More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 519,741 transactions (+13 Pending)
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xeac064d4eecbe406aad8ab30b2f8b2520ebf6f1a92435501e50532495a17c2f1 | - | (pending) | 5 hrs ago | IN | 0 ETH | (Pending) | |||
0x4047e01b13d429de70bb0de44eadab6f54fff24ec5049793578915c6aeee5b05 | - | (pending) | 5 hrs ago | IN | 0 ETH | (Pending) | |||
0x79093fa2a6b07d1b448e38d64667f38f0fa6a1c2f3c7696da7174e93e03213af | - | (pending) | 37 hrs ago | IN | 0 ETH | (Pending) | |||
0xf4016f6e829f5e412044151e487c5db422a32d9cb83475fe11003b34b89b8e4d | - | (pending) | 2 days ago | IN | 0 ETH | (Pending) | |||
0xeb9bb3ff63baf6b58e60857326a2f86fa232ac34a8d9ad56d7cca7e33f150188 | - | (pending) | 2 days ago | IN | 0.0122 ETH | (Pending) | |||
0x8c5656bb91efea27d35e22d5e5a1a26182a05cee0260046abc42bf1ecc8f5a92 | - | (pending) | 2 days ago | IN | 0.0138 ETH | (Pending) | |||
0x744d9bbd85cfb9910dba70017f2b9ef1bc14d8ddafd8c3f8353658149282f38e | - | (pending) | 2 days ago | IN | 0.00001 ETH | (Pending) | |||
0xcfd7b28cd11339feb5cdb54c1b99cb30dfac6c27b7df00b1650e8116c3731cfe | - | (pending) | 2 days ago | IN | 0 ETH | (Pending) | |||
0xe34b2ed37366700054df49a73385922ccfb86a0b9eec8b2e9677af7f3140f5ab | - | (pending) | 2 days ago | IN | 0 ETH | (Pending) | |||
0xf00478783fcd4383e67aed34cd44d10b97035ce571d59f312939383838312ce2 | - | (pending) | 7 days ago | IN | 0 ETH | (Pending) | |||
0xb98a474d8788db4c49a3c5d909a95cc3055b516602d6f18bb0a6d3d96c30754a | - | (pending) | 9 days ago | IN | 0 ETH | (Pending) | |||
0xa1eb1b0be36a165716a3222a3ce9643af2a087d3d9c92481d7692bc6274b4e8c | - | (pending) | 9 days ago | IN | 0 ETH | (Pending) | |||
0xf0043e12298ae058521a7505c8ca7041375a36d6338486f7e062a43b2568aaae | - | (pending) | 23 days ago | IN | 0 ETH | (Pending) | |||
Redeem Token | 13374323 | 22 secs ago | IN | 0 ETH | 0.00002073 | ||||
Redeem Token | 13374306 | 56 secs ago | IN | 0 ETH | 0.00000986 | ||||
Redeem Token | 13374274 | 2 mins ago | IN | 0 ETH | 0.00001146 | ||||
Redeem Token | 13374269 | 2 mins ago | IN | 0 ETH | 0.00002183 | ||||
Supply | 13374263 | 2 mins ago | IN | 0 ETH | 0.00001151 | ||||
Supply | 13374215 | 4 mins ago | IN | 0 ETH | 0.00002245 | ||||
Redeem Token | 13374196 | 4 mins ago | IN | 0 ETH | 0.00002277 | ||||
Repay Borrow | 13374186 | 4 mins ago | IN | 0.01181938 ETH | 0.00001901 | ||||
Redeem Underlyin... | 13374143 | 6 mins ago | IN | 0 ETH | 0.00002364 | ||||
Redeem Token | 13374114 | 7 mins ago | IN | 0 ETH | 0.00006114 | ||||
Repay Borrow | 13374080 | 8 mins ago | IN | 0.071 ETH | 0.00001522 | ||||
Enter Markets | 13374077 | 8 mins ago | IN | 0 ETH | 0.00000898 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13374323 | 22 secs ago | 0 ETH | ||||
13374323 | 22 secs ago | 0 ETH | ||||
13374323 | 22 secs ago | 0 ETH | ||||
13374323 | 22 secs ago | 0 ETH | ||||
13374306 | 56 secs ago | 0 ETH | ||||
13374306 | 56 secs ago | 0 ETH | ||||
13374306 | 56 secs ago | 0 ETH | ||||
13374306 | 56 secs ago | 0 ETH | ||||
13374274 | 2 mins ago | 0 ETH | ||||
13374274 | 2 mins ago | 0 ETH | ||||
13374274 | 2 mins ago | 0 ETH | ||||
13374274 | 2 mins ago | 0 ETH | ||||
13374269 | 2 mins ago | 0 ETH | ||||
13374269 | 2 mins ago | 0 ETH | ||||
13374269 | 2 mins ago | 0 ETH | ||||
13374269 | 2 mins ago | 0 ETH | ||||
13374263 | 2 mins ago | 0 ETH | ||||
13374263 | 2 mins ago | 0 ETH | ||||
13374263 | 2 mins ago | 0 ETH | ||||
13374215 | 4 mins ago | 0 ETH | ||||
13374215 | 4 mins ago | 0 ETH | ||||
13374215 | 4 mins ago | 0 ETH | ||||
13374196 | 4 mins ago | 0 ETH | ||||
13374196 | 4 mins ago | 0 ETH | ||||
13374196 | 4 mins ago | 0 ETH |
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; 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; 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; 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
[{"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
[ 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.