This nametag was submitted by Kleros Curate.
Latest 25 from a total of 2,842,908 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Redeem Underlyin... | 28706987 | 7 mins ago | IN | 0 ETH | 0.00000091 | ||||
| Redeem Underlyin... | 28706535 | 16 mins ago | IN | 0 ETH | 0.00000005 | ||||
| Redeem Underlyin... | 28706312 | 21 mins ago | IN | 0 ETH | 0.0000015 | ||||
| Redeem Underlyin... | 28706218 | 22 mins ago | IN | 0 ETH | 0.00000004 | ||||
| Redeem Underlyin... | 28704859 | 48 mins ago | IN | 0 ETH | 0.00000004 | ||||
| Redeem Underlyin... | 28704503 | 56 mins ago | IN | 0 ETH | 0.00000021 | ||||
| Redeem Underlyin... | 28704494 | 56 mins ago | IN | 0 ETH | 0.00000091 | ||||
| Redeem Underlyin... | 28703989 | 1 hr ago | IN | 0 ETH | 0.00000004 | ||||
| Redeem Underlyin... | 28703608 | 1 hr ago | IN | 0 ETH | 0.00000091 | ||||
| Redeem Underlyin... | 28703374 | 1 hr ago | IN | 0 ETH | 0.00000004 | ||||
| Redeem Underlyin... | 28703051 | 1 hr ago | IN | 0 ETH | 0.00000092 | ||||
| Redeem Underlyin... | 28702753 | 1 hr ago | IN | 0 ETH | 0.00000092 | ||||
| Supply | 28702567 | 1 hr ago | IN | 0.02392575 ETH | 0.00000004 | ||||
| Redeem Underlyin... | 28702460 | 1 hr ago | IN | 0 ETH | 0.00000003 | ||||
| Redeem Underlyin... | 28701853 | 1 hr ago | IN | 0 ETH | 0.00000004 | ||||
| Redeem Underlyin... | 28701580 | 1 hr ago | IN | 0 ETH | 0.00000004 | ||||
| Redeem Underlyin... | 28701126 | 2 hrs ago | IN | 0 ETH | 0.00000004 | ||||
| Redeem Underlyin... | 28700616 | 2 hrs ago | IN | 0 ETH | 0.00000091 | ||||
| Redeem Underlyin... | 28700239 | 2 hrs ago | IN | 0 ETH | 0.0000009 | ||||
| Supply | 28699109 | 2 hrs ago | IN | 0.15 ETH | 0.00000003 | ||||
| Redeem Underlyin... | 28698576 | 3 hrs ago | IN | 0 ETH | 0.00000114 | ||||
| Redeem Underlyin... | 28697747 | 3 hrs ago | IN | 0 ETH | 0.00000006 | ||||
| Redeem Underlyin... | 28697734 | 3 hrs ago | IN | 0 ETH | 0.00000006 | ||||
| Redeem Underlyin... | 28696207 | 3 hrs ago | IN | 0 ETH | 0.00000005 | ||||
| Redeem Underlyin... | 28693551 | 4 hrs ago | IN | 0 ETH | 0.0000015 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 28702567 | 1 hr ago | 0.02392575 ETH | ||||
| 28699109 | 2 hrs ago | 0.15 ETH | ||||
| 28692998 | 5 hrs ago | 0.00045162 ETH | ||||
| 28692998 | 5 hrs ago | 0.00045162 ETH | ||||
| 28681379 | 9 hrs ago | 0.0000071 ETH | ||||
| 28681229 | 9 hrs ago | 0.003574 ETH | ||||
| 28681229 | 9 hrs ago | 0.003574 ETH | ||||
| 28672005 | 13 hrs ago | 0.02407195 ETH | ||||
| 28637448 | 25 hrs ago | 0.02439406 ETH | ||||
| 28624253 | 30 hrs ago | 0.02466745 ETH | ||||
| 28610755 | 37 hrs ago | 0.02484451 ETH | ||||
| 28606321 | 39 hrs ago | 0.00021946 ETH | ||||
| 28598594 | 42 hrs ago | 0.00073124 ETH | ||||
| 28598594 | 42 hrs ago | 0.00073124 ETH | ||||
| 28595132 | 43 hrs ago | 0.00043411 ETH | ||||
| 28595132 | 43 hrs ago | 0.00043411 ETH | ||||
| 28577208 | 2 days ago | 0.02500633 ETH | ||||
| 28554254 | 2 days ago | 0.0251716 ETH | ||||
| 28552846 | 2 days ago | 0.02530127 ETH | ||||
| 28546326 | 2 days ago | 0.00030927 ETH | ||||
| 28546326 | 2 days ago | 0.00030927 ETH | ||||
| 28546324 | 2 days ago | 0.00028857 ETH | ||||
| 28546324 | 2 days ago | 0.00028857 ETH | ||||
| 28546319 | 2 days ago | 0.00025846 ETH | ||||
| 28546319 | 2 days ago | 0.00025846 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Core
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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;
}
}
}
}// 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();
}
}// 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;
}// 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);
}// 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);
}// 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;
}
}// 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;
}
}// 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;
}// 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);
}// 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;
}// 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;
}
}// 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;
}
}// 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());
}
}// 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;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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"}]Contract Creation Code
60806040523480156200001157600080fd5b5060006200001e6200007c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556002805460ff1916905562000080565b3390565b6149ca80620000906000396000f3fe60806040526004361061031a5760003560e01c80638b95e335116101ab578063c2998238116100f7578063e61604cf11610095578063f187186c1161006f578063f187186c146108c4578063f2b9fdb8146108e4578063f2fde38b146108f7578063f8982e7a146109175761031a565b8063e61604cf14610871578063ede4edd014610884578063eefc5947146108a45761031a565b8063d9452b04116100d1578063d9452b04146107fc578063db3e34611461081c578063db91323614610831578063de02d642146108515761031a565b8063c29982381461079c578063c4d66de8146107bc578063d136af44146107dc5761031a565b8063a2a2d5bb11610164578063aced16611161013e578063aced166114610734578063b1283e7714610749578063bba6157814610769578063c04f31ff1461077c5761031a565b8063a2a2d5bb146106e1578063a843108114610701578063abdb5ea8146107215761031a565b80638b95e335146106425780638c765e94146106575780638da5cb5b1461066c578063928fe47714610681578063929fe9a1146106a157806396294178146106c15761031a565b80635189e1101161026a5780636922d7b611610223578063748747e6116101fd578063748747e6146105d85780637f0927f2146105f8578063830cbbbd1461060d5780638456cb591461062d5761031a565b80636922d7b6146105765780636e8584fd14610596578063715018a6146105c35761031a565b80635189e110146104d7578063571abe30146104f757806359341a1a1461050c5780635c975abb1461052157806366ae02091461053657806368155ec1146105565761031a565b806333f9c876116102d75780633a5381b5116102b15780633a5381b5146104605780633f4ba83a146104825780634036c8b5146104975780634b8a3529146104b75761031a565b806333f9c876146103fe57806334e115be1461041e578063375a7cba1461043e5761031a565b806305308b9f1461031f57806312348e961461034a5780631327d3d81461036c5780631488ca081461038c578063158ef93e146103bc578063186db48f146103de575b600080fd5b34801561032b57600080fd5b50610334610946565b6040516103419190614916565b60405180910390f35b34801561035657600080fd5b5061036a610365366004613ef0565b61094c565b005b34801561037857600080fd5b5061036a610387366004613be8565b610a22565b34801561039857600080fd5b506103ac6103a7366004613be8565b610ae5565b604051610341949392919061418b565b3480156103c857600080fd5b506103d1610b10565b6040516103419190614180565b3480156103ea57600080fd5b5061036a6103f9366004613d8d565b610b19565b34801561040a57600080fd5b5061036a610419366004613ce2565b610c77565b34801561042a57600080fd5b5061036a610439366004613ef0565b610ec4565b34801561044a57600080fd5b50610453610f5a565b60405161034191906140ac565b34801561046c57600080fd5b50610475610fbc565b6040516103419190613fcb565b34801561048e57600080fd5b5061036a610fcb565b3480156104a357600080fd5b5061036a6104b2366004613d4d565b611027565b3480156104c357600080fd5b5061036a6104d2366004613d22565b611110565b3480156104e357600080fd5b506104536104f2366004613be8565b611330565b34801561050357600080fd5b506104756113a6565b34801561051857600080fd5b506104756113b5565b34801561052d57600080fd5b506103d16113c4565b34801561054257600080fd5b5061036a610551366004613be8565b6113cd565b34801561056257600080fd5b5061036a610571366004613c92565b611490565b34801561058257600080fd5b5061036a610591366004613be8565b6115ef565b3480156105a257600080fd5b506105b66105b1366004613be8565b611689565b60405161034191906148e9565b3480156105cf57600080fd5b5061036a6116e4565b3480156105e457600080fd5b5061036a6105f3366004613be8565b61176d565b34801561060457600080fd5b5061036a611835565b34801561061957600080fd5b50610334610628366004613d22565b6118c8565b34801561063957600080fd5b5061036a611a7e565b34801561064e57600080fd5b50610475611ad8565b34801561066357600080fd5b50610334611ae7565b34801561067857600080fd5b50610475611aed565b34801561068d57600080fd5b506103d161069c366004613c5a565b611afc565b3480156106ad57600080fd5b506103d16106bc366004613c5a565b611b1c565b3480156106cd57600080fd5b506103346106dc366004613d22565b611b4c565b3480156106ed57600080fd5b506104756106fc366004613d22565b611c04565b34801561070d57600080fd5b5061036a61071c366004613ef0565b611c39565b61036a61072f366004613d22565b611cc0565b34801561074057600080fd5b50610475611dc9565b34801561075557600080fd5b50610475610764366004613ef0565b611ddd565b610334610777366004613ce2565b611e04565b34801561078857600080fd5b5061036a610797366004613d22565b61219e565b3480156107a857600080fd5b5061036a6107b7366004613df6565b612358565b3480156107c857600080fd5b5061036a6107d7366004613be8565b61238d565b3480156107e857600080fd5b5061036a6107f7366004613d8d565b612426565b34801561080857600080fd5b5061036a610817366004613c20565b61257d565b34801561082857600080fd5b50610475612742565b34801561083d57600080fd5b5061036a61084c366004613be8565b612751565b34801561085d57600080fd5b5061036a61086c366004613be8565b6129f8565b61036a61087f366004613c92565b612abb565b34801561089057600080fd5b5061036a61089f366004613be8565b612fbd565b3480156108b057600080fd5b5061036a6108bf366004613be8565b6131c4565b3480156108d057600080fd5b5061036a6108df366004613be8565b61325b565b6103346108f2366004613d22565b61331e565b34801561090357600080fd5b5061036a610912366004613be8565b6135fa565b34801561092357600080fd5b50610937610932366004613be8565b6136ba565b6040516103419392919061491f565b600a5481565b60025461010090046001600160a01b0316331480610982575061096d611aed565b6001600160a01b0316336001600160a01b0316145b6109a75760405162461bcd60e51b815260040161099e906143e9565b60405180910390fd5b66b1a2bc2ec5000081101580156109c65750670c7d713b49da00008111155b6109e25760405162461bcd60e51b815260040161099e90614699565b600a8190556040517fd88469f5aa8525dce9ae07fa2d8df83e2ec766fc060483b66a0082ff36d6582d90610a17908390614916565b60405180910390a150565b60025461010090046001600160a01b0316331480610a585750610a43611aed565b6001600160a01b0316336001600160a01b0316145b610a745760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038116610a9a5760405162461bcd60e51b815260040161099e9061476a565b600480546001600160a01b0319166001600160a01b0383161790556040517fb3a3a56265020415cf2f7ff198e2052a6e1d43d7eb127450af725829e40e08c290610a17908390613fcb565b600960205260009081526040902080546001820154600283015460039093015460ff90921692909184565b600e5460ff1681565b60025461010090046001600160a01b0316331480610b4f5750610b3a611aed565b6001600160a01b0316336001600160a01b0316145b610b6b5760405162461bcd60e51b815260040161099e906143e9565b8215801590610b7957508281145b610b955760405162461bcd60e51b815260040161099e906147d8565b60005b83811015610c7057828282818110610bac57fe5b9050602002013560096000878785818110610bc357fe5b9050602002016020810190610bd89190613be8565b6001600160a01b03168152602081019190915260400160002060020155848482818110610c0157fe5b9050602002016020810190610c169190613be8565b6001600160a01b03167f84d2db42497fc6f1882756be420935d982025ad8a2a903dfb83638a09e49a775848484818110610c4c57fe5b90506020020135604051610c609190614916565b60405180910390a2600101610b98565b5050505050565b6001600160a01b038216600090815260096020526040902054829060ff16610cb15760405162461bcd60e51b815260040161099e906146d0565b6003546001600160a01b03163314610cdb5760405162461bcd60e51b815260040161099e906141a8565b60026001541415610cfe5760405162461bcd60e51b815260040161099e9061487b565b6002600155610d0b6113c4565b15610d285760405162461bcd60e51b815260040161099e906144d5565b610d32838561374d565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c91610d659187918991889101614002565b602060405180830381600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db79190613e93565b610dd35760405162461bcd60e51b815260040161099e906144ff565b6040516319fce43b60e11b81526001600160a01b038416906333f9c87690610e0390339088908790600401614002565b602060405180830381600087803b158015610e1d57600080fd5b505af1158015610e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e559190613f08565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90610e88908690889060040161403f565b600060405180830381600087803b158015610ea257600080fd5b505af1158015610eb6573d6000803e3d6000fd5b505060018055505050505050565b60026001541415610ee75760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163f3c15dcb60e01b81526001600160a01b039091169063f3c15dcb90610f2190600890339086906004016140fc565b600060405180830381600087803b158015610f3b57600080fd5b505af1158015610f4f573d6000803e3d6000fd5b505060018055505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610fb257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f94575b5050505050905090565b6004546001600160a01b031681565b60025461010090046001600160a01b03163314806110015750610fec611aed565b6001600160a01b0316336001600160a01b0316145b61101d5760405162461bcd60e51b815260040161099e906143e9565b61102561383d565b565b60025461010090046001600160a01b031633148061105d5750611048611aed565b6001600160a01b0316336001600160a01b0316145b6110795760405162461bcd60e51b815260040161099e906143e9565b6002600154141561109c5760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163fedc611160e01b81526001600160a01b039091169063fedc6111906110d6906008908690869060040161412a565b600060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b50506001805550505050565b6001600160a01b038216600090815260096020526040902054829060ff1661114a5760405162461bcd60e51b815260040161099e906146d0565b6002600154141561116d5760405162461bcd60e51b815260040161099e9061487b565b600260015561117a6113c4565b156111975760405162461bcd60e51b815260040161099e906144d5565b6111a1833361374d565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c916111d49187913391889101614002565b602060405180830381600087803b1580156111ee57600080fd5b505af1158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190613e93565b6112425760405162461bcd60e51b815260040161099e906144ff565b604051634b8a352960e01b81526001600160a01b03841690634b8a3529906112709033908690600401614026565b602060405180830381600087803b15801561128a57600080fd5b505af115801561129e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c29190613f08565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce906112f5908690339060040161403f565b600060405180830381600087803b15801561130f57600080fd5b505af1158015611323573d6000803e3d6000fd5b5050600180555050505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561139a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161137c575b50505050509050919050565b6006546001600160a01b031681565b6005546001600160a01b031681565b60025460ff1690565b60025461010090046001600160a01b031633148061140357506113ee611aed565b6001600160a01b0316336001600160a01b0316145b61141f5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166114455760405162461bcd60e51b815260040161099e90614283565b600680546001600160a01b0319166001600160a01b0383161790556040517f2351f252c60252e548e93df4d785886faa1d88410325b8bce69d624a25583ae790610a17908390613fcb565b600260015414156114b35760405162461bcd60e51b815260040161099e9061487b565b60026001556000805b60085481101561150057600881815481106114d357fe5b6000918252602090912001546001600160a01b03163314156114f85760019150611500565b6001016114bc565b506001811515146115235760405162461bcd60e51b815260040161099e90614430565b604051636119bced60e11b8152339063c23379da9061154c908890889088908890600401614059565b600060405180830381600087803b15801561156657600080fd5b505af115801561157a573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b91506115b290339088908890600401613fdf565b600060405180830381600087803b1580156115cc57600080fd5b505af11580156115e0573d6000803e3d6000fd5b50506001805550505050505050565b60025461010090046001600160a01b03163314806116255750611610611aed565b6001600160a01b0316336001600160a01b0316145b6116415760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166116675760405162461bcd60e51b815260040161099e90614735565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611691613b49565b506001600160a01b03166000908152600960209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015290565b6116ec6138ab565b6001600160a01b03166116fd611aed565b6001600160a01b0316146117235760405162461bcd60e51b815260040161099e9061462d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025461010090046001600160a01b03163314806117a3575061178e611aed565b6001600160a01b0316336001600160a01b0316145b6117bf5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166117e55760405162461bcd60e51b815260040161099e9061449e565b60028054610100600160a81b0319166101006001600160a01b038416021790556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e90610a17908390613fcb565b600260015414156118585760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163025181bb60e41b81526001600160a01b03909116906325181bb0906118909060089033906004016140e9565b600060405180830381600087803b1580156118aa57600080fd5b505af11580156118be573d6000803e3d6000fd5b5050600180555050565b6001600160a01b038216600090815260096020526040812054839060ff166119025760405162461bcd60e51b815260040161099e906146d0565b600260015414156119255760405162461bcd60e51b815260040161099e9061487b565b60026001556119326113c4565b1561194f5760405162461bcd60e51b815260040161099e906144d5565b60405163830cbbbd60e01b81526000906001600160a01b0386169063830cbbbd906119809033908890600401614026565b602060405180830381600087803b15801561199a57600080fd5b505af11580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d29190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90611a05908890339060040161403f565b600060405180830381600087803b158015611a1f57600080fd5b505af1158015611a33573d6000803e3d6000fd5b505050507fda2fcb771cce6a80cd6c0101db394f4fd1f8755def9185535cc97509f3e03cdd338683604051611a6a93929190614002565b60405180910390a160018055949350505050565b60025461010090046001600160a01b0316331480611ab45750611a9f611aed565b6001600160a01b0316336001600160a01b0316145b611ad05760405162461bcd60e51b815260040161099e906143e9565b6110256138af565b6007546001600160a01b031681565b600b5481565b6000546001600160a01b031690565b600d60209081526000928352604080842090915290825290205460ff1681565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205460ff165b92915050565b6001600160a01b038216600090815260096020526040812054839060ff16611b865760405162461bcd60e51b815260040161099e906146d0565b60026001541415611ba95760405162461bcd60e51b815260040161099e9061487b565b6002600155611bb66113c4565b15611bd35760405162461bcd60e51b815260040161099e906144d5565b6040516312c5282f60e31b81526000906001600160a01b038616906396294178906119809033908890600401614026565b600c6020528160005260406000208181548110611c1d57fe5b6000918252602090912001546001600160a01b03169150829050565b60025461010090046001600160a01b0316331480611c6f5750611c5a611aed565b6001600160a01b0316336001600160a01b0316145b611c8b5760405162461bcd60e51b815260040161099e906143e9565b600b8190556040517f6791c9b68799eda502f8f7808e4ab556a632237eea58a66c4f7e4e6f94574d0d90610a17908390614916565b6001600160a01b038216600090815260096020526040902054829060ff16611cfa5760405162461bcd60e51b815260040161099e906146d0565b60026001541415611d1d5760405162461bcd60e51b815260040161099e9061487b565b6002600155611d2a6113c4565b15611d475760405162461bcd60e51b815260040161099e906144d5565b60405163157b6bd560e31b81526001600160a01b0384169063abdb5ea8903490611d779033908790600401614026565b6020604051808303818588803b158015611d9057600080fd5b505af1158015611da4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112c29190613f08565b60025461010090046001600160a01b031681565b60088181548110611dea57fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038216600090815260096020526040812054839060ff16611e3e5760405162461bcd60e51b815260040161099e906146d0565b60026001541415611e615760405162461bcd60e51b815260040161099e9061487b565b6002600155611e6e6113c4565b15611e8b5760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611ecf57600080fd5b505afa158015611ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f079190613c04565b6001600160a01b031614611f1b5782611f1d565b345b6001600160a01b03851660009081526009602052604090206001015490935080158061204f57508061204c85612046670de0b6b3a76400006120408a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9157600080fd5b505afa158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190613f08565b8b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561200257600080fd5b505afa158015612016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203a9190613f08565b9061390a565b9061394b565b9061397d565b11155b61206b5760405162461bcd60e51b815260040161099e906143b2565b6000856001600160a01b031663bba6157834338a896040518563ffffffff1660e01b815260040161209e93929190614002565b6020604051808303818588803b1580156120b757600080fd5b505af11580156120cb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120f09190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b906121239089908b9060040161403f565b600060405180830381600087803b15801561213d57600080fd5b505af1158015612151573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe17387878760405161218893929190614002565b60405180910390a1600180559695505050505050565b60025461010090046001600160a01b03163314806121d457506121bf611aed565b6001600160a01b0316336001600160a01b0316145b6121f05760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038216600090815260096020526040902054829060ff1661222a5760405162461bcd60e51b815260040161099e906146d0565b670c7d713b49da00008211156122525760405162461bcd60e51b815260040161099e90614662565b81158015906122de575060075460405163fc57d4df60e01b81526001600160a01b039091169063fc57d4df9061228c908690600401613fcb565b60206040518083038186803b1580156122a457600080fd5b505afa1580156122b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122dc9190613f08565b155b156122fb5760405162461bcd60e51b815260040161099e90614344565b6001600160a01b03831660009081526009602052604090819020600301839055517f275d6207ccd4271a12c584febf2bcf32254205dfb4639ce1a9184d2e2609e2d09061234b9085908590614026565b60405180910390a1505050565b60005b81518110156123895761238182828151811061237357fe5b60200260200101513361374d565b60010161235b565b5050565b6123956138ab565b6001600160a01b03166123a6611aed565b6001600160a01b0316146123cc5760405162461bcd60e51b815260040161099e9061462d565b600e5460ff16156123ef5760405162461bcd60e51b815260040161099e9061452c565b6123f76139a2565b600780546001600160a01b0319166001600160a01b0392909216919091179055600e805460ff19166001179055565b60025461010090046001600160a01b031633148061245c5750612447611aed565b6001600160a01b0316336001600160a01b0316145b6124785760405162461bcd60e51b815260040161099e906143e9565b821580159061248657508281145b6124a25760405162461bcd60e51b815260040161099e906147d8565b60005b83811015610c70578282828181106124b957fe5b90506020020135600960008787858181106124d057fe5b90506020020160208101906124e59190613be8565b6001600160a01b0316815260208101919091526040016000206001015584848281811061250e57fe5b90506020020160208101906125239190613be8565b6001600160a01b03167f638a463c59949a284e093291dedfbadcb32ebf9007e649767344e67346ab882984848481811061255957fe5b9050602002013560405161256d9190614916565b60405180910390a26001016124a5565b60025461010090046001600160a01b03163314806125b3575061259e611aed565b6001600160a01b0316336001600160a01b0316145b6125cf5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b03841660009081526009602052604090205460ff16156126085760405162461bcd60e51b815260040161099e906148b2565b60005b60085481101561266757846001600160a01b03166008828154811061262c57fe5b6000918252602090912001546001600160a01b0316141561265f5760405162461bcd60e51b815260040161099e906148b2565b60010161260b565b506040805160808101825260018082526020808301878152838501878152606085018781526001600160a01b038b16600081815260099095528785209651875460ff1916901515178755925186860155905160028601555160039094019390935560088054928301815590527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055517fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f90612734908690613fcb565b60405180910390a150505050565b6003546001600160a01b031681565b60025461010090046001600160a01b03163314806127875750612772611aed565b6001600160a01b0316336001600160a01b0316145b6127a35760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b03811660009081526009602052604090205460ff166127db5760405162461bcd60e51b815260040161099e90614559565b806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284c9190613f08565b1580156128c75750806001600160a01b0316638285ef406040518163ffffffff1660e01b815260040160206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c59190613f08565b155b6128e35760405162461bcd60e51b815260040161099e906147a1565b60085460005b818110156129f357826001600160a01b03166008828154811061290857fe5b6000918252602090912001546001600160a01b031614156129eb576008600183038154811061293357fe5b600091825260209091200154600880546001600160a01b03909216918390811061295957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600880548061299257fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526009905260408120805460ff191681556001810182905560028101829055600301556129f3565b6001016128e9565b505050565b60025461010090046001600160a01b0316331480612a2e5750612a19611aed565b6001600160a01b0316336001600160a01b0316145b612a4a5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038116612a705760405162461bcd60e51b815260040161099e90614804565b600580546001600160a01b0319166001600160a01b0383161790556040517f827daa11640de0eb908d0b06593ffb3f2b5e14e83d678fb922e512075f1d36f090610a17908390613fcb565b60026001541415612ade5760405162461bcd60e51b815260040161099e9061487b565b6002600155612aeb6113c4565b15612b085760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4c57600080fd5b505afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b849190613c04565b6001600160a01b031614612b985780612b9a565b345b6001600160a01b03851660009081526009602052604090205490915060ff168015612bdd57506001600160a01b03831660009081526009602052604090205460ff165b612bf95760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612c3e5760405162461bcd60e51b815260040161099e9061484b565b6001600160a01b038316600090815260096020526040902060030154612c765760405162461bcd60e51b815260040161099e9061484b565b60048054600a546040516312e8123160e11b81526001600160a01b03909216926325d0246292612cad928992889288929101614083565b602060405180830381600087803b158015612cc757600080fd5b505af1158015612cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cff9190613e93565b612d1b5760405162461bcd60e51b815260040161099e906146fe565b600080856001600160a01b031663e61604cf34873388886040518663ffffffff1660e01b8152600401612d519493929190614059565b6060604051808303818588803b158015612d6a57600080fd5b505af1158015612d7e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612da39190613f20565b60405163b2a02ff160e01b815291945092506001600160a01b038716915063b2a02ff190612dd990339088908690600401614002565b600060405180830381600087803b158015612df357600080fd5b505af1158015612e07573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b9150612e3f90889088903390600401613fdf565b600060405180830381600087803b158015612e5957600080fd5b505af1158015612e6d573d6000803e3d6000fd5b505050506000821115612f4d5760055460405163b2a02ff160e01b81526001600160a01b038781169263b2a02ff192612eb0929091169088908790600401614002565b600060405180830381600087803b158015612eca57600080fd5b505af1158015612ede573d6000803e3d6000fd5b505060065460055460405163dd9aba1b60e01b81526001600160a01b03928316945063dd9aba1b9350612f1a928a928a92911690600401613fdf565b600060405180830381600087803b158015612f3457600080fd5b505af1158015612f48573d6000803e3d6000fd5b505050505b6006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90612f7f908990889060040161403f565b600060405180830381600087803b158015612f9957600080fd5b505af1158015612fad573d6000803e3d6000fd5b5050600180555050505050505050565b6001600160a01b038116600090815260096020526040902054819060ff16612ff75760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b0382166000908152600d60209081526040808320338452909152902054829060ff1661303c5760405162461bcd60e51b815260040161099e9061424c565b613044613b73565b60405163497d274760e11b81526001600160a01b038516906392fa4e8e90613070903390600401613fcb565b606060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c29190613eb3565b905080602001516000146130e85760405162461bcd60e51b815260040161099e9061420b565b60048054825160405163eabe7d9160e01b81526001600160a01b039092169263eabe7d919261311b928992339201614002565b602060405180830381600087803b15801561313557600080fd5b505af1158015613149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316d9190613e93565b6131895760405162461bcd60e51b815260040161099e90614588565b61319384336139bc565b7fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d843360405161273492919061403f565b600260015414156131e75760405162461bcd60e51b815260040161099e9061487b565b600260019081556040805182815280820190915260609160208083019080368337019050509050818160008151811061321c57fe5b6001600160a01b03928316602091820292909201015260065460405163025181bb60e41b81529116906325181bb0906110d690849033906004016140bf565b60025461010090046001600160a01b0316331480613291575061327c611aed565b6001600160a01b0316336001600160a01b0316145b6132ad5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166132d35760405162461bcd60e51b815260040161099e9061430d565b600380546001600160a01b0319166001600160a01b0383161790556040517f21887d3c26545972adeaf9e44bd9aa5b527cd2b60b24cce6171828a07c564ea990610a17908390613fcb565b6001600160a01b038216600090815260096020526040812054839060ff166133585760405162461bcd60e51b815260040161099e906146d0565b6002600154141561337b5760405162461bcd60e51b815260040161099e9061487b565b60026001556133886113c4565b156133a55760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156133e957600080fd5b505afa1580156133fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134219190613c04565b6001600160a01b0316146134355782613437565b345b6001600160a01b0385166000908152600960205260409020600101549093508015806134ae5750806134ab85612046670de0b6b3a76400006120408a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9157600080fd5b11155b6134ca5760405162461bcd60e51b815260040161099e906143b2565b6000856001600160a01b031663f2b9fdb83433886040518463ffffffff1660e01b81526004016134fb929190614026565b6020604051808303818588803b15801561351457600080fd5b505af1158015613528573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061354d9190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90613580908990339060040161403f565b600060405180830381600087803b15801561359a57600080fd5b505af11580156135ae573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe1733387876040516135e593929190614002565b60405180910390a16001805595945050505050565b6136026138ab565b6001600160a01b0316613613611aed565b6001600160a01b0316146136395760405162461bcd60e51b815260040161099e9061462d565b6001600160a01b03811661365f5760405162461bcd60e51b815260040161099e906142c7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604051635ec88c7960e01b8152600092839283926001600160a01b0390911691635ec88c79916136f091889101613fcb565b60606040518083038186803b15801561370857600080fd5b505afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190613f20565b9250925092509193909250565b6001600160a01b038216600090815260096020526040902054829060ff166137875760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff166129f3576001600160a01b038084166000818152600d602090815260408083209487168352938152838220805460ff19166001908117909155600c825284832080549182018155835291200180546001600160a01b0319169091179055517f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a59061234b908590859061403f565b6138456113c4565b6138615760405162461bcd60e51b815260040161099e906141dd565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6138946138ab565b6040516138a19190613fcb565b60405180910390a1565b3390565b6138b76113c4565b156138d45760405162461bcd60e51b815260040161099e906144d5565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138946138ab565b60008261391957506000611b46565b8282028284828161392657fe5b04146139445760405162461bcd60e51b815260040161099e906145b5565b9392505050565b600080821161396c5760405162461bcd60e51b815260040161099e90614467565b81838161397557fe5b049392505050565b6000828201838110156139445760405162461bcd60e51b815260040161099e9061437b565b6706f05b59d3b20000600a55670ff59ee833b30000600b55565b6001600160a01b0381166000908152600c60205260409020546139f15760405162461bcd60e51b815260040161099e906145f6565b6001600160a01b038083166000908152600d602090815260408083209385168352928152828220805460ff19169055600c905290812054905b81811015613b43576001600160a01b038381166000908152600c6020526040902080549186169183908110613a5b57fe5b6000918252602090912001546001600160a01b03161415613b3b576001600160a01b0383166000908152600c6020526040902080546000198401908110613a9e57fe5b60009182526020808320909101546001600160a01b038681168452600c9092526040909220805491909216919083908110613ad557fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600c90915260409020805480613b1457fe5b600082815260209020810160001990810180546001600160a01b0319169055019055613b43565b600101613a2a565b50505050565b60405180608001604052806000151581526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b8035611b468161497c565b60008083601f840112613bb0578182fd5b50813567ffffffffffffffff811115613bc7578182fd5b6020830191508360208083028501011115613be157600080fd5b9250929050565b600060208284031215613bf9578081fd5b81356139448161497c565b600060208284031215613c15578081fd5b81516139448161497c565b60008060008060808587031215613c35578283fd5b8435613c408161497c565b966020860135965060408601359560600135945092505050565b60008060408385031215613c6c578182fd5b8235613c778161497c565b91506020830135613c878161497c565b809150509250929050565b60008060008060808587031215613ca7578384fd5b8435613cb28161497c565b93506020850135613cc28161497c565b92506040850135613cd28161497c565b9396929550929360600135925050565b600080600060608486031215613cf6578283fd5b8335613d018161497c565b92506020840135613d118161497c565b929592945050506040919091013590565b60008060408385031215613d34578182fd5b8235613d3f8161497c565b946020939093013593505050565b60008060208385031215613d5f578182fd5b823567ffffffffffffffff811115613d75578283fd5b613d8185828601613b9f565b90969095509350505050565b60008060008060408587031215613da2578384fd5b843567ffffffffffffffff80821115613db9578586fd5b613dc588838901613b9f565b90965094506020870135915080821115613ddd578384fd5b50613dea87828801613b9f565b95989497509550505050565b60006020808385031215613e08578182fd5b823567ffffffffffffffff811115613e1e578283fd5b8301601f81018513613e2e578283fd5b8035613e41613e3c8261495c565b614935565b8181528381019083850185840285018601891015613e5d578687fd5b8694505b83851015613e8757613e738982613b94565b835260019490940193918501918501613e61565b50979650505050505050565b600060208284031215613ea4578081fd5b81518015158114613944578182fd5b600060608284031215613ec4578081fd5b613ece6060614935565b8251815260208301516020820152604083015160408201528091505092915050565b600060208284031215613f01578081fd5b5035919050565b600060208284031215613f19578081fd5b5051919050565b600080600060608486031215613f34578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613f855781516001600160a01b031687529582019590820190600101613f60565b509495945050505050565b6000815480845260208085019450838352808320835b83811015613f855781546001600160a01b031687529582019560019182019101613fa6565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082526139446020830184613f4d565b6000604082526140d26040830185613f4d565b905060018060a01b03831660208301529392505050565b6000604082526140d26040830185613f90565b60006060825261410f6060830186613f90565b6001600160a01b039490941660208301525060400152919050565b60006040825261413d6040830186613f90565b82810360208481019190915284825285918101835b86811015613e875783356141658161497c565b6001600160a01b031682529282019290820190600101614152565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b6020808252818101527f436f72653a2063616c6c65722073686f756c64206265206c6576657261676572604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526021908201527f436f72653a20626f72726f772062616c616e6365206d757374206265207a65726040820152606f60f81b606082015260800190565b60208082526017908201527f436f72653a206d75737420656e746572206d61726b6574000000000000000000604082015260600190565b60208082526024908201527f436f72653a20696e76616c6964206c61624469737472696275746f72206164646040820152637265737360e01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601f908201527f436f72653a20696e76616c6964206c6576657261676572206164647265737300604082015260600190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672070726963650000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f436f72653a20737570706c792063617020726561636865640000000000000000604082015260600190565b60208082526027908201527f436f72653a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152661035b2b2b832b960c91b606082015260800190565b6020808252601d908201527f436f72653a2063616c6c65722073686f756c64206265206d61726b6574000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f436f72653a20696e76616c6964206b6565706572206164647265737300000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f7420626f72726f7760681b604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526015908201527410dbdc994e881d5b9b1a5cdd1959081b585c9ad95d605a1b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f742072656465656d60681b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f436f72653a2063616e6e6f7420706f702075736572206d61726b657400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f436f72653a20696e76616c696420636f6c6c61746572616c20666163746f7200604082015260600190565b6020808252601a908201527f436f72653a20696e76616c696420636c6f736520666163746f72000000000000604082015260600190565b60208082526014908201527310dbdc994e881a5b9d985b1a59081b585c9ad95d60621b604082015260600190565b6020808252601d908201527f436f72653a2063616e6e6f74206c697175696461746520626f72726f77000000604082015260600190565b6020808252818101527f436f72653a20696e76616c69642063616c63756c61746f722061646472657373604082015260600190565b6020808252601f908201527f436f72653a20696e76616c69642076616c696461746f72206164647265737300604082015260600190565b6020808252601a908201527f436f72653a2063616e6e6f742072656d6f7665206d61726b6574000000000000604082015260600190565b602080825260129082015271436f72653a20696e76616c6964206461746160701b604082015260600190565b60208082526027908201527f436f72653a20696e76616c6964207265626174654469737472696275746f72206040820152666164647265737360c81b606082015260800190565b60208082526016908201527510dbdc994e881b9bdd08184818dbdb1b185d195c985b60521b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f436f72653a20616c7265616479206c6973746564206d61726b65740000000000604082015260600190565b81511515815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561495457600080fd5b604052919050565b600067ffffffffffffffff821115614972578081fd5b5060209081020190565b6001600160a01b038116811461499157600080fd5b5056fea2646970667358221220c29c43d173369c81629c40fbaaf3d4cf39a779d1e898cb8ecded94de7c929c4f64736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061031a5760003560e01c80638b95e335116101ab578063c2998238116100f7578063e61604cf11610095578063f187186c1161006f578063f187186c146108c4578063f2b9fdb8146108e4578063f2fde38b146108f7578063f8982e7a146109175761031a565b8063e61604cf14610871578063ede4edd014610884578063eefc5947146108a45761031a565b8063d9452b04116100d1578063d9452b04146107fc578063db3e34611461081c578063db91323614610831578063de02d642146108515761031a565b8063c29982381461079c578063c4d66de8146107bc578063d136af44146107dc5761031a565b8063a2a2d5bb11610164578063aced16611161013e578063aced166114610734578063b1283e7714610749578063bba6157814610769578063c04f31ff1461077c5761031a565b8063a2a2d5bb146106e1578063a843108114610701578063abdb5ea8146107215761031a565b80638b95e335146106425780638c765e94146106575780638da5cb5b1461066c578063928fe47714610681578063929fe9a1146106a157806396294178146106c15761031a565b80635189e1101161026a5780636922d7b611610223578063748747e6116101fd578063748747e6146105d85780637f0927f2146105f8578063830cbbbd1461060d5780638456cb591461062d5761031a565b80636922d7b6146105765780636e8584fd14610596578063715018a6146105c35761031a565b80635189e110146104d7578063571abe30146104f757806359341a1a1461050c5780635c975abb1461052157806366ae02091461053657806368155ec1146105565761031a565b806333f9c876116102d75780633a5381b5116102b15780633a5381b5146104605780633f4ba83a146104825780634036c8b5146104975780634b8a3529146104b75761031a565b806333f9c876146103fe57806334e115be1461041e578063375a7cba1461043e5761031a565b806305308b9f1461031f57806312348e961461034a5780631327d3d81461036c5780631488ca081461038c578063158ef93e146103bc578063186db48f146103de575b600080fd5b34801561032b57600080fd5b50610334610946565b6040516103419190614916565b60405180910390f35b34801561035657600080fd5b5061036a610365366004613ef0565b61094c565b005b34801561037857600080fd5b5061036a610387366004613be8565b610a22565b34801561039857600080fd5b506103ac6103a7366004613be8565b610ae5565b604051610341949392919061418b565b3480156103c857600080fd5b506103d1610b10565b6040516103419190614180565b3480156103ea57600080fd5b5061036a6103f9366004613d8d565b610b19565b34801561040a57600080fd5b5061036a610419366004613ce2565b610c77565b34801561042a57600080fd5b5061036a610439366004613ef0565b610ec4565b34801561044a57600080fd5b50610453610f5a565b60405161034191906140ac565b34801561046c57600080fd5b50610475610fbc565b6040516103419190613fcb565b34801561048e57600080fd5b5061036a610fcb565b3480156104a357600080fd5b5061036a6104b2366004613d4d565b611027565b3480156104c357600080fd5b5061036a6104d2366004613d22565b611110565b3480156104e357600080fd5b506104536104f2366004613be8565b611330565b34801561050357600080fd5b506104756113a6565b34801561051857600080fd5b506104756113b5565b34801561052d57600080fd5b506103d16113c4565b34801561054257600080fd5b5061036a610551366004613be8565b6113cd565b34801561056257600080fd5b5061036a610571366004613c92565b611490565b34801561058257600080fd5b5061036a610591366004613be8565b6115ef565b3480156105a257600080fd5b506105b66105b1366004613be8565b611689565b60405161034191906148e9565b3480156105cf57600080fd5b5061036a6116e4565b3480156105e457600080fd5b5061036a6105f3366004613be8565b61176d565b34801561060457600080fd5b5061036a611835565b34801561061957600080fd5b50610334610628366004613d22565b6118c8565b34801561063957600080fd5b5061036a611a7e565b34801561064e57600080fd5b50610475611ad8565b34801561066357600080fd5b50610334611ae7565b34801561067857600080fd5b50610475611aed565b34801561068d57600080fd5b506103d161069c366004613c5a565b611afc565b3480156106ad57600080fd5b506103d16106bc366004613c5a565b611b1c565b3480156106cd57600080fd5b506103346106dc366004613d22565b611b4c565b3480156106ed57600080fd5b506104756106fc366004613d22565b611c04565b34801561070d57600080fd5b5061036a61071c366004613ef0565b611c39565b61036a61072f366004613d22565b611cc0565b34801561074057600080fd5b50610475611dc9565b34801561075557600080fd5b50610475610764366004613ef0565b611ddd565b610334610777366004613ce2565b611e04565b34801561078857600080fd5b5061036a610797366004613d22565b61219e565b3480156107a857600080fd5b5061036a6107b7366004613df6565b612358565b3480156107c857600080fd5b5061036a6107d7366004613be8565b61238d565b3480156107e857600080fd5b5061036a6107f7366004613d8d565b612426565b34801561080857600080fd5b5061036a610817366004613c20565b61257d565b34801561082857600080fd5b50610475612742565b34801561083d57600080fd5b5061036a61084c366004613be8565b612751565b34801561085d57600080fd5b5061036a61086c366004613be8565b6129f8565b61036a61087f366004613c92565b612abb565b34801561089057600080fd5b5061036a61089f366004613be8565b612fbd565b3480156108b057600080fd5b5061036a6108bf366004613be8565b6131c4565b3480156108d057600080fd5b5061036a6108df366004613be8565b61325b565b6103346108f2366004613d22565b61331e565b34801561090357600080fd5b5061036a610912366004613be8565b6135fa565b34801561092357600080fd5b50610937610932366004613be8565b6136ba565b6040516103419392919061491f565b600a5481565b60025461010090046001600160a01b0316331480610982575061096d611aed565b6001600160a01b0316336001600160a01b0316145b6109a75760405162461bcd60e51b815260040161099e906143e9565b60405180910390fd5b66b1a2bc2ec5000081101580156109c65750670c7d713b49da00008111155b6109e25760405162461bcd60e51b815260040161099e90614699565b600a8190556040517fd88469f5aa8525dce9ae07fa2d8df83e2ec766fc060483b66a0082ff36d6582d90610a17908390614916565b60405180910390a150565b60025461010090046001600160a01b0316331480610a585750610a43611aed565b6001600160a01b0316336001600160a01b0316145b610a745760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038116610a9a5760405162461bcd60e51b815260040161099e9061476a565b600480546001600160a01b0319166001600160a01b0383161790556040517fb3a3a56265020415cf2f7ff198e2052a6e1d43d7eb127450af725829e40e08c290610a17908390613fcb565b600960205260009081526040902080546001820154600283015460039093015460ff90921692909184565b600e5460ff1681565b60025461010090046001600160a01b0316331480610b4f5750610b3a611aed565b6001600160a01b0316336001600160a01b0316145b610b6b5760405162461bcd60e51b815260040161099e906143e9565b8215801590610b7957508281145b610b955760405162461bcd60e51b815260040161099e906147d8565b60005b83811015610c7057828282818110610bac57fe5b9050602002013560096000878785818110610bc357fe5b9050602002016020810190610bd89190613be8565b6001600160a01b03168152602081019190915260400160002060020155848482818110610c0157fe5b9050602002016020810190610c169190613be8565b6001600160a01b03167f84d2db42497fc6f1882756be420935d982025ad8a2a903dfb83638a09e49a775848484818110610c4c57fe5b90506020020135604051610c609190614916565b60405180910390a2600101610b98565b5050505050565b6001600160a01b038216600090815260096020526040902054829060ff16610cb15760405162461bcd60e51b815260040161099e906146d0565b6003546001600160a01b03163314610cdb5760405162461bcd60e51b815260040161099e906141a8565b60026001541415610cfe5760405162461bcd60e51b815260040161099e9061487b565b6002600155610d0b6113c4565b15610d285760405162461bcd60e51b815260040161099e906144d5565b610d32838561374d565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c91610d659187918991889101614002565b602060405180830381600087803b158015610d7f57600080fd5b505af1158015610d93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db79190613e93565b610dd35760405162461bcd60e51b815260040161099e906144ff565b6040516319fce43b60e11b81526001600160a01b038416906333f9c87690610e0390339088908790600401614002565b602060405180830381600087803b158015610e1d57600080fd5b505af1158015610e31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e559190613f08565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90610e88908690889060040161403f565b600060405180830381600087803b158015610ea257600080fd5b505af1158015610eb6573d6000803e3d6000fd5b505060018055505050505050565b60026001541415610ee75760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163f3c15dcb60e01b81526001600160a01b039091169063f3c15dcb90610f2190600890339086906004016140fc565b600060405180830381600087803b158015610f3b57600080fd5b505af1158015610f4f573d6000803e3d6000fd5b505060018055505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610fb257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f94575b5050505050905090565b6004546001600160a01b031681565b60025461010090046001600160a01b03163314806110015750610fec611aed565b6001600160a01b0316336001600160a01b0316145b61101d5760405162461bcd60e51b815260040161099e906143e9565b61102561383d565b565b60025461010090046001600160a01b031633148061105d5750611048611aed565b6001600160a01b0316336001600160a01b0316145b6110795760405162461bcd60e51b815260040161099e906143e9565b6002600154141561109c5760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163fedc611160e01b81526001600160a01b039091169063fedc6111906110d6906008908690869060040161412a565b600060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b50506001805550505050565b6001600160a01b038216600090815260096020526040902054829060ff1661114a5760405162461bcd60e51b815260040161099e906146d0565b6002600154141561116d5760405162461bcd60e51b815260040161099e9061487b565b600260015561117a6113c4565b156111975760405162461bcd60e51b815260040161099e906144d5565b6111a1833361374d565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c916111d49187913391889101614002565b602060405180830381600087803b1580156111ee57600080fd5b505af1158015611202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112269190613e93565b6112425760405162461bcd60e51b815260040161099e906144ff565b604051634b8a352960e01b81526001600160a01b03841690634b8a3529906112709033908690600401614026565b602060405180830381600087803b15801561128a57600080fd5b505af115801561129e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c29190613f08565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce906112f5908690339060040161403f565b600060405180830381600087803b15801561130f57600080fd5b505af1158015611323573d6000803e3d6000fd5b5050600180555050505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561139a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161137c575b50505050509050919050565b6006546001600160a01b031681565b6005546001600160a01b031681565b60025460ff1690565b60025461010090046001600160a01b031633148061140357506113ee611aed565b6001600160a01b0316336001600160a01b0316145b61141f5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166114455760405162461bcd60e51b815260040161099e90614283565b600680546001600160a01b0319166001600160a01b0383161790556040517f2351f252c60252e548e93df4d785886faa1d88410325b8bce69d624a25583ae790610a17908390613fcb565b600260015414156114b35760405162461bcd60e51b815260040161099e9061487b565b60026001556000805b60085481101561150057600881815481106114d357fe5b6000918252602090912001546001600160a01b03163314156114f85760019150611500565b6001016114bc565b506001811515146115235760405162461bcd60e51b815260040161099e90614430565b604051636119bced60e11b8152339063c23379da9061154c908890889088908890600401614059565b600060405180830381600087803b15801561156657600080fd5b505af115801561157a573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b91506115b290339088908890600401613fdf565b600060405180830381600087803b1580156115cc57600080fd5b505af11580156115e0573d6000803e3d6000fd5b50506001805550505050505050565b60025461010090046001600160a01b03163314806116255750611610611aed565b6001600160a01b0316336001600160a01b0316145b6116415760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166116675760405162461bcd60e51b815260040161099e90614735565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611691613b49565b506001600160a01b03166000908152600960209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015290565b6116ec6138ab565b6001600160a01b03166116fd611aed565b6001600160a01b0316146117235760405162461bcd60e51b815260040161099e9061462d565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025461010090046001600160a01b03163314806117a3575061178e611aed565b6001600160a01b0316336001600160a01b0316145b6117bf5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166117e55760405162461bcd60e51b815260040161099e9061449e565b60028054610100600160a81b0319166101006001600160a01b038416021790556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e90610a17908390613fcb565b600260015414156118585760405162461bcd60e51b815260040161099e9061487b565b600260015560065460405163025181bb60e41b81526001600160a01b03909116906325181bb0906118909060089033906004016140e9565b600060405180830381600087803b1580156118aa57600080fd5b505af11580156118be573d6000803e3d6000fd5b5050600180555050565b6001600160a01b038216600090815260096020526040812054839060ff166119025760405162461bcd60e51b815260040161099e906146d0565b600260015414156119255760405162461bcd60e51b815260040161099e9061487b565b60026001556119326113c4565b1561194f5760405162461bcd60e51b815260040161099e906144d5565b60405163830cbbbd60e01b81526000906001600160a01b0386169063830cbbbd906119809033908890600401614026565b602060405180830381600087803b15801561199a57600080fd5b505af11580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d29190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90611a05908890339060040161403f565b600060405180830381600087803b158015611a1f57600080fd5b505af1158015611a33573d6000803e3d6000fd5b505050507fda2fcb771cce6a80cd6c0101db394f4fd1f8755def9185535cc97509f3e03cdd338683604051611a6a93929190614002565b60405180910390a160018055949350505050565b60025461010090046001600160a01b0316331480611ab45750611a9f611aed565b6001600160a01b0316336001600160a01b0316145b611ad05760405162461bcd60e51b815260040161099e906143e9565b6110256138af565b6007546001600160a01b031681565b600b5481565b6000546001600160a01b031690565b600d60209081526000928352604080842090915290825290205460ff1681565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205460ff165b92915050565b6001600160a01b038216600090815260096020526040812054839060ff16611b865760405162461bcd60e51b815260040161099e906146d0565b60026001541415611ba95760405162461bcd60e51b815260040161099e9061487b565b6002600155611bb66113c4565b15611bd35760405162461bcd60e51b815260040161099e906144d5565b6040516312c5282f60e31b81526000906001600160a01b038616906396294178906119809033908890600401614026565b600c6020528160005260406000208181548110611c1d57fe5b6000918252602090912001546001600160a01b03169150829050565b60025461010090046001600160a01b0316331480611c6f5750611c5a611aed565b6001600160a01b0316336001600160a01b0316145b611c8b5760405162461bcd60e51b815260040161099e906143e9565b600b8190556040517f6791c9b68799eda502f8f7808e4ab556a632237eea58a66c4f7e4e6f94574d0d90610a17908390614916565b6001600160a01b038216600090815260096020526040902054829060ff16611cfa5760405162461bcd60e51b815260040161099e906146d0565b60026001541415611d1d5760405162461bcd60e51b815260040161099e9061487b565b6002600155611d2a6113c4565b15611d475760405162461bcd60e51b815260040161099e906144d5565b60405163157b6bd560e31b81526001600160a01b0384169063abdb5ea8903490611d779033908790600401614026565b6020604051808303818588803b158015611d9057600080fd5b505af1158015611da4573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112c29190613f08565b60025461010090046001600160a01b031681565b60088181548110611dea57fe5b6000918252602090912001546001600160a01b0316905081565b6001600160a01b038216600090815260096020526040812054839060ff16611e3e5760405162461bcd60e51b815260040161099e906146d0565b60026001541415611e615760405162461bcd60e51b815260040161099e9061487b565b6002600155611e6e6113c4565b15611e8b5760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611ecf57600080fd5b505afa158015611ee3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f079190613c04565b6001600160a01b031614611f1b5782611f1d565b345b6001600160a01b03851660009081526009602052604090206001015490935080158061204f57508061204c85612046670de0b6b3a76400006120408a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9157600080fd5b505afa158015611fa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fc99190613f08565b8b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561200257600080fd5b505afa158015612016573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203a9190613f08565b9061390a565b9061394b565b9061397d565b11155b61206b5760405162461bcd60e51b815260040161099e906143b2565b6000856001600160a01b031663bba6157834338a896040518563ffffffff1660e01b815260040161209e93929190614002565b6020604051808303818588803b1580156120b757600080fd5b505af11580156120cb573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120f09190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b906121239089908b9060040161403f565b600060405180830381600087803b15801561213d57600080fd5b505af1158015612151573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe17387878760405161218893929190614002565b60405180910390a1600180559695505050505050565b60025461010090046001600160a01b03163314806121d457506121bf611aed565b6001600160a01b0316336001600160a01b0316145b6121f05760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038216600090815260096020526040902054829060ff1661222a5760405162461bcd60e51b815260040161099e906146d0565b670c7d713b49da00008211156122525760405162461bcd60e51b815260040161099e90614662565b81158015906122de575060075460405163fc57d4df60e01b81526001600160a01b039091169063fc57d4df9061228c908690600401613fcb565b60206040518083038186803b1580156122a457600080fd5b505afa1580156122b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122dc9190613f08565b155b156122fb5760405162461bcd60e51b815260040161099e90614344565b6001600160a01b03831660009081526009602052604090819020600301839055517f275d6207ccd4271a12c584febf2bcf32254205dfb4639ce1a9184d2e2609e2d09061234b9085908590614026565b60405180910390a1505050565b60005b81518110156123895761238182828151811061237357fe5b60200260200101513361374d565b60010161235b565b5050565b6123956138ab565b6001600160a01b03166123a6611aed565b6001600160a01b0316146123cc5760405162461bcd60e51b815260040161099e9061462d565b600e5460ff16156123ef5760405162461bcd60e51b815260040161099e9061452c565b6123f76139a2565b600780546001600160a01b0319166001600160a01b0392909216919091179055600e805460ff19166001179055565b60025461010090046001600160a01b031633148061245c5750612447611aed565b6001600160a01b0316336001600160a01b0316145b6124785760405162461bcd60e51b815260040161099e906143e9565b821580159061248657508281145b6124a25760405162461bcd60e51b815260040161099e906147d8565b60005b83811015610c70578282828181106124b957fe5b90506020020135600960008787858181106124d057fe5b90506020020160208101906124e59190613be8565b6001600160a01b0316815260208101919091526040016000206001015584848281811061250e57fe5b90506020020160208101906125239190613be8565b6001600160a01b03167f638a463c59949a284e093291dedfbadcb32ebf9007e649767344e67346ab882984848481811061255957fe5b9050602002013560405161256d9190614916565b60405180910390a26001016124a5565b60025461010090046001600160a01b03163314806125b3575061259e611aed565b6001600160a01b0316336001600160a01b0316145b6125cf5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b03841660009081526009602052604090205460ff16156126085760405162461bcd60e51b815260040161099e906148b2565b60005b60085481101561266757846001600160a01b03166008828154811061262c57fe5b6000918252602090912001546001600160a01b0316141561265f5760405162461bcd60e51b815260040161099e906148b2565b60010161260b565b506040805160808101825260018082526020808301878152838501878152606085018781526001600160a01b038b16600081815260099095528785209651875460ff1916901515178755925186860155905160028601555160039094019390935560088054928301815590527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055517fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f90612734908690613fcb565b60405180910390a150505050565b6003546001600160a01b031681565b60025461010090046001600160a01b03163314806127875750612772611aed565b6001600160a01b0316336001600160a01b0316145b6127a35760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b03811660009081526009602052604090205460ff166127db5760405162461bcd60e51b815260040161099e90614559565b806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561281457600080fd5b505afa158015612828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284c9190613f08565b1580156128c75750806001600160a01b0316638285ef406040518163ffffffff1660e01b815260040160206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c59190613f08565b155b6128e35760405162461bcd60e51b815260040161099e906147a1565b60085460005b818110156129f357826001600160a01b03166008828154811061290857fe5b6000918252602090912001546001600160a01b031614156129eb576008600183038154811061293357fe5b600091825260209091200154600880546001600160a01b03909216918390811061295957fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600880548061299257fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526009905260408120805460ff191681556001810182905560028101829055600301556129f3565b6001016128e9565b505050565b60025461010090046001600160a01b0316331480612a2e5750612a19611aed565b6001600160a01b0316336001600160a01b0316145b612a4a5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b038116612a705760405162461bcd60e51b815260040161099e90614804565b600580546001600160a01b0319166001600160a01b0383161790556040517f827daa11640de0eb908d0b06593ffb3f2b5e14e83d678fb922e512075f1d36f090610a17908390613fcb565b60026001541415612ade5760405162461bcd60e51b815260040161099e9061487b565b6002600155612aeb6113c4565b15612b085760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612b4c57600080fd5b505afa158015612b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b849190613c04565b6001600160a01b031614612b985780612b9a565b345b6001600160a01b03851660009081526009602052604090205490915060ff168015612bdd57506001600160a01b03831660009081526009602052604090205460ff165b612bf95760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612c3e5760405162461bcd60e51b815260040161099e9061484b565b6001600160a01b038316600090815260096020526040902060030154612c765760405162461bcd60e51b815260040161099e9061484b565b60048054600a546040516312e8123160e11b81526001600160a01b03909216926325d0246292612cad928992889288929101614083565b602060405180830381600087803b158015612cc757600080fd5b505af1158015612cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cff9190613e93565b612d1b5760405162461bcd60e51b815260040161099e906146fe565b600080856001600160a01b031663e61604cf34873388886040518663ffffffff1660e01b8152600401612d519493929190614059565b6060604051808303818588803b158015612d6a57600080fd5b505af1158015612d7e573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612da39190613f20565b60405163b2a02ff160e01b815291945092506001600160a01b038716915063b2a02ff190612dd990339088908690600401614002565b600060405180830381600087803b158015612df357600080fd5b505af1158015612e07573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b9150612e3f90889088903390600401613fdf565b600060405180830381600087803b158015612e5957600080fd5b505af1158015612e6d573d6000803e3d6000fd5b505050506000821115612f4d5760055460405163b2a02ff160e01b81526001600160a01b038781169263b2a02ff192612eb0929091169088908790600401614002565b600060405180830381600087803b158015612eca57600080fd5b505af1158015612ede573d6000803e3d6000fd5b505060065460055460405163dd9aba1b60e01b81526001600160a01b03928316945063dd9aba1b9350612f1a928a928a92911690600401613fdf565b600060405180830381600087803b158015612f3457600080fd5b505af1158015612f48573d6000803e3d6000fd5b505050505b6006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90612f7f908990889060040161403f565b600060405180830381600087803b158015612f9957600080fd5b505af1158015612fad573d6000803e3d6000fd5b5050600180555050505050505050565b6001600160a01b038116600090815260096020526040902054819060ff16612ff75760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b0382166000908152600d60209081526040808320338452909152902054829060ff1661303c5760405162461bcd60e51b815260040161099e9061424c565b613044613b73565b60405163497d274760e11b81526001600160a01b038516906392fa4e8e90613070903390600401613fcb565b606060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c29190613eb3565b905080602001516000146130e85760405162461bcd60e51b815260040161099e9061420b565b60048054825160405163eabe7d9160e01b81526001600160a01b039092169263eabe7d919261311b928992339201614002565b602060405180830381600087803b15801561313557600080fd5b505af1158015613149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316d9190613e93565b6131895760405162461bcd60e51b815260040161099e90614588565b61319384336139bc565b7fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d843360405161273492919061403f565b600260015414156131e75760405162461bcd60e51b815260040161099e9061487b565b600260019081556040805182815280820190915260609160208083019080368337019050509050818160008151811061321c57fe5b6001600160a01b03928316602091820292909201015260065460405163025181bb60e41b81529116906325181bb0906110d690849033906004016140bf565b60025461010090046001600160a01b0316331480613291575061327c611aed565b6001600160a01b0316336001600160a01b0316145b6132ad5760405162461bcd60e51b815260040161099e906143e9565b6001600160a01b0381166132d35760405162461bcd60e51b815260040161099e9061430d565b600380546001600160a01b0319166001600160a01b0383161790556040517f21887d3c26545972adeaf9e44bd9aa5b527cd2b60b24cce6171828a07c564ea990610a17908390613fcb565b6001600160a01b038216600090815260096020526040812054839060ff166133585760405162461bcd60e51b815260040161099e906146d0565b6002600154141561337b5760405162461bcd60e51b815260040161099e9061487b565b60026001556133886113c4565b156133a55760405162461bcd60e51b815260040161099e906144d5565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156133e957600080fd5b505afa1580156133fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134219190613c04565b6001600160a01b0316146134355782613437565b345b6001600160a01b0385166000908152600960205260409020600101549093508015806134ae5750806134ab85612046670de0b6b3a76400006120408a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f9157600080fd5b11155b6134ca5760405162461bcd60e51b815260040161099e906143b2565b6000856001600160a01b031663f2b9fdb83433886040518463ffffffff1660e01b81526004016134fb929190614026565b6020604051808303818588803b15801561351457600080fd5b505af1158015613528573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061354d9190613f08565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90613580908990339060040161403f565b600060405180830381600087803b15801561359a57600080fd5b505af11580156135ae573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe1733387876040516135e593929190614002565b60405180910390a16001805595945050505050565b6136026138ab565b6001600160a01b0316613613611aed565b6001600160a01b0316146136395760405162461bcd60e51b815260040161099e9061462d565b6001600160a01b03811661365f5760405162461bcd60e51b815260040161099e906142c7565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604051635ec88c7960e01b8152600092839283926001600160a01b0390911691635ec88c79916136f091889101613fcb565b60606040518083038186803b15801561370857600080fd5b505afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190613f20565b9250925092509193909250565b6001600160a01b038216600090815260096020526040902054829060ff166137875760405162461bcd60e51b815260040161099e906146d0565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff166129f3576001600160a01b038084166000818152600d602090815260408083209487168352938152838220805460ff19166001908117909155600c825284832080549182018155835291200180546001600160a01b0319169091179055517f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a59061234b908590859061403f565b6138456113c4565b6138615760405162461bcd60e51b815260040161099e906141dd565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6138946138ab565b6040516138a19190613fcb565b60405180910390a1565b3390565b6138b76113c4565b156138d45760405162461bcd60e51b815260040161099e906144d5565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138946138ab565b60008261391957506000611b46565b8282028284828161392657fe5b04146139445760405162461bcd60e51b815260040161099e906145b5565b9392505050565b600080821161396c5760405162461bcd60e51b815260040161099e90614467565b81838161397557fe5b049392505050565b6000828201838110156139445760405162461bcd60e51b815260040161099e9061437b565b6706f05b59d3b20000600a55670ff59ee833b30000600b55565b6001600160a01b0381166000908152600c60205260409020546139f15760405162461bcd60e51b815260040161099e906145f6565b6001600160a01b038083166000908152600d602090815260408083209385168352928152828220805460ff19169055600c905290812054905b81811015613b43576001600160a01b038381166000908152600c6020526040902080549186169183908110613a5b57fe5b6000918252602090912001546001600160a01b03161415613b3b576001600160a01b0383166000908152600c6020526040902080546000198401908110613a9e57fe5b60009182526020808320909101546001600160a01b038681168452600c9092526040909220805491909216919083908110613ad557fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600c90915260409020805480613b1457fe5b600082815260209020810160001990810180546001600160a01b0319169055019055613b43565b600101613a2a565b50505050565b60405180608001604052806000151581526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b8035611b468161497c565b60008083601f840112613bb0578182fd5b50813567ffffffffffffffff811115613bc7578182fd5b6020830191508360208083028501011115613be157600080fd5b9250929050565b600060208284031215613bf9578081fd5b81356139448161497c565b600060208284031215613c15578081fd5b81516139448161497c565b60008060008060808587031215613c35578283fd5b8435613c408161497c565b966020860135965060408601359560600135945092505050565b60008060408385031215613c6c578182fd5b8235613c778161497c565b91506020830135613c878161497c565b809150509250929050565b60008060008060808587031215613ca7578384fd5b8435613cb28161497c565b93506020850135613cc28161497c565b92506040850135613cd28161497c565b9396929550929360600135925050565b600080600060608486031215613cf6578283fd5b8335613d018161497c565b92506020840135613d118161497c565b929592945050506040919091013590565b60008060408385031215613d34578182fd5b8235613d3f8161497c565b946020939093013593505050565b60008060208385031215613d5f578182fd5b823567ffffffffffffffff811115613d75578283fd5b613d8185828601613b9f565b90969095509350505050565b60008060008060408587031215613da2578384fd5b843567ffffffffffffffff80821115613db9578586fd5b613dc588838901613b9f565b90965094506020870135915080821115613ddd578384fd5b50613dea87828801613b9f565b95989497509550505050565b60006020808385031215613e08578182fd5b823567ffffffffffffffff811115613e1e578283fd5b8301601f81018513613e2e578283fd5b8035613e41613e3c8261495c565b614935565b8181528381019083850185840285018601891015613e5d578687fd5b8694505b83851015613e8757613e738982613b94565b835260019490940193918501918501613e61565b50979650505050505050565b600060208284031215613ea4578081fd5b81518015158114613944578182fd5b600060608284031215613ec4578081fd5b613ece6060614935565b8251815260208301516020820152604083015160408201528091505092915050565b600060208284031215613f01578081fd5b5035919050565b600060208284031215613f19578081fd5b5051919050565b600080600060608486031215613f34578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613f855781516001600160a01b031687529582019590820190600101613f60565b509495945050505050565b6000815480845260208085019450838352808320835b83811015613f855781546001600160a01b031687529582019560019182019101613fa6565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082526139446020830184613f4d565b6000604082526140d26040830185613f4d565b905060018060a01b03831660208301529392505050565b6000604082526140d26040830185613f90565b60006060825261410f6060830186613f90565b6001600160a01b039490941660208301525060400152919050565b60006040825261413d6040830186613f90565b82810360208481019190915284825285918101835b86811015613e875783356141658161497c565b6001600160a01b031682529282019290820190600101614152565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b6020808252818101527f436f72653a2063616c6c65722073686f756c64206265206c6576657261676572604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526021908201527f436f72653a20626f72726f772062616c616e6365206d757374206265207a65726040820152606f60f81b606082015260800190565b60208082526017908201527f436f72653a206d75737420656e746572206d61726b6574000000000000000000604082015260600190565b60208082526024908201527f436f72653a20696e76616c6964206c61624469737472696275746f72206164646040820152637265737360e01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601f908201527f436f72653a20696e76616c6964206c6576657261676572206164647265737300604082015260600190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672070726963650000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f436f72653a20737570706c792063617020726561636865640000000000000000604082015260600190565b60208082526027908201527f436f72653a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152661035b2b2b832b960c91b606082015260800190565b6020808252601d908201527f436f72653a2063616c6c65722073686f756c64206265206d61726b6574000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f436f72653a20696e76616c6964206b6565706572206164647265737300000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f7420626f72726f7760681b604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526015908201527410dbdc994e881d5b9b1a5cdd1959081b585c9ad95d605a1b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f742072656465656d60681b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f436f72653a2063616e6e6f7420706f702075736572206d61726b657400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f436f72653a20696e76616c696420636f6c6c61746572616c20666163746f7200604082015260600190565b6020808252601a908201527f436f72653a20696e76616c696420636c6f736520666163746f72000000000000604082015260600190565b60208082526014908201527310dbdc994e881a5b9d985b1a59081b585c9ad95d60621b604082015260600190565b6020808252601d908201527f436f72653a2063616e6e6f74206c697175696461746520626f72726f77000000604082015260600190565b6020808252818101527f436f72653a20696e76616c69642063616c63756c61746f722061646472657373604082015260600190565b6020808252601f908201527f436f72653a20696e76616c69642076616c696461746f72206164647265737300604082015260600190565b6020808252601a908201527f436f72653a2063616e6e6f742072656d6f7665206d61726b6574000000000000604082015260600190565b602080825260129082015271436f72653a20696e76616c6964206461746160701b604082015260600190565b60208082526027908201527f436f72653a20696e76616c6964207265626174654469737472696275746f72206040820152666164647265737360c81b606082015260800190565b60208082526016908201527510dbdc994e881b9bdd08184818dbdb1b185d195c985b60521b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f436f72653a20616c7265616479206c6973746564206d61726b65740000000000604082015260600190565b81511515815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561495457600080fd5b604052919050565b600067ffffffffffffffff821115614972578081fd5b5060209081020190565b6001600160a01b038116811461499157600080fd5b5056fea2646970667358221220c29c43d173369c81629c40fbaaf3d4cf39a779d1e898cb8ecded94de7c929c4f64736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1,885.37
Net Worth in ETH
Token Allocations
ETH
100.00%
POL
0.00%
Multichain Portfolio | 35 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.