Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 114 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Redeem Token | 1995242 | 657 days ago | IN | 0 ETH | 0.00002405 | ||||
| Redeem Token | 1995185 | 657 days ago | IN | 0 ETH | 0.00002726 | ||||
| Redeem Token | 1995108 | 657 days ago | IN | 0 ETH | 0.00002565 | ||||
| Redeem Token | 1995057 | 657 days ago | IN | 0 ETH | 0.00002567 | ||||
| Repay Borrow | 1995024 | 657 days ago | IN | 0 ETH | 0.0000206 | ||||
| Repay Borrow | 1994911 | 657 days ago | IN | 0.051421 ETH | 0.00002327 | ||||
| Redeem Token | 1994871 | 657 days ago | IN | 0 ETH | 0.00002513 | ||||
| Repay Borrow | 1994820 | 657 days ago | IN | 0 ETH | 0.00002123 | ||||
| Redeem Underlyin... | 1994109 | 657 days ago | IN | 0 ETH | 0.00002385 | ||||
| Redeem Underlyin... | 1994107 | 657 days ago | IN | 0 ETH | 0.00002385 | ||||
| Redeem Underlyin... | 1994098 | 657 days ago | IN | 0 ETH | 0.00002507 | ||||
| Redeem Underlyin... | 1994097 | 657 days ago | IN | 0 ETH | 0.00002507 | ||||
| Redeem Underlyin... | 1994057 | 657 days ago | IN | 0 ETH | 0.00002459 | ||||
| Redeem Underlyin... | 1994052 | 657 days ago | IN | 0 ETH | 0.00002538 | ||||
| Redeem Underlyin... | 1994042 | 657 days ago | IN | 0 ETH | 0.00002442 | ||||
| Redeem Underlyin... | 1994037 | 657 days ago | IN | 0 ETH | 0.00002443 | ||||
| Redeem Underlyin... | 1993997 | 657 days ago | IN | 0 ETH | 0.00002474 | ||||
| Redeem Underlyin... | 1993996 | 657 days ago | IN | 0 ETH | 0.00002474 | ||||
| Redeem Underlyin... | 1993928 | 657 days ago | IN | 0 ETH | 0.00002314 | ||||
| Redeem Underlyin... | 1993925 | 657 days ago | IN | 0 ETH | 0.00002366 | ||||
| Redeem Underlyin... | 1993911 | 657 days ago | IN | 0 ETH | 0.00002369 | ||||
| Redeem Underlyin... | 1993906 | 657 days ago | IN | 0 ETH | 0.00002308 | ||||
| Redeem Underlyin... | 1969451 | 657 days ago | IN | 0 ETH | 0.00003233 | ||||
| Redeem Underlyin... | 1969432 | 657 days ago | IN | 0 ETH | 0.00003009 | ||||
| Redeem Token | 1276605 | 673 days ago | IN | 0 ETH | 0.00003231 |
Latest 14 internal transactions
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 1994911 | 657 days ago | 0.051421 ETH | ||||
| 1276441 | 673 days ago | 0.01 ETH | ||||
| 372863 | 694 days ago | 0.05 ETH | ||||
| 372718 | 694 days ago | 0.07 ETH | ||||
| 371368 | 694 days ago | 0.003 ETH | ||||
| 368555 | 694 days ago | 0.00041004 ETH | ||||
| 368538 | 694 days ago | 0.00041004 ETH | ||||
| 368423 | 695 days ago | 0.04690589 ETH | ||||
| 368290 | 695 days ago | 0.00310986 ETH | ||||
| 336027 | 695 days ago | 0.05 ETH | ||||
| 335869 | 695 days ago | 0.1 ETH | ||||
| 330055 | 695 days ago | 0.001 ETH | ||||
| 329853 | 695 days ago | 0.0001 ETH | ||||
| 328570 | 695 days ago | 0.001 ETH |
Cross-Chain Transactions
Contract Source Code (Solidity Standard Json-Input format)
// Sources flattened with hardhat v2.11.1 https://hardhat.org
// File contracts/library/Constant.sol
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 LoanData {
uint256 loanId;
LoanState state;
address borrower;
address gNft;
address nftAsset;
uint256 nftTokenId;
uint256 borrowAmount;
uint256 interestIndex;
uint256 bidStartTimestamp;
address bidderAddress;
uint256 bidPrice;
uint256 bidBorrowAmount;
uint256 floorPrice;
uint256 bidCount;
address firstBidderAddress;
}
struct AccountSnapshot {
uint256 gTokenBalance;
uint256 borrowBalance;
uint256 exchangeRate;
}
struct AccrueSnapshot {
uint256 totalBorrow;
uint256 totalReserve;
uint256 accInterestIndex;
}
struct AccrueLoanSnapshot {
uint256 totalBorrow;
uint256 accInterestIndex;
}
struct DistributionInfo {
uint256 supplySpeed;
uint256 borrowSpeed;
uint256 totalBoostedSupply;
uint256 totalBoostedBorrow;
uint256 accPerShareSupply;
uint256 accPerShareBorrow;
uint256 accruedAt;
}
struct DistributionAccountInfo {
uint256 accuredLAB; // Unclaimed LAB rewards amount
uint256 boostedSupply; // effective(boosted) supply balance of user (since last_action)
uint256 boostedBorrow; // effective(boosted) borrow balance of user (since last_action)
uint256 accPerShareSupply; // Last integral value of LAB rewards per share. ∫(LABRate(t) / totalShare(t) dt) from 0 till (last_action)
uint256 accPerShareBorrow; // Last integral value of LAB rewards per share. ∫(LABRate(t) / totalShare(t) dt) from 0 till (last_action)
}
struct DistributionAPY {
uint256 apySupplyLab;
uint256 apyBorrowLab;
uint256 apyAccountSupplyLab;
uint256 apyAccountBorrowLab;
}
struct RebateCheckpoint {
uint256 timestamp;
uint256 totalScore;
uint256 adminFeeRate;
uint256 weeklyLabSpeed;
uint256 additionalLabAmount;
mapping(address => uint256) marketFees;
}
struct LockInfo {
uint256 timestamp;
uint256 amount;
uint256 expiry;
}
}
// File contracts/interfaces/ILToken.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
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 redeemToken(address account, uint256 gTokenAmount) external returns (uint256);
function redeemUnderlying(address account, uint256 underlyingAmount) external returns (uint256);
function borrow(address account, uint256 amount) external returns (uint256);
function repayBorrow(address account, uint256 amount) external payable returns (uint256);
function repayBorrowBehalf(address payer, address borrower, uint256 amount) external payable returns (uint256);
function liquidateBorrow(
address gTokenCollateral,
address liquidator,
address borrower,
uint256 amount
) external payable returns (uint256 seizeGAmount, uint256 rebateGAmount, uint256 liquidatorGAmount);
function seize(address liquidator, address borrower, uint256 gTokenAmount) external;
function withdrawReserves() external;
function transferTokensInternal(address spender, address src, address dst, uint256 amount) external;
}
// File contracts/interfaces/ICore.sol
pragma solidity ^0.6.12;
interface ICore {
/* ========== Event ========== */
event MarketSupply(address user, address gToken, uint256 uAmount);
event MarketRedeem(address user, address gToken, uint256 uAmount);
event MarketListed(address gToken);
event MarketEntered(address gToken, address account);
event MarketExited(address gToken, address account);
event CloseFactorUpdated(uint256 newCloseFactor);
event CollateralFactorUpdated(address gToken, uint256 newCollateralFactor);
event LiquidationIncentiveUpdated(uint256 newLiquidationIncentive);
event SupplyCapUpdated(address indexed gToken, uint256 newSupplyCap);
event BorrowCapUpdated(address indexed gToken, uint256 newBorrowCap);
event KeeperUpdated(address newKeeper);
event NftCoreUpdated(address newNftCore);
event ValidatorUpdated(address newValidator);
event LABDistributorUpdated(address newLABDistributor);
event RebateDistributorUpdated(address newRebateDistributor);
event FlashLoan(
address indexed target,
address indexed initiator,
address indexed asset,
uint256 amount,
uint256 premium
);
function nftCore() external view returns (address);
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 gToken) external view returns (Constant.MarketInfo memory);
function checkMembership(address account, address gToken) 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 gTokens) external;
function exitMarket(address gToken) external;
function supply(address gToken, uint256 underlyingAmount) external payable returns (uint256);
function redeemToken(address gToken, uint256 gTokenAmount) external returns (uint256 redeemed);
function redeemUnderlying(address gToken, uint256 underlyingAmount) external returns (uint256 redeemed);
function borrow(address gToken, uint256 amount) external;
function nftBorrow(address gToken, address user, uint256 amount) external;
function repayBorrow(address gToken, uint256 amount) external payable;
function nftRepayBorrow(address gToken, address user, uint256 amount) external payable;
function repayBorrowBehalf(address gToken, address borrower, uint256 amount) external payable;
function liquidateBorrow(
address gTokenBorrowed,
address gTokenCollateral,
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() external;
}
// File contracts/interfaces/IPriceCalculator.sol
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 gToken) external view returns (uint256);
function getUnderlyingPrices(address[] memory gTokens) external view returns (uint256[] memory);
}
// File contracts/interfaces/ILABDistributor.sol
pragma solidity ^0.6.12;
interface ILABDistributor {
/* ========== EVENTS ========== */
event DistributionSpeedUpdated(address indexed gToken, 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 kick(address user) external;
function updateAccountBoostedInfo(address user) external;
function compound(address[] calldata markets, address account) external;
function pause() external;
function unpause() external;
function approve(address _spender, uint256 amount) external returns (bool);
}
// File contracts/interfaces/IRebateDistributor.sol
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 indicativeYearProfit() external view returns (uint256);
function accruedRebates(address account) external view returns (uint256, uint256, uint256[] memory);
function claimRebates() external returns (uint256, uint256, uint256[] memory);
function claimAdminRebates() external returns (uint256, uint256[] memory);
function addLABToRebatePool(uint256 amount) external;
function addMarketUTokenToRebatePool(address lToken, uint256 uAmount) external payable;
}
// File @openzeppelin/contracts/utils/[email protected]
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;
}
}
// File @openzeppelin/contracts/access/[email protected]
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// File @openzeppelin/contracts/utils/[email protected]
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// File @openzeppelin/contracts/utils/[email protected]
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () internal {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// File contracts/CoreAdmin.sol
pragma solidity ^0.6.12;
abstract contract CoreAdmin is ICore, Ownable, ReentrancyGuard, Pausable {
/* ========== STATE VARIABLES ========== */
address public keeper;
address public override nftCore;
address public override validator;
address public override rebateDistributor;
ILABDistributor public labDistributor;
IPriceCalculator public priceCalculator;
address[] public markets; // gTokenAddress[]
mapping(address => Constant.MarketInfo) public marketInfos; // (gTokenAddress => MarketInfo)
uint256 public override closeFactor;
uint256 public override liquidationIncentive;
/* ========== MODIFIERS ========== */
/// @dev sender 가 keeper address 인지 검증
modifier onlyKeeper() {
require(msg.sender == keeper || msg.sender == owner(), "Core: caller is not the owner or keeper");
_;
}
/// @dev Market 에 list 된 gToken address 인지 검증
/// @param gToken gToken address
modifier onlyListedMarket(address gToken) {
require(marketInfos[gToken].isListed, "Core: invalid market");
_;
}
modifier onlyNftCore() {
require(msg.sender == nftCore, "Core: caller is not the nft core");
_;
}
/* ========== 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);
}
function setNftCore(address _nftCore) external onlyKeeper {
require(_nftCore != address(0), "Core: invalid nft core address");
nftCore = _nftCore;
emit NftCoreUpdated(_nftCore);
}
/// @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);
}
/// @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);
}
/// @notice Market collateral factor (담보 인정 비율) 변경
/// @dev keeper address 에서만 요청 가능
/// @param gToken gToken address
/// @param newCollateralFactor collateral factor (담보 인정 비율)
function setCollateralFactor(
address gToken,
uint256 newCollateralFactor
) external onlyKeeper onlyListedMarket(gToken) {
require(newCollateralFactor <= Constant.COLLATERAL_FACTOR_MAX, "Core: invalid collateral factor");
if (newCollateralFactor != 0 && priceCalculator.getUnderlyingPrice(gToken) == 0) {
revert("Core: invalid underlying price");
}
marketInfos[gToken].collateralFactor = newCollateralFactor;
emit CollateralFactorUpdated(gToken, newCollateralFactor);
}
/// @notice 청산 인센티브 설정
/// @dev keeper address 에서만 요청 가능
/// @param newLiquidationIncentive 새로운 청산 인센티브 값 (TBD)
function setLiquidationIncentive(uint256 newLiquidationIncentive) external onlyKeeper {
liquidationIncentive = newLiquidationIncentive;
emit LiquidationIncentiveUpdated(newLiquidationIncentive);
}
/// @notice Market supply cap 변경
/// @dev keeper address 에서만 요청 가능
/// @param gTokens gToken addresses
/// @param newSupplyCaps new supply caps in array
function setMarketSupplyCaps(address[] calldata gTokens, uint256[] calldata newSupplyCaps) external onlyKeeper {
require(gTokens.length != 0 && gTokens.length == newSupplyCaps.length, "Core: invalid data");
for (uint256 i = 0; i < gTokens.length; i++) {
marketInfos[gTokens[i]].supplyCap = newSupplyCaps[i];
emit SupplyCapUpdated(gTokens[i], newSupplyCaps[i]);
}
}
/// @notice Market borrow cap 변경
/// @dev keeper address 에서만 요청 가능
/// @param gTokens gToken addresses
/// @param newBorrowCaps new borrow caps in array
function setMarketBorrowCaps(address[] calldata gTokens, uint256[] calldata newBorrowCaps) external onlyKeeper {
require(gTokens.length != 0 && gTokens.length == newBorrowCaps.length, "Core: invalid data");
for (uint256 i = 0; i < gTokens.length; i++) {
marketInfos[gTokens[i]].borrowCap = newBorrowCaps[i];
emit BorrowCapUpdated(gTokens[i], newBorrowCaps[i]);
}
}
/// @notice Market 추가
/// @dev keeper address 에서만 요청 가능
/// @param gToken gToken address
/// @param supplyCap supply cap
/// @param borrowCap borrow cap
/// @param collateralFactor collateral factor (담보 인정 비율)
function listMarket(
address payable gToken,
uint256 supplyCap,
uint256 borrowCap,
uint256 collateralFactor
) external onlyKeeper {
require(!marketInfos[gToken].isListed, "Core: already listed market");
for (uint256 i = 0; i < markets.length; i++) {
require(markets[i] != gToken, "Core: already listed market");
}
marketInfos[gToken] = Constant.MarketInfo({
isListed: true,
supplyCap: supplyCap,
borrowCap: borrowCap,
collateralFactor: collateralFactor
});
markets.push(gToken);
emit MarketListed(gToken);
}
/// @notice Market 제거
/// @dev keeper address 에서만 요청 가능
/// @param gToken gToken address
function removeMarket(address payable gToken) external onlyKeeper {
require(marketInfos[gToken].isListed, "Core: unlisted market");
require(ILToken(gToken).totalSupply() == 0 && ILToken(gToken).totalBorrow() == 0, "Core: cannot remove market");
uint256 length = markets.length;
for (uint256 i = 0; i < length; i++) {
if (markets[i] == gToken) {
markets[i] = markets[length - 1];
markets.pop();
delete marketInfos[gToken];
break;
}
}
}
function pause() external onlyKeeper {
_pause();
}
function unpause() external onlyKeeper {
_unpause();
}
}
// File contracts/interfaces/IValidator.sol
pragma solidity ^0.6.12;
interface IValidator {
function redeemAllowed(address gToken, address redeemer, uint256 redeemAmount) external returns (bool);
function borrowAllowed(address gToken, address borrower, uint256 borrowAmount) external returns (bool);
function liquidateAllowed(
address gTokenBorrowed,
address borrower,
uint256 repayAmount,
uint256 closeFactor
) external returns (bool);
function gTokenAmountToSeize(
address gTokenBorrowed,
address gTokenCollateral,
uint256 actualRepayAmount
) external returns (uint256 seizeGAmount, uint256 rebateGAmount, uint256 liquidatorGAmount);
function getAccountLiquidity(
address account
) external view returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD);
}
// File @openzeppelin/contracts/math/[email protected]
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
// File contracts/Core.sol
pragma solidity ^0.6.12;
contract Core is CoreAdmin {
using SafeMath for uint256;
/* ========== CONSTANT VARIABLES ========== */
address internal constant ETH = 0x0000000000000000000000000000000000000000;
/* ========== STATE VARIABLES ========== */
mapping(address => address[]) public marketListOfUsers; // (account => gTokenAddress[])
mapping(address => mapping(address => bool)) public usersOfMarket; // (gTokenAddress => (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 ========== */
/// @dev sender 가 해당 gToken 의 Market Enter 되어있는 상태인지 검사
/// @param gToken 검사할 Market 의 gToken address
modifier onlyMemberOfMarket(address gToken) {
require(usersOfMarket[gToken][msg.sender], "Core: must enter market");
_;
}
/// @dev caller 가 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");
_;
}
/* ========== VIEWS ========== */
/// @notice market addresses 조회
/// @return markets address[]
function allMarkets() external view override returns (address[] memory) {
return markets;
}
/// @notice gToken 의 marketInfo 조회
/// @param gToken gToken address
/// @return Market info
function marketInfoOf(address gToken) external view override returns (Constant.MarketInfo memory) {
return marketInfos[gToken];
}
/// @notice account 의 market addresses
/// @param account account address
/// @return Market addresses of account
function marketListOf(address account) external view override returns (address[] memory) {
return marketListOfUsers[account];
}
/// @notice account market enter 상태인지 여부 조회
/// @param account account address
/// @param gToken gToken address
/// @return Market enter 여부에 대한 boolean value
function checkMembership(address account, address gToken) external view override returns (bool) {
return usersOfMarket[gToken][account];
}
/// @notice !TBD
function accountLiquidityOf(
address account
) external view override returns (uint256 collateralInUSD, uint256 supplyInUSD, uint256 borrowInUSD) {
return IValidator(validator).getAccountLiquidity(account);
}
/* ========== MUTATIVE FUNCTIONS ========== */
/// @notice 여러 token 에 대하여 Enter Market 수행
/// @dev 해당 Token 을 대출하거나, 담보로 enable 하기 위해서는 Enter Market 이 필요함
/// @param gTokens gToken addresses
function enterMarkets(address[] memory gTokens) public override {
for (uint256 i = 0; i < gTokens.length; i++) {
_enterMarket(payable(gTokens[i]), msg.sender);
}
}
/// @notice 하나의 token 에 대하여 Market Exit 수행
/// @dev Market 에서 제거할 시에 해당 토큰이 담보물에서 제거되어 청산되지 않음
/// @param gToken Token address
function exitMarket(address gToken) external override onlyListedMarket(gToken) onlyMemberOfMarket(gToken) {
Constant.AccountSnapshot memory snapshot = ILToken(gToken).accruedAccountSnapshot(msg.sender);
require(snapshot.borrowBalance == 0, "Core: borrow balance must be zero");
require(IValidator(validator).redeemAllowed(gToken, msg.sender, snapshot.gTokenBalance), "Core: cannot redeem");
_removeUserMarket(gToken, msg.sender);
emit MarketExited(gToken, msg.sender);
}
/// @notice 담보 제공 트랜잭션
/// @param gToken 담보 gToken address
/// @param uAmount 담보 gToken amount
/// @return gAmount
function supply(
address gToken,
uint256 uAmount
) external payable override onlyListedMarket(gToken) nonReentrant whenNotPaused returns (uint256) {
uAmount = ILToken(gToken).underlying() == address(ETH) ? msg.value : uAmount;
uint256 supplyCap = marketInfos[gToken].supplyCap;
require(
supplyCap == 0 ||
ILToken(gToken).totalSupply().mul(ILToken(gToken).exchangeRate()).div(1e18).add(uAmount) <= supplyCap,
"Core: supply cap reached"
);
uint256 gAmount = ILToken(gToken).supply{value: msg.value}(msg.sender, uAmount);
labDistributor.notifySupplyUpdated(gToken, msg.sender);
emit MarketSupply(msg.sender, gToken, uAmount);
return gAmount;
}
/// @notice 담보로 제공한 토큰을 전부 Redeem All
/// @param gToken 담보 gToken address
/// @param gAmount 담보 gToken redeem amount
/// @return uAmountRedeem
function redeemToken(
address gToken,
uint256 gAmount
) external override onlyListedMarket(gToken) nonReentrant whenNotPaused returns (uint256) {
uint256 uAmountRedeem = ILToken(gToken).redeemToken(msg.sender, gAmount);
labDistributor.notifySupplyUpdated(gToken, msg.sender);
emit MarketRedeem(msg.sender, gToken, uAmountRedeem);
return uAmountRedeem;
}
/// @notice 담보로 제공한 토큰 중 일부를 Redeem
/// @param gToken 담보 gToken address
/// @param uAmount 담보 gToken redeem amount
/// @return uAmountRedeem
function redeemUnderlying(
address gToken,
uint256 uAmount
) external override onlyListedMarket(gToken) nonReentrant whenNotPaused returns (uint256) {
uint256 uAmountRedeem = ILToken(gToken).redeemUnderlying(msg.sender, uAmount);
labDistributor.notifySupplyUpdated(gToken, msg.sender);
emit MarketRedeem(msg.sender, gToken, uAmountRedeem);
return uAmountRedeem;
}
/// @notice 원하는 자산을 Borrow 하는 트랜잭션
/// @param gToken 빌리는 gToken address
//labDistributort 빌리는 underlying token amount
function borrow(
address gToken,
uint256 amount
) external override onlyListedMarket(gToken) nonReentrant whenNotPaused {
_enterMarket(gToken, msg.sender);
require(IValidator(validator).borrowAllowed(gToken, msg.sender, amount), "Core: cannot borrow");
ILToken(payable(gToken)).borrow(msg.sender, amount);
labDistributor.notifyBorrowUpdated(gToken, msg.sender);
}
function nftBorrow(
address gToken,
address user,
uint256 amount
) external override onlyListedMarket(gToken) onlyNftCore nonReentrant whenNotPaused {
require(ILToken(gToken).underlying() == address(ETH), "Core: invalid underlying asset");
_enterMarket(gToken, msg.sender);
ILToken(payable(gToken)).borrow(msg.sender, amount);
labDistributor.notifyBorrowUpdated(gToken, user);
}
/// @notice 대출한 자산을 상환하는 트랜잭션
/// @dev UI 에서의 Repay All 도 본 트랜잭션을 사용함
/// amount 를 넉넉하게 주면 repay 후 초과분은 환불함
/// @param gToken 상환하려는 gToken address
/// @param amount 상환하려는 gToken amount
function repayBorrow(
address gToken,
uint256 amount
) external payable override onlyListedMarket(gToken) nonReentrant whenNotPaused {
ILToken(payable(gToken)).repayBorrow{value: msg.value}(msg.sender, amount);
labDistributor.notifyBorrowUpdated(gToken, msg.sender);
}
function nftRepayBorrow(
address gToken,
address user,
uint256 amount
) external payable override onlyListedMarket(gToken) onlyNftCore nonReentrant whenNotPaused {
require(ILToken(gToken).underlying() == address(ETH), "Core: invalid underlying asset");
ILToken(payable(gToken)).repayBorrow{value: msg.value}(msg.sender, amount);
labDistributor.notifyBorrowUpdated(gToken, user);
}
/// @notice 본인이 아닌 특정한 주소의 대출을 청산시키는 트랜잭션
/// @dev UI 에서 본 트랜잭션 호출을 확인하지 못했음
/// @param gToken 상환하려는 gToken address
/// @param amount 상환하려는 gToken amount
function repayBorrowBehalf(
address gToken,
address borrower,
uint256 amount
) external payable override onlyListedMarket(gToken) nonReentrant whenNotPaused {
ILToken(payable(gToken)).repayBorrowBehalf{value: msg.value}(msg.sender, borrower, amount);
labDistributor.notifyBorrowUpdated(gToken, borrower);
}
/// @notice 본인이 아닌 특정한 주소의 대출을 청산시키는 트랜잭션
/// @dev UI 에서 본 트랜잭션 호출을 확인하지 못했음
function liquidateBorrow(
address gTokenBorrowed,
address gTokenCollateral,
address borrower,
uint256 amount
) external payable override nonReentrant whenNotPaused {
amount = ILToken(gTokenBorrowed).underlying() == address(ETH) ? msg.value : amount;
require(marketInfos[gTokenBorrowed].isListed && marketInfos[gTokenCollateral].isListed, "Core: invalid market");
require(usersOfMarket[gTokenCollateral][borrower], "Core: not a collateral");
require(marketInfos[gTokenCollateral].collateralFactor > 0, "Core: not a collateral");
require(
IValidator(validator).liquidateAllowed(gTokenBorrowed, borrower, amount, closeFactor),
"Core: cannot liquidate borrow"
);
(, uint256 rebateGAmount, uint256 liquidatorGAmount) = ILToken(gTokenBorrowed).liquidateBorrow{value: msg.value}(
gTokenCollateral,
msg.sender,
borrower,
amount
);
ILToken(gTokenCollateral).seize(msg.sender, borrower, liquidatorGAmount);
labDistributor.notifyTransferred(gTokenCollateral, borrower, msg.sender);
if (rebateGAmount > 0) {
ILToken(gTokenCollateral).seize(rebateDistributor, borrower, rebateGAmount);
labDistributor.notifyTransferred(gTokenCollateral, borrower, rebateDistributor);
}
labDistributor.notifyBorrowUpdated(gTokenBorrowed, borrower);
}
/// @notice 모든 마켓의 Reward LAB 클레임 트랜잭션
function claimLab() external override nonReentrant {
labDistributor.claim(markets, msg.sender);
}
/// @notice 하나의 market 의 Reward LAB 클레임 트랜잭션
//labDistributort 클레임 하는 market 의 address
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() external override {
labDistributor.compound(markets, msg.sender);
}
/// @notice Called when gToken has transfered
/// @dev gToken 에서 grvDistributor 의 메서드를 호출하기 위해 중간 역할을 함
/// gToken -> Core -> gToken, grvDistributor
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 ========== */
/// @notice Enter Market
/// @dev 해당 Token 을 대출하거나, 담보로 enable 하기 위해서는 Enter Market 이 필요함
/// @param gToken Token address
/// @param _account Market 에 Enter 할 account address
function _enterMarket(address gToken, address _account) internal onlyListedMarket(gToken) {
if (!usersOfMarket[gToken][_account]) {
usersOfMarket[gToken][_account] = true;
marketListOfUsers[_account].push(gToken);
emit MarketEntered(gToken, _account);
}
}
/// @notice remove user from market
/// @dev Market 에서 제거할 시에 해당 토큰이 담보물에서 제거되어 청산되지 않음
/// @param gTokenToExit Token address
/// @param _account Market 에 제거할 account address
function _removeUserMarket(address gTokenToExit, address _account) private {
require(marketListOfUsers[_account].length > 0, "Core: cannot pop user market");
delete usersOfMarket[gTokenToExit][_account];
uint256 length = marketListOfUsers[_account].length;
for (uint256 i = 0; i < length; i++) {
if (marketListOfUsers[_account][i] == gTokenToExit) {
marketListOfUsers[_account][i] = marketListOfUsers[_account][length - 1];
marketListOfUsers[_account].pop();
break;
}
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"gToken","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":"gToken","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":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"LiquidationIncentiveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"MarketEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gToken","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"MarketExited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"gToken","type":"address"}],"name":"MarketListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"gToken","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":"gToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"MarketSupply","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newNftCore","type":"address"}],"name":"NftCoreUpdated","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":"gToken","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":"gToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"gToken","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":[],"name":"closeFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compoundLab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"gTokens","type":"address[]"}],"name":"enterMarkets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","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":[{"internalType":"address","name":"gTokenBorrowed","type":"address"},{"internalType":"address","name":"gTokenCollateral","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":"gToken","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":"gToken","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":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"nftBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftCore","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"nftRepayBorrow","outputs":[],"stateMutability":"payable","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":"gToken","type":"address"},{"internalType":"uint256","name":"gAmount","type":"uint256"}],"name":"redeemToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","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":"gToken","type":"address"}],"name":"removeMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayBorrowBehalf","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCloseFactor","type":"uint256"}],"name":"setCloseFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gToken","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":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"setLiquidationIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"gTokens","type":"address[]"},{"internalType":"uint256[]","name":"newBorrowCaps","type":"uint256[]"}],"name":"setMarketBorrowCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"gTokens","type":"address[]"},{"internalType":"uint256[]","name":"newSupplyCaps","type":"uint256[]"}],"name":"setMarketSupplyCaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftCore","type":"address"}],"name":"setNftCore","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":"gToken","type":"address"},{"internalType":"uint256","name":"uAmount","type":"uint256"}],"name":"supply","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
60806040523480156200001157600080fd5b5060006200001e6200007c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180556002805460ff1916905562000080565b3390565b61480380620000906000396000f3fe60806040526004361061031a5760003560e01c80638456cb59116101ab578063c2998238116100f7578063e61604cf11610095578063f2b9fdb81161006f578063f2b9fdb8146108b7578063f2fde38b146108ca578063f8982e7a146108ea578063fa680561146109195761031a565b8063e61604cf14610864578063ede4edd014610877578063eefc5947146108975761031a565b8063d6b76b9c116100d1578063d6b76b9c146107f1578063d9452b0414610804578063db91323614610824578063de02d642146108445761031a565b8063c299823814610791578063c4d66de8146107b1578063d136af44146107d15761031a565b80639629417811610164578063abdb5ea81161013e578063abdb5ea814610729578063aced16611461073c578063b1283e7714610751578063c04f31ff146107715761031a565b806396294178146106c9578063a2a2d5bb146106e9578063a8431081146107095761031a565b80638456cb59146106355780638b95e3351461064a5780638c765e941461065f5780638da5cb5b14610674578063928fe47714610689578063929fe9a1146106a95761031a565b8063571abe301161026a5780636922d7b611610223578063748747e6116101fd578063748747e6146105c05780637a81308f146105e05780637f0927f214610600578063830cbbbd146106155761031a565b80636922d7b61461055e5780636e8584fd1461057e578063715018a6146105ab5761031a565b8063571abe30146104cc57806359086a5e146104e157806359341a1a146104f45780635c975abb1461050957806366ae02091461051e57806368155ec11461053e5761031a565b8063186db48f116102d75780633a941f73116102b15780633a941f73146104575780633f4ba83a146104775780634b8a35291461048c5780635189e110146104ac5761031a565b8063186db48f14610400578063375a7cba146104205780633a5381b5146104425761031a565b806305308b9f1461031f5780630c5ff1021461034a57806312348e961461036c5780631327d3d81461038e5780631488ca08146103ae578063158ef93e146103de575b600080fd5b34801561032b57600080fd5b5061033461092e565b604051610341919061474f565b60405180910390f35b34801561035657600080fd5b5061035f610934565b6040516103419190613e02565b34801561037857600080fd5b5061038c610387366004613d62565b610943565b005b34801561039a57600080fd5b5061038c6103a9366004613a9a565b610a19565b3480156103ba57600080fd5b506103ce6103c9366004613a9a565b610adc565b6040516103419493929190613f8d565b3480156103ea57600080fd5b506103f3610b07565b6040516103419190613f82565b34801561040c57600080fd5b5061038c61041b366004613bff565b610b10565b34801561042c57600080fd5b50610435610c6e565b6040516103419190613ee3565b34801561044e57600080fd5b5061035f610cd0565b34801561046357600080fd5b5061038c610472366004613b94565b610cdf565b34801561048357600080fd5b5061038c610f2b565b34801561049857600080fd5b5061038c6104a7366004613bd4565b610f87565b3480156104b857600080fd5b506104356104c7366004613a9a565b6111a7565b3480156104d857600080fd5b5061035f61121d565b61038c6104ef366004613b94565b61122c565b34801561050057600080fd5b5061035f611337565b34801561051557600080fd5b506103f3611346565b34801561052a57600080fd5b5061038c610539366004613a9a565b61134f565b34801561054a57600080fd5b5061038c610559366004613b44565b611412565b34801561056a57600080fd5b5061038c610579366004613a9a565b611571565b34801561058a57600080fd5b5061059e610599366004613a9a565b61160b565b6040516103419190614722565b3480156105b757600080fd5b5061038c611666565b3480156105cc57600080fd5b5061038c6105db366004613a9a565b6116ef565b3480156105ec57600080fd5b5061038c6105fb366004613a9a565b6117b7565b34801561060c57600080fd5b5061038c61187a565b34801561062157600080fd5b50610334610630366004613bd4565b61190d565b34801561064157600080fd5b5061038c611ac3565b34801561065657600080fd5b5061035f611b1d565b34801561066b57600080fd5b50610334611b2c565b34801561068057600080fd5b5061035f611b32565b34801561069557600080fd5b506103f36106a4366004613b0c565b611b41565b3480156106b557600080fd5b506103f36106c4366004613b0c565b611b61565b3480156106d557600080fd5b506103346106e4366004613bd4565b611b91565b3480156106f557600080fd5b5061035f610704366004613bd4565b611c49565b34801561071557600080fd5b5061038c610724366004613d62565b611c7e565b61038c610737366004613bd4565b611d05565b34801561074857600080fd5b5061035f611e0e565b34801561075d57600080fd5b5061035f61076c366004613d62565b611e22565b34801561077d57600080fd5b5061038c61078c366004613bd4565b611e49565b34801561079d57600080fd5b5061038c6107ac366004613c68565b612003565b3480156107bd57600080fd5b5061038c6107cc366004613a9a565b612038565b3480156107dd57600080fd5b5061038c6107ec366004613bff565b6120d1565b61038c6107ff366004613b94565b612228565b34801561081057600080fd5b5061038c61081f366004613ad2565b6123ab565b34801561083057600080fd5b5061038c61083f366004613a9a565b612570565b34801561085057600080fd5b5061038c61085f366004613a9a565b612817565b61038c610872366004613b44565b6128da565b34801561088357600080fd5b5061038c610892366004613a9a565b612ddc565b3480156108a357600080fd5b5061038c6108b2366004613a9a565b612fe3565b6103346108c5366004613bd4565b6130b4565b3480156108d657600080fd5b5061038c6108e5366004613a9a565b61344b565b3480156108f657600080fd5b5061090a610905366004613a9a565b61350b565b60405161034193929190614758565b34801561092557600080fd5b5061038c61359e565b600a5481565b6003546001600160a01b031681565b60025461010090046001600160a01b03163314806109795750610964611b32565b6001600160a01b0316336001600160a01b0316145b61099e5760405162461bcd60e51b81526004016109959061417f565b60405180910390fd5b66b1a2bc2ec5000081101580156109bd5750670c7d713b49da00008111155b6109d95760405162461bcd60e51b81526004016109959061449d565b600a8190556040517fd88469f5aa8525dce9ae07fa2d8df83e2ec766fc060483b66a0082ff36d6582d90610a0e90839061474f565b60405180910390a150565b60025461010090046001600160a01b0316331480610a4f5750610a3a611b32565b6001600160a01b0316336001600160a01b0316145b610a6b5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b038116610a915760405162461bcd60e51b81526004016109959061456e565b600480546001600160a01b0319166001600160a01b0383161790556040517fb3a3a56265020415cf2f7ff198e2052a6e1d43d7eb127450af725829e40e08c290610a0e908390613e02565b600960205260009081526040902080546001820154600283015460039093015460ff90921692909184565b600e5460ff1681565b60025461010090046001600160a01b0316331480610b465750610b31611b32565b6001600160a01b0316336001600160a01b0316145b610b625760405162461bcd60e51b81526004016109959061417f565b8215801590610b7057508281145b610b8c5760405162461bcd60e51b8152600401610995906145dc565b60005b83811015610c6757828282818110610ba357fe5b9050602002013560096000878785818110610bba57fe5b9050602002016020810190610bcf9190613a9a565b6001600160a01b03168152602081019190915260400160002060020155848482818110610bf857fe5b9050602002016020810190610c0d9190613a9a565b6001600160a01b03167f84d2db42497fc6f1882756be420935d982025ad8a2a903dfb83638a09e49a775848484818110610c4357fe5b90506020020135604051610c57919061474f565b60405180910390a2600101610b8f565b5050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610cc657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ca8575b5050505050905090565b6004546001600160a01b031681565b6001600160a01b038316600090815260096020526040902054839060ff16610d195760405162461bcd60e51b8152600401610995906144d4565b6003546001600160a01b03163314610d435760405162461bcd60e51b8152600401610995906146ed565b60026001541415610d665760405162461bcd60e51b81526004016109959061467f565b6002600155610d73611346565b15610d905760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610dd457600080fd5b505afa158015610de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0c9190613ab6565b6001600160a01b031614610e325760405162461bcd60e51b8152600401610995906141c6565b610e3c8433613605565b604051634b8a352960e01b81526001600160a01b03851690634b8a352990610e6a9033908690600401613e5d565b602060405180830381600087803b158015610e8457600080fd5b505af1158015610e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebc9190613d7a565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90610eef9087908790600401613e76565b600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b505060018055505050505050565b60025461010090046001600160a01b0316331480610f615750610f4c611b32565b6001600160a01b0316336001600160a01b0316145b610f7d5760405162461bcd60e51b81526004016109959061417f565b610f856136f5565b565b6001600160a01b038216600090815260096020526040902054829060ff16610fc15760405162461bcd60e51b8152600401610995906144d4565b60026001541415610fe45760405162461bcd60e51b81526004016109959061467f565b6002600155610ff1611346565b1561100e5760405162461bcd60e51b8152600401610995906142a2565b6110188333613605565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c9161104b9187913391889101613e39565b602060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109d9190613d05565b6110b95760405162461bcd60e51b8152600401610995906142cc565b604051634b8a352960e01b81526001600160a01b03841690634b8a3529906110e79033908690600401613e5d565b602060405180830381600087803b15801561110157600080fd5b505af1158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190613d7a565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce9061116c9086903390600401613e76565b600060405180830381600087803b15801561118657600080fd5b505af115801561119a573d6000803e3d6000fd5b5050600180555050505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561121157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116111f3575b50505050509050919050565b6006546001600160a01b031681565b6001600160a01b038316600090815260096020526040902054839060ff166112665760405162461bcd60e51b8152600401610995906144d4565b600260015414156112895760405162461bcd60e51b81526004016109959061467f565b6002600155611296611346565b156112b35760405162461bcd60e51b8152600401610995906142a2565b604051632c84352f60e11b81526001600160a01b038516906359086a5e9034906112e590339088908890600401613e39565b6020604051808303818588803b1580156112fe57600080fd5b505af1158015611312573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ebc9190613d7a565b6005546001600160a01b031681565b60025460ff1690565b60025461010090046001600160a01b03163314806113855750611370611b32565b6001600160a01b0316336001600160a01b0316145b6113a15760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166113c75760405162461bcd60e51b815260040161099590614050565b600680546001600160a01b0319166001600160a01b0383161790556040517f2351f252c60252e548e93df4d785886faa1d88410325b8bce69d624a25583ae790610a0e908390613e02565b600260015414156114355760405162461bcd60e51b81526004016109959061467f565b60026001556000805b600854811015611482576008818154811061145557fe5b6000918252602090912001546001600160a01b031633141561147a5760019150611482565b60010161143e565b506001811515146114a55760405162461bcd60e51b8152600401610995906141fd565b604051636119bced60e11b8152339063c23379da906114ce908890889088908890600401613e90565b600060405180830381600087803b1580156114e857600080fd5b505af11580156114fc573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b915061153490339088908890600401613e16565b600060405180830381600087803b15801561154e57600080fd5b505af1158015611562573d6000803e3d6000fd5b50506001805550505050505050565b60025461010090046001600160a01b03163314806115a75750611592611b32565b6001600160a01b0316336001600160a01b0316145b6115c35760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166115e95760405162461bcd60e51b815260040161099590614539565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6116136139fb565b506001600160a01b03166000908152600960209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015290565b61166e613763565b6001600160a01b031661167f611b32565b6001600160a01b0316146116a55760405162461bcd60e51b8152600401610995906143fa565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025461010090046001600160a01b03163314806117255750611710611b32565b6001600160a01b0316336001600160a01b0316145b6117415760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166117675760405162461bcd60e51b81526004016109959061426b565b60028054610100600160a81b0319166101006001600160a01b038416021790556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e90610a0e908390613e02565b60025461010090046001600160a01b03163314806117ed57506117d8611b32565b6001600160a01b0316336001600160a01b0316145b6118095760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811661182f5760405162461bcd60e51b81526004016109959061442f565b600380546001600160a01b0319166001600160a01b0383161790556040517fa0db7f35e3369b887ccd7d6757ea475d09c689b97f5d0b4ee395add6a5d4545d90610a0e908390613e02565b6002600154141561189d5760405162461bcd60e51b81526004016109959061467f565b600260015560065460405163025181bb60e41b81526001600160a01b03909116906325181bb0906118d5906008903390600401613f20565b600060405180830381600087803b1580156118ef57600080fd5b505af1158015611903573d6000803e3d6000fd5b5050600180555050565b6001600160a01b038216600090815260096020526040812054839060ff166119475760405162461bcd60e51b8152600401610995906144d4565b6002600154141561196a5760405162461bcd60e51b81526004016109959061467f565b6002600155611977611346565b156119945760405162461bcd60e51b8152600401610995906142a2565b60405163830cbbbd60e01b81526000906001600160a01b0386169063830cbbbd906119c59033908890600401613e5d565b602060405180830381600087803b1580156119df57600080fd5b505af11580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a179190613d7a565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90611a4a9088903390600401613e76565b600060405180830381600087803b158015611a6457600080fd5b505af1158015611a78573d6000803e3d6000fd5b505050507fda2fcb771cce6a80cd6c0101db394f4fd1f8755def9185535cc97509f3e03cdd338683604051611aaf93929190613e39565b60405180910390a160018055949350505050565b60025461010090046001600160a01b0316331480611af95750611ae4611b32565b6001600160a01b0316336001600160a01b0316145b611b155760405162461bcd60e51b81526004016109959061417f565b610f85613767565b6007546001600160a01b031681565b600b5481565b6000546001600160a01b031690565b600d60209081526000928352604080842090915290825290205460ff1681565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205460ff165b92915050565b6001600160a01b038216600090815260096020526040812054839060ff16611bcb5760405162461bcd60e51b8152600401610995906144d4565b60026001541415611bee5760405162461bcd60e51b81526004016109959061467f565b6002600155611bfb611346565b15611c185760405162461bcd60e51b8152600401610995906142a2565b6040516312c5282f60e31b81526000906001600160a01b038616906396294178906119c59033908890600401613e5d565b600c6020528160005260406000208181548110611c6257fe5b6000918252602090912001546001600160a01b03169150829050565b60025461010090046001600160a01b0316331480611cb45750611c9f611b32565b6001600160a01b0316336001600160a01b0316145b611cd05760405162461bcd60e51b81526004016109959061417f565b600b8190556040517f6791c9b68799eda502f8f7808e4ab556a632237eea58a66c4f7e4e6f94574d0d90610a0e90839061474f565b6001600160a01b038216600090815260096020526040902054829060ff16611d3f5760405162461bcd60e51b8152600401610995906144d4565b60026001541415611d625760405162461bcd60e51b81526004016109959061467f565b6002600155611d6f611346565b15611d8c5760405162461bcd60e51b8152600401610995906142a2565b60405163157b6bd560e31b81526001600160a01b0384169063abdb5ea8903490611dbc9033908790600401613e5d565b6020604051808303818588803b158015611dd557600080fd5b505af1158015611de9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111399190613d7a565b60025461010090046001600160a01b031681565b60088181548110611e2f57fe5b6000918252602090912001546001600160a01b0316905081565b60025461010090046001600160a01b0316331480611e7f5750611e6a611b32565b6001600160a01b0316336001600160a01b0316145b611e9b5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b038216600090815260096020526040902054829060ff16611ed55760405162461bcd60e51b8152600401610995906144d4565b670c7d713b49da0000821115611efd5760405162461bcd60e51b815260040161099590614466565b8115801590611f89575060075460405163fc57d4df60e01b81526001600160a01b039091169063fc57d4df90611f37908690600401613e02565b60206040518083038186803b158015611f4f57600080fd5b505afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613d7a565b155b15611fa65760405162461bcd60e51b8152600401610995906140da565b6001600160a01b03831660009081526009602052604090819020600301839055517f275d6207ccd4271a12c584febf2bcf32254205dfb4639ce1a9184d2e2609e2d090611ff69085908590613e5d565b60405180910390a1505050565b60005b81518110156120345761202c82828151811061201e57fe5b602002602001015133613605565b600101612006565b5050565b612040613763565b6001600160a01b0316612051611b32565b6001600160a01b0316146120775760405162461bcd60e51b8152600401610995906143fa565b600e5460ff161561209a5760405162461bcd60e51b8152600401610995906142f9565b6120a26137c2565b600780546001600160a01b0319166001600160a01b0392909216919091179055600e805460ff19166001179055565b60025461010090046001600160a01b031633148061210757506120f2611b32565b6001600160a01b0316336001600160a01b0316145b6121235760405162461bcd60e51b81526004016109959061417f565b821580159061213157508281145b61214d5760405162461bcd60e51b8152600401610995906145dc565b60005b83811015610c675782828281811061216457fe5b905060200201356009600087878581811061217b57fe5b90506020020160208101906121909190613a9a565b6001600160a01b031681526020810191909152604001600020600101558484828181106121b957fe5b90506020020160208101906121ce9190613a9a565b6001600160a01b03167f638a463c59949a284e093291dedfbadcb32ebf9007e649767344e67346ab882984848481811061220457fe5b90506020020135604051612218919061474f565b60405180910390a2600101612150565b6001600160a01b038316600090815260096020526040902054839060ff166122625760405162461bcd60e51b8152600401610995906144d4565b6003546001600160a01b0316331461228c5760405162461bcd60e51b8152600401610995906146ed565b600260015414156122af5760405162461bcd60e51b81526004016109959061467f565b60026001556122bc611346565b156122d95760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561231d57600080fd5b505afa158015612331573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123559190613ab6565b6001600160a01b03161461237b5760405162461bcd60e51b8152600401610995906141c6565b60405163157b6bd560e31b81526001600160a01b0385169063abdb5ea89034906112e59033908790600401613e5d565b60025461010090046001600160a01b03163314806123e157506123cc611b32565b6001600160a01b0316336001600160a01b0316145b6123fd5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03841660009081526009602052604090205460ff16156124365760405162461bcd60e51b8152600401610995906146b6565b60005b60085481101561249557846001600160a01b03166008828154811061245a57fe5b6000918252602090912001546001600160a01b0316141561248d5760405162461bcd60e51b8152600401610995906146b6565b600101612439565b506040805160808101825260018082526020808301878152838501878152606085018781526001600160a01b038b16600081815260099095528785209651875460ff1916901515178755925186860155905160028601555160039094019390935560088054928301815590527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055517fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f90612562908690613e02565b60405180910390a150505050565b60025461010090046001600160a01b03163314806125a65750612591611b32565b6001600160a01b0316336001600160a01b0316145b6125c25760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811660009081526009602052604090205460ff166125fa5760405162461bcd60e51b815260040161099590614326565b806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561263357600080fd5b505afa158015612647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266b9190613d7a565b1580156126e65750806001600160a01b0316638285ef406040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ac57600080fd5b505afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e49190613d7a565b155b6127025760405162461bcd60e51b8152600401610995906145a5565b60085460005b8181101561281257826001600160a01b03166008828154811061272757fe5b6000918252602090912001546001600160a01b0316141561280a576008600183038154811061275257fe5b600091825260209091200154600880546001600160a01b03909216918390811061277857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806127b157fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526009905260408120805460ff19168155600181018290556002810182905560030155612812565b600101612708565b505050565b60025461010090046001600160a01b031633148061284d5750612838611b32565b6001600160a01b0316336001600160a01b0316145b6128695760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811661288f5760405162461bcd60e51b815260040161099590614608565b600580546001600160a01b0319166001600160a01b0383161790556040517f827daa11640de0eb908d0b06593ffb3f2b5e14e83d678fb922e512075f1d36f090610a0e908390613e02565b600260015414156128fd5760405162461bcd60e51b81526004016109959061467f565b600260015561290a611346565b156129275760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561296b57600080fd5b505afa15801561297f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a39190613ab6565b6001600160a01b0316146129b757806129b9565b345b6001600160a01b03851660009081526009602052604090205490915060ff1680156129fc57506001600160a01b03831660009081526009602052604090205460ff165b612a185760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612a5d5760405162461bcd60e51b81526004016109959061464f565b6001600160a01b038316600090815260096020526040902060030154612a955760405162461bcd60e51b81526004016109959061464f565b60048054600a546040516312e8123160e11b81526001600160a01b03909216926325d0246292612acc928992889288929101613eba565b602060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1e9190613d05565b612b3a5760405162461bcd60e51b815260040161099590614502565b600080856001600160a01b031663e61604cf34873388886040518663ffffffff1660e01b8152600401612b709493929190613e90565b6060604051808303818588803b158015612b8957600080fd5b505af1158015612b9d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bc29190613d92565b60405163b2a02ff160e01b815291945092506001600160a01b038716915063b2a02ff190612bf890339088908690600401613e39565b600060405180830381600087803b158015612c1257600080fd5b505af1158015612c26573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b9150612c5e90889088903390600401613e16565b600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050506000821115612d6c5760055460405163b2a02ff160e01b81526001600160a01b038781169263b2a02ff192612ccf929091169088908790600401613e39565b600060405180830381600087803b158015612ce957600080fd5b505af1158015612cfd573d6000803e3d6000fd5b505060065460055460405163dd9aba1b60e01b81526001600160a01b03928316945063dd9aba1b9350612d39928a928a92911690600401613e16565b600060405180830381600087803b158015612d5357600080fd5b505af1158015612d67573d6000803e3d6000fd5b505050505b6006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90612d9e9089908890600401613e76565b600060405180830381600087803b158015612db857600080fd5b505af1158015612dcc573d6000803e3d6000fd5b5050600180555050505050505050565b6001600160a01b038116600090815260096020526040902054819060ff16612e165760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b0382166000908152600d60209081526040808320338452909152902054829060ff16612e5b5760405162461bcd60e51b815260040161099590614019565b612e63613a25565b60405163497d274760e11b81526001600160a01b038516906392fa4e8e90612e8f903390600401613e02565b606060405180830381600087803b158015612ea957600080fd5b505af1158015612ebd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee19190613d25565b90508060200151600014612f075760405162461bcd60e51b815260040161099590613fd8565b60048054825160405163eabe7d9160e01b81526001600160a01b039092169263eabe7d9192612f3a928992339201613e39565b602060405180830381600087803b158015612f5457600080fd5b505af1158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c9190613d05565b612fa85760405162461bcd60e51b815260040161099590614355565b612fb284336137dc565b7fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d8433604051612562929190613e76565b600260015414156130065760405162461bcd60e51b81526004016109959061467f565b600260019081556040805182815280820190915260609160208083019080368337019050509050818160008151811061303b57fe5b6001600160a01b03928316602091820292909201015260065460405163025181bb60e41b81529116906325181bb09061307a9084903390600401613ef6565b600060405180830381600087803b15801561309457600080fd5b505af11580156130a8573d6000803e3d6000fd5b50506001805550505050565b6001600160a01b038216600090815260096020526040812054839060ff166130ee5760405162461bcd60e51b8152600401610995906144d4565b600260015414156131115760405162461bcd60e51b81526004016109959061467f565b600260015561311e611346565b1561313b5760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561317f57600080fd5b505afa158015613193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b79190613ab6565b6001600160a01b0316146131cb57826131cd565b345b6001600160a01b0385166000908152600960205260409020600101549093508015806132ff5750806132fc856132f6670de0b6b3a76400006132f08a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561324157600080fd5b505afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132799190613d7a565b8b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132b257600080fd5b505afa1580156132c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ea9190613d7a565b90613963565b906139a4565b906139d6565b11155b61331b5760405162461bcd60e51b815260040161099590614148565b6000856001600160a01b031663f2b9fdb83433886040518463ffffffff1660e01b815260040161334c929190613e5d565b6020604051808303818588803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061339e9190613d7a565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b906133d19089903390600401613e76565b600060405180830381600087803b1580156133eb57600080fd5b505af11580156133ff573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe17333878760405161343693929190613e39565b60405180910390a16001805595945050505050565b613453613763565b6001600160a01b0316613464611b32565b6001600160a01b03161461348a5760405162461bcd60e51b8152600401610995906143fa565b6001600160a01b0381166134b05760405162461bcd60e51b815260040161099590614094565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604051635ec88c7960e01b8152600092839283926001600160a01b0390911691635ec88c799161354191889101613e02565b60606040518083038186803b15801561355957600080fd5b505afa15801561356d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135919190613d92565b9250925092509193909250565b600654604051637ee0d61360e01b81526001600160a01b0390911690637ee0d613906135d1906008903390600401613f20565b600060405180830381600087803b1580156135eb57600080fd5b505af11580156135ff573d6000803e3d6000fd5b50505050565b6001600160a01b038216600090815260096020526040902054829060ff1661363f5760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612812576001600160a01b038084166000818152600d602090815260408083209487168352938152838220805460ff19166001908117909155600c825284832080549182018155835291200180546001600160a01b0319169091179055517f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a590611ff69085908590613e76565b6136fd611346565b6137195760405162461bcd60e51b815260040161099590613faa565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61374c613763565b6040516137599190613e02565b60405180910390a1565b3390565b61376f611346565b1561378c5760405162461bcd60e51b8152600401610995906142a2565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861374c613763565b6706f05b59d3b20000600a55670ff59ee833b30000600b55565b6001600160a01b0381166000908152600c60205260409020546138115760405162461bcd60e51b8152600401610995906143c3565b6001600160a01b038083166000908152600d602090815260408083209385168352928152828220805460ff19169055600c905290812054905b818110156135ff576001600160a01b038381166000908152600c602052604090208054918616918390811061387b57fe5b6000918252602090912001546001600160a01b0316141561395b576001600160a01b0383166000908152600c60205260409020805460001984019081106138be57fe5b60009182526020808320909101546001600160a01b038681168452600c90925260409092208054919092169190839081106138f557fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600c9091526040902080548061393457fe5b600082815260209020810160001990810180546001600160a01b03191690550190556135ff565b60010161384a565b60008261397257506000611b8b565b8282028284828161397f57fe5b041461399d5760405162461bcd60e51b815260040161099590614382565b9392505050565b60008082116139c55760405162461bcd60e51b815260040161099590614234565b8183816139ce57fe5b049392505050565b60008282018381101561399d5760405162461bcd60e51b815260040161099590614111565b60405180608001604052806000151581526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b8035611b8b816147b5565b60008083601f840112613a62578182fd5b50813567ffffffffffffffff811115613a79578182fd5b6020830191508360208083028501011115613a9357600080fd5b9250929050565b600060208284031215613aab578081fd5b813561399d816147b5565b600060208284031215613ac7578081fd5b815161399d816147b5565b60008060008060808587031215613ae7578283fd5b8435613af2816147b5565b966020860135965060408601359560600135945092505050565b60008060408385031215613b1e578182fd5b8235613b29816147b5565b91506020830135613b39816147b5565b809150509250929050565b60008060008060808587031215613b59578384fd5b8435613b64816147b5565b93506020850135613b74816147b5565b92506040850135613b84816147b5565b9396929550929360600135925050565b600080600060608486031215613ba8578283fd5b8335613bb3816147b5565b92506020840135613bc3816147b5565b929592945050506040919091013590565b60008060408385031215613be6578182fd5b8235613bf1816147b5565b946020939093013593505050565b60008060008060408587031215613c14578384fd5b843567ffffffffffffffff80821115613c2b578586fd5b613c3788838901613a51565b90965094506020870135915080821115613c4f578384fd5b50613c5c87828801613a51565b95989497509550505050565b60006020808385031215613c7a578182fd5b823567ffffffffffffffff811115613c90578283fd5b8301601f81018513613ca0578283fd5b8035613cb3613cae82614795565b61476e565b8181528381019083850185840285018601891015613ccf578687fd5b8694505b83851015613cf957613ce58982613a46565b835260019490940193918501918501613cd3565b50979650505050505050565b600060208284031215613d16578081fd5b8151801515811461399d578182fd5b600060608284031215613d36578081fd5b613d40606061476e565b8251815260208301516020820152604083015160408201528091505092915050565b600060208284031215613d73578081fd5b5035919050565b600060208284031215613d8b578081fd5b5051919050565b600080600060608486031215613da6578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613df75781516001600160a01b031687529582019590820190600101613dd2565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b60006020825261399d6020830184613dbf565b600060408252613f096040830185613dbf565b905060018060a01b03831660208301529392505050565b6000604082016040835280855480835260608501915086845260209250828420845b82811015613f675781546001600160a01b031684529284019260019182019101613f42565b5050506001600160a01b039490941692019190915250919050565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526021908201527f436f72653a20626f72726f772062616c616e6365206d757374206265207a65726040820152606f60f81b606082015260800190565b60208082526017908201527f436f72653a206d75737420656e746572206d61726b6574000000000000000000604082015260600190565b60208082526024908201527f436f72653a20696e76616c6964206c61624469737472696275746f72206164646040820152637265737360e01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672070726963650000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f436f72653a20737570706c792063617020726561636865640000000000000000604082015260600190565b60208082526027908201527f436f72653a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152661035b2b2b832b960c91b606082015260800190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672061737365740000604082015260600190565b6020808252601d908201527f436f72653a2063616c6c65722073686f756c64206265206d61726b6574000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f436f72653a20696e76616c6964206b6565706572206164647265737300000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f7420626f72726f7760681b604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526015908201527410dbdc994e881d5b9b1a5cdd1959081b585c9ad95d605a1b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f742072656465656d60681b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f436f72653a2063616e6e6f7420706f702075736572206d61726b657400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f436f72653a20696e76616c6964206e667420636f726520616464726573730000604082015260600190565b6020808252601f908201527f436f72653a20696e76616c696420636f6c6c61746572616c20666163746f7200604082015260600190565b6020808252601a908201527f436f72653a20696e76616c696420636c6f736520666163746f72000000000000604082015260600190565b60208082526014908201527310dbdc994e881a5b9d985b1a59081b585c9ad95d60621b604082015260600190565b6020808252601d908201527f436f72653a2063616e6e6f74206c697175696461746520626f72726f77000000604082015260600190565b6020808252818101527f436f72653a20696e76616c69642063616c63756c61746f722061646472657373604082015260600190565b6020808252601f908201527f436f72653a20696e76616c69642076616c696461746f72206164647265737300604082015260600190565b6020808252601a908201527f436f72653a2063616e6e6f742072656d6f7665206d61726b6574000000000000604082015260600190565b602080825260129082015271436f72653a20696e76616c6964206461746160701b604082015260600190565b60208082526027908201527f436f72653a20696e76616c6964207265626174654469737472696275746f72206040820152666164647265737360c81b606082015260800190565b60208082526016908201527510dbdc994e881b9bdd08184818dbdb1b185d195c985b60521b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f436f72653a20616c7265616479206c6973746564206d61726b65740000000000604082015260600190565b6020808252818101527f436f72653a2063616c6c6572206973206e6f7420746865206e667420636f7265604082015260600190565b81511515815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561478d57600080fd5b604052919050565b600067ffffffffffffffff8211156147ab578081fd5b5060209081020190565b6001600160a01b03811681146147ca57600080fd5b5056fea2646970667358221220dc53fc188be8059d4bb041ca91e5a28a7396e66c8dc03bd0ce8167a92104784864736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061031a5760003560e01c80638456cb59116101ab578063c2998238116100f7578063e61604cf11610095578063f2b9fdb81161006f578063f2b9fdb8146108b7578063f2fde38b146108ca578063f8982e7a146108ea578063fa680561146109195761031a565b8063e61604cf14610864578063ede4edd014610877578063eefc5947146108975761031a565b8063d6b76b9c116100d1578063d6b76b9c146107f1578063d9452b0414610804578063db91323614610824578063de02d642146108445761031a565b8063c299823814610791578063c4d66de8146107b1578063d136af44146107d15761031a565b80639629417811610164578063abdb5ea81161013e578063abdb5ea814610729578063aced16611461073c578063b1283e7714610751578063c04f31ff146107715761031a565b806396294178146106c9578063a2a2d5bb146106e9578063a8431081146107095761031a565b80638456cb59146106355780638b95e3351461064a5780638c765e941461065f5780638da5cb5b14610674578063928fe47714610689578063929fe9a1146106a95761031a565b8063571abe301161026a5780636922d7b611610223578063748747e6116101fd578063748747e6146105c05780637a81308f146105e05780637f0927f214610600578063830cbbbd146106155761031a565b80636922d7b61461055e5780636e8584fd1461057e578063715018a6146105ab5761031a565b8063571abe30146104cc57806359086a5e146104e157806359341a1a146104f45780635c975abb1461050957806366ae02091461051e57806368155ec11461053e5761031a565b8063186db48f116102d75780633a941f73116102b15780633a941f73146104575780633f4ba83a146104775780634b8a35291461048c5780635189e110146104ac5761031a565b8063186db48f14610400578063375a7cba146104205780633a5381b5146104425761031a565b806305308b9f1461031f5780630c5ff1021461034a57806312348e961461036c5780631327d3d81461038e5780631488ca08146103ae578063158ef93e146103de575b600080fd5b34801561032b57600080fd5b5061033461092e565b604051610341919061474f565b60405180910390f35b34801561035657600080fd5b5061035f610934565b6040516103419190613e02565b34801561037857600080fd5b5061038c610387366004613d62565b610943565b005b34801561039a57600080fd5b5061038c6103a9366004613a9a565b610a19565b3480156103ba57600080fd5b506103ce6103c9366004613a9a565b610adc565b6040516103419493929190613f8d565b3480156103ea57600080fd5b506103f3610b07565b6040516103419190613f82565b34801561040c57600080fd5b5061038c61041b366004613bff565b610b10565b34801561042c57600080fd5b50610435610c6e565b6040516103419190613ee3565b34801561044e57600080fd5b5061035f610cd0565b34801561046357600080fd5b5061038c610472366004613b94565b610cdf565b34801561048357600080fd5b5061038c610f2b565b34801561049857600080fd5b5061038c6104a7366004613bd4565b610f87565b3480156104b857600080fd5b506104356104c7366004613a9a565b6111a7565b3480156104d857600080fd5b5061035f61121d565b61038c6104ef366004613b94565b61122c565b34801561050057600080fd5b5061035f611337565b34801561051557600080fd5b506103f3611346565b34801561052a57600080fd5b5061038c610539366004613a9a565b61134f565b34801561054a57600080fd5b5061038c610559366004613b44565b611412565b34801561056a57600080fd5b5061038c610579366004613a9a565b611571565b34801561058a57600080fd5b5061059e610599366004613a9a565b61160b565b6040516103419190614722565b3480156105b757600080fd5b5061038c611666565b3480156105cc57600080fd5b5061038c6105db366004613a9a565b6116ef565b3480156105ec57600080fd5b5061038c6105fb366004613a9a565b6117b7565b34801561060c57600080fd5b5061038c61187a565b34801561062157600080fd5b50610334610630366004613bd4565b61190d565b34801561064157600080fd5b5061038c611ac3565b34801561065657600080fd5b5061035f611b1d565b34801561066b57600080fd5b50610334611b2c565b34801561068057600080fd5b5061035f611b32565b34801561069557600080fd5b506103f36106a4366004613b0c565b611b41565b3480156106b557600080fd5b506103f36106c4366004613b0c565b611b61565b3480156106d557600080fd5b506103346106e4366004613bd4565b611b91565b3480156106f557600080fd5b5061035f610704366004613bd4565b611c49565b34801561071557600080fd5b5061038c610724366004613d62565b611c7e565b61038c610737366004613bd4565b611d05565b34801561074857600080fd5b5061035f611e0e565b34801561075d57600080fd5b5061035f61076c366004613d62565b611e22565b34801561077d57600080fd5b5061038c61078c366004613bd4565b611e49565b34801561079d57600080fd5b5061038c6107ac366004613c68565b612003565b3480156107bd57600080fd5b5061038c6107cc366004613a9a565b612038565b3480156107dd57600080fd5b5061038c6107ec366004613bff565b6120d1565b61038c6107ff366004613b94565b612228565b34801561081057600080fd5b5061038c61081f366004613ad2565b6123ab565b34801561083057600080fd5b5061038c61083f366004613a9a565b612570565b34801561085057600080fd5b5061038c61085f366004613a9a565b612817565b61038c610872366004613b44565b6128da565b34801561088357600080fd5b5061038c610892366004613a9a565b612ddc565b3480156108a357600080fd5b5061038c6108b2366004613a9a565b612fe3565b6103346108c5366004613bd4565b6130b4565b3480156108d657600080fd5b5061038c6108e5366004613a9a565b61344b565b3480156108f657600080fd5b5061090a610905366004613a9a565b61350b565b60405161034193929190614758565b34801561092557600080fd5b5061038c61359e565b600a5481565b6003546001600160a01b031681565b60025461010090046001600160a01b03163314806109795750610964611b32565b6001600160a01b0316336001600160a01b0316145b61099e5760405162461bcd60e51b81526004016109959061417f565b60405180910390fd5b66b1a2bc2ec5000081101580156109bd5750670c7d713b49da00008111155b6109d95760405162461bcd60e51b81526004016109959061449d565b600a8190556040517fd88469f5aa8525dce9ae07fa2d8df83e2ec766fc060483b66a0082ff36d6582d90610a0e90839061474f565b60405180910390a150565b60025461010090046001600160a01b0316331480610a4f5750610a3a611b32565b6001600160a01b0316336001600160a01b0316145b610a6b5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b038116610a915760405162461bcd60e51b81526004016109959061456e565b600480546001600160a01b0319166001600160a01b0383161790556040517fb3a3a56265020415cf2f7ff198e2052a6e1d43d7eb127450af725829e40e08c290610a0e908390613e02565b600960205260009081526040902080546001820154600283015460039093015460ff90921692909184565b600e5460ff1681565b60025461010090046001600160a01b0316331480610b465750610b31611b32565b6001600160a01b0316336001600160a01b0316145b610b625760405162461bcd60e51b81526004016109959061417f565b8215801590610b7057508281145b610b8c5760405162461bcd60e51b8152600401610995906145dc565b60005b83811015610c6757828282818110610ba357fe5b9050602002013560096000878785818110610bba57fe5b9050602002016020810190610bcf9190613a9a565b6001600160a01b03168152602081019190915260400160002060020155848482818110610bf857fe5b9050602002016020810190610c0d9190613a9a565b6001600160a01b03167f84d2db42497fc6f1882756be420935d982025ad8a2a903dfb83638a09e49a775848484818110610c4357fe5b90506020020135604051610c57919061474f565b60405180910390a2600101610b8f565b5050505050565b60606008805480602002602001604051908101604052809291908181526020018280548015610cc657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ca8575b5050505050905090565b6004546001600160a01b031681565b6001600160a01b038316600090815260096020526040902054839060ff16610d195760405162461bcd60e51b8152600401610995906144d4565b6003546001600160a01b03163314610d435760405162461bcd60e51b8152600401610995906146ed565b60026001541415610d665760405162461bcd60e51b81526004016109959061467f565b6002600155610d73611346565b15610d905760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610dd457600080fd5b505afa158015610de8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0c9190613ab6565b6001600160a01b031614610e325760405162461bcd60e51b8152600401610995906141c6565b610e3c8433613605565b604051634b8a352960e01b81526001600160a01b03851690634b8a352990610e6a9033908690600401613e5d565b602060405180830381600087803b158015610e8457600080fd5b505af1158015610e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebc9190613d7a565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90610eef9087908790600401613e76565b600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b505060018055505050505050565b60025461010090046001600160a01b0316331480610f615750610f4c611b32565b6001600160a01b0316336001600160a01b0316145b610f7d5760405162461bcd60e51b81526004016109959061417f565b610f856136f5565b565b6001600160a01b038216600090815260096020526040902054829060ff16610fc15760405162461bcd60e51b8152600401610995906144d4565b60026001541415610fe45760405162461bcd60e51b81526004016109959061467f565b6002600155610ff1611346565b1561100e5760405162461bcd60e51b8152600401610995906142a2565b6110188333613605565b6004805460405163368f515360e21b81526001600160a01b039091169163da3d454c9161104b9187913391889101613e39565b602060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109d9190613d05565b6110b95760405162461bcd60e51b8152600401610995906142cc565b604051634b8a352960e01b81526001600160a01b03841690634b8a3529906110e79033908690600401613e5d565b602060405180830381600087803b15801561110157600080fd5b505af1158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190613d7a565b506006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce9061116c9086903390600401613e76565b600060405180830381600087803b15801561118657600080fd5b505af115801561119a573d6000803e3d6000fd5b5050600180555050505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561121157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116111f3575b50505050509050919050565b6006546001600160a01b031681565b6001600160a01b038316600090815260096020526040902054839060ff166112665760405162461bcd60e51b8152600401610995906144d4565b600260015414156112895760405162461bcd60e51b81526004016109959061467f565b6002600155611296611346565b156112b35760405162461bcd60e51b8152600401610995906142a2565b604051632c84352f60e11b81526001600160a01b038516906359086a5e9034906112e590339088908890600401613e39565b6020604051808303818588803b1580156112fe57600080fd5b505af1158015611312573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ebc9190613d7a565b6005546001600160a01b031681565b60025460ff1690565b60025461010090046001600160a01b03163314806113855750611370611b32565b6001600160a01b0316336001600160a01b0316145b6113a15760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166113c75760405162461bcd60e51b815260040161099590614050565b600680546001600160a01b0319166001600160a01b0383161790556040517f2351f252c60252e548e93df4d785886faa1d88410325b8bce69d624a25583ae790610a0e908390613e02565b600260015414156114355760405162461bcd60e51b81526004016109959061467f565b60026001556000805b600854811015611482576008818154811061145557fe5b6000918252602090912001546001600160a01b031633141561147a5760019150611482565b60010161143e565b506001811515146114a55760405162461bcd60e51b8152600401610995906141fd565b604051636119bced60e11b8152339063c23379da906114ce908890889088908890600401613e90565b600060405180830381600087803b1580156114e857600080fd5b505af11580156114fc573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b915061153490339088908890600401613e16565b600060405180830381600087803b15801561154e57600080fd5b505af1158015611562573d6000803e3d6000fd5b50506001805550505050505050565b60025461010090046001600160a01b03163314806115a75750611592611b32565b6001600160a01b0316336001600160a01b0316145b6115c35760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166115e95760405162461bcd60e51b815260040161099590614539565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6116136139fb565b506001600160a01b03166000908152600960209081526040918290208251608081018452815460ff1615158152600182015492810192909252600281015492820192909252600390910154606082015290565b61166e613763565b6001600160a01b031661167f611b32565b6001600160a01b0316146116a55760405162461bcd60e51b8152600401610995906143fa565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025461010090046001600160a01b03163314806117255750611710611b32565b6001600160a01b0316336001600160a01b0316145b6117415760405162461bcd60e51b81526004016109959061417f565b6001600160a01b0381166117675760405162461bcd60e51b81526004016109959061426b565b60028054610100600160a81b0319166101006001600160a01b038416021790556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e90610a0e908390613e02565b60025461010090046001600160a01b03163314806117ed57506117d8611b32565b6001600160a01b0316336001600160a01b0316145b6118095760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811661182f5760405162461bcd60e51b81526004016109959061442f565b600380546001600160a01b0319166001600160a01b0383161790556040517fa0db7f35e3369b887ccd7d6757ea475d09c689b97f5d0b4ee395add6a5d4545d90610a0e908390613e02565b6002600154141561189d5760405162461bcd60e51b81526004016109959061467f565b600260015560065460405163025181bb60e41b81526001600160a01b03909116906325181bb0906118d5906008903390600401613f20565b600060405180830381600087803b1580156118ef57600080fd5b505af1158015611903573d6000803e3d6000fd5b5050600180555050565b6001600160a01b038216600090815260096020526040812054839060ff166119475760405162461bcd60e51b8152600401610995906144d4565b6002600154141561196a5760405162461bcd60e51b81526004016109959061467f565b6002600155611977611346565b156119945760405162461bcd60e51b8152600401610995906142a2565b60405163830cbbbd60e01b81526000906001600160a01b0386169063830cbbbd906119c59033908890600401613e5d565b602060405180830381600087803b1580156119df57600080fd5b505af11580156119f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a179190613d7a565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b90611a4a9088903390600401613e76565b600060405180830381600087803b158015611a6457600080fd5b505af1158015611a78573d6000803e3d6000fd5b505050507fda2fcb771cce6a80cd6c0101db394f4fd1f8755def9185535cc97509f3e03cdd338683604051611aaf93929190613e39565b60405180910390a160018055949350505050565b60025461010090046001600160a01b0316331480611af95750611ae4611b32565b6001600160a01b0316336001600160a01b0316145b611b155760405162461bcd60e51b81526004016109959061417f565b610f85613767565b6007546001600160a01b031681565b600b5481565b6000546001600160a01b031690565b600d60209081526000928352604080842090915290825290205460ff1681565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205460ff165b92915050565b6001600160a01b038216600090815260096020526040812054839060ff16611bcb5760405162461bcd60e51b8152600401610995906144d4565b60026001541415611bee5760405162461bcd60e51b81526004016109959061467f565b6002600155611bfb611346565b15611c185760405162461bcd60e51b8152600401610995906142a2565b6040516312c5282f60e31b81526000906001600160a01b038616906396294178906119c59033908890600401613e5d565b600c6020528160005260406000208181548110611c6257fe5b6000918252602090912001546001600160a01b03169150829050565b60025461010090046001600160a01b0316331480611cb45750611c9f611b32565b6001600160a01b0316336001600160a01b0316145b611cd05760405162461bcd60e51b81526004016109959061417f565b600b8190556040517f6791c9b68799eda502f8f7808e4ab556a632237eea58a66c4f7e4e6f94574d0d90610a0e90839061474f565b6001600160a01b038216600090815260096020526040902054829060ff16611d3f5760405162461bcd60e51b8152600401610995906144d4565b60026001541415611d625760405162461bcd60e51b81526004016109959061467f565b6002600155611d6f611346565b15611d8c5760405162461bcd60e51b8152600401610995906142a2565b60405163157b6bd560e31b81526001600160a01b0384169063abdb5ea8903490611dbc9033908790600401613e5d565b6020604051808303818588803b158015611dd557600080fd5b505af1158015611de9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111399190613d7a565b60025461010090046001600160a01b031681565b60088181548110611e2f57fe5b6000918252602090912001546001600160a01b0316905081565b60025461010090046001600160a01b0316331480611e7f5750611e6a611b32565b6001600160a01b0316336001600160a01b0316145b611e9b5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b038216600090815260096020526040902054829060ff16611ed55760405162461bcd60e51b8152600401610995906144d4565b670c7d713b49da0000821115611efd5760405162461bcd60e51b815260040161099590614466565b8115801590611f89575060075460405163fc57d4df60e01b81526001600160a01b039091169063fc57d4df90611f37908690600401613e02565b60206040518083038186803b158015611f4f57600080fd5b505afa158015611f63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f879190613d7a565b155b15611fa65760405162461bcd60e51b8152600401610995906140da565b6001600160a01b03831660009081526009602052604090819020600301839055517f275d6207ccd4271a12c584febf2bcf32254205dfb4639ce1a9184d2e2609e2d090611ff69085908590613e5d565b60405180910390a1505050565b60005b81518110156120345761202c82828151811061201e57fe5b602002602001015133613605565b600101612006565b5050565b612040613763565b6001600160a01b0316612051611b32565b6001600160a01b0316146120775760405162461bcd60e51b8152600401610995906143fa565b600e5460ff161561209a5760405162461bcd60e51b8152600401610995906142f9565b6120a26137c2565b600780546001600160a01b0319166001600160a01b0392909216919091179055600e805460ff19166001179055565b60025461010090046001600160a01b031633148061210757506120f2611b32565b6001600160a01b0316336001600160a01b0316145b6121235760405162461bcd60e51b81526004016109959061417f565b821580159061213157508281145b61214d5760405162461bcd60e51b8152600401610995906145dc565b60005b83811015610c675782828281811061216457fe5b905060200201356009600087878581811061217b57fe5b90506020020160208101906121909190613a9a565b6001600160a01b031681526020810191909152604001600020600101558484828181106121b957fe5b90506020020160208101906121ce9190613a9a565b6001600160a01b03167f638a463c59949a284e093291dedfbadcb32ebf9007e649767344e67346ab882984848481811061220457fe5b90506020020135604051612218919061474f565b60405180910390a2600101612150565b6001600160a01b038316600090815260096020526040902054839060ff166122625760405162461bcd60e51b8152600401610995906144d4565b6003546001600160a01b0316331461228c5760405162461bcd60e51b8152600401610995906146ed565b600260015414156122af5760405162461bcd60e51b81526004016109959061467f565b60026001556122bc611346565b156122d95760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561231d57600080fd5b505afa158015612331573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123559190613ab6565b6001600160a01b03161461237b5760405162461bcd60e51b8152600401610995906141c6565b60405163157b6bd560e31b81526001600160a01b0385169063abdb5ea89034906112e59033908790600401613e5d565b60025461010090046001600160a01b03163314806123e157506123cc611b32565b6001600160a01b0316336001600160a01b0316145b6123fd5760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03841660009081526009602052604090205460ff16156124365760405162461bcd60e51b8152600401610995906146b6565b60005b60085481101561249557846001600160a01b03166008828154811061245a57fe5b6000918252602090912001546001600160a01b0316141561248d5760405162461bcd60e51b8152600401610995906146b6565b600101612439565b506040805160808101825260018082526020808301878152838501878152606085018781526001600160a01b038b16600081815260099095528785209651875460ff1916901515178755925186860155905160028601555160039094019390935560088054928301815590527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055517fcf583bb0c569eb967f806b11601c4cb93c10310485c67add5f8362c2f212321f90612562908690613e02565b60405180910390a150505050565b60025461010090046001600160a01b03163314806125a65750612591611b32565b6001600160a01b0316336001600160a01b0316145b6125c25760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811660009081526009602052604090205460ff166125fa5760405162461bcd60e51b815260040161099590614326565b806001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561263357600080fd5b505afa158015612647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266b9190613d7a565b1580156126e65750806001600160a01b0316638285ef406040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ac57600080fd5b505afa1580156126c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e49190613d7a565b155b6127025760405162461bcd60e51b8152600401610995906145a5565b60085460005b8181101561281257826001600160a01b03166008828154811061272757fe5b6000918252602090912001546001600160a01b0316141561280a576008600183038154811061275257fe5b600091825260209091200154600880546001600160a01b03909216918390811061277857fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060088054806127b157fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b03851682526009905260408120805460ff19168155600181018290556002810182905560030155612812565b600101612708565b505050565b60025461010090046001600160a01b031633148061284d5750612838611b32565b6001600160a01b0316336001600160a01b0316145b6128695760405162461bcd60e51b81526004016109959061417f565b6001600160a01b03811661288f5760405162461bcd60e51b815260040161099590614608565b600580546001600160a01b0319166001600160a01b0383161790556040517f827daa11640de0eb908d0b06593ffb3f2b5e14e83d678fb922e512075f1d36f090610a0e908390613e02565b600260015414156128fd5760405162461bcd60e51b81526004016109959061467f565b600260015561290a611346565b156129275760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561296b57600080fd5b505afa15801561297f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a39190613ab6565b6001600160a01b0316146129b757806129b9565b345b6001600160a01b03851660009081526009602052604090205490915060ff1680156129fc57506001600160a01b03831660009081526009602052604090205460ff165b612a185760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612a5d5760405162461bcd60e51b81526004016109959061464f565b6001600160a01b038316600090815260096020526040902060030154612a955760405162461bcd60e51b81526004016109959061464f565b60048054600a546040516312e8123160e11b81526001600160a01b03909216926325d0246292612acc928992889288929101613eba565b602060405180830381600087803b158015612ae657600080fd5b505af1158015612afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1e9190613d05565b612b3a5760405162461bcd60e51b815260040161099590614502565b600080856001600160a01b031663e61604cf34873388886040518663ffffffff1660e01b8152600401612b709493929190613e90565b6060604051808303818588803b158015612b8957600080fd5b505af1158015612b9d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bc29190613d92565b60405163b2a02ff160e01b815291945092506001600160a01b038716915063b2a02ff190612bf890339088908690600401613e39565b600060405180830381600087803b158015612c1257600080fd5b505af1158015612c26573d6000803e3d6000fd5b505060065460405163dd9aba1b60e01b81526001600160a01b03909116925063dd9aba1b9150612c5e90889088903390600401613e16565b600060405180830381600087803b158015612c7857600080fd5b505af1158015612c8c573d6000803e3d6000fd5b505050506000821115612d6c5760055460405163b2a02ff160e01b81526001600160a01b038781169263b2a02ff192612ccf929091169088908790600401613e39565b600060405180830381600087803b158015612ce957600080fd5b505af1158015612cfd573d6000803e3d6000fd5b505060065460055460405163dd9aba1b60e01b81526001600160a01b03928316945063dd9aba1b9350612d39928a928a92911690600401613e16565b600060405180830381600087803b158015612d5357600080fd5b505af1158015612d67573d6000803e3d6000fd5b505050505b6006546040516359debb6760e11b81526001600160a01b039091169063b3bd76ce90612d9e9089908890600401613e76565b600060405180830381600087803b158015612db857600080fd5b505af1158015612dcc573d6000803e3d6000fd5b5050600180555050505050505050565b6001600160a01b038116600090815260096020526040902054819060ff16612e165760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b0382166000908152600d60209081526040808320338452909152902054829060ff16612e5b5760405162461bcd60e51b815260040161099590614019565b612e63613a25565b60405163497d274760e11b81526001600160a01b038516906392fa4e8e90612e8f903390600401613e02565b606060405180830381600087803b158015612ea957600080fd5b505af1158015612ebd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee19190613d25565b90508060200151600014612f075760405162461bcd60e51b815260040161099590613fd8565b60048054825160405163eabe7d9160e01b81526001600160a01b039092169263eabe7d9192612f3a928992339201613e39565b602060405180830381600087803b158015612f5457600080fd5b505af1158015612f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8c9190613d05565b612fa85760405162461bcd60e51b815260040161099590614355565b612fb284336137dc565b7fe699a64c18b07ac5b7301aa273f36a2287239eb9501d81950672794afba29a0d8433604051612562929190613e76565b600260015414156130065760405162461bcd60e51b81526004016109959061467f565b600260019081556040805182815280820190915260609160208083019080368337019050509050818160008151811061303b57fe5b6001600160a01b03928316602091820292909201015260065460405163025181bb60e41b81529116906325181bb09061307a9084903390600401613ef6565b600060405180830381600087803b15801561309457600080fd5b505af11580156130a8573d6000803e3d6000fd5b50506001805550505050565b6001600160a01b038216600090815260096020526040812054839060ff166130ee5760405162461bcd60e51b8152600401610995906144d4565b600260015414156131115760405162461bcd60e51b81526004016109959061467f565b600260015561311e611346565b1561313b5760405162461bcd60e51b8152600401610995906142a2565b60006001600160a01b0316846001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561317f57600080fd5b505afa158015613193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b79190613ab6565b6001600160a01b0316146131cb57826131cd565b345b6001600160a01b0385166000908152600960205260409020600101549093508015806132ff5750806132fc856132f6670de0b6b3a76400006132f08a6001600160a01b0316633ba0b9a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561324157600080fd5b505afa158015613255573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132799190613d7a565b8b6001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156132b257600080fd5b505afa1580156132c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ea9190613d7a565b90613963565b906139a4565b906139d6565b11155b61331b5760405162461bcd60e51b815260040161099590614148565b6000856001600160a01b031663f2b9fdb83433886040518463ffffffff1660e01b815260040161334c929190613e5d565b6020604051808303818588803b15801561336557600080fd5b505af1158015613379573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061339e9190613d7a565b600654604051639ba24c9b60e01b81529192506001600160a01b031690639ba24c9b906133d19089903390600401613e76565b600060405180830381600087803b1580156133eb57600080fd5b505af11580156133ff573d6000803e3d6000fd5b505050507f2bbccc947c61d8ee81518a7f91c8e99f62691dbacce3401d6ab09fb692fbe17333878760405161343693929190613e39565b60405180910390a16001805595945050505050565b613453613763565b6001600160a01b0316613464611b32565b6001600160a01b03161461348a5760405162461bcd60e51b8152600401610995906143fa565b6001600160a01b0381166134b05760405162461bcd60e51b815260040161099590614094565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60048054604051635ec88c7960e01b8152600092839283926001600160a01b0390911691635ec88c799161354191889101613e02565b60606040518083038186803b15801561355957600080fd5b505afa15801561356d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135919190613d92565b9250925092509193909250565b600654604051637ee0d61360e01b81526001600160a01b0390911690637ee0d613906135d1906008903390600401613f20565b600060405180830381600087803b1580156135eb57600080fd5b505af11580156135ff573d6000803e3d6000fd5b50505050565b6001600160a01b038216600090815260096020526040902054829060ff1661363f5760405162461bcd60e51b8152600401610995906144d4565b6001600160a01b038084166000908152600d602090815260408083209386168352929052205460ff16612812576001600160a01b038084166000818152600d602090815260408083209487168352938152838220805460ff19166001908117909155600c825284832080549182018155835291200180546001600160a01b0319169091179055517f3ab23ab0d51cccc0c3085aec51f99228625aa1a922b3a8ca89a26b0f2027a1a590611ff69085908590613e76565b6136fd611346565b6137195760405162461bcd60e51b815260040161099590613faa565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61374c613763565b6040516137599190613e02565b60405180910390a1565b3390565b61376f611346565b1561378c5760405162461bcd60e51b8152600401610995906142a2565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861374c613763565b6706f05b59d3b20000600a55670ff59ee833b30000600b55565b6001600160a01b0381166000908152600c60205260409020546138115760405162461bcd60e51b8152600401610995906143c3565b6001600160a01b038083166000908152600d602090815260408083209385168352928152828220805460ff19169055600c905290812054905b818110156135ff576001600160a01b038381166000908152600c602052604090208054918616918390811061387b57fe5b6000918252602090912001546001600160a01b0316141561395b576001600160a01b0383166000908152600c60205260409020805460001984019081106138be57fe5b60009182526020808320909101546001600160a01b038681168452600c90925260409092208054919092169190839081106138f557fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559185168152600c9091526040902080548061393457fe5b600082815260209020810160001990810180546001600160a01b03191690550190556135ff565b60010161384a565b60008261397257506000611b8b565b8282028284828161397f57fe5b041461399d5760405162461bcd60e51b815260040161099590614382565b9392505050565b60008082116139c55760405162461bcd60e51b815260040161099590614234565b8183816139ce57fe5b049392505050565b60008282018381101561399d5760405162461bcd60e51b815260040161099590614111565b60405180608001604052806000151581526020016000815260200160008152602001600081525090565b60405180606001604052806000815260200160008152602001600081525090565b8035611b8b816147b5565b60008083601f840112613a62578182fd5b50813567ffffffffffffffff811115613a79578182fd5b6020830191508360208083028501011115613a9357600080fd5b9250929050565b600060208284031215613aab578081fd5b813561399d816147b5565b600060208284031215613ac7578081fd5b815161399d816147b5565b60008060008060808587031215613ae7578283fd5b8435613af2816147b5565b966020860135965060408601359560600135945092505050565b60008060408385031215613b1e578182fd5b8235613b29816147b5565b91506020830135613b39816147b5565b809150509250929050565b60008060008060808587031215613b59578384fd5b8435613b64816147b5565b93506020850135613b74816147b5565b92506040850135613b84816147b5565b9396929550929360600135925050565b600080600060608486031215613ba8578283fd5b8335613bb3816147b5565b92506020840135613bc3816147b5565b929592945050506040919091013590565b60008060408385031215613be6578182fd5b8235613bf1816147b5565b946020939093013593505050565b60008060008060408587031215613c14578384fd5b843567ffffffffffffffff80821115613c2b578586fd5b613c3788838901613a51565b90965094506020870135915080821115613c4f578384fd5b50613c5c87828801613a51565b95989497509550505050565b60006020808385031215613c7a578182fd5b823567ffffffffffffffff811115613c90578283fd5b8301601f81018513613ca0578283fd5b8035613cb3613cae82614795565b61476e565b8181528381019083850185840285018601891015613ccf578687fd5b8694505b83851015613cf957613ce58982613a46565b835260019490940193918501918501613cd3565b50979650505050505050565b600060208284031215613d16578081fd5b8151801515811461399d578182fd5b600060608284031215613d36578081fd5b613d40606061476e565b8251815260208301516020820152604083015160408201528091505092915050565b600060208284031215613d73578081fd5b5035919050565b600060208284031215613d8b578081fd5b5051919050565b600080600060608486031215613da6578081fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b83811015613df75781516001600160a01b031687529582019590820190600101613dd2565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b60006020825261399d6020830184613dbf565b600060408252613f096040830185613dbf565b905060018060a01b03831660208301529392505050565b6000604082016040835280855480835260608501915086845260209250828420845b82811015613f675781546001600160a01b031684529284019260019182019101613f42565b5050506001600160a01b039490941692019190915250919050565b901515815260200190565b931515845260208401929092526040830152606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526021908201527f436f72653a20626f72726f772062616c616e6365206d757374206265207a65726040820152606f60f81b606082015260800190565b60208082526017908201527f436f72653a206d75737420656e746572206d61726b6574000000000000000000604082015260600190565b60208082526024908201527f436f72653a20696e76616c6964206c61624469737472696275746f72206164646040820152637265737360e01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672070726963650000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f436f72653a20737570706c792063617020726561636865640000000000000000604082015260600190565b60208082526027908201527f436f72653a2063616c6c6572206973206e6f7420746865206f776e6572206f726040820152661035b2b2b832b960c91b606082015260800190565b6020808252601e908201527f436f72653a20696e76616c696420756e6465726c79696e672061737365740000604082015260600190565b6020808252601d908201527f436f72653a2063616c6c65722073686f756c64206265206d61726b6574000000604082015260600190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b6020808252601c908201527f436f72653a20696e76616c6964206b6565706572206164647265737300000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f7420626f72726f7760681b604082015260600190565b602080825260139082015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b60208082526015908201527410dbdc994e881d5b9b1a5cdd1959081b585c9ad95d605a1b604082015260600190565b602080825260139082015272436f72653a2063616e6e6f742072656465656d60681b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601c908201527f436f72653a2063616e6e6f7420706f702075736572206d61726b657400000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601e908201527f436f72653a20696e76616c6964206e667420636f726520616464726573730000604082015260600190565b6020808252601f908201527f436f72653a20696e76616c696420636f6c6c61746572616c20666163746f7200604082015260600190565b6020808252601a908201527f436f72653a20696e76616c696420636c6f736520666163746f72000000000000604082015260600190565b60208082526014908201527310dbdc994e881a5b9d985b1a59081b585c9ad95d60621b604082015260600190565b6020808252601d908201527f436f72653a2063616e6e6f74206c697175696461746520626f72726f77000000604082015260600190565b6020808252818101527f436f72653a20696e76616c69642063616c63756c61746f722061646472657373604082015260600190565b6020808252601f908201527f436f72653a20696e76616c69642076616c696461746f72206164647265737300604082015260600190565b6020808252601a908201527f436f72653a2063616e6e6f742072656d6f7665206d61726b6574000000000000604082015260600190565b602080825260129082015271436f72653a20696e76616c6964206461746160701b604082015260600190565b60208082526027908201527f436f72653a20696e76616c6964207265626174654469737472696275746f72206040820152666164647265737360c81b606082015260800190565b60208082526016908201527510dbdc994e881b9bdd08184818dbdb1b185d195c985b60521b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601b908201527f436f72653a20616c7265616479206c6973746564206d61726b65740000000000604082015260600190565b6020808252818101527f436f72653a2063616c6c6572206973206e6f7420746865206e667420636f7265604082015260600190565b81511515815260208083015190820152604080830151908201526060918201519181019190915260800190565b90815260200190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561478d57600080fd5b604052919050565b600067ffffffffffffffff8211156147ab578081fd5b5060209081020190565b6001600160a01b03811681146147ca57600080fd5b5056fea2646970667358221220dc53fc188be8059d4bb041ca91e5a28a7396e66c8dc03bd0ce8167a92104784864736f6c634300060c0033
Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.