ETH Price: $3,967.72 (+2.33%)
Gas: 0.35 GWei

Contract

0x43Eac5BFEa14531B8DE0B334E123eA98325de866

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

Token Holdings

Transaction Hash
Method
Block
From
To
0xeac064d4eecbe406aad8ab30b2f8b2520ebf6f1a92435501e50532495a17c2f1 -(pending)2024-12-16 1:04:145 hrs ago1734311054IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0x4047e01b13d429de70bb0de44eadab6f54fff24ec5049793578915c6aeee5b05 -(pending)2024-12-16 0:52:045 hrs ago1734310324IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0x79093fa2a6b07d1b448e38d64667f38f0fa6a1c2f3c7696da7174e93e03213af -(pending)2024-12-14 17:06:2137 hrs ago1734195981IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0xf4016f6e829f5e412044151e487c5db422a32d9cb83475fe11003b34b89b8e4d -(pending)2024-12-13 9:23:292 days ago1734081809IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0xeb9bb3ff63baf6b58e60857326a2f86fa232ac34a8d9ad56d7cca7e33f150188 -(pending)2024-12-13 7:25:162 days ago1734074716IN
0x43Eac5BF...8325de866
0.0122 ETH(Pending)(Pending)
0x8c5656bb91efea27d35e22d5e5a1a26182a05cee0260046abc42bf1ecc8f5a92 -(pending)2024-12-13 7:25:042 days ago1734074704IN
0x43Eac5BF...8325de866
0.0138 ETH(Pending)(Pending)
0x744d9bbd85cfb9910dba70017f2b9ef1bc14d8ddafd8c3f8353658149282f38e -(pending)2024-12-13 7:25:032 days ago1734074703IN
0x43Eac5BF...8325de866
0.00001 ETH(Pending)(Pending)
0xcfd7b28cd11339feb5cdb54c1b99cb30dfac6c27b7df00b1650e8116c3731cfe -(pending)2024-12-13 7:24:512 days ago1734074691IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0xe34b2ed37366700054df49a73385922ccfb86a0b9eec8b2e9677af7f3140f5ab -(pending)2024-12-13 7:24:042 days ago1734074644IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0xf00478783fcd4383e67aed34cd44d10b97035ce571d59f312939383838312ce2 -(pending)2024-12-09 5:41:487 days ago1733722908IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0xb98a474d8788db4c49a3c5d909a95cc3055b516602d6f18bb0a6d3d96c30754a -(pending)2024-12-06 7:19:439 days ago1733469583IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0xa1eb1b0be36a165716a3222a3ce9643af2a087d3d9c92481d7692bc6274b4e8c -(pending)2024-12-06 7:16:009 days ago1733469360IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
0xf0043e12298ae058521a7505c8ca7041375a36d6338486f7e062a43b2568aaae -(pending)2024-11-23 6:27:0223 days ago1732343222IN
0x43Eac5BF...8325de866
0 ETH(Pending)(Pending)
Redeem Token133743232024-12-16 6:40:4322 secs ago1734331243IN
0x43Eac5BF...8325de866
0 ETH0.000020730.1
Redeem Token133743062024-12-16 6:40:0956 secs ago1734331209IN
0x43Eac5BF...8325de866
0 ETH0.000009860.05897337
Redeem Token133742742024-12-16 6:39:052 mins ago1734331145IN
0x43Eac5BF...8325de866
0 ETH0.000011460.05602527
Redeem Token133742692024-12-16 6:38:552 mins ago1734331135IN
0x43Eac5BF...8325de866
0 ETH0.000021830.10393202
Supply133742632024-12-16 6:38:432 mins ago1734331123IN
0x43Eac5BF...8325de866
0 ETH0.000011510.05595795
Supply133742152024-12-16 6:37:054 mins ago1734331025IN
0x43Eac5BF...8325de866
0 ETH0.000022450.10646619
Redeem Token133741962024-12-16 6:36:274 mins ago1734330987IN
0x43Eac5BF...8325de866
0 ETH0.000022770.09668335
Repay Borrow133741862024-12-16 6:36:074 mins ago1734330967IN
0x43Eac5BF...8325de866
0.01181938 ETH0.000019010.12381442
Redeem Underlyin...133741432024-12-16 6:34:396 mins ago1734330879IN
0x43Eac5BF...8325de866
0 ETH0.000023640.09529177
Redeem Token133741142024-12-16 6:33:417 mins ago1734330821IN
0x43Eac5BF...8325de866
0 ETH0.000061140.36551296
Repay Borrow133740802024-12-16 6:32:338 mins ago1734330753IN
0x43Eac5BF...8325de866
0.071 ETH0.000015220.09709981
Enter Markets133740772024-12-16 6:32:278 mins ago1734330747IN
0x43Eac5BF...8325de866
0 ETH0.000008980.0963139
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
133743232024-12-16 6:40:4322 secs ago1734331243
0x43Eac5BF...8325de866
0 ETH
133743232024-12-16 6:40:4322 secs ago1734331243
0x43Eac5BF...8325de866
0 ETH
133743232024-12-16 6:40:4322 secs ago1734331243
0x43Eac5BF...8325de866
0 ETH
133743232024-12-16 6:40:4322 secs ago1734331243
0x43Eac5BF...8325de866
0 ETH
133743062024-12-16 6:40:0956 secs ago1734331209
0x43Eac5BF...8325de866
0 ETH
133743062024-12-16 6:40:0956 secs ago1734331209
0x43Eac5BF...8325de866
0 ETH
133743062024-12-16 6:40:0956 secs ago1734331209
0x43Eac5BF...8325de866
0 ETH
133743062024-12-16 6:40:0956 secs ago1734331209
0x43Eac5BF...8325de866
0 ETH
133742742024-12-16 6:39:052 mins ago1734331145
0x43Eac5BF...8325de866
0 ETH
133742742024-12-16 6:39:052 mins ago1734331145
0x43Eac5BF...8325de866
0 ETH
133742742024-12-16 6:39:052 mins ago1734331145
0x43Eac5BF...8325de866
0 ETH
133742742024-12-16 6:39:052 mins ago1734331145
0x43Eac5BF...8325de866
0 ETH
133742692024-12-16 6:38:552 mins ago1734331135
0x43Eac5BF...8325de866
0 ETH
133742692024-12-16 6:38:552 mins ago1734331135
0x43Eac5BF...8325de866
0 ETH
133742692024-12-16 6:38:552 mins ago1734331135
0x43Eac5BF...8325de866
0 ETH
133742692024-12-16 6:38:552 mins ago1734331135
0x43Eac5BF...8325de866
0 ETH
133742632024-12-16 6:38:432 mins ago1734331123
0x43Eac5BF...8325de866
0 ETH
133742632024-12-16 6:38:432 mins ago1734331123
0x43Eac5BF...8325de866
0 ETH
133742632024-12-16 6:38:432 mins ago1734331123
0x43Eac5BF...8325de866
0 ETH
133742152024-12-16 6:37:054 mins ago1734331025
0x43Eac5BF...8325de866
0 ETH
133742152024-12-16 6:37:054 mins ago1734331025
0x43Eac5BF...8325de866
0 ETH
133742152024-12-16 6:37:054 mins ago1734331025
0x43Eac5BF...8325de866
0 ETH
133741962024-12-16 6:36:274 mins ago1734330987
0x43Eac5BF...8325de866
0 ETH
133741962024-12-16 6:36:274 mins ago1734330987
0x43Eac5BF...8325de866
0 ETH
133741962024-12-16 6:36:274 mins ago1734330987
0x43Eac5BF...8325de866
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Core

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 14 : Core.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

import "@openzeppelin/contracts/math/SafeMath.sol";

import "./CoreAdmin.sol";

import "./interfaces/ILToken.sol";
import "./interfaces/IValidator.sol";
import "./interfaces/IPriceCalculator.sol";

contract Core is CoreAdmin {
  using SafeMath for uint256;

  /* ========== CONSTANT VARIABLES ========== */

  address internal constant ETH = 0x0000000000000000000000000000000000000000;

  /* ========== STATE VARIABLES ========== */

  mapping(address => address[]) public marketListOfUsers; // (account => lTokenAddress[])
  mapping(address => mapping(address => bool)) public usersOfMarket; // (lTokenAddress => (account => joined))

  // initializer
  bool public initialized;

  /* ========== INITIALIZER ========== */

  constructor() public {}

  function initialize(address _priceCalculator) external onlyOwner {
    require(initialized == false, "already initialized");

    __Core_init();
    priceCalculator = IPriceCalculator(_priceCalculator);

    initialized = true;
  }

  /* ========== MODIFIERS ========== */

  modifier onlyMemberOfMarket(address lToken) {
    require(usersOfMarket[lToken][msg.sender], "Core: must enter market");
    _;
  }

  modifier onlyMarket() {
    bool fromMarket = false;
    for (uint256 i = 0; i < markets.length; i++) {
      if (msg.sender == markets[i]) {
        fromMarket = true;
        break;
      }
    }
    require(fromMarket == true, "Core: caller should be market");
    _;
  }

  modifier onlyLeverager() {
    require(msg.sender == leverager, "Core: caller should be leverager");
    _;
  }

  /* ========== VIEWS ========== */

  function allMarkets() external view override returns (address[] memory) {
    return markets;
  }

  function marketInfoOf(address lToken) external view override returns (Constant.MarketInfo memory) {
    return marketInfos[lToken];
  }

  function marketListOf(address account) external view override returns (address[] memory) {
    return marketListOfUsers[account];
  }

  function checkMembership(address account, address lToken) external view override returns (bool) {
    return usersOfMarket[lToken][account];
  }

  function accountLiquidityOf(
    address account
  ) external view override returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD) {
    return IValidator(validator).getAccountLiquidity(account);
  }

  /* ========== MUTATIVE FUNCTIONS ========== */

  function enterMarkets(address[] memory lTokens) public override {
    for (uint256 i = 0; i < lTokens.length; i++) {
      _enterMarket(payable(lTokens[i]), msg.sender);
    }
  }

  function exitMarket(address lToken) external override onlyListedMarket(lToken) onlyMemberOfMarket(lToken) {
    Constant.AccountSnapshot memory snapshot = ILToken(lToken).accruedAccountSnapshot(msg.sender);
    require(snapshot.borrowBalance == 0, "Core: borrow balance must be zero");
    require(IValidator(validator).redeemAllowed(lToken, msg.sender, snapshot.lTokenBalance), "Core: cannot redeem");

    _removeUserMarket(lToken, msg.sender);
    emit MarketExited(lToken, msg.sender);
  }

  function supply(
    address lToken,
    uint256 uAmount
  ) external payable override onlyListedMarket(lToken) nonReentrant whenNotPaused returns (uint256) {
    uAmount = ILToken(lToken).underlying() == address(ETH) ? msg.value : uAmount;
    uint256 supplyCap = marketInfos[lToken].supplyCap;
    require(
      supplyCap == 0 ||
        ILToken(lToken).totalSupply().mul(ILToken(lToken).exchangeRate()).div(1e18).add(uAmount) <= supplyCap,
      "Core: supply cap reached"
    );

    uint256 lAmount = ILToken(lToken).supply{value: msg.value}(msg.sender, uAmount);
    labDistributor.notifySupplyUpdated(lToken, msg.sender);

    emit MarketSupply(msg.sender, lToken, uAmount);
    return lAmount;
  }

  function supplyBehalf(
    address supplier,
    address lToken,
    uint256 uAmount
  ) external payable override onlyListedMarket(lToken) nonReentrant whenNotPaused returns (uint256) {
    uAmount = ILToken(lToken).underlying() == address(ETH) ? msg.value : uAmount;
    uint256 supplyCap = marketInfos[lToken].supplyCap;
    require(
      supplyCap == 0 ||
        ILToken(lToken).totalSupply().mul(ILToken(lToken).exchangeRate()).div(1e18).add(uAmount) <= supplyCap,
      "Core: supply cap reached"
    );

    uint256 lAmount = ILToken(lToken).supplyBehalf{value: msg.value}(msg.sender, supplier, uAmount);
    labDistributor.notifySupplyUpdated(lToken, supplier);

    emit MarketSupply(supplier, lToken, uAmount);
    return lAmount;
  }

  function redeemToken(
    address lToken,
    uint256 lAmount
  ) external override onlyListedMarket(lToken) nonReentrant whenNotPaused returns (uint256) {
    uint256 uAmountRedeem = ILToken(lToken).redeemToken(msg.sender, lAmount);
    labDistributor.notifySupplyUpdated(lToken, msg.sender);

    emit MarketRedeem(msg.sender, lToken, uAmountRedeem);
    return uAmountRedeem;
  }

  function redeemUnderlying(
    address lToken,
    uint256 uAmount
  ) external override onlyListedMarket(lToken) nonReentrant whenNotPaused returns (uint256) {
    uint256 uAmountRedeem = ILToken(lToken).redeemUnderlying(msg.sender, uAmount);
    labDistributor.notifySupplyUpdated(lToken, msg.sender);

    emit MarketRedeem(msg.sender, lToken, uAmountRedeem);
    return uAmountRedeem;
  }

  function borrow(
    address lToken,
    uint256 amount
  ) external override onlyListedMarket(lToken) nonReentrant whenNotPaused {
    _enterMarket(lToken, msg.sender);
    require(IValidator(validator).borrowAllowed(lToken, msg.sender, amount), "Core: cannot borrow");

    ILToken(payable(lToken)).borrow(msg.sender, amount);
    labDistributor.notifyBorrowUpdated(lToken, msg.sender);
  }

  function borrowBehalf(
    address borrower,
    address lToken,
    uint256 amount
  ) external override onlyListedMarket(lToken) onlyLeverager nonReentrant whenNotPaused {
    _enterMarket(lToken, borrower);
    require(IValidator(validator).borrowAllowed(lToken, borrower, amount), "Core: cannot borrow");

    ILToken(payable(lToken)).borrowBehalf(msg.sender, borrower, amount);
    labDistributor.notifyBorrowUpdated(lToken, borrower);
  }

  function repayBorrow(
    address lToken,
    uint256 amount
  ) external payable override onlyListedMarket(lToken) nonReentrant whenNotPaused {
    ILToken(payable(lToken)).repayBorrow{value: msg.value}(msg.sender, amount);
    labDistributor.notifyBorrowUpdated(lToken, msg.sender);
  }

  function liquidateBorrow(
    address lTokenBorrowed,
    address lTokenCollateral,
    address borrower,
    uint256 amount
  ) external payable override nonReentrant whenNotPaused {
    amount = ILToken(lTokenBorrowed).underlying() == address(ETH) ? msg.value : amount;
    require(marketInfos[lTokenBorrowed].isListed && marketInfos[lTokenCollateral].isListed, "Core: invalid market");
    require(usersOfMarket[lTokenCollateral][borrower], "Core: not a collateral");
    require(marketInfos[lTokenCollateral].collateralFactor > 0, "Core: not a collateral");
    require(
      IValidator(validator).liquidateAllowed(lTokenBorrowed, borrower, amount, closeFactor),
      "Core: cannot liquidate borrow"
    );

    (, uint256 rebateLAmount, uint256 liquidatorLAmount) = ILToken(lTokenBorrowed).liquidateBorrow{value: msg.value}(
      lTokenCollateral,
      msg.sender,
      borrower,
      amount
    );

    ILToken(lTokenCollateral).seize(msg.sender, borrower, liquidatorLAmount);
    labDistributor.notifyTransferred(lTokenCollateral, borrower, msg.sender);

    if (rebateLAmount > 0) {
      ILToken(lTokenCollateral).seize(rebateDistributor, borrower, rebateLAmount);
      labDistributor.notifyTransferred(lTokenCollateral, borrower, rebateDistributor);
    }

    labDistributor.notifyBorrowUpdated(lTokenBorrowed, borrower);
  }

  function claimLab() external override nonReentrant {
    labDistributor.claim(markets, msg.sender);
  }

  function claimLab(address market) external override nonReentrant {
    address[] memory _markets = new address[](1);
    _markets[0] = market;
    labDistributor.claim(_markets, msg.sender);
  }

  /// @notice 쌓인 보상을 Locker에 바로 deposit
  function compoundLab(uint256 lockDuration) external override nonReentrant {
    labDistributor.compound(markets, msg.sender, lockDuration);
  }

  function transferTokens(
    address spender,
    address src,
    address dst,
    uint256 amount
  ) external override nonReentrant onlyMarket {
    ILToken(msg.sender).transferTokensInternal(spender, src, dst, amount);
    labDistributor.notifyTransferred(msg.sender, src, dst);
  }

  /* ========== PRIVATE FUNCTIONS ========== */

  function _enterMarket(address lToken, address _account) internal onlyListedMarket(lToken) {
    if (!usersOfMarket[lToken][_account]) {
      usersOfMarket[lToken][_account] = true;
      marketListOfUsers[_account].push(lToken);
      emit MarketEntered(lToken, _account);
    }
  }

  function _removeUserMarket(address lTokenToExit, address _account) private {
    require(marketListOfUsers[_account].length > 0, "Core: cannot pop user market");
    delete usersOfMarket[lTokenToExit][_account];

    uint256 length = marketListOfUsers[_account].length;
    for (uint256 i = 0; i < length; i++) {
      if (marketListOfUsers[_account][i] == lTokenToExit) {
        marketListOfUsers[_account][i] = marketListOfUsers[_account][length - 1];
        marketListOfUsers[_account].pop();
        break;
      }
    }
  }
}

File 2 of 14 : CoreAdmin.sol
// SPDX-License-Identifier: UNLICENSE
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";

import "./library/Constant.sol";

import "./interfaces/ICore.sol";
import "./interfaces/ILABDistributor.sol";
import "./interfaces/IPriceCalculator.sol";
import "./interfaces/ILToken.sol";
import "./interfaces/IRebateDistributor.sol";

abstract contract CoreAdmin is ICore, Ownable, ReentrancyGuard, Pausable {
  /* ========== STATE VARIABLES ========== */

  address public keeper;
  address public leverager;
  address public override validator;
  address public override rebateDistributor;
  ILABDistributor public labDistributor;
  IPriceCalculator public priceCalculator;

  address[] public markets; // lTokenAddress[]
  mapping(address => Constant.MarketInfo) public marketInfos; // (lTokenAddress => MarketInfo)

  uint256 public override closeFactor;
  uint256 public override liquidationIncentive;

  /* ========== MODIFIERS ========== */

  modifier onlyKeeper() {
    require(msg.sender == keeper || msg.sender == owner(), "Core: caller is not the owner or keeper");
    _;
  }

  modifier onlyListedMarket(address lToken) {
    require(marketInfos[lToken].isListed, "Core: invalid market");
    _;
  }

  /* ========== INITIALIZER ========== */

  function __Core_init() internal {
    closeFactor = 5e17; // 0.5
    liquidationIncentive = 115e16; // 1.15
  }

  /* ========== RESTRICTED FUNCTIONS ========== */

  function setPriceCalculator(address _priceCalculator) external onlyKeeper {
    require(_priceCalculator != address(0), "Core: invalid calculator address");
    priceCalculator = IPriceCalculator(_priceCalculator);
  }

  /// @notice keeper address 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param _keeper 새로운 keeper address
  function setKeeper(address _keeper) external onlyKeeper {
    require(_keeper != address(0), "Core: invalid keeper address");
    keeper = _keeper;
    emit KeeperUpdated(_keeper);
  }

  /// @notice validator 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param _validator 새로운 validator address
  function setValidator(address _validator) external onlyKeeper {
    require(_validator != address(0), "Core: invalid validator address");
    validator = _validator;
    emit ValidatorUpdated(_validator);
  }

  /// @notice labDistributor 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param _labDistributor 새로운 labDistributor address
  function setLABDistributor(address _labDistributor) external onlyKeeper {
    require(_labDistributor != address(0), "Core: invalid labDistributor address");
    labDistributor = ILABDistributor(_labDistributor);
    emit LABDistributorUpdated(_labDistributor);
  }

  function setRebateDistributor(address _rebateDistributor) external onlyKeeper {
    require(_rebateDistributor != address(0), "Core: invalid rebateDistributor address");
    rebateDistributor = _rebateDistributor;
    emit RebateDistributorUpdated(_rebateDistributor);
  }

  function setLeverager(address _leverager) external onlyKeeper {
    require(_leverager != address(0), "Core: invalid leverager address");
    leverager = _leverager;
    emit LeveragerUpdated(_leverager);
  }

  /// @notice close factor 변경
  /// @dev keeper address 에서만 요청 가능
  /// @param newCloseFactor 새로운 close factor 값 (TBD)
  function setCloseFactor(uint256 newCloseFactor) external onlyKeeper {
    require(
      newCloseFactor >= Constant.CLOSE_FACTOR_MIN && newCloseFactor <= Constant.CLOSE_FACTOR_MAX,
      "Core: invalid close factor"
    );
    closeFactor = newCloseFactor;
    emit CloseFactorUpdated(newCloseFactor);
  }

  function setCollateralFactor(
    address lToken,
    uint256 newCollateralFactor
  ) external onlyKeeper onlyListedMarket(lToken) {
    require(newCollateralFactor <= Constant.COLLATERAL_FACTOR_MAX, "Core: invalid collateral factor");
    if (newCollateralFactor != 0 && priceCalculator.getUnderlyingPrice(lToken) == 0) {
      revert("Core: invalid underlying price");
    }

    marketInfos[lToken].collateralFactor = newCollateralFactor;
    emit CollateralFactorUpdated(lToken, newCollateralFactor);
  }

  function setLiquidationIncentive(uint256 newLiquidationIncentive) external onlyKeeper {
    liquidationIncentive = newLiquidationIncentive;
    emit LiquidationIncentiveUpdated(newLiquidationIncentive);
  }

  function setMarketSupplyCaps(address[] calldata lTokens, uint256[] calldata newSupplyCaps) external onlyKeeper {
    require(lTokens.length != 0 && lTokens.length == newSupplyCaps.length, "Core: invalid data");

    for (uint256 i = 0; i < lTokens.length; i++) {
      marketInfos[lTokens[i]].supplyCap = newSupplyCaps[i];
      emit SupplyCapUpdated(lTokens[i], newSupplyCaps[i]);
    }
  }

  function setMarketBorrowCaps(address[] calldata lTokens, uint256[] calldata newBorrowCaps) external onlyKeeper {
    require(lTokens.length != 0 && lTokens.length == newBorrowCaps.length, "Core: invalid data");

    for (uint256 i = 0; i < lTokens.length; i++) {
      marketInfos[lTokens[i]].borrowCap = newBorrowCaps[i];
      emit BorrowCapUpdated(lTokens[i], newBorrowCaps[i]);
    }
  }

  function listMarket(
    address payable lToken,
    uint256 supplyCap,
    uint256 borrowCap,
    uint256 collateralFactor
  ) external onlyKeeper {
    require(!marketInfos[lToken].isListed, "Core: already listed market");
    for (uint256 i = 0; i < markets.length; i++) {
      require(markets[i] != lToken, "Core: already listed market");
    }

    marketInfos[lToken] = Constant.MarketInfo({
      isListed: true,
      supplyCap: supplyCap,
      borrowCap: borrowCap,
      collateralFactor: collateralFactor
    });
    markets.push(lToken);
    emit MarketListed(lToken);
  }

  function removeMarket(address payable lToken) external onlyKeeper {
    require(marketInfos[lToken].isListed, "Core: unlisted market");
    require(ILToken(lToken).totalSupply() == 0 && ILToken(lToken).totalBorrow() == 0, "Core: cannot remove market");

    uint256 length = markets.length;
    for (uint256 i = 0; i < length; i++) {
      if (markets[i] == lToken) {
        markets[i] = markets[length - 1];
        markets.pop();
        delete marketInfos[lToken];
        break;
      }
    }
  }

  function claimLabBehalf(address[] calldata accounts) external onlyKeeper nonReentrant {
    labDistributor.claimBehalf(markets, accounts);
  }

  function pause() external onlyKeeper {
    _pause();
  }

  function unpause() external onlyKeeper {
    _unpause();
  }
}

File 3 of 14 : IValidator.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

interface IValidator {
  function redeemAllowed(address lToken, address redeemer, uint256 redeemAmount) external returns (bool);

  function borrowAllowed(address lToken, address borrower, uint256 borrowAmount) external returns (bool);

  function liquidateAllowed(
    address lTokenBorrowed,
    address borrower,
    uint256 repayAmount,
    uint256 closeFactor
  ) external returns (bool);

  function lTokenAmountToSeize(
    address lTokenBorrowed,
    address lTokenCollateral,
    uint256 actualRepayAmount
  ) external returns (uint256 seizeLAmount, uint256 rebateLAmount, uint256 liquidatorLAmount);

  function getAccountLiquidity(
    address account
  ) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD);
}

File 4 of 14 : ILToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

import "../library/Constant.sol";

interface ILToken {
  function underlying() external view returns (address);

  function totalSupply() external view returns (uint256);

  function accountSnapshot(address account) external view returns (Constant.AccountSnapshot memory);

  function underlyingBalanceOf(address account) external view returns (uint256);

  function borrowBalanceOf(address account) external view returns (uint256);

  function totalBorrow() external view returns (uint256);

  function _totalBorrow() external view returns (uint256);

  function totalReserve() external view returns (uint256);

  function reserveFactor() external view returns (uint256);

  function lastAccruedTime() external view returns (uint256);

  function accInterestIndex() external view returns (uint256);

  function exchangeRate() external view returns (uint256);

  function getCash() external view returns (uint256);

  function getRateModel() external view returns (address);

  function getAccInterestIndex() external view returns (uint256);

  function accruedAccountSnapshot(address account) external returns (Constant.AccountSnapshot memory);

  function accruedBorrowBalanceOf(address account) external returns (uint256);

  function accruedTotalBorrow() external returns (uint256);

  function accruedExchangeRate() external returns (uint256);

  function approve(address spender, uint256 amount) external returns (bool);

  function allowance(address owner, address spender) external view returns (uint256);

  function balanceOf(address account) external view returns (uint256);

  function transfer(address dst, uint256 amount) external returns (bool);

  function transferFrom(address src, address dst, uint256 amount) external returns (bool);

  function supply(address account, uint256 underlyingAmount) external payable returns (uint256);

  function supplyBehalf(address account, address supplier, uint256 underlyingAmount) external payable returns (uint256);

  function redeemToken(address account, uint256 lTokenAmount) external returns (uint256);

  function redeemUnderlying(address account, uint256 underlyingAmount) external returns (uint256);

  function borrow(address account, uint256 amount) external returns (uint256);

  function borrowBehalf(address account, address borrower, uint256 amount) external returns (uint256);

  function repayBorrow(address account, uint256 amount) external payable returns (uint256);

  function liquidateBorrow(
    address lTokenCollateral,
    address liquidator,
    address borrower,
    uint256 amount
  ) external payable returns (uint256 seizeLAmount, uint256 rebateLAmount, uint256 liquidatorLAmount);

  function seize(address liquidator, address borrower, uint256 lTokenAmount) external;

  function withdrawReserves() external;

  function transferTokensInternal(address spender, address src, address dst, uint256 amount) external;
}

File 5 of 14 : IPriceCalculator.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

interface IPriceCalculator {
  struct ReferenceData {
    uint256 lastData;
    uint256 lastUpdated;
  }

  function priceOf(address asset) external view returns (uint256);

  function pricesOf(address[] memory assets) external view returns (uint256[] memory);

  function priceOfETH() external view returns (uint256);

  function getUnderlyingPrice(address lToken) external view returns (uint256);

  function getUnderlyingPrices(address[] memory lTokens) external view returns (uint256[] memory);
}

File 6 of 14 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @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) {
        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, reverting 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) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting 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) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * 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);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * 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 7 of 14 : Constant.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

library Constant {
  uint256 public constant CLOSE_FACTOR_MIN = 5e16;
  uint256 public constant CLOSE_FACTOR_MAX = 9e17;
  uint256 public constant COLLATERAL_FACTOR_MAX = 9e17;
  uint256 public constant LIQUIDATION_THRESHOLD_MAX = 9e17;
  uint256 public constant LIQUIDATION_BONUS_MAX = 5e17;

  enum EcoScorePreviewOption {
    LOCK,
    CLAIM,
    EXTEND,
    LOCK_MORE
  }

  enum LoanState {
    None,
    Active,
    Auction,
    Repaid,
    Defaulted
  }

  struct MarketInfo {
    bool isListed;
    uint256 supplyCap;
    uint256 borrowCap;
    uint256 collateralFactor;
  }

  struct BorrowInfo {
    uint256 borrow;
    uint256 interestIndex;
  }

  struct AccountSnapshot {
    uint256 lTokenBalance;
    uint256 borrowBalance;
    uint256 exchangeRate;
  }

  struct AccrueSnapshot {
    uint256 totalBorrow;
    uint256 totalReserve;
    uint256 accInterestIndex;
  }

  struct AccrueLoanSnapshot {
    uint256 totalBorrow;
    uint256 accInterestIndex;
  }

  struct DistributionInfo {
    uint256 supplySpeed;
    uint256 borrowSpeed;
    uint256 totalBoostedSupply;
    uint256 totalBoostedBorrow;
    uint256 accPerShareSupply;
    uint256 accPerShareBorrow;
    uint256 accruedAt;
  }

  struct DistributionAccountInfo {
    uint256 accuredLAB; // Unclaimed LAB rewards amount
    uint256 boostedSupply; // effective(boosted) supply balance of user  (since last_action)
    uint256 boostedBorrow; // effective(boosted) borrow balance of user  (since last_action)
    uint256 accPerShareSupply; // Last integral value of LAB rewards per share. ∫(LABRate(t) / totalShare(t) dt) from 0 till (last_action)
    uint256 accPerShareBorrow; // Last integral value of LAB rewards per share. ∫(LABRate(t) / totalShare(t) dt) from 0 till (last_action)
  }

  struct DistributionAPY {
    uint256 apySupplyLab;
    uint256 apyBorrowLab;
    uint256 apyAccountSupplyLab;
    uint256 apyAccountBorrowLab;
  }

  struct RebateCheckpoint {
    uint256 timestamp;
    uint256 totalScore;
    uint256 adminFeeRate;
    uint256 weeklyLabSpeed;
    uint256 additionalLabAmount;
    mapping(address => uint256) marketFees;
  }

  struct LockInfo {
    uint256 timestamp;
    uint256 amount;
    uint256 expiry;
  }
}

File 8 of 14 : ICore.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

import "../library/Constant.sol";

interface ICore {
  /* ========== Event ========== */
  event MarketSupply(address user, address lToken, uint256 uAmount);
  event MarketRedeem(address user, address lToken, uint256 uAmount);

  event MarketListed(address lToken);
  event MarketEntered(address lToken, address account);
  event MarketExited(address lToken, address account);

  event CloseFactorUpdated(uint256 newCloseFactor);
  event CollateralFactorUpdated(address lToken, uint256 newCollateralFactor);
  event LiquidationIncentiveUpdated(uint256 newLiquidationIncentive);
  event SupplyCapUpdated(address indexed lToken, uint256 newSupplyCap);
  event BorrowCapUpdated(address indexed lToken, uint256 newBorrowCap);
  event KeeperUpdated(address newKeeper);
  event ValidatorUpdated(address newValidator);
  event LABDistributorUpdated(address newLABDistributor);
  event RebateDistributorUpdated(address newRebateDistributor);
  event LeveragerUpdated(address newLeverager);
  event FlashLoan(
    address indexed target,
    address indexed initiator,
    address indexed asset,
    uint256 amount,
    uint256 premium
  );

  function validator() external view returns (address);

  function rebateDistributor() external view returns (address);

  function allMarkets() external view returns (address[] memory);

  function marketListOf(address account) external view returns (address[] memory);

  function marketInfoOf(address lToken) external view returns (Constant.MarketInfo memory);

  function checkMembership(address account, address lToken) external view returns (bool);

  function accountLiquidityOf(
    address account
  ) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD);

  function closeFactor() external view returns (uint256);

  function liquidationIncentive() external view returns (uint256);

  function enterMarkets(address[] memory lTokens) external;

  function exitMarket(address lToken) external;

  function supply(address lToken, uint256 underlyingAmount) external payable returns (uint256);

  function supplyBehalf(address account, address lToken, uint256 underlyingAmount) external payable returns (uint256);

  function redeemToken(address lToken, uint256 lTokenAmount) external returns (uint256 redeemed);

  function redeemUnderlying(address lToken, uint256 underlyingAmount) external returns (uint256 redeemed);

  function borrow(address lToken, uint256 amount) external;

  function borrowBehalf(address borrower, address lToken, uint256 amount) external;

  function repayBorrow(address lToken, uint256 amount) external payable;

  function liquidateBorrow(
    address lTokenBorrowed,
    address lTokenCollateral,
    address borrower,
    uint256 amount
  ) external payable;

  function claimLab() external;

  function claimLab(address market) external;

  function transferTokens(address spender, address src, address dst, uint256 amount) external;

  function compoundLab(uint256 lockDuration) external;
}

File 9 of 14 : ILABDistributor.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

import "../library/Constant.sol";

interface ILABDistributor {
  /* ========== EVENTS ========== */
  event DistributionSpeedUpdated(address indexed lToken, uint256 supplySpeed, uint256 borrowSpeed);
  event Claimed(address indexed user, uint256 amount);
  event Compound(address indexed user, uint256 amount);

  function accuredLAB(address[] calldata markets, address account) external view returns (uint);

  function distributionInfoOf(address market) external view returns (Constant.DistributionInfo memory);

  function accountDistributionInfoOf(
    address market,
    address account
  ) external view returns (Constant.DistributionAccountInfo memory);

  function apyDistributionOf(address market, address account) external view returns (Constant.DistributionAPY memory);

  function boostedRatioOf(
    address market,
    address account
  ) external view returns (uint boostedSupplyRatio, uint boostedBorrowRatio);

  function notifySupplyUpdated(address market, address user) external;

  function notifyBorrowUpdated(address market, address user) external;

  function notifyTransferred(address qToken, address sender, address receiver) external;

  function claim(address[] calldata markets, address account) external;

  function claimBehalf(address[] calldata markets, address[] calldata accounts) external;

  function updateAccountBoostedInfo(address user) external;

  function compound(address[] calldata markets, address account, uint256 lockDuration) external;

  function pause() external;

  function unpause() external;

  function approve(address _spender, uint256 amount) external returns (bool);
}

File 10 of 14 : IRebateDistributor.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;

interface IRebateDistributor {
  function setKeeper(address _keeper) external;

  function pause() external;

  function unpause() external;

  function updateAdminFeeRate(uint256 newAdminFeeRate) external;

  function checkpoint() external;

  function weeklyRebatePool() external view returns (uint256);

  function weeklyProfitOfVP(uint256 vp) external view returns (uint256);

  function weeklyProfitOf(address account) external view returns (uint256);

  function indicativeAPR() external view returns (uint256);

  function indicativeAPROf(uint256 amount, uint256 lockDuration) external view returns (uint256);

  function indicativeAPROfUser(address account) external view returns (uint256);

  function accruedRebates(address account) external view returns (uint256, uint256, uint256[] memory);

  function claimRebates() external returns (uint256, uint256, uint256[] memory);

  function claimAdminRebates() external returns (uint256, uint256[] memory);

  function addLABToRebatePool(uint256 amount) external;

  function addMarketUTokenToRebatePool(address lToken, uint256 uAmount) external payable;
}

File 11 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../utils/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 12 of 14 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @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].
 */
abstract 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 13 of 14 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newBorrowCap","type":"uint256"}],"name":"BorrowCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newCloseFactor","type":"uint256"}],"name":"CloseFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newCollateralFactor","type":"uint256"}],"name":"CollateralFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"}],"name":"FlashLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"KeeperUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLABDistributor","type":"address"}],"name":"LABDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newLeverager","type":"address"}],"name":"LeveragerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"LiquidationIncentiveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"MarketEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"MarketExited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lToken","type":"address"}],"name":"MarketListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"MarketRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"MarketSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRebateDistributor","type":"address"}],"name":"RebateDistributorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"lToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"newSupplyCap","type":"uint256"}],"name":"SupplyCapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newValidator","type":"address"}],"name":"ValidatorUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accountLiquidityOf","outputs":[{"internalType":"uint256","name":"collateralInUSD","type":"uint256"},{"internalType":"uint256","name":"supplyInUSD","type":"uint256"},{"internalType":"uint256","name":"borrowInUSD","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allMarkets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrowBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"lToken","type":"address"}],"name":"checkMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"}],"name":"claimLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"claimLabBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockDuration","type":"uint256"}],"name":"compoundLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lTokens","type":"address[]"}],"name":"enterMarkets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"}],"name":"exitMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceCalculator","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"labDistributor","outputs":[{"internalType":"contract ILABDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leverager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lTokenBorrowed","type":"address"},{"internalType":"address","name":"lTokenCollateral","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"liquidateBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"liquidationIncentive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"lToken","type":"address"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"name":"listMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"}],"name":"marketInfoOf","outputs":[{"components":[{"internalType":"bool","name":"isListed","type":"bool"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"internalType":"struct Constant.MarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"marketInfos","outputs":[{"internalType":"bool","name":"isListed","type":"bool"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"collateralFactor","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"marketListOf","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketListOfUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceCalculator","outputs":[{"internalType":"contract IPriceCalculator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebateDistributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"lAmount","type":"uint256"}],"name":"redeemToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"lToken","type":"address"}],"name":"removeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCloseFactor","type":"uint256"}],"name":"setCloseFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"newCollateralFactor","type":"uint256"}],"name":"setCollateralFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_labDistributor","type":"address"}],"name":"setLABDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_leverager","type":"address"}],"name":"setLeverager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"setLiquidationIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lTokens","type":"address[]"},{"internalType":"uint256[]","name":"newBorrowCaps","type":"uint256[]"}],"name":"setMarketBorrowCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lTokens","type":"address[]"},{"internalType":"uint256[]","name":"newSupplyCaps","type":"uint256[]"}],"name":"setMarketSupplyCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_priceCalculator","type":"address"}],"name":"setPriceCalculator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rebateDistributor","type":"address"}],"name":"setRebateDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"supplier","type":"address"},{"internalType":"address","name":"lToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"supplyBehalf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"usersOfMarket","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060006200001e6200007c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556002805460ff1916905562000080565b3390565b6149ca80620000906000396000f3fe60806040526004361061031a5760003560e01c80638b95e335116101ab578063c2998238116100f7578063e61604cf11610095578063f187186c1161006f578063f187186c146108c4578063f2b9fdb8146108e4578063f2fde38b146108f7578063f8982e7a146109175761031a565b8063e61604cf14610871578063ede4edd014610884578063eefc5947146108a45761031a565b8063d9452b04116100d1578063d9452b04146107fc578063db3e34611461081c578063db91323614610831578063de02d642146108515761031a565b8063c29982381461079c578063c4d66de8146107bc578063d136af44146107dc5761031a565b8063a2a2d5bb11610164578063aced16611161013e578063aced166114610734578063b1283e7714610749578063bba6157814610769578063c04f31ff1461077c5761031a565b8063a2a2d5bb146106e1578063a843108114610701578063abdb5ea8146107215761031a565b80638b95e335146106425780638c765e94146106575780638da5cb5b1461066c578063928fe47714610681578063929fe9a1146106a157806396294178146106c15761031a565b80635189e1101161026a5780636922d7b611610223578063748747e6116101fd578063748747e6146105d85780637f0927f2146105f8578063830cbbbd1461060d5780638456cb591461062d5761031a565b80636922d7b6146105765780636e8584fd14610596578063715018a6146105c35761031a565b80635189e110146104d7578063571abe30146104f757806359341a1a1461050c5780635c975abb1461052157806366ae02091461053657806368155ec1146105565761031a565b806333f9c876116102d75780633a5381b5116102b15780633a5381b5146104605780633f4ba83a146104825780634036c8b5146104975780634b8a3529146104b75761031a565b806333f9c876146103fe57806334e115be1461041e578063375a7cba1461043e5761031a565b806305308b9f1461031f57806312348e961461034a5780631327d3d81461036c5780631488ca081461038c578063158ef93e146103bc578063186db48f146103de575b600080fd5b34801561032b57600080fd5b50610334610946565b6040516103419190614916565b60405180910390f35b34801561035657600080fd5b5061036a610365366004613ef0565b61094c565b005b34801561037857600080fd5b5061036a610387366004613be8565b610a22565b34801561039857600080fd5b506103ac6103a7366004613be8565b610ae5565b604051610341949392919061418b565b3480156103c857600080fd5b506103d1610b10565b6040516103419190614180565b3480156103ea57600080fd5b5061036a6103f9366004613d8d565b610b19565b34801561040a57600080fd5b5061036a610419366004613ce2565b610c77565b34801561042a57600080fd5b5061036a610439366004613ef0565b610ec4565b34801561044a57600080fd5b50610453610f5a565b60405161034191906140ac565b34801561046c57600080fd5b50610475610fbc565b6040516103419190613fcb565b34801561048e57600080fd5b5061036a610fcb565b3480156104a357600080fd5b5061036a6104b2366004613d4d565b611027565b3480156104c357600080fd5b5061036a6104d2366004613d22565b611110565b3480156104e357600080fd5b506104536104f2366004613be8565b611330565b34801561050357600080fd5b506104756113a6565b34801561051857600080fd5b506104756113b5565b34801561052d57600080fd5b506103d16113c4565b34801561054257600080fd5b5061036a610551366004613be8565b6113cd565b34801561056257600080fd5b5061036a610571366004613c92565b611490565b34801561058257600080fd5b5061036a610591366004613be8565b6115ef565b3480156105a257600080fd5b506105b66105b1366004613be8565b611689565b60405161034191906148e9565b3480156105cf57600080fd5b5061036a6116e4565b3480156105e457600080fd5b5061036a6105f3366004613be8565b61176d565b34801561060457600080fd5b5061036a611835565b34801561061957600080fd5b50610334610628366004613d22565b6118c8565b34801561063957600080fd5b5061036a611a7e565b34801561064e57600080fd5b50610475611ad8565b34801561066357600080fd5b50610334611ae7565b34801561067857600080fd5b50610475611aed565b34801561068d57600080fd5b506103d161069c366004613c5a565b611afc565b3480156106ad57600080fd5b506103d16106bc366004613c5a565b611b1c565b3480156106cd57600080fd5b506103346106dc366004613d22565b611b4c565b3480156106ed57600080fd5b506104756106fc366004613d22565b611c04565b34801561070d57600080fd5b5061036a61071c366004613ef0565b611c39565b61036a61072f366004613d22565b611cc0565b34801561074057600080fd5b50610475611dc9565b34801561075557600080fd5b50610475610764366004613ef0565b611ddd565b610334610777366004613ce2565b611e04565b34801561078857600080fd5b5061036a610797366004613d22565b61219e565b3480156107a857600080fd5b5061036a6107b7366004613df6565b612358565b3480156107c857600080fd5b5061036a6107d7366004613be8565b61238d565b3480156107e857600080fd5b5061036a6107f7366004613d8d565b612426565b34801561080857600080fd5b5061036a610817366004613c20565b61257d565b34801561082857600080fd5b50610475612742565b34801561083d57600080fd5b5061036a61084c366004613be8565b612751565b34801561085d57600080fd5b5061036a61086c366004613be8565b6129f8565b61036a61087f366004613c92565b612abb565b34801561089057600080fd5b5061036a61089f366004613be8565b612fbd565b3480156108b057600080fd5b5061036a6108bf366004613be8565b6131c4565b3480156108d057600080fd5b5061036a6108df366004613be8565b61325b565b6103346108f2366004613d22565b61331e565b34801561090357600080fd5b5061036a610912366004613be8565b6135fa565b34801561092357600080fd5b50610937610932366004613be8565b6136ba565b6040516103419392919061491f565b600a5481565b60025461010090046001600160a01b0316331480610982575061096d611aed565b6001600160a01b0316336001600160a01b0316145b6109a75760405162461bcd60e51b815260040161099e906143e9565b60405180910390fd5b66b1a2bc2ec5000081101580156109c65750670c7d713b49da00008111155b6109e25760405162461bcd60e51b815260040161099e90614699565b600a8190556040517fd88469f5aa8525dce9ae07fa2d8df83e2ec766fc060483b66a0082ff36d6582d90610a17908390614916565b60405180910390a150565b60025461010090046001600160a01b0316331480610a585750610a43611aed565b6001600160a01b0316336001600160a01b0316145b610a745760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038116610a9a5760405162461bcd60e51b815260040161099e9061476a565b600480546001600160a01b0319166001600160a01b0383161790556040517fb3a3a56265020415cf2f7ff198e2052a6e1d43d7eb127450af725829e40e08c290610a17908390613fcb565b600960205260009081526040902080546001820154600283015460039093015460ff90921692909184565b600e5460ff1681565b60025461010090046001600160a01b0316331480610b4f5750610b3a611aed565b6001600160a01b0316336001600160a01b0316145b610b6b5760405162461bcd60e51b815260040161099e906143e9565b8215801590610b7957508281145b610b955760405162461bcd60e51b815260040161099e906147d8565b60005b83811015610c7057828282818110610bac57fe5b9050602002013560096000878785818110610bc357fe5b9050602002016020810190610bd89190613be8565b6001600160a01b03168152602081019190915260400160002060020155848482818110610c0157fe5b9050602002016020810190610c169190613be8565b6001600160a01b03167f84d2db42497fc6f1882756be420935d982025ad8a2a903dfb83638a09e49a775848484818110610c4c57fe5b90506020020135604051610c609190614916565b60405180910390a2600101610b98565b5050505050565b6001600160a01b038216600090815260096020526040902054829060ff16610cb15760405162461bcd60e51b815260040161099e906146d0565b6003546001600160a01b03163314610cdb5760405162461bcd60e51b815260040161099e906141a8565b60026001541415610cfe5760405162461bcd60e51b815260040161099e9061487b565b6002600155610d0b6113c4565b15610d285760405162461bcd60e51b815260040161099e906144d5565b610d32838561374d565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c91610d659187918991889101614002565b602060405180830381600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db79190613e93565b610dd35760405162461bcd60e51b815260040161099e906144ff565b6040516319fce43b60e11b81526001600160a01b038416906333f9c87690610e0390339088908790600401614002565b602060405180830381600087803b158015610e1d57600080fd5b505af1158015610e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e559190613f08565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90610e88908690889060040161403f565b600060405180830381600087803b158015610ea257600080fd5b505af1158015610eb6573d6000803e3d6000fd5b505060018055505050505050565b60026001541415610ee75760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163f3c15dcb60e01b81526001600160a01b039091169063f3c15dcb90610f2190600890339086906004016140fc565b600060405180830381600087803b158015610f3b57600080fd5b505af1158015610f4f573d6000803e3d6000fd5b505060018055505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610fb257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f94575b5050505050905090565b6004546001600160a01b031681565b60025461010090046001600160a01b03163314806110015750610fec611aed565b6001600160a01b0316336001600160a01b0316145b61101d5760405162461bcd60e51b815260040161099e906143e9565b61102561383d565b565b60025461010090046001600160a01b031633148061105d5750611048611aed565b6001600160a01b0316336001600160a01b0316145b6110795760405162461bcd60e51b815260040161099e906143e9565b6002600154141561109c5760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163fedc611160e01b81526001600160a01b039091169063fedc6111906110d6906008908690869060040161412a565b600060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b50506001805550505050565b6001600160a01b038216600090815260096020526040902054829060ff1661114a5760405162461bcd60e51b815260040161099e906146d0565b6002600154141561116d5760405162461bcd60e51b815260040161099e9061487b565b600260015561117a6113c4565b156111975760405162461bcd60e51b815260040161099e906144d5565b6111a1833361374d565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c916111d49187913391889101614002565b602060405180830381600087803b1580156111ee57600080fd5b505af1158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190613e93565b6112425760405162461bcd60e51b815260040161099e906144ff565b604051634b8a352960e01b81526001600160a01b03841690634b8a3529906112709033908690600401614026565b602060405180830381600087803b15801561128a57600080fd5b505af115801561129e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c29190613f08565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce906112f5908690339060040161403f565b600060405180830381600087803b15801561130f57600080fd5b505af1158015611323573d6000803e3d6000fd5b5050600180555050505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561139a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161137c575b50505050509050919050565b6006546001600160a01b031681565b6005546001600160a01b031681565b60025460ff1690565b60025461010090046001600160a01b031633148061140357506113ee611aed565b6001600160a01b0316336001600160a01b0316145b61141f5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166114455760405162461bcd60e51b815260040161099e90614283565b600680546001600160a01b0319166001600160a01b0383161790556040517f2351f252c60252e548e93df4d785886faa1d88410325b8bce69d624a25583ae790610a17908390613fcb565b600260015414156114b35760405162461bcd60e51b815260040161099e9061487b565b60026001556000805b60085481101561150057600881815481106114d357fe5b6000918252602090912001546001600160a01b03163314156114f85760019150611500565b6001016114bc565b506001811515146115235760405162461bcd60e51b815260040161099e90614430565b604051636119bced60e11b8152339063c23379da9061154c908890889088908890600401614059565b600060405180830381600087803b15801561156657600080fd5b505af115801561157a573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b91506115b290339088908890600401613fdf565b600060405180830381600087803b1580156115cc57600080fd5b505af11580156115e0573d6000803e3d6000fd5b50506001805550505050505050565b60025461010090046001600160a01b03163314806116255750611610611aed565b6001600160a01b0316336001600160a01b0316145b6116415760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166116675760405162461bcd60e51b815260040161099e90614735565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611691613b49565b506001600160a01b03166000908152600960209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015290565b6116ec6138ab565b6001600160a01b03166116fd611aed565b6001600160a01b0316146117235760405162461bcd60e51b815260040161099e9061462d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025461010090046001600160a01b03163314806117a3575061178e611aed565b6001600160a01b0316336001600160a01b0316145b6117bf5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166117e55760405162461bcd60e51b815260040161099e9061449e565b60028054610100600160a81b0319166101006001600160a01b038416021790556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e90610a17908390613fcb565b600260015414156118585760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163025181bb60e41b81526001600160a01b03909116906325181bb0906118909060089033906004016140e9565b600060405180830381600087803b1580156118aa57600080fd5b505af11580156118be573d6000803e3d6000fd5b5050600180555050565b6001600160a01b038216600090815260096020526040812054839060ff166119025760405162461bcd60e51b815260040161099e906146d0565b600260015414156119255760405162461bcd60e51b815260040161099e9061487b565b60026001556119326113c4565b1561194f5760405162461bcd60e51b815260040161099e906144d5565b60405163830cbbbd60e01b81526000906001600160a01b0386169063830cbbbd906119809033908890600401614026565b602060405180830381600087803b15801561199a57600080fd5b505af11580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d29190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90611a05908890339060040161403f565b600060405180830381600087803b158015611a1f57600080fd5b505af1158015611a33573d6000803e3d6000fd5b505050507fda2fcb771cce6a80cd6c0101db394f4fd1f8755def9185535cc97509f3e03cdd338683604051611a6a93929190614002565b60405180910390a160018055949350505050565b60025461010090046001600160a01b0316331480611ab45750611a9f611aed565b6001600160a01b0316336001600160a01b0316145b611ad05760405162461bcd60e51b815260040161099e906143e9565b6110256138af565b6007546001600160a01b031681565b600b5481565b6000546001600160a01b031690565b600d60209081526000928352604080842090915290825290205460ff1681565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205460ff165b92915050565b6001600160a01b038216600090815260096020526040812054839060ff16611b865760405162461bcd60e51b815260040161099e906146d0565b60026001541415611ba95760405162461bcd60e51b815260040161099e9061487b565b6002600155611bb66113c4565b15611bd35760405162461bcd60e51b815260040161099e906144d5565b6040516312c5282f60e31b81526000906001600160a01b038616906396294178906119809033908890600401614026565b600c6020528160005260406000208181548110611c1d57fe5b6000918252602090912001546001600160a01b03169150829050565b60025461010090046001600160a01b0316331480611c6f5750611c5a611aed565b6001600160a01b0316336001600160a01b0316145b611c8b5760405162461bcd60e51b815260040161099e906143e9565b600b8190556040517f6791c9b68799eda502f8f7808e4ab556a632237eea58a66c4f7e4e6f94574d0d90610a17908390614916565b6001600160a01b038216600090815260096020526040902054829060ff16611cfa5760405162461bcd60e51b815260040161099e906146d0565b60026001541415611d1d5760405162461bcd60e51b815260040161099e9061487b565b6002600155611d2a6113c4565b15611d475760405162461bcd60e51b815260040161099e906144d5565b60405163157b6bd560e31b81526001600160a01b0384169063abdb5ea8903490611d779033908790600401614026565b6020604051808303818588803b158015611d9057600080fd5b505af1158015611da4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112c29190613f08565b60025461010090046001600160a01b031681565b60088181548110611dea57fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038216600090815260096020526040812054839060ff16611e3e5760405162461bcd60e51b815260040161099e906146d0565b60026001541415611e615760405162461bcd60e51b815260040161099e9061487b565b6002600155611e6e6113c4565b15611e8b5760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611ecf57600080fd5b505afa158015611ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f079190613c04565b6001600160a01b031614611f1b5782611f1d565b345b6001600160a01b03851660009081526009602052604090206001015490935080158061204f57508061204c85612046670de0b6b3a76400006120408a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9157600080fd5b505afa158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190613f08565b8b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561200257600080fd5b505afa158015612016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203a9190613f08565b9061390a565b9061394b565b9061397d565b11155b61206b5760405162461bcd60e51b815260040161099e906143b2565b6000856001600160a01b031663bba6157834338a896040518563ffffffff1660e01b815260040161209e93929190614002565b6020604051808303818588803b1580156120b757600080fd5b505af11580156120cb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120f09190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b906121239089908b9060040161403f565b600060405180830381600087803b15801561213d57600080fd5b505af1158015612151573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe17387878760405161218893929190614002565b60405180910390a1600180559695505050505050565b60025461010090046001600160a01b03163314806121d457506121bf611aed565b6001600160a01b0316336001600160a01b0316145b6121f05760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038216600090815260096020526040902054829060ff1661222a5760405162461bcd60e51b815260040161099e906146d0565b670c7d713b49da00008211156122525760405162461bcd60e51b815260040161099e90614662565b81158015906122de575060075460405163fc57d4df60e01b81526001600160a01b039091169063fc57d4df9061228c908690600401613fcb565b60206040518083038186803b1580156122a457600080fd5b505afa1580156122b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122dc9190613f08565b155b156122fb5760405162461bcd60e51b815260040161099e90614344565b6001600160a01b03831660009081526009602052604090819020600301839055517f275d6207ccd4271a12c584febf2bcf32254205dfb4639ce1a9184d2e2609e2d09061234b9085908590614026565b60405180910390a1505050565b60005b81518110156123895761238182828151811061237357fe5b60200260200101513361374d565b60010161235b565b5050565b6123956138ab565b6001600160a01b03166123a6611aed565b6001600160a01b0316146123cc5760405162461bcd60e51b815260040161099e9061462d565b600e5460ff16156123ef5760405162461bcd60e51b815260040161099e9061452c565b6123f76139a2565b600780546001600160a01b0319166001600160a01b0392909216919091179055600e805460ff19166001179055565b60025461010090046001600160a01b031633148061245c5750612447611aed565b6001600160a01b0316336001600160a01b0316145b6124785760405162461bcd60e51b815260040161099e906143e9565b821580159061248657508281145b6124a25760405162461bcd60e51b815260040161099e906147d8565b60005b83811015610c70578282828181106124b957fe5b90506020020135600960008787858181106124d057fe5b90506020020160208101906124e59190613be8565b6001600160a01b0316815260208101919091526040016000206001015584848281811061250e57fe5b90506020020160208101906125239190613be8565b6001600160a01b03167f638a463c59949a284e093291dedfbadcb32ebf9007e649767344e67346ab882984848481811061255957fe5b9050602002013560405161256d9190614916565b60405180910390a26001016124a5565b60025461010090046001600160a01b03163314806125b3575061259e611aed565b6001600160a01b0316336001600160a01b0316145b6125cf5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b03841660009081526009602052604090205460ff16156126085760405162461bcd60e51b815260040161099e906148b2565b60005b60085481101561266757846001600160a01b03166008828154811061262c57fe5b6000918252602090912001546001600160a01b0316141561265f5760405162461bcd60e51b815260040161099e906148b2565b60010161260b565b506040805160808101825260018082526020808301878152838501878152606085018781526001600160a01b038b16600081815260099095528785209651875460ff1916901515178755925186860155905160028601555160039094019390935560088054928301815590527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055517fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f90612734908690613fcb565b60405180910390a150505050565b6003546001600160a01b031681565b60025461010090046001600160a01b03163314806127875750612772611aed565b6001600160a01b0316336001600160a01b0316145b6127a35760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b03811660009081526009602052604090205460ff166127db5760405162461bcd60e51b815260040161099e90614559565b806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284c9190613f08565b1580156128c75750806001600160a01b0316638285ef406040518163ffffffff1660e01b815260040160206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c59190613f08565b155b6128e35760405162461bcd60e51b815260040161099e906147a1565b60085460005b818110156129f357826001600160a01b03166008828154811061290857fe5b6000918252602090912001546001600160a01b031614156129eb576008600183038154811061293357fe5b600091825260209091200154600880546001600160a01b03909216918390811061295957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600880548061299257fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526009905260408120805460ff191681556001810182905560028101829055600301556129f3565b6001016128e9565b505050565b60025461010090046001600160a01b0316331480612a2e5750612a19611aed565b6001600160a01b0316336001600160a01b0316145b612a4a5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038116612a705760405162461bcd60e51b815260040161099e90614804565b600580546001600160a01b0319166001600160a01b0383161790556040517f827daa11640de0eb908d0b06593ffb3f2b5e14e83d678fb922e512075f1d36f090610a17908390613fcb565b60026001541415612ade5760405162461bcd60e51b815260040161099e9061487b565b6002600155612aeb6113c4565b15612b085760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4c57600080fd5b505afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b849190613c04565b6001600160a01b031614612b985780612b9a565b345b6001600160a01b03851660009081526009602052604090205490915060ff168015612bdd57506001600160a01b03831660009081526009602052604090205460ff165b612bf95760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612c3e5760405162461bcd60e51b815260040161099e9061484b565b6001600160a01b038316600090815260096020526040902060030154612c765760405162461bcd60e51b815260040161099e9061484b565b60048054600a546040516312e8123160e11b81526001600160a01b03909216926325d0246292612cad928992889288929101614083565b602060405180830381600087803b158015612cc757600080fd5b505af1158015612cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cff9190613e93565b612d1b5760405162461bcd60e51b815260040161099e906146fe565b600080856001600160a01b031663e61604cf34873388886040518663ffffffff1660e01b8152600401612d519493929190614059565b6060604051808303818588803b158015612d6a57600080fd5b505af1158015612d7e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612da39190613f20565b60405163b2a02ff160e01b815291945092506001600160a01b038716915063b2a02ff190612dd990339088908690600401614002565b600060405180830381600087803b158015612df357600080fd5b505af1158015612e07573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b9150612e3f90889088903390600401613fdf565b600060405180830381600087803b158015612e5957600080fd5b505af1158015612e6d573d6000803e3d6000fd5b505050506000821115612f4d5760055460405163b2a02ff160e01b81526001600160a01b038781169263b2a02ff192612eb0929091169088908790600401614002565b600060405180830381600087803b158015612eca57600080fd5b505af1158015612ede573d6000803e3d6000fd5b505060065460055460405163dd9aba1b60e01b81526001600160a01b03928316945063dd9aba1b9350612f1a928a928a92911690600401613fdf565b600060405180830381600087803b158015612f3457600080fd5b505af1158015612f48573d6000803e3d6000fd5b505050505b6006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90612f7f908990889060040161403f565b600060405180830381600087803b158015612f9957600080fd5b505af1158015612fad573d6000803e3d6000fd5b5050600180555050505050505050565b6001600160a01b038116600090815260096020526040902054819060ff16612ff75760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b0382166000908152600d60209081526040808320338452909152902054829060ff1661303c5760405162461bcd60e51b815260040161099e9061424c565b613044613b73565b60405163497d274760e11b81526001600160a01b038516906392fa4e8e90613070903390600401613fcb565b606060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c29190613eb3565b905080602001516000146130e85760405162461bcd60e51b815260040161099e9061420b565b60048054825160405163eabe7d9160e01b81526001600160a01b039092169263eabe7d919261311b928992339201614002565b602060405180830381600087803b15801561313557600080fd5b505af1158015613149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316d9190613e93565b6131895760405162461bcd60e51b815260040161099e90614588565b61319384336139bc565b7fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d843360405161273492919061403f565b600260015414156131e75760405162461bcd60e51b815260040161099e9061487b565b600260019081556040805182815280820190915260609160208083019080368337019050509050818160008151811061321c57fe5b6001600160a01b03928316602091820292909201015260065460405163025181bb60e41b81529116906325181bb0906110d690849033906004016140bf565b60025461010090046001600160a01b0316331480613291575061327c611aed565b6001600160a01b0316336001600160a01b0316145b6132ad5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166132d35760405162461bcd60e51b815260040161099e9061430d565b600380546001600160a01b0319166001600160a01b0383161790556040517f21887d3c26545972adeaf9e44bd9aa5b527cd2b60b24cce6171828a07c564ea990610a17908390613fcb565b6001600160a01b038216600090815260096020526040812054839060ff166133585760405162461bcd60e51b815260040161099e906146d0565b6002600154141561337b5760405162461bcd60e51b815260040161099e9061487b565b60026001556133886113c4565b156133a55760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156133e957600080fd5b505afa1580156133fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134219190613c04565b6001600160a01b0316146134355782613437565b345b6001600160a01b0385166000908152600960205260409020600101549093508015806134ae5750806134ab85612046670de0b6b3a76400006120408a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9157600080fd5b11155b6134ca5760405162461bcd60e51b815260040161099e906143b2565b6000856001600160a01b031663f2b9fdb83433886040518463ffffffff1660e01b81526004016134fb929190614026565b6020604051808303818588803b15801561351457600080fd5b505af1158015613528573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061354d9190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90613580908990339060040161403f565b600060405180830381600087803b15801561359a57600080fd5b505af11580156135ae573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe1733387876040516135e593929190614002565b60405180910390a16001805595945050505050565b6136026138ab565b6001600160a01b0316613613611aed565b6001600160a01b0316146136395760405162461bcd60e51b815260040161099e9061462d565b6001600160a01b03811661365f5760405162461bcd60e51b815260040161099e906142c7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604051635ec88c7960e01b8152600092839283926001600160a01b0390911691635ec88c79916136f091889101613fcb565b60606040518083038186803b15801561370857600080fd5b505afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190613f20565b9250925092509193909250565b6001600160a01b038216600090815260096020526040902054829060ff166137875760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff166129f3576001600160a01b038084166000818152600d602090815260408083209487168352938152838220805460ff19166001908117909155600c825284832080549182018155835291200180546001600160a01b0319169091179055517f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a59061234b908590859061403f565b6138456113c4565b6138615760405162461bcd60e51b815260040161099e906141dd565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6138946138ab565b6040516138a19190613fcb565b60405180910390a1565b3390565b6138b76113c4565b156138d45760405162461bcd60e51b815260040161099e906144d5565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138946138ab565b60008261391957506000611b46565b8282028284828161392657fe5b04146139445760405162461bcd60e51b815260040161099e906145b5565b9392505050565b600080821161396c5760405162461bcd60e51b815260040161099e90614467565b81838161397557fe5b049392505050565b6000828201838110156139445760405162461bcd60e51b815260040161099e9061437b565b6706f05b59d3b20000600a55670ff59ee833b30000600b55565b6001600160a01b0381166000908152600c60205260409020546139f15760405162461bcd60e51b815260040161099e906145f6565b6001600160a01b038083166000908152600d602090815260408083209385168352928152828220805460ff19169055600c905290812054905b81811015613b43576001600160a01b038381166000908152600c6020526040902080549186169183908110613a5b57fe5b6000918252602090912001546001600160a01b03161415613b3b576001600160a01b0383166000908152600c6020526040902080546000198401908110613a9e57fe5b60009182526020808320909101546001600160a01b038681168452600c9092526040909220805491909216919083908110613ad557fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600c90915260409020805480613b1457fe5b600082815260209020810160001990810180546001600160a01b0319169055019055613b43565b600101613a2a565b50505050565b60405180608001604052806000151581526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b8035611b468161497c565b60008083601f840112613bb0578182fd5b50813567ffffffffffffffff811115613bc7578182fd5b6020830191508360208083028501011115613be157600080fd5b9250929050565b600060208284031215613bf9578081fd5b81356139448161497c565b600060208284031215613c15578081fd5b81516139448161497c565b60008060008060808587031215613c35578283fd5b8435613c408161497c565b966020860135965060408601359560600135945092505050565b60008060408385031215613c6c578182fd5b8235613c778161497c565b91506020830135613c878161497c565b809150509250929050565b60008060008060808587031215613ca7578384fd5b8435613cb28161497c565b93506020850135613cc28161497c565b92506040850135613cd28161497c565b9396929550929360600135925050565b600080600060608486031215613cf6578283fd5b8335613d018161497c565b92506020840135613d118161497c565b929592945050506040919091013590565b60008060408385031215613d34578182fd5b8235613d3f8161497c565b946020939093013593505050565b60008060208385031215613d5f578182fd5b823567ffffffffffffffff811115613d75578283fd5b613d8185828601613b9f565b90969095509350505050565b60008060008060408587031215613da2578384fd5b843567ffffffffffffffff80821115613db9578586fd5b613dc588838901613b9f565b90965094506020870135915080821115613ddd578384fd5b50613dea87828801613b9f565b95989497509550505050565b60006020808385031215613e08578182fd5b823567ffffffffffffffff811115613e1e578283fd5b8301601f81018513613e2e578283fd5b8035613e41613e3c8261495c565b614935565b8181528381019083850185840285018601891015613e5d578687fd5b8694505b83851015613e8757613e738982613b94565b835260019490940193918501918501613e61565b50979650505050505050565b600060208284031215613ea4578081fd5b81518015158114613944578182fd5b600060608284031215613ec4578081fd5b613ece6060614935565b8251815260208301516020820152604083015160408201528091505092915050565b600060208284031215613f01578081fd5b5035919050565b600060208284031215613f19578081fd5b5051919050565b600080600060608486031215613f34578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613f855781516001600160a01b031687529582019590820190600101613f60565b509495945050505050565b6000815480845260208085019450838352808320835b83811015613f855781546001600160a01b031687529582019560019182019101613fa6565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082526139446020830184613f4d565b6000604082526140d26040830185613f4d565b905060018060a01b03831660208301529392505050565b6000604082526140d26040830185613f90565b60006060825261410f6060830186613f90565b6001600160a01b039490941660208301525060400152919050565b60006040825261413d6040830186613f90565b82810360208481019190915284825285918101835b86811015613e875783356141658161497c565b6001600160a01b031682529282019290820190600101614152565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b6020808252818101527f436f72653a2063616c6c65722073686f756c64206265206c6576657261676572604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526021908201527f436f72653a20626f72726f772062616c616e6365206d757374206265207a65726040820152606f60f81b606082015260800190565b60208082526017908201527f436f72653a206d75737420656e746572206d61726b6574000000000000000000604082015260600190565b60208082526024908201527f436f72653a20696e76616c6964206c61624469737472696275746f72206164646040820152637265737360e01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601f908201527f436f72653a20696e76616c6964206c6576657261676572206164647265737300604082015260600190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672070726963650000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f436f72653a20737570706c792063617020726561636865640000000000000000604082015260600190565b60208082526027908201527f436f72653a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152661035b2b2b832b960c91b606082015260800190565b6020808252601d908201527f436f72653a2063616c6c65722073686f756c64206265206d61726b6574000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f436f72653a20696e76616c6964206b6565706572206164647265737300000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f7420626f72726f7760681b604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526015908201527410dbdc994e881d5b9b1a5cdd1959081b585c9ad95d605a1b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f742072656465656d60681b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f436f72653a2063616e6e6f7420706f702075736572206d61726b657400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f436f72653a20696e76616c696420636f6c6c61746572616c20666163746f7200604082015260600190565b6020808252601a908201527f436f72653a20696e76616c696420636c6f736520666163746f72000000000000604082015260600190565b60208082526014908201527310dbdc994e881a5b9d985b1a59081b585c9ad95d60621b604082015260600190565b6020808252601d908201527f436f72653a2063616e6e6f74206c697175696461746520626f72726f77000000604082015260600190565b6020808252818101527f436f72653a20696e76616c69642063616c63756c61746f722061646472657373604082015260600190565b6020808252601f908201527f436f72653a20696e76616c69642076616c696461746f72206164647265737300604082015260600190565b6020808252601a908201527f436f72653a2063616e6e6f742072656d6f7665206d61726b6574000000000000604082015260600190565b602080825260129082015271436f72653a20696e76616c6964206461746160701b604082015260600190565b60208082526027908201527f436f72653a20696e76616c6964207265626174654469737472696275746f72206040820152666164647265737360c81b606082015260800190565b60208082526016908201527510dbdc994e881b9bdd08184818dbdb1b185d195c985b60521b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f436f72653a20616c7265616479206c6973746564206d61726b65740000000000604082015260600190565b81511515815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561495457600080fd5b604052919050565b600067ffffffffffffffff821115614972578081fd5b5060209081020190565b6001600160a01b038116811461499157600080fd5b5056fea2646970667358221220c29c43d173369c81629c40fbaaf3d4cf39a779d1e898cb8ecded94de7c929c4f64736f6c634300060c0033

Deployed Bytecode

0x60806040526004361061031a5760003560e01c80638b95e335116101ab578063c2998238116100f7578063e61604cf11610095578063f187186c1161006f578063f187186c146108c4578063f2b9fdb8146108e4578063f2fde38b146108f7578063f8982e7a146109175761031a565b8063e61604cf14610871578063ede4edd014610884578063eefc5947146108a45761031a565b8063d9452b04116100d1578063d9452b04146107fc578063db3e34611461081c578063db91323614610831578063de02d642146108515761031a565b8063c29982381461079c578063c4d66de8146107bc578063d136af44146107dc5761031a565b8063a2a2d5bb11610164578063aced16611161013e578063aced166114610734578063b1283e7714610749578063bba6157814610769578063c04f31ff1461077c5761031a565b8063a2a2d5bb146106e1578063a843108114610701578063abdb5ea8146107215761031a565b80638b95e335146106425780638c765e94146106575780638da5cb5b1461066c578063928fe47714610681578063929fe9a1146106a157806396294178146106c15761031a565b80635189e1101161026a5780636922d7b611610223578063748747e6116101fd578063748747e6146105d85780637f0927f2146105f8578063830cbbbd1461060d5780638456cb591461062d5761031a565b80636922d7b6146105765780636e8584fd14610596578063715018a6146105c35761031a565b80635189e110146104d7578063571abe30146104f757806359341a1a1461050c5780635c975abb1461052157806366ae02091461053657806368155ec1146105565761031a565b806333f9c876116102d75780633a5381b5116102b15780633a5381b5146104605780633f4ba83a146104825780634036c8b5146104975780634b8a3529146104b75761031a565b806333f9c876146103fe57806334e115be1461041e578063375a7cba1461043e5761031a565b806305308b9f1461031f57806312348e961461034a5780631327d3d81461036c5780631488ca081461038c578063158ef93e146103bc578063186db48f146103de575b600080fd5b34801561032b57600080fd5b50610334610946565b6040516103419190614916565b60405180910390f35b34801561035657600080fd5b5061036a610365366004613ef0565b61094c565b005b34801561037857600080fd5b5061036a610387366004613be8565b610a22565b34801561039857600080fd5b506103ac6103a7366004613be8565b610ae5565b604051610341949392919061418b565b3480156103c857600080fd5b506103d1610b10565b6040516103419190614180565b3480156103ea57600080fd5b5061036a6103f9366004613d8d565b610b19565b34801561040a57600080fd5b5061036a610419366004613ce2565b610c77565b34801561042a57600080fd5b5061036a610439366004613ef0565b610ec4565b34801561044a57600080fd5b50610453610f5a565b60405161034191906140ac565b34801561046c57600080fd5b50610475610fbc565b6040516103419190613fcb565b34801561048e57600080fd5b5061036a610fcb565b3480156104a357600080fd5b5061036a6104b2366004613d4d565b611027565b3480156104c357600080fd5b5061036a6104d2366004613d22565b611110565b3480156104e357600080fd5b506104536104f2366004613be8565b611330565b34801561050357600080fd5b506104756113a6565b34801561051857600080fd5b506104756113b5565b34801561052d57600080fd5b506103d16113c4565b34801561054257600080fd5b5061036a610551366004613be8565b6113cd565b34801561056257600080fd5b5061036a610571366004613c92565b611490565b34801561058257600080fd5b5061036a610591366004613be8565b6115ef565b3480156105a257600080fd5b506105b66105b1366004613be8565b611689565b60405161034191906148e9565b3480156105cf57600080fd5b5061036a6116e4565b3480156105e457600080fd5b5061036a6105f3366004613be8565b61176d565b34801561060457600080fd5b5061036a611835565b34801561061957600080fd5b50610334610628366004613d22565b6118c8565b34801561063957600080fd5b5061036a611a7e565b34801561064e57600080fd5b50610475611ad8565b34801561066357600080fd5b50610334611ae7565b34801561067857600080fd5b50610475611aed565b34801561068d57600080fd5b506103d161069c366004613c5a565b611afc565b3480156106ad57600080fd5b506103d16106bc366004613c5a565b611b1c565b3480156106cd57600080fd5b506103346106dc366004613d22565b611b4c565b3480156106ed57600080fd5b506104756106fc366004613d22565b611c04565b34801561070d57600080fd5b5061036a61071c366004613ef0565b611c39565b61036a61072f366004613d22565b611cc0565b34801561074057600080fd5b50610475611dc9565b34801561075557600080fd5b50610475610764366004613ef0565b611ddd565b610334610777366004613ce2565b611e04565b34801561078857600080fd5b5061036a610797366004613d22565b61219e565b3480156107a857600080fd5b5061036a6107b7366004613df6565b612358565b3480156107c857600080fd5b5061036a6107d7366004613be8565b61238d565b3480156107e857600080fd5b5061036a6107f7366004613d8d565b612426565b34801561080857600080fd5b5061036a610817366004613c20565b61257d565b34801561082857600080fd5b50610475612742565b34801561083d57600080fd5b5061036a61084c366004613be8565b612751565b34801561085d57600080fd5b5061036a61086c366004613be8565b6129f8565b61036a61087f366004613c92565b612abb565b34801561089057600080fd5b5061036a61089f366004613be8565b612fbd565b3480156108b057600080fd5b5061036a6108bf366004613be8565b6131c4565b3480156108d057600080fd5b5061036a6108df366004613be8565b61325b565b6103346108f2366004613d22565b61331e565b34801561090357600080fd5b5061036a610912366004613be8565b6135fa565b34801561092357600080fd5b50610937610932366004613be8565b6136ba565b6040516103419392919061491f565b600a5481565b60025461010090046001600160a01b0316331480610982575061096d611aed565b6001600160a01b0316336001600160a01b0316145b6109a75760405162461bcd60e51b815260040161099e906143e9565b60405180910390fd5b66b1a2bc2ec5000081101580156109c65750670c7d713b49da00008111155b6109e25760405162461bcd60e51b815260040161099e90614699565b600a8190556040517fd88469f5aa8525dce9ae07fa2d8df83e2ec766fc060483b66a0082ff36d6582d90610a17908390614916565b60405180910390a150565b60025461010090046001600160a01b0316331480610a585750610a43611aed565b6001600160a01b0316336001600160a01b0316145b610a745760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038116610a9a5760405162461bcd60e51b815260040161099e9061476a565b600480546001600160a01b0319166001600160a01b0383161790556040517fb3a3a56265020415cf2f7ff198e2052a6e1d43d7eb127450af725829e40e08c290610a17908390613fcb565b600960205260009081526040902080546001820154600283015460039093015460ff90921692909184565b600e5460ff1681565b60025461010090046001600160a01b0316331480610b4f5750610b3a611aed565b6001600160a01b0316336001600160a01b0316145b610b6b5760405162461bcd60e51b815260040161099e906143e9565b8215801590610b7957508281145b610b955760405162461bcd60e51b815260040161099e906147d8565b60005b83811015610c7057828282818110610bac57fe5b9050602002013560096000878785818110610bc357fe5b9050602002016020810190610bd89190613be8565b6001600160a01b03168152602081019190915260400160002060020155848482818110610c0157fe5b9050602002016020810190610c169190613be8565b6001600160a01b03167f84d2db42497fc6f1882756be420935d982025ad8a2a903dfb83638a09e49a775848484818110610c4c57fe5b90506020020135604051610c609190614916565b60405180910390a2600101610b98565b5050505050565b6001600160a01b038216600090815260096020526040902054829060ff16610cb15760405162461bcd60e51b815260040161099e906146d0565b6003546001600160a01b03163314610cdb5760405162461bcd60e51b815260040161099e906141a8565b60026001541415610cfe5760405162461bcd60e51b815260040161099e9061487b565b6002600155610d0b6113c4565b15610d285760405162461bcd60e51b815260040161099e906144d5565b610d32838561374d565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c91610d659187918991889101614002565b602060405180830381600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db79190613e93565b610dd35760405162461bcd60e51b815260040161099e906144ff565b6040516319fce43b60e11b81526001600160a01b038416906333f9c87690610e0390339088908790600401614002565b602060405180830381600087803b158015610e1d57600080fd5b505af1158015610e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e559190613f08565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90610e88908690889060040161403f565b600060405180830381600087803b158015610ea257600080fd5b505af1158015610eb6573d6000803e3d6000fd5b505060018055505050505050565b60026001541415610ee75760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163f3c15dcb60e01b81526001600160a01b039091169063f3c15dcb90610f2190600890339086906004016140fc565b600060405180830381600087803b158015610f3b57600080fd5b505af1158015610f4f573d6000803e3d6000fd5b505060018055505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610fb257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f94575b5050505050905090565b6004546001600160a01b031681565b60025461010090046001600160a01b03163314806110015750610fec611aed565b6001600160a01b0316336001600160a01b0316145b61101d5760405162461bcd60e51b815260040161099e906143e9565b61102561383d565b565b60025461010090046001600160a01b031633148061105d5750611048611aed565b6001600160a01b0316336001600160a01b0316145b6110795760405162461bcd60e51b815260040161099e906143e9565b6002600154141561109c5760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163fedc611160e01b81526001600160a01b039091169063fedc6111906110d6906008908690869060040161412a565b600060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b50506001805550505050565b6001600160a01b038216600090815260096020526040902054829060ff1661114a5760405162461bcd60e51b815260040161099e906146d0565b6002600154141561116d5760405162461bcd60e51b815260040161099e9061487b565b600260015561117a6113c4565b156111975760405162461bcd60e51b815260040161099e906144d5565b6111a1833361374d565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c916111d49187913391889101614002565b602060405180830381600087803b1580156111ee57600080fd5b505af1158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190613e93565b6112425760405162461bcd60e51b815260040161099e906144ff565b604051634b8a352960e01b81526001600160a01b03841690634b8a3529906112709033908690600401614026565b602060405180830381600087803b15801561128a57600080fd5b505af115801561129e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c29190613f08565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce906112f5908690339060040161403f565b600060405180830381600087803b15801561130f57600080fd5b505af1158015611323573d6000803e3d6000fd5b5050600180555050505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561139a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161137c575b50505050509050919050565b6006546001600160a01b031681565b6005546001600160a01b031681565b60025460ff1690565b60025461010090046001600160a01b031633148061140357506113ee611aed565b6001600160a01b0316336001600160a01b0316145b61141f5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166114455760405162461bcd60e51b815260040161099e90614283565b600680546001600160a01b0319166001600160a01b0383161790556040517f2351f252c60252e548e93df4d785886faa1d88410325b8bce69d624a25583ae790610a17908390613fcb565b600260015414156114b35760405162461bcd60e51b815260040161099e9061487b565b60026001556000805b60085481101561150057600881815481106114d357fe5b6000918252602090912001546001600160a01b03163314156114f85760019150611500565b6001016114bc565b506001811515146115235760405162461bcd60e51b815260040161099e90614430565b604051636119bced60e11b8152339063c23379da9061154c908890889088908890600401614059565b600060405180830381600087803b15801561156657600080fd5b505af115801561157a573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b91506115b290339088908890600401613fdf565b600060405180830381600087803b1580156115cc57600080fd5b505af11580156115e0573d6000803e3d6000fd5b50506001805550505050505050565b60025461010090046001600160a01b03163314806116255750611610611aed565b6001600160a01b0316336001600160a01b0316145b6116415760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166116675760405162461bcd60e51b815260040161099e90614735565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611691613b49565b506001600160a01b03166000908152600960209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015290565b6116ec6138ab565b6001600160a01b03166116fd611aed565b6001600160a01b0316146117235760405162461bcd60e51b815260040161099e9061462d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025461010090046001600160a01b03163314806117a3575061178e611aed565b6001600160a01b0316336001600160a01b0316145b6117bf5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166117e55760405162461bcd60e51b815260040161099e9061449e565b60028054610100600160a81b0319166101006001600160a01b038416021790556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e90610a17908390613fcb565b600260015414156118585760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163025181bb60e41b81526001600160a01b03909116906325181bb0906118909060089033906004016140e9565b600060405180830381600087803b1580156118aa57600080fd5b505af11580156118be573d6000803e3d6000fd5b5050600180555050565b6001600160a01b038216600090815260096020526040812054839060ff166119025760405162461bcd60e51b815260040161099e906146d0565b600260015414156119255760405162461bcd60e51b815260040161099e9061487b565b60026001556119326113c4565b1561194f5760405162461bcd60e51b815260040161099e906144d5565b60405163830cbbbd60e01b81526000906001600160a01b0386169063830cbbbd906119809033908890600401614026565b602060405180830381600087803b15801561199a57600080fd5b505af11580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d29190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90611a05908890339060040161403f565b600060405180830381600087803b158015611a1f57600080fd5b505af1158015611a33573d6000803e3d6000fd5b505050507fda2fcb771cce6a80cd6c0101db394f4fd1f8755def9185535cc97509f3e03cdd338683604051611a6a93929190614002565b60405180910390a160018055949350505050565b60025461010090046001600160a01b0316331480611ab45750611a9f611aed565b6001600160a01b0316336001600160a01b0316145b611ad05760405162461bcd60e51b815260040161099e906143e9565b6110256138af565b6007546001600160a01b031681565b600b5481565b6000546001600160a01b031690565b600d60209081526000928352604080842090915290825290205460ff1681565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205460ff165b92915050565b6001600160a01b038216600090815260096020526040812054839060ff16611b865760405162461bcd60e51b815260040161099e906146d0565b60026001541415611ba95760405162461bcd60e51b815260040161099e9061487b565b6002600155611bb66113c4565b15611bd35760405162461bcd60e51b815260040161099e906144d5565b6040516312c5282f60e31b81526000906001600160a01b038616906396294178906119809033908890600401614026565b600c6020528160005260406000208181548110611c1d57fe5b6000918252602090912001546001600160a01b03169150829050565b60025461010090046001600160a01b0316331480611c6f5750611c5a611aed565b6001600160a01b0316336001600160a01b0316145b611c8b5760405162461bcd60e51b815260040161099e906143e9565b600b8190556040517f6791c9b68799eda502f8f7808e4ab556a632237eea58a66c4f7e4e6f94574d0d90610a17908390614916565b6001600160a01b038216600090815260096020526040902054829060ff16611cfa5760405162461bcd60e51b815260040161099e906146d0565b60026001541415611d1d5760405162461bcd60e51b815260040161099e9061487b565b6002600155611d2a6113c4565b15611d475760405162461bcd60e51b815260040161099e906144d5565b60405163157b6bd560e31b81526001600160a01b0384169063abdb5ea8903490611d779033908790600401614026565b6020604051808303818588803b158015611d9057600080fd5b505af1158015611da4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112c29190613f08565b60025461010090046001600160a01b031681565b60088181548110611dea57fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038216600090815260096020526040812054839060ff16611e3e5760405162461bcd60e51b815260040161099e906146d0565b60026001541415611e615760405162461bcd60e51b815260040161099e9061487b565b6002600155611e6e6113c4565b15611e8b5760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611ecf57600080fd5b505afa158015611ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f079190613c04565b6001600160a01b031614611f1b5782611f1d565b345b6001600160a01b03851660009081526009602052604090206001015490935080158061204f57508061204c85612046670de0b6b3a76400006120408a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9157600080fd5b505afa158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190613f08565b8b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561200257600080fd5b505afa158015612016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203a9190613f08565b9061390a565b9061394b565b9061397d565b11155b61206b5760405162461bcd60e51b815260040161099e906143b2565b6000856001600160a01b031663bba6157834338a896040518563ffffffff1660e01b815260040161209e93929190614002565b6020604051808303818588803b1580156120b757600080fd5b505af11580156120cb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120f09190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b906121239089908b9060040161403f565b600060405180830381600087803b15801561213d57600080fd5b505af1158015612151573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe17387878760405161218893929190614002565b60405180910390a1600180559695505050505050565b60025461010090046001600160a01b03163314806121d457506121bf611aed565b6001600160a01b0316336001600160a01b0316145b6121f05760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038216600090815260096020526040902054829060ff1661222a5760405162461bcd60e51b815260040161099e906146d0565b670c7d713b49da00008211156122525760405162461bcd60e51b815260040161099e90614662565b81158015906122de575060075460405163fc57d4df60e01b81526001600160a01b039091169063fc57d4df9061228c908690600401613fcb565b60206040518083038186803b1580156122a457600080fd5b505afa1580156122b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122dc9190613f08565b155b156122fb5760405162461bcd60e51b815260040161099e90614344565b6001600160a01b03831660009081526009602052604090819020600301839055517f275d6207ccd4271a12c584febf2bcf32254205dfb4639ce1a9184d2e2609e2d09061234b9085908590614026565b60405180910390a1505050565b60005b81518110156123895761238182828151811061237357fe5b60200260200101513361374d565b60010161235b565b5050565b6123956138ab565b6001600160a01b03166123a6611aed565b6001600160a01b0316146123cc5760405162461bcd60e51b815260040161099e9061462d565b600e5460ff16156123ef5760405162461bcd60e51b815260040161099e9061452c565b6123f76139a2565b600780546001600160a01b0319166001600160a01b0392909216919091179055600e805460ff19166001179055565b60025461010090046001600160a01b031633148061245c5750612447611aed565b6001600160a01b0316336001600160a01b0316145b6124785760405162461bcd60e51b815260040161099e906143e9565b821580159061248657508281145b6124a25760405162461bcd60e51b815260040161099e906147d8565b60005b83811015610c70578282828181106124b957fe5b90506020020135600960008787858181106124d057fe5b90506020020160208101906124e59190613be8565b6001600160a01b0316815260208101919091526040016000206001015584848281811061250e57fe5b90506020020160208101906125239190613be8565b6001600160a01b03167f638a463c59949a284e093291dedfbadcb32ebf9007e649767344e67346ab882984848481811061255957fe5b9050602002013560405161256d9190614916565b60405180910390a26001016124a5565b60025461010090046001600160a01b03163314806125b3575061259e611aed565b6001600160a01b0316336001600160a01b0316145b6125cf5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b03841660009081526009602052604090205460ff16156126085760405162461bcd60e51b815260040161099e906148b2565b60005b60085481101561266757846001600160a01b03166008828154811061262c57fe5b6000918252602090912001546001600160a01b0316141561265f5760405162461bcd60e51b815260040161099e906148b2565b60010161260b565b506040805160808101825260018082526020808301878152838501878152606085018781526001600160a01b038b16600081815260099095528785209651875460ff1916901515178755925186860155905160028601555160039094019390935560088054928301815590527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055517fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f90612734908690613fcb565b60405180910390a150505050565b6003546001600160a01b031681565b60025461010090046001600160a01b03163314806127875750612772611aed565b6001600160a01b0316336001600160a01b0316145b6127a35760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b03811660009081526009602052604090205460ff166127db5760405162461bcd60e51b815260040161099e90614559565b806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284c9190613f08565b1580156128c75750806001600160a01b0316638285ef406040518163ffffffff1660e01b815260040160206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c59190613f08565b155b6128e35760405162461bcd60e51b815260040161099e906147a1565b60085460005b818110156129f357826001600160a01b03166008828154811061290857fe5b6000918252602090912001546001600160a01b031614156129eb576008600183038154811061293357fe5b600091825260209091200154600880546001600160a01b03909216918390811061295957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600880548061299257fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526009905260408120805460ff191681556001810182905560028101829055600301556129f3565b6001016128e9565b505050565b60025461010090046001600160a01b0316331480612a2e5750612a19611aed565b6001600160a01b0316336001600160a01b0316145b612a4a5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038116612a705760405162461bcd60e51b815260040161099e90614804565b600580546001600160a01b0319166001600160a01b0383161790556040517f827daa11640de0eb908d0b06593ffb3f2b5e14e83d678fb922e512075f1d36f090610a17908390613fcb565b60026001541415612ade5760405162461bcd60e51b815260040161099e9061487b565b6002600155612aeb6113c4565b15612b085760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4c57600080fd5b505afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b849190613c04565b6001600160a01b031614612b985780612b9a565b345b6001600160a01b03851660009081526009602052604090205490915060ff168015612bdd57506001600160a01b03831660009081526009602052604090205460ff165b612bf95760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612c3e5760405162461bcd60e51b815260040161099e9061484b565b6001600160a01b038316600090815260096020526040902060030154612c765760405162461bcd60e51b815260040161099e9061484b565b60048054600a546040516312e8123160e11b81526001600160a01b03909216926325d0246292612cad928992889288929101614083565b602060405180830381600087803b158015612cc757600080fd5b505af1158015612cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cff9190613e93565b612d1b5760405162461bcd60e51b815260040161099e906146fe565b600080856001600160a01b031663e61604cf34873388886040518663ffffffff1660e01b8152600401612d519493929190614059565b6060604051808303818588803b158015612d6a57600080fd5b505af1158015612d7e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612da39190613f20565b60405163b2a02ff160e01b815291945092506001600160a01b038716915063b2a02ff190612dd990339088908690600401614002565b600060405180830381600087803b158015612df357600080fd5b505af1158015612e07573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b9150612e3f90889088903390600401613fdf565b600060405180830381600087803b158015612e5957600080fd5b505af1158015612e6d573d6000803e3d6000fd5b505050506000821115612f4d5760055460405163b2a02ff160e01b81526001600160a01b038781169263b2a02ff192612eb0929091169088908790600401614002565b600060405180830381600087803b158015612eca57600080fd5b505af1158015612ede573d6000803e3d6000fd5b505060065460055460405163dd9aba1b60e01b81526001600160a01b03928316945063dd9aba1b9350612f1a928a928a92911690600401613fdf565b600060405180830381600087803b158015612f3457600080fd5b505af1158015612f48573d6000803e3d6000fd5b505050505b6006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90612f7f908990889060040161403f565b600060405180830381600087803b158015612f9957600080fd5b505af1158015612fad573d6000803e3d6000fd5b5050600180555050505050505050565b6001600160a01b038116600090815260096020526040902054819060ff16612ff75760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b0382166000908152600d60209081526040808320338452909152902054829060ff1661303c5760405162461bcd60e51b815260040161099e9061424c565b613044613b73565b60405163497d274760e11b81526001600160a01b038516906392fa4e8e90613070903390600401613fcb565b606060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c29190613eb3565b905080602001516000146130e85760405162461bcd60e51b815260040161099e9061420b565b60048054825160405163eabe7d9160e01b81526001600160a01b039092169263eabe7d919261311b928992339201614002565b602060405180830381600087803b15801561313557600080fd5b505af1158015613149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316d9190613e93565b6131895760405162461bcd60e51b815260040161099e90614588565b61319384336139bc565b7fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d843360405161273492919061403f565b600260015414156131e75760405162461bcd60e51b815260040161099e9061487b565b600260019081556040805182815280820190915260609160208083019080368337019050509050818160008151811061321c57fe5b6001600160a01b03928316602091820292909201015260065460405163025181bb60e41b81529116906325181bb0906110d690849033906004016140bf565b60025461010090046001600160a01b0316331480613291575061327c611aed565b6001600160a01b0316336001600160a01b0316145b6132ad5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166132d35760405162461bcd60e51b815260040161099e9061430d565b600380546001600160a01b0319166001600160a01b0383161790556040517f21887d3c26545972adeaf9e44bd9aa5b527cd2b60b24cce6171828a07c564ea990610a17908390613fcb565b6001600160a01b038216600090815260096020526040812054839060ff166133585760405162461bcd60e51b815260040161099e906146d0565b6002600154141561337b5760405162461bcd60e51b815260040161099e9061487b565b60026001556133886113c4565b156133a55760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156133e957600080fd5b505afa1580156133fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134219190613c04565b6001600160a01b0316146134355782613437565b345b6001600160a01b0385166000908152600960205260409020600101549093508015806134ae5750806134ab85612046670de0b6b3a76400006120408a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9157600080fd5b11155b6134ca5760405162461bcd60e51b815260040161099e906143b2565b6000856001600160a01b031663f2b9fdb83433886040518463ffffffff1660e01b81526004016134fb929190614026565b6020604051808303818588803b15801561351457600080fd5b505af1158015613528573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061354d9190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90613580908990339060040161403f565b600060405180830381600087803b15801561359a57600080fd5b505af11580156135ae573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe1733387876040516135e593929190614002565b60405180910390a16001805595945050505050565b6136026138ab565b6001600160a01b0316613613611aed565b6001600160a01b0316146136395760405162461bcd60e51b815260040161099e9061462d565b6001600160a01b03811661365f5760405162461bcd60e51b815260040161099e906142c7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604051635ec88c7960e01b8152600092839283926001600160a01b0390911691635ec88c79916136f091889101613fcb565b60606040518083038186803b15801561370857600080fd5b505afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190613f20565b9250925092509193909250565b6001600160a01b038216600090815260096020526040902054829060ff166137875760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff166129f3576001600160a01b038084166000818152600d602090815260408083209487168352938152838220805460ff19166001908117909155600c825284832080549182018155835291200180546001600160a01b0319169091179055517f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a59061234b908590859061403f565b6138456113c4565b6138615760405162461bcd60e51b815260040161099e906141dd565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6138946138ab565b6040516138a19190613fcb565b60405180910390a1565b3390565b6138b76113c4565b156138d45760405162461bcd60e51b815260040161099e906144d5565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138946138ab565b60008261391957506000611b46565b8282028284828161392657fe5b04146139445760405162461bcd60e51b815260040161099e906145b5565b9392505050565b600080821161396c5760405162461bcd60e51b815260040161099e90614467565b81838161397557fe5b049392505050565b6000828201838110156139445760405162461bcd60e51b815260040161099e9061437b565b6706f05b59d3b20000600a55670ff59ee833b30000600b55565b6001600160a01b0381166000908152600c60205260409020546139f15760405162461bcd60e51b815260040161099e906145f6565b6001600160a01b038083166000908152600d602090815260408083209385168352928152828220805460ff19169055600c905290812054905b81811015613b43576001600160a01b038381166000908152600c6020526040902080549186169183908110613a5b57fe5b6000918252602090912001546001600160a01b03161415613b3b576001600160a01b0383166000908152600c6020526040902080546000198401908110613a9e57fe5b60009182526020808320909101546001600160a01b038681168452600c9092526040909220805491909216919083908110613ad557fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600c90915260409020805480613b1457fe5b600082815260209020810160001990810180546001600160a01b0319169055019055613b43565b600101613a2a565b50505050565b60405180608001604052806000151581526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b8035611b468161497c565b60008083601f840112613bb0578182fd5b50813567ffffffffffffffff811115613bc7578182fd5b6020830191508360208083028501011115613be157600080fd5b9250929050565b600060208284031215613bf9578081fd5b81356139448161497c565b600060208284031215613c15578081fd5b81516139448161497c565b60008060008060808587031215613c35578283fd5b8435613c408161497c565b966020860135965060408601359560600135945092505050565b60008060408385031215613c6c578182fd5b8235613c778161497c565b91506020830135613c878161497c565b809150509250929050565b60008060008060808587031215613ca7578384fd5b8435613cb28161497c565b93506020850135613cc28161497c565b92506040850135613cd28161497c565b9396929550929360600135925050565b600080600060608486031215613cf6578283fd5b8335613d018161497c565b92506020840135613d118161497c565b929592945050506040919091013590565b60008060408385031215613d34578182fd5b8235613d3f8161497c565b946020939093013593505050565b60008060208385031215613d5f578182fd5b823567ffffffffffffffff811115613d75578283fd5b613d8185828601613b9f565b90969095509350505050565b60008060008060408587031215613da2578384fd5b843567ffffffffffffffff80821115613db9578586fd5b613dc588838901613b9f565b90965094506020870135915080821115613ddd578384fd5b50613dea87828801613b9f565b95989497509550505050565b60006020808385031215613e08578182fd5b823567ffffffffffffffff811115613e1e578283fd5b8301601f81018513613e2e578283fd5b8035613e41613e3c8261495c565b614935565b8181528381019083850185840285018601891015613e5d578687fd5b8694505b83851015613e8757613e738982613b94565b835260019490940193918501918501613e61565b50979650505050505050565b600060208284031215613ea4578081fd5b81518015158114613944578182fd5b600060608284031215613ec4578081fd5b613ece6060614935565b8251815260208301516020820152604083015160408201528091505092915050565b600060208284031215613f01578081fd5b5035919050565b600060208284031215613f19578081fd5b5051919050565b600080600060608486031215613f34578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613f855781516001600160a01b031687529582019590820190600101613f60565b509495945050505050565b6000815480845260208085019450838352808320835b83811015613f855781546001600160a01b031687529582019560019182019101613fa6565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082526139446020830184613f4d565b6000604082526140d26040830185613f4d565b905060018060a01b03831660208301529392505050565b6000604082526140d26040830185613f90565b60006060825261410f6060830186613f90565b6001600160a01b039490941660208301525060400152919050565b60006040825261413d6040830186613f90565b82810360208481019190915284825285918101835b86811015613e875783356141658161497c565b6001600160a01b031682529282019290820190600101614152565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b6020808252818101527f436f72653a2063616c6c65722073686f756c64206265206c6576657261676572604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526021908201527f436f72653a20626f72726f772062616c616e6365206d757374206265207a65726040820152606f60f81b606082015260800190565b60208082526017908201527f436f72653a206d75737420656e746572206d61726b6574000000000000000000604082015260600190565b60208082526024908201527f436f72653a20696e76616c6964206c61624469737472696275746f72206164646040820152637265737360e01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601f908201527f436f72653a20696e76616c6964206c6576657261676572206164647265737300604082015260600190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672070726963650000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f436f72653a20737570706c792063617020726561636865640000000000000000604082015260600190565b60208082526027908201527f436f72653a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152661035b2b2b832b960c91b606082015260800190565b6020808252601d908201527f436f72653a2063616c6c65722073686f756c64206265206d61726b6574000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f436f72653a20696e76616c6964206b6565706572206164647265737300000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f7420626f72726f7760681b604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526015908201527410dbdc994e881d5b9b1a5cdd1959081b585c9ad95d605a1b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f742072656465656d60681b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f436f72653a2063616e6e6f7420706f702075736572206d61726b657400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f436f72653a20696e76616c696420636f6c6c61746572616c20666163746f7200604082015260600190565b6020808252601a908201527f436f72653a20696e76616c696420636c6f736520666163746f72000000000000604082015260600190565b60208082526014908201527310dbdc994e881a5b9d985b1a59081b585c9ad95d60621b604082015260600190565b6020808252601d908201527f436f72653a2063616e6e6f74206c697175696461746520626f72726f77000000604082015260600190565b6020808252818101527f436f72653a20696e76616c69642063616c63756c61746f722061646472657373604082015260600190565b6020808252601f908201527f436f72653a20696e76616c69642076616c696461746f72206164647265737300604082015260600190565b6020808252601a908201527f436f72653a2063616e6e6f742072656d6f7665206d61726b6574000000000000604082015260600190565b602080825260129082015271436f72653a20696e76616c6964206461746160701b604082015260600190565b60208082526027908201527f436f72653a20696e76616c6964207265626174654469737472696275746f72206040820152666164647265737360c81b606082015260800190565b60208082526016908201527510dbdc994e881b9bdd08184818dbdb1b185d195c985b60521b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f436f72653a20616c7265616479206c6973746564206d61726b65740000000000604082015260600190565b81511515815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561495457600080fd5b604052919050565b600067ffffffffffffffff821115614972578081fd5b5060209081020190565b6001600160a01b038116811461499157600080fd5b5056fea2646970667358221220c29c43d173369c81629c40fbaaf3d4cf39a779d1e898cb8ecded94de7c929c4f64736f6c634300060c0033

Block Transaction Gas Used Reward
view all blocks sequenced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.