Ready to simplify your web3 experience? Try the all-in-one web3 app trusted by millions worldwide.
Purchase 100+ cryptocurrencies instantly, with Visa/Mastercard, Google/Apple Pay, and a variety of other funding methods.
Everyday giveaways up to 100 ETH, Lucky Spins. Deposit BONUS 300% and Cashbacks!
9 years old Licensed Crypto Casino, Instant Withdraw 24/7, 6000+ Slots available, Paypal Deposit, Instant Live Support 24/7, 30% Rakeback.
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
5000+ Slots & Live Casino Games, 50+cryptos. Register with Etherscan and get 760% deposit bonus. Win Big$, withdraw it fast.
Dive into 100s of games and play anonymously with major cryptos. Join CryptoWins today!
Anonymous play on awesome games - sign up now for 25 free jackpot spins - worth $100s!
Overview
ETH Balance
Eth Value
$0.00Token Holdings
Could not find any matches!
- ERC-20 Tokens (24)10 MIMOMIMO Paralle... (MIMO)$0.05@0.00481,000 MTVMultiVAC (MTV)$0.68@0.00071.77027618 PARPAR Stableco... (PAR)$2.02@1.142,500 $ Evmosia.com$ Evmosia.c... ($ Evm...)4.75ERC20 ***8.64858633 COLONColon$0.02@0.001816.6546259 DOGDog (DOG)1,120,693,252.18922 NebraNebra Dione (Nebra)74.375 REKTRektGAME (REKT)5 SWAPPSwapp Token1.28399185 ZENIQZENIQ$0.01@0.00771.2 TokenERC-20 TOKEN*[Suspicious]3,999.99 TokenERC-20 TOKEN*[Suspicious]3,999.99 TokenERC-20 TOKEN*[Suspicious]0.7 TokenERC-20 TOKEN*[Suspicious]100,000 TokenERC-20 TOKEN*[Suspicious]4,214 TokenERC-20 TOKEN*[Suspicious]7,000 TokenERC-20 TOKEN*[Suspicious]350 TokenERC-20 TOKEN*[Suspicious]7,000 TokenERC-20 TOKEN*[Unsafe]3,999.99 TokenERC-20 TOKEN*[Spam]7,000 TokenERC-20 TOKEN*[Spam]50,000 TokenERC-20 TOKEN*[Spam]50,000 TokenERC-20 TOKEN*[Spam]NFT Tokens (18)claim rewards on apyusd.netapyusd.netERC-1155NativePunks TicketNativePunks TicketERC-1155NWBTCwbtc-nft.org or OS/collection/nwbtc to Redeem and Swap your NFT for WBTCERC-1155debridgeth.comWithdrawal Badge debridgeth.comERC-1155Let's Go!🎁ERC-1155ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]ERC-1155 TOKEN*[Suspicious]
More Info
Private Name Tags
ContractCreator
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- NFT Transfers
- Contract
- Events
- Analytics
- Multichain Portfolio
Advanced Filter- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
- NFTs
Latest 25 from a total of 5,766 transactions
Transaction Hash MethodBlockFromToDeposit ETH And ... 20834690 2024-09-26 12:08:23 17 days ago 1727352503 IN 1.50652639 ETH$3,803.27 0.0070014 17.74721574 Borrow 20827395 2024-09-25 11:42:47 18 days ago 1727264567 IN 0 ETH$0.00 0.00649502 18.22971541 Withdraw 20793027 2024-09-20 16:34:47 23 days ago 1726850087 IN 0 ETH$0.00 0.00597093 22.4016298 Withdraw ETH 20793026 2024-09-20 16:34:35 23 days ago 1726850075 IN 0 ETH$0.00 0.00604039 23.36321693 Withdraw ETH 20737319 2024-09-12 21:49:35 31 days ago 1726177775 IN 0 ETH$0.00 0.00111666 4.32945438 Borrow 20727096 2024-09-11 11:33:23 32 days ago 1726054403 IN 0 ETH$0.00 0.00089591 2.63012094 Repay 20722019 2024-09-10 18:32:35 33 days ago 1725993155 IN 0 ETH$0.00 0.00197405 7.99083549 Repay 20694166 2024-09-06 21:13:47 37 days ago 1725657227 IN 0 ETH$0.00 0.00268044 11.2822213 Withdraw 20694145 2024-09-06 21:09:23 37 days ago 1725656963 IN 0 ETH$0.00 0.00377395 14.10988787 Liquidate Partia... 20692833 2024-09-06 16:46:11 37 days ago 1725641171 IN 0 ETH$0.00 0.02200188 53.04751534 Deposit ETH And ... 20670108 2024-09-03 12:39:47 40 days ago 1725367187 IN 0.3 ETH$757.36 0.00113754 3.02085987 Liquidate 20625271 2024-08-28 6:23:23 47 days ago 1724826203 IN 0 ETH$0.00 0.00051661 1.24652336 Liquidate Partia... 20622850 2024-08-27 22:16:23 47 days ago 1724796983 IN 0 ETH$0.00 0.00286025 13.5331994 Liquidate Partia... 20622738 2024-08-27 21:53:47 47 days ago 1724795627 IN 0 ETH$0.00 0.00452688 10.89011859 Liquidate 20595280 2024-08-24 1:48:35 51 days ago 1724464115 IN 0 ETH$0.00 0.00039887 0.97598671 Liquidate 20595263 2024-08-24 1:45:11 51 days ago 1724463911 IN 0 ETH$0.00 0.00042426 0.97089611 Liquidate 20595243 2024-08-24 1:41:11 51 days ago 1724463671 IN 0 ETH$0.00 0.00038265 0.89395547 Withdraw ETH 20591964 2024-08-23 14:42:11 51 days ago 1724424131 IN 0 ETH$0.00 0.0004633 5.28117403 Withdraw 20577935 2024-08-21 15:36:59 53 days ago 1724254619 IN 0 ETH$0.00 0.00200038 8.07654013 Withdraw ETH 20577930 2024-08-21 15:35:59 53 days ago 1724254559 IN 0 ETH$0.00 0.00215014 8.41892201 Withdraw ETH 20575759 2024-08-21 8:19:35 54 days ago 1724228375 IN 0 ETH$0.00 0.00100424 3.8846033 Withdraw 20575745 2024-08-21 8:16:47 54 days ago 1724228207 IN 0 ETH$0.00 0.00114474 4.27177517 Liquidate 20564934 2024-08-19 20:03:23 55 days ago 1724097803 IN 0 ETH$0.00 0.00112059 2.66880904 Liquidate 20564919 2024-08-19 20:00:23 55 days ago 1724097623 IN 0 ETH$0.00 0.00115625 2.50138928 Deposit ETH And ... 20526797 2024-08-14 12:13:35 60 days ago 1723637615 IN 0.28 ETH$706.87 0.0009357 2.18136998 Latest 25 internal transactions (View All)
Advanced mode:Parent Transaction Hash Block From To 20834690 2024-09-26 12:08:23 17 days ago 1727352503 1.50652639 ETH$3,803.27 20793026 2024-09-20 16:34:35 23 days ago 1726850075 0.18809452 ETH$474.85 20793026 2024-09-20 16:34:35 23 days ago 1726850075 0.18809452 ETH$474.85 20737319 2024-09-12 21:49:35 31 days ago 1726177775 1.106851 ETH$2,794.27 20737319 2024-09-12 21:49:35 31 days ago 1726177775 1.106851 ETH$2,794.27 20670108 2024-09-03 12:39:47 40 days ago 1725367187 0.3 ETH$757.36 20591964 2024-08-23 14:42:11 51 days ago 1724424131 10 ETH$25,245.27 20591964 2024-08-23 14:42:11 51 days ago 1724424131 10 ETH$25,245.27 20584387 2024-08-22 13:16:47 52 days ago 1724332607 3,000 ETH$7,573,579.83 20584387 2024-08-22 13:16:47 52 days ago 1724332607 3,000 ETH$7,573,579.83 20577930 2024-08-21 15:35:59 53 days ago 1724254559 20 ETH$50,490.53 20577930 2024-08-21 15:35:59 53 days ago 1724254559 20 ETH$50,490.53 20575759 2024-08-21 8:19:35 54 days ago 1724228375 0.00988924 ETH$24.97 20575759 2024-08-21 8:19:35 54 days ago 1724228375 0.00988924 ETH$24.97 20526797 2024-08-14 12:13:35 60 days ago 1723637615 0.28 ETH$706.87 20508035 2024-08-11 21:24:11 63 days ago 1723411451 0.834362 ETH$2,106.37 20508035 2024-08-11 21:24:11 63 days ago 1723411451 0.834362 ETH$2,106.37 20319174 2024-07-16 12:48:59 89 days ago 1721134139 100 ETH$252,452.66 20319174 2024-07-16 12:48:59 89 days ago 1721134139 100 ETH$252,452.66 20240453 2024-07-05 12:58:11 100 days ago 1720184291 0.7 ETH$1,767.17 20238715 2024-07-05 7:08:35 101 days ago 1720163315 0.5 ETH$1,262.26 20167241 2024-06-25 7:35:35 111 days ago 1719300935 280.8565202 ETH$709,029.76 20167241 2024-06-25 7:35:35 111 days ago 1719300935 280.8565202 ETH$709,029.76 20126401 2024-06-19 14:32:23 116 days ago 1718807543 25 ETH$63,113.17 20126401 2024-06-19 14:32:23 116 days ago 1718807543 25 ETH$63,113.17 Loading...LoadingContract Name:VaultsCore
Compiler Versionv0.6.12+commit.27d51765
Contract Source Code (Solidity)
- interface IERC20
- - function totalSupply()
- - function balanceOf(address account)
- - function transfer(address recipient, ...
- - function allowance(address owner, add ...
- - function approve(address spender, uin ...
- - function transferFrom(address sender, ...
- library SafeMath
- - function add(uint256 a, uint256 b)
- - function sub(uint256 a, uint256 b)
- - function sub(uint256 a, uint256 b, st ...
- - function mul(uint256 a, uint256 b)
- - function div(uint256 a, uint256 b)
- - function div(uint256 a, uint256 b, st ...
- - function mod(uint256 a, uint256 b)
- - function mod(uint256 a, uint256 b, st ...
- library Address
- - function isContract(address account)
- - function sendValue(address payable re ...
- - function functionCall(address target, ...
- - function functionCall(address target, ...
- - function functionCallWithValue(addres ...
- - function functionCallWithValue(addres ...
- - function _functionCallWithValue(addre ...
- library SafeERC20
- - function safeTransfer(IERC20 token, a ...
- - function safeTransferFrom(IERC20 toke ...
- - function safeApprove(IERC20 token, ad ...
- - function safeIncreaseAllowance(IERC20 ...
- - function safeDecreaseAllowance(IERC20 ...
- - function _callOptionalReturn(IERC20 t ...
- contract ReentrancyGuard
- library WadRayMath
- - function ray()
- - function wad()
- - function halfRay()
- - function halfWad()
- - function wadMul(uint256 a, uint256 b)
- - function wadDiv(uint256 a, uint256 b)
- - function rayMul(uint256 a, uint256 b)
- - function rayDiv(uint256 a, uint256 b)
- - function rayToWad(uint256 a)
- - function wadToRay(uint256 a)
- - function rayPow(uint256 x, uint256 n)
- interface IAccessController
- - function grantRole(bytes32 role, addr ...
- - function revokeRole(bytes32 role, add ...
- - function renounceRole(bytes32 role, a ...
- - function MANAGER_ROLE()
- - function MINTER_ROLE()
- - function hasRole(bytes32 role, addres ...
- - function getRoleMemberCount(bytes32 r ...
- - function getRoleMember(bytes32 role, ...
- - function getRoleAdmin(bytes32 role)
- interface IConfigProvider
- - function setCollateralConfig(
- - function removeCollateral(address _co ...
- - function setCollateralDebtLimit(addre ...
- - function setCollateralLiquidationRati ...
- - function setCollateralMinCollateralRa ...
- - function setCollateralBorrowRate(addr ...
- - function setCollateralOriginationFee( ...
- - function setCollateralLiquidationBonu ...
- - function setCollateralLiquidationFee( ...
- - function setMinVotingPeriod(uint256 _ ...
- - function setMaxVotingPeriod(uint256 _ ...
- - function setVotingQuorum(uint256 _vot ...
- - function setProposalThreshold(uint256 ...
- - function a()
- - function collateralConfigs(uint256 _i ...
- - function collateralIds(address _colla ...
- - function numCollateralConfigs()
- - function minVotingPeriod()
- - function maxVotingPeriod()
- - function votingQuorum()
- - function proposalThreshold()
- - function collateralDebtLimit(address ...
- - function collateralLiquidationRatio(a ...
- - function collateralMinCollateralRatio ...
- - function collateralBorrowRate(address ...
- - function collateralOriginationFee(add ...
- - function collateralLiquidationBonus(a ...
- - function collateralLiquidationFee(add ...
- interface ISTABLEX is IERC20
- - function mint(address account, uint25 ...
- - function burn(address account, uint25 ...
- - function a()
- interface AggregatorV3Interface
- - function decimals()
- - function description()
- - function version()
- - function getRoundData(uint80 _roundId ...
- - function latestRoundData()
- interface IPriceFeed
- - function setAssetOracle(address _asse ...
- - function setEurOracle(address _oracle ...
- - function a()
- - function assetOracles(address _asset)
- - function eurOracle()
- - function getAssetPrice(address _asset ...
- - function convertFrom(address _asset, ...
- - function convertTo(address _asset, ui ...
- interface IRatesManager
- - function a()
- - function annualizedBorrowRate(uint256 ...
- - function calculateDebt(uint256 _baseD ...
- - function calculateBaseDebt(uint256 _d ...
- - function calculateCumulativeRate(
- interface ILiquidationManager
- - function a()
- - function calculateHealthFactor(
- - function liquidationBonus(address _co ...
- - function applyLiquidationDiscount(add ...
- - function isHealthy(
- interface IVaultsDataProvider
- - function createVault(address _collate ...
- - function setCollateralBalance(uint256 ...
- - function setBaseDebt(uint256 _id, uin ...
- - function a()
- - function baseDebt(address _collateral ...
- - function vaultCount()
- - function vaults(uint256 _id)
- - function vaultOwner(uint256 _id)
- - function vaultCollateralType(uint256 ...
- - function vaultCollateralBalance(uint2 ...
- - function vaultBaseDebt(uint256 _id)
- - function vaultId(address _collateralT ...
- - function vaultExists(uint256 _id)
- - function vaultDebt(uint256 _vaultId)
- - function debt()
- - function collateralDebt(address _coll ...
- interface IFeeDistributor
- - function release()
- - function changePayees(address[] memor ...
- - function a()
- - function lastReleasedAt()
- - function getPayees()
- - function totalShares()
- - function shares(address payee)
- interface IAddressProvider
- - function setAccessController(IAccessC ...
- - function setConfigProvider(IConfigPro ...
- - function setVaultsCore(IVaultsCore _c ...
- - function setStableX(ISTABLEX _stablex ...
- - function setRatesManager(IRatesManage ...
- - function setPriceFeed(IPriceFeed _pri ...
- - function setLiquidationManager(ILiqui ...
- - function setVaultsDataProvider(IVault ...
- - function setFeeDistributor(IFeeDistri ...
- - function controller()
- - function config()
- - function core()
- - function stablex()
- - function ratesManager()
- - function priceFeed()
- - function liquidationManager()
- - function vaultsData()
- - function feeDistributor()
- interface IConfigProviderV1
- - function setCollateralConfig(
- - function removeCollateral(address _co ...
- - function setCollateralDebtLimit(addre ...
- - function setCollateralMinCollateralRa ...
- - function setCollateralBorrowRate(addr ...
- - function setCollateralOriginationFee( ...
- - function setLiquidationBonus(uint256 ...
- - function a()
- - function collateralConfigs(uint256 _i ...
- - function collateralIds(address _colla ...
- - function numCollateralConfigs()
- - function liquidationBonus()
- - function collateralDebtLimit(address ...
- - function collateralMinCollateralRatio ...
- - function collateralBorrowRate(address ...
- - function collateralOriginationFee(add ...
- interface ILiquidationManagerV1
- - function a()
- - function calculateHealthFactor(
- - function liquidationBonus(uint256 _am ...
- - function applyLiquidationDiscount(uin ...
- - function isHealthy(
- interface IVaultsCoreV1
- - function deposit(address _collateralT ...
- - function withdraw(uint256 _vaultId, u ...
- - function withdrawAll(uint256 _vaultId ...
- - function borrow(uint256 _vaultId, uin ...
- - function repayAll(uint256 _vaultId)
- - function repay(uint256 _vaultId, uint ...
- - function liquidate(uint256 _vaultId)
- - function initializeRates(address _col ...
- - function refresh()
- - function refreshCollateral(address co ...
- - function upgrade(address _newVaultsCo ...
- - function a()
- - function availableIncome()
- - function cumulativeRates(address _col ...
- - function lastRefresh(address _collate ...
- interface IWETH
- - function deposit()
- - function transfer(address to, uint256 ...
- - function withdraw(uint256 wad)
- interface IGovernorAlpha
- - function propose(address[] memory tar ...
- - function queue(uint256 proposalId)
- - function execute(uint256 proposalId)
- - function cancel(uint256 proposalId)
- - function castVote(uint256 proposalId, ...
- - function getActions(uint256 proposalI ...
- - function getReceipt(uint256 proposalI ...
- - function state(uint proposalId)
- - function quorumVotes()
- - function proposalThreshold()
- interface ITimelock
- - function acceptAdmin()
- - function queueTransaction(
- - function cancelTransaction(
- - function executeTransaction(
- - function delay()
- - function GRACE_PERIOD()
- - function queuedTransactions(bytes32 h ...
- interface IVotingEscrow
- - function createLock(uint256 _value, u ...
- - function increaseLockAmount(uint256 _ ...
- - function increaseLockLength(uint256 _ ...
- - function withdraw()
- - function expireContract()
- - function name()
- - function symbol()
- - function decimals()
- - function balanceOf(address _owner)
- - function balanceOfAt(address _owner, ...
- - function stakingToken()
- interface IMIMO is IERC20
- - function burn(address account, uint25 ...
- - function mint(address account, uint25 ...
- interface ISupplyMiner
- - function baseDebtChanged(address user ...
- interface IDebtNotifier
- - function debtChanged(uint256 _vaultId ...
- - function setCollateralSupplyMiner(add ...
- - function a()
- - function collateralSupplyMinerMapping ...
- interface IGovernanceAddressProvider
- - function setParallelAddressProvider(I ...
- - function setMIMO(IMIMO _mimo)
- - function setDebtNotifier(IDebtNotifie ...
- - function setGovernorAlpha(IGovernorAl ...
- - function setTimelock(ITimelock _timel ...
- - function setVotingEscrow(IVotingEscro ...
- - function controller()
- - function parallel()
- - function mimo()
- - function debtNotifier()
- - function governorAlpha()
- - function timelock()
- - function votingEscrow()
- interface IVaultsCore
- - function deposit(address _collateralT ...
- - function depositETH()
- - function depositByVaultId(uint256 _va ...
- - function depositETHByVaultId(uint256 ...
- - function depositAndBorrow(
- - function depositETHAndBorrow(uint256 ...
- - function withdraw(uint256 _vaultId, u ...
- - function withdrawETH(uint256 _vaultId ...
- - function borrow(uint256 _vaultId, uin ...
- - function repayAll(uint256 _vaultId)
- - function repay(uint256 _vaultId, uint ...
- - function liquidate(uint256 _vaultId)
- - function liquidatePartial(uint256 _va ...
- - function upgrade(address payable _new ...
- - function acceptUpgrade(address payabl ...
- - function setDebtNotifier(IDebtNotifie ...
- - function a()
- - function WETH()
- - function debtNotifier()
- - function state()
- - function cumulativeRates(address _col ...
- interface IAddressProviderV1
- - function setAccessController(IAccessC ...
- - function setConfigProvider(IConfigPro ...
- - function setVaultsCore(IVaultsCoreV1 ...
- - function setStableX(ISTABLEX _stablex ...
- - function setRatesManager(IRatesManage ...
- - function setPriceFeed(IPriceFeed _pri ...
- - function setLiquidationManager(ILiqui ...
- - function setVaultsDataProvider(IVault ...
- - function setFeeDistributor(IFeeDistri ...
- - function controller()
- - function config()
- - function core()
- - function stablex()
- - function ratesManager()
- - function priceFeed()
- - function liquidationManager()
- - function vaultsData()
- - function feeDistributor()
- interface IVaultsCoreState
- - function initializeRates(address _col ...
- - function refresh()
- - function refreshCollateral(address co ...
- - function syncState(IVaultsCoreState _ ...
- - function syncStateFromV1(IVaultsCoreV ...
- - function a()
- - function availableIncome()
- - function cumulativeRates(address _col ...
- - function lastRefresh(address _collate ...
- - function synced()
- contract VaultsCore is IVaultsCore ... *
- - function upgrade(address payable _new ...
- - function acceptUpgrade(address payabl ...
- - function setDebtNotifier(IDebtNotifie ...
- - function deposit(address _collateralT ...
- - function depositETH()
- - function depositByVaultId(uint256 _va ...
- - function depositETHByVaultId(uint256 ...
- - function depositAndBorrow(
- - function depositETHAndBorrow(uint256 ...
- - function _addCollateralToVault(addres ...
- - function _addCollateralToVaultById(ui ...
- - function withdraw(uint256 _vaultId, u ...
- - function withdrawETH(uint256 _vaultId ...
- - function _removeCollateralFromVault(u ...
- - function borrow(uint256 _vaultId, uin ...
- - function repayAll(uint256 _vaultId)
- - function repay(uint256 _vaultId, uint ...
- - function _reduceVaultDebt(uint256 _va ...
- - function liquidate(uint256 _vaultId)
- - function liquidatePartial(uint256 _va ...
- - function cumulativeRates(address _col ...
/** *Submitted for verification at Etherscan.io on 2021-03-01 */ // SPDX-License-Identifier: MIT pragma experimental ABIEncoderV2; pragma solidity 0.6.12; // /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // /****************** @title WadRayMath library @author Aave @dev Provides mul and div function for wads (decimal numbers with 18 digits precision) and rays (decimals with 27 digits) */ library WadRayMath { using SafeMath for uint256; uint256 internal constant _WAD = 1e18; uint256 internal constant _HALF_WAD = _WAD / 2; uint256 internal constant _RAY = 1e27; uint256 internal constant _HALF_RAY = _RAY / 2; uint256 internal constant _WAD_RAY_RATIO = 1e9; function ray() internal pure returns (uint256) { return _RAY; } function wad() internal pure returns (uint256) { return _WAD; } function halfRay() internal pure returns (uint256) { return _HALF_RAY; } function halfWad() internal pure returns (uint256) { return _HALF_WAD; } function wadMul(uint256 a, uint256 b) internal pure returns (uint256) { return _HALF_WAD.add(a.mul(b)).div(_WAD); } function wadDiv(uint256 a, uint256 b) internal pure returns (uint256) { uint256 halfB = b / 2; return halfB.add(a.mul(_WAD)).div(b); } function rayMul(uint256 a, uint256 b) internal pure returns (uint256) { return _HALF_RAY.add(a.mul(b)).div(_RAY); } function rayDiv(uint256 a, uint256 b) internal pure returns (uint256) { uint256 halfB = b / 2; return halfB.add(a.mul(_RAY)).div(b); } function rayToWad(uint256 a) internal pure returns (uint256) { uint256 halfRatio = _WAD_RAY_RATIO / 2; return halfRatio.add(a).div(_WAD_RAY_RATIO); } function wadToRay(uint256 a) internal pure returns (uint256) { return a.mul(_WAD_RAY_RATIO); } /** * @dev calculates x^n, in ray. The code uses the ModExp precompile * @param x base * @param n exponent * @return z = x^n, in ray */ function rayPow(uint256 x, uint256 n) internal pure returns (uint256 z) { z = n % 2 != 0 ? x : _RAY; for (n /= 2; n != 0; n /= 2) { x = rayMul(x, x); if (n % 2 != 0) { z = rayMul(z, x); } } } } // interface IAccessController { event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; function MANAGER_ROLE() external view returns (bytes32); function MINTER_ROLE() external view returns (bytes32); function hasRole(bytes32 role, address account) external view returns (bool); function getRoleMemberCount(bytes32 role) external view returns (uint256); function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleAdmin(bytes32 role) external view returns (bytes32); } // interface IConfigProvider { struct CollateralConfig { address collateralType; uint256 debtLimit; uint256 liquidationRatio; uint256 minCollateralRatio; uint256 borrowRate; uint256 originationFee; uint256 liquidationBonus; uint256 liquidationFee; } event CollateralUpdated( address indexed collateralType, uint256 debtLimit, uint256 liquidationRatio, uint256 minCollateralRatio, uint256 borrowRate, uint256 originationFee, uint256 liquidationBonus, uint256 liquidationFee ); event CollateralRemoved(address indexed collateralType); function setCollateralConfig( address _collateralType, uint256 _debtLimit, uint256 _liquidationRatio, uint256 _minCollateralRatio, uint256 _borrowRate, uint256 _originationFee, uint256 _liquidationBonus, uint256 _liquidationFee ) external; function removeCollateral(address _collateralType) external; function setCollateralDebtLimit(address _collateralType, uint256 _debtLimit) external; function setCollateralLiquidationRatio(address _collateralType, uint256 _liquidationRatio) external; function setCollateralMinCollateralRatio(address _collateralType, uint256 _minCollateralRatio) external; function setCollateralBorrowRate(address _collateralType, uint256 _borrowRate) external; function setCollateralOriginationFee(address _collateralType, uint256 _originationFee) external; function setCollateralLiquidationBonus(address _collateralType, uint256 _liquidationBonus) external; function setCollateralLiquidationFee(address _collateralType, uint256 _liquidationFee) external; function setMinVotingPeriod(uint256 _minVotingPeriod) external; function setMaxVotingPeriod(uint256 _maxVotingPeriod) external; function setVotingQuorum(uint256 _votingQuorum) external; function setProposalThreshold(uint256 _proposalThreshold) external; function a() external view returns (IAddressProvider); function collateralConfigs(uint256 _id) external view returns (CollateralConfig memory); function collateralIds(address _collateralType) external view returns (uint256); function numCollateralConfigs() external view returns (uint256); function minVotingPeriod() external view returns (uint256); function maxVotingPeriod() external view returns (uint256); function votingQuorum() external view returns (uint256); function proposalThreshold() external view returns (uint256); function collateralDebtLimit(address _collateralType) external view returns (uint256); function collateralLiquidationRatio(address _collateralType) external view returns (uint256); function collateralMinCollateralRatio(address _collateralType) external view returns (uint256); function collateralBorrowRate(address _collateralType) external view returns (uint256); function collateralOriginationFee(address _collateralType) external view returns (uint256); function collateralLiquidationBonus(address _collateralType) external view returns (uint256); function collateralLiquidationFee(address _collateralType) external view returns (uint256); } // interface ISTABLEX is IERC20 { function mint(address account, uint256 amount) external; function burn(address account, uint256 amount) external; function a() external view returns (IAddressProvider); } // interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // interface IPriceFeed { event OracleUpdated(address indexed asset, address oracle, address sender); event EurOracleUpdated(address oracle, address sender); function setAssetOracle(address _asset, address _oracle) external; function setEurOracle(address _oracle) external; function a() external view returns (IAddressProvider); function assetOracles(address _asset) external view returns (AggregatorV3Interface); function eurOracle() external view returns (AggregatorV3Interface); function getAssetPrice(address _asset) external view returns (uint256); function convertFrom(address _asset, uint256 _amount) external view returns (uint256); function convertTo(address _asset, uint256 _amount) external view returns (uint256); } // interface IRatesManager { function a() external view returns (IAddressProvider); //current annualized borrow rate function annualizedBorrowRate(uint256 _currentBorrowRate) external pure returns (uint256); //uses current cumulative rate to calculate totalDebt based on baseDebt at time T0 function calculateDebt(uint256 _baseDebt, uint256 _cumulativeRate) external pure returns (uint256); //uses current cumulative rate to calculate baseDebt at time T0 function calculateBaseDebt(uint256 _debt, uint256 _cumulativeRate) external pure returns (uint256); //calculate a new cumulative rate function calculateCumulativeRate( uint256 _borrowRate, uint256 _cumulativeRate, uint256 _timeElapsed ) external view returns (uint256); } // interface ILiquidationManager { function a() external view returns (IAddressProvider); function calculateHealthFactor( uint256 _collateralValue, uint256 _vaultDebt, uint256 _minRatio ) external view returns (uint256 healthFactor); function liquidationBonus(address _collateralType, uint256 _amount) external view returns (uint256 bonus); function applyLiquidationDiscount(address _collateralType, uint256 _amount) external view returns (uint256 discountedAmount); function isHealthy( uint256 _collateralValue, uint256 _vaultDebt, uint256 _minRatio ) external view returns (bool); } // interface IVaultsDataProvider { struct Vault { // borrowedType support USDX / PAR address collateralType; address owner; uint256 collateralBalance; uint256 baseDebt; uint256 createdAt; } //Write function createVault(address _collateralType, address _owner) external returns (uint256); function setCollateralBalance(uint256 _id, uint256 _balance) external; function setBaseDebt(uint256 _id, uint256 _newBaseDebt) external; // Read function a() external view returns (IAddressProvider); function baseDebt(address _collateralType) external view returns (uint256); function vaultCount() external view returns (uint256); function vaults(uint256 _id) external view returns (Vault memory); function vaultOwner(uint256 _id) external view returns (address); function vaultCollateralType(uint256 _id) external view returns (address); function vaultCollateralBalance(uint256 _id) external view returns (uint256); function vaultBaseDebt(uint256 _id) external view returns (uint256); function vaultId(address _collateralType, address _owner) external view returns (uint256); function vaultExists(uint256 _id) external view returns (bool); function vaultDebt(uint256 _vaultId) external view returns (uint256); function debt() external view returns (uint256); function collateralDebt(address _collateralType) external view returns (uint256); } // interface IFeeDistributor { event PayeeAdded(address indexed account, uint256 shares); event FeeReleased(uint256 income, uint256 releasedAt); function release() external; function changePayees(address[] memory _payees, uint256[] memory _shares) external; function a() external view returns (IAddressProvider); function lastReleasedAt() external view returns (uint256); function getPayees() external view returns (address[] memory); function totalShares() external view returns (uint256); function shares(address payee) external view returns (uint256); } // interface IAddressProvider { function setAccessController(IAccessController _controller) external; function setConfigProvider(IConfigProvider _config) external; function setVaultsCore(IVaultsCore _core) external; function setStableX(ISTABLEX _stablex) external; function setRatesManager(IRatesManager _ratesManager) external; function setPriceFeed(IPriceFeed _priceFeed) external; function setLiquidationManager(ILiquidationManager _liquidationManager) external; function setVaultsDataProvider(IVaultsDataProvider _vaultsData) external; function setFeeDistributor(IFeeDistributor _feeDistributor) external; function controller() external view returns (IAccessController); function config() external view returns (IConfigProvider); function core() external view returns (IVaultsCore); function stablex() external view returns (ISTABLEX); function ratesManager() external view returns (IRatesManager); function priceFeed() external view returns (IPriceFeed); function liquidationManager() external view returns (ILiquidationManager); function vaultsData() external view returns (IVaultsDataProvider); function feeDistributor() external view returns (IFeeDistributor); } // interface IConfigProviderV1 { struct CollateralConfig { address collateralType; uint256 debtLimit; uint256 minCollateralRatio; uint256 borrowRate; uint256 originationFee; } event CollateralUpdated( address indexed collateralType, uint256 debtLimit, uint256 minCollateralRatio, uint256 borrowRate, uint256 originationFee ); event CollateralRemoved(address indexed collateralType); function setCollateralConfig( address _collateralType, uint256 _debtLimit, uint256 _minCollateralRatio, uint256 _borrowRate, uint256 _originationFee ) external; function removeCollateral(address _collateralType) external; function setCollateralDebtLimit(address _collateralType, uint256 _debtLimit) external; function setCollateralMinCollateralRatio(address _collateralType, uint256 _minCollateralRatio) external; function setCollateralBorrowRate(address _collateralType, uint256 _borrowRate) external; function setCollateralOriginationFee(address _collateralType, uint256 _originationFee) external; function setLiquidationBonus(uint256 _bonus) external; function a() external view returns (IAddressProviderV1); function collateralConfigs(uint256 _id) external view returns (CollateralConfig memory); function collateralIds(address _collateralType) external view returns (uint256); function numCollateralConfigs() external view returns (uint256); function liquidationBonus() external view returns (uint256); function collateralDebtLimit(address _collateralType) external view returns (uint256); function collateralMinCollateralRatio(address _collateralType) external view returns (uint256); function collateralBorrowRate(address _collateralType) external view returns (uint256); function collateralOriginationFee(address _collateralType) external view returns (uint256); } // interface ILiquidationManagerV1 { function a() external view returns (IAddressProviderV1); function calculateHealthFactor( address _collateralType, uint256 _collateralValue, uint256 _vaultDebt ) external view returns (uint256 healthFactor); function liquidationBonus(uint256 _amount) external view returns (uint256 bonus); function applyLiquidationDiscount(uint256 _amount) external view returns (uint256 discountedAmount); function isHealthy( address _collateralType, uint256 _collateralValue, uint256 _vaultDebt ) external view returns (bool); } // interface IVaultsCoreV1 { event Opened(uint256 indexed vaultId, address indexed collateralType, address indexed owner); event Deposited(uint256 indexed vaultId, uint256 amount, address indexed sender); event Withdrawn(uint256 indexed vaultId, uint256 amount, address indexed sender); event Borrowed(uint256 indexed vaultId, uint256 amount, address indexed sender); event Repaid(uint256 indexed vaultId, uint256 amount, address indexed sender); event Liquidated( uint256 indexed vaultId, uint256 debtRepaid, uint256 collateralLiquidated, address indexed owner, address indexed sender ); event CumulativeRateUpdated(address indexed collateralType, uint256 elapsedTime, uint256 newCumulativeRate); //cumulative interest rate from deployment time T0 event InsurancePaid(uint256 indexed vaultId, uint256 insuranceAmount, address indexed sender); function deposit(address _collateralType, uint256 _amount) external; function withdraw(uint256 _vaultId, uint256 _amount) external; function withdrawAll(uint256 _vaultId) external; function borrow(uint256 _vaultId, uint256 _amount) external; function repayAll(uint256 _vaultId) external; function repay(uint256 _vaultId, uint256 _amount) external; function liquidate(uint256 _vaultId) external; //Refresh function initializeRates(address _collateralType) external; function refresh() external; function refreshCollateral(address collateralType) external; //upgrade function upgrade(address _newVaultsCore) external; //Read only function a() external view returns (IAddressProviderV1); function availableIncome() external view returns (uint256); function cumulativeRates(address _collateralType) external view returns (uint256); function lastRefresh(address _collateralType) external view returns (uint256); } // interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256 wad) external; } // interface IGovernorAlpha { /// @notice Possible states that a proposal may be in enum ProposalState { Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed } struct Proposal { // Unique id for looking up a proposal uint256 id; // Creator of the proposal address proposer; // The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; // the ordered list of target addresses for calls to be made address[] targets; // The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint256[] values; // The ordered list of function signatures to be called string[] signatures; // The ordered list of calldata to be passed to each call bytes[] calldatas; // The timestamp at which voting begins: holders must delegate their votes prior to this timestamp uint256 startTime; // The timestamp at which voting ends: votes must be cast prior to this timestamp uint endTime; // Current number of votes in favor of this proposal uint256 forVotes; // Current number of votes in opposition to this proposal uint256 againstVotes; // Flag marking whether the proposal has been canceled bool canceled; // Flag marking whether the proposal has been executed bool executed; // Receipts of ballots for the entire set of voters mapping (address => Receipt) receipts; } /// @notice Ballot receipt record for a voter struct Receipt { // Whether or not a vote has been cast bool hasVoted; // Whether or not the voter supports the proposal bool support; // The number of votes the voter had, which were cast uint votes; } /// @notice An event emitted when a new proposal is created event ProposalCreated(uint256 id, address proposer, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, uint startTime, uint endTime, string description); /// @notice An event emitted when a vote has been cast on a proposal event VoteCast(address voter, uint256 proposalId, bool support, uint256 votes); /// @notice An event emitted when a proposal has been canceled event ProposalCanceled(uint256 id); /// @notice An event emitted when a proposal has been queued in the Timelock event ProposalQueued(uint256 id, uint256 eta); /// @notice An event emitted when a proposal has been executed in the Timelock event ProposalExecuted(uint256 id); function propose(address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description, uint256 endTime) external returns (uint); function queue(uint256 proposalId) external; function execute(uint256 proposalId) external payable; function cancel(uint256 proposalId) external; function castVote(uint256 proposalId, bool support) external; function getActions(uint256 proposalId) external view returns (address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas); function getReceipt(uint256 proposalId, address voter) external view returns (Receipt memory); function state(uint proposalId) external view returns (ProposalState); function quorumVotes() external view returns (uint256); function proposalThreshold() external view returns (uint256); } // interface ITimelock { event NewAdmin(address indexed newAdmin); event NewPendingAdmin(address indexed newPendingAdmin); event NewDelay(uint256 indexed newDelay); event CancelTransaction( bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta ); event ExecuteTransaction( bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta ); event QueueTransaction( bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta ); function acceptAdmin() external; function queueTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external returns (bytes32); function cancelTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external; function executeTransaction( address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta ) external payable returns (bytes memory); function delay() external view returns (uint256); function GRACE_PERIOD() external view returns (uint256); function queuedTransactions(bytes32 hash) external view returns (bool); } // interface IVotingEscrow { enum LockAction { CREATE_LOCK, INCREASE_LOCK_AMOUNT, INCREASE_LOCK_TIME } struct LockedBalance { uint256 amount; uint256 end; } /** Shared Events */ event Deposit(address indexed provider, uint256 value, uint256 locktime, LockAction indexed action, uint256 ts); event Withdraw(address indexed provider, uint256 value, uint256 ts); event Expired(); function createLock(uint256 _value, uint256 _unlockTime) external; function increaseLockAmount(uint256 _value) external; function increaseLockLength(uint256 _unlockTime) external; function withdraw() external; function expireContract() external; function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint256); function balanceOf(address _owner) external view returns (uint256); function balanceOfAt(address _owner, uint256 _blockTime) external view returns (uint256); function stakingToken() external view returns (IERC20); } // interface IMIMO is IERC20 { function burn(address account, uint256 amount) external; function mint(address account, uint256 amount) external; } // interface ISupplyMiner { function baseDebtChanged(address user, uint256 newBaseDebt) external; } // interface IDebtNotifier { function debtChanged(uint256 _vaultId) external; function setCollateralSupplyMiner(address collateral, ISupplyMiner supplyMiner) external; function a() external view returns (IGovernanceAddressProvider); function collateralSupplyMinerMapping(address collateral) external view returns (ISupplyMiner); } // interface IGovernanceAddressProvider { function setParallelAddressProvider(IAddressProvider _parallel) external; function setMIMO(IMIMO _mimo) external; function setDebtNotifier(IDebtNotifier _debtNotifier) external; function setGovernorAlpha(IGovernorAlpha _governorAlpha) external; function setTimelock(ITimelock _timelock) external; function setVotingEscrow(IVotingEscrow _votingEscrow) external; function controller() external view returns (IAccessController); function parallel() external view returns (IAddressProvider); function mimo() external view returns (IMIMO); function debtNotifier() external view returns (IDebtNotifier); function governorAlpha() external view returns (IGovernorAlpha); function timelock() external view returns (ITimelock); function votingEscrow() external view returns (IVotingEscrow); } // interface IVaultsCore { event Opened(uint256 indexed vaultId, address indexed collateralType, address indexed owner); event Deposited(uint256 indexed vaultId, uint256 amount, address indexed sender); event Withdrawn(uint256 indexed vaultId, uint256 amount, address indexed sender); event Borrowed(uint256 indexed vaultId, uint256 amount, address indexed sender); event Repaid(uint256 indexed vaultId, uint256 amount, address indexed sender); event Liquidated( uint256 indexed vaultId, uint256 debtRepaid, uint256 collateralLiquidated, address indexed owner, address indexed sender ); event InsurancePaid(uint256 indexed vaultId, uint256 insuranceAmount, address indexed sender); function deposit(address _collateralType, uint256 _amount) external; function depositETH() external payable; function depositByVaultId(uint256 _vaultId, uint256 _amount) external; function depositETHByVaultId(uint256 _vaultId) external payable; function depositAndBorrow( address _collateralType, uint256 _depositAmount, uint256 _borrowAmount ) external; function depositETHAndBorrow(uint256 _borrowAmount) external payable; function withdraw(uint256 _vaultId, uint256 _amount) external; function withdrawETH(uint256 _vaultId, uint256 _amount) external; function borrow(uint256 _vaultId, uint256 _amount) external; function repayAll(uint256 _vaultId) external; function repay(uint256 _vaultId, uint256 _amount) external; function liquidate(uint256 _vaultId) external; function liquidatePartial(uint256 _vaultId, uint256 _amount) external; function upgrade(address payable _newVaultsCore) external; function acceptUpgrade(address payable _oldVaultsCore) external; function setDebtNotifier(IDebtNotifier _debtNotifier) external; //Read only function a() external view returns (IAddressProvider); function WETH() external view returns (IWETH); function debtNotifier() external view returns (IDebtNotifier); function state() external view returns (IVaultsCoreState); function cumulativeRates(address _collateralType) external view returns (uint256); } // interface IAddressProviderV1 { function setAccessController(IAccessController _controller) external; function setConfigProvider(IConfigProviderV1 _config) external; function setVaultsCore(IVaultsCoreV1 _core) external; function setStableX(ISTABLEX _stablex) external; function setRatesManager(IRatesManager _ratesManager) external; function setPriceFeed(IPriceFeed _priceFeed) external; function setLiquidationManager(ILiquidationManagerV1 _liquidationManager) external; function setVaultsDataProvider(IVaultsDataProvider _vaultsData) external; function setFeeDistributor(IFeeDistributor _feeDistributor) external; function controller() external view returns (IAccessController); function config() external view returns (IConfigProviderV1); function core() external view returns (IVaultsCoreV1); function stablex() external view returns (ISTABLEX); function ratesManager() external view returns (IRatesManager); function priceFeed() external view returns (IPriceFeed); function liquidationManager() external view returns (ILiquidationManagerV1); function vaultsData() external view returns (IVaultsDataProvider); function feeDistributor() external view returns (IFeeDistributor); } // interface IVaultsCoreState { event CumulativeRateUpdated(address indexed collateralType, uint256 elapsedTime, uint256 newCumulativeRate); //cumulative interest rate from deployment time T0 function initializeRates(address _collateralType) external; function refresh() external; function refreshCollateral(address collateralType) external; function syncState(IVaultsCoreState _stateAddress) external; function syncStateFromV1(IVaultsCoreV1 _core) external; //Read only function a() external view returns (IAddressProvider); function availableIncome() external view returns (uint256); function cumulativeRates(address _collateralType) external view returns (uint256); function lastRefresh(address _collateralType) external view returns (uint256); function synced() external view returns (bool); } // contract VaultsCore is IVaultsCore, ReentrancyGuard { using SafeERC20 for IERC20; using SafeMath for uint256; using WadRayMath for uint256; uint256 internal constant _MAX_INT = 2**256 - 1; IAddressProvider public override a; IWETH public override WETH; IVaultsCoreState public override state; IDebtNotifier public override debtNotifier; modifier onlyManager() { require(a.controller().hasRole(a.controller().MANAGER_ROLE(), msg.sender)); _; } modifier onlyVaultOwner(uint256 _vaultId) { require(a.vaultsData().vaultOwner(_vaultId) == msg.sender); _; } constructor( IAddressProvider _addresses, IWETH _IWETH, IVaultsCoreState _vaultsCoreState ) public { require(address(_addresses) != address(0)); require(address(_IWETH) != address(0)); require(address(_vaultsCoreState) != address(0)); a = _addresses; WETH = _IWETH; state = _vaultsCoreState; } // For a contract to receive ETH, it needs to have a payable fallback function // https://ethereum.stackexchange.com/a/47415 receive() external payable { require(msg.sender == address(WETH)); } /* Allow smooth upgrading of the vaultscore. @dev this function approves token transfers to the new vaultscore of both stablex and all configured collateral types @param _newVaultsCore address of the new vaultscore */ function upgrade(address payable _newVaultsCore) public override onlyManager { require(address(_newVaultsCore) != address(0)); require(a.stablex().approve(_newVaultsCore, _MAX_INT)); for (uint256 i = 1; i <= a.config().numCollateralConfigs(); i++) { address collateralType = a.config().collateralConfigs(i).collateralType; IERC20 asset = IERC20(collateralType); asset.safeApprove(_newVaultsCore, _MAX_INT); } } /* Allow smooth upgrading of the VaultsCore. @dev this function transfers both PAR and all configured collateral types to the new vaultscore. */ function acceptUpgrade(address payable _oldVaultsCore) public override onlyManager { IERC20 stableX = IERC20(a.stablex()); stableX.safeTransferFrom(_oldVaultsCore, address(this), stableX.balanceOf(_oldVaultsCore)); for (uint256 i = 1; i <= a.config().numCollateralConfigs(); i++) { address collateralType = a.config().collateralConfigs(i).collateralType; IERC20 asset = IERC20(collateralType); asset.safeTransferFrom(_oldVaultsCore, address(this), asset.balanceOf(_oldVaultsCore)); } } /** Configure the debt notifier. @param _debtNotifier the new DebtNotifier module address. **/ function setDebtNotifier(IDebtNotifier _debtNotifier) public override onlyManager { require(address(_debtNotifier) != address(0)); debtNotifier = _debtNotifier; } /** Deposit an ERC20 token into the vault of the msg.sender as collateral @dev A new vault is created if no vault exists for the `msg.sender` with the specified collateral type. this function uses `transferFrom()` and requires pre-approval via `approve()` on the ERC20. @param _collateralType the address of the collateral type to be deposited @param _amount the amount of tokens to be deposited in WEI. **/ function deposit(address _collateralType, uint256 _amount) public override { require(a.config().collateralIds(_collateralType) != 0); IERC20 asset = IERC20(_collateralType); asset.safeTransferFrom(msg.sender, address(this), _amount); _addCollateralToVault(_collateralType, _amount); } /** Wraps ETH and deposits WETH into the vault of the msg.sender as collateral @dev A new vault is created if no WETH vault exists **/ function depositETH() public payable override { WETH.deposit{ value: msg.value }(); _addCollateralToVault(address(WETH), msg.value); } /** Deposit an ERC20 token into the specified vault as collateral @dev this function uses `transferFrom()` and requires pre-approval via `approve()` on the ERC20. @param _vaultId the address of the collateral type to be deposited @param _amount the amount of tokens to be deposited in WEI. **/ function depositByVaultId(uint256 _vaultId, uint256 _amount) public override { IVaultsDataProvider.Vault memory v = a.vaultsData().vaults(_vaultId); require(v.collateralType != address(0)); IERC20 asset = IERC20(v.collateralType); asset.safeTransferFrom(msg.sender, address(this), _amount); _addCollateralToVaultById(_vaultId, _amount); } /** Wraps ETH and deposits WETH into the specified vault as collateral @dev this function uses `transferFrom()` and requires pre-approval via `approve()` on the ERC20. @param _vaultId the address of the collateral type to be deposited **/ function depositETHByVaultId(uint256 _vaultId) public payable override { IVaultsDataProvider.Vault memory v = a.vaultsData().vaults(_vaultId); require(v.collateralType == address(WETH)); WETH.deposit{ value: msg.value }(); _addCollateralToVaultById(_vaultId, msg.value); } /** Deposit an ERC20 token into the vault of the msg.sender as collateral and borrows the specified amount of tokens in WEI @dev see deposit() and borrow() @param _collateralType the address of the collateral type to be deposited @param _depositAmount the amount of tokens to be deposited in WEI. @param _borrowAmount the amount of borrowed StableX tokens in WEI. **/ function depositAndBorrow( address _collateralType, uint256 _depositAmount, uint256 _borrowAmount ) public override { deposit(_collateralType, _depositAmount); uint256 vaultId = a.vaultsData().vaultId(_collateralType, msg.sender); borrow(vaultId, _borrowAmount); } /** Wraps ETH and deposits WETH into the vault of the msg.sender as collateral and borrows the specified amount of tokens in WEI @dev see depositETH() and borrow() @param _borrowAmount the amount of borrowed StableX tokens in WEI. **/ function depositETHAndBorrow(uint256 _borrowAmount) public payable override { depositETH(); uint256 vaultId = a.vaultsData().vaultId(address(WETH), msg.sender); borrow(vaultId, _borrowAmount); } function _addCollateralToVault(address _collateralType, uint256 _amount) internal { uint256 vaultId = a.vaultsData().vaultId(_collateralType, msg.sender); if (vaultId == 0) { vaultId = a.vaultsData().createVault(_collateralType, msg.sender); } _addCollateralToVaultById(vaultId, _amount); } function _addCollateralToVaultById(uint256 _vaultId, uint256 _amount) internal { IVaultsDataProvider.Vault memory v = a.vaultsData().vaults(_vaultId); a.vaultsData().setCollateralBalance(_vaultId, v.collateralBalance.add(_amount)); emit Deposited(_vaultId, _amount, msg.sender); } /** Withdraws ERC20 tokens from a vault. @dev Only the owner of a vault can withdraw collateral from it. `withdraw()` will fail if it would bring the vault below the minimum collateralization treshold. @param _vaultId the ID of the vault from which to withdraw the collateral. @param _amount the amount of ERC20 tokens to be withdrawn in WEI. **/ function withdraw(uint256 _vaultId, uint256 _amount) public override onlyVaultOwner(_vaultId) nonReentrant { _removeCollateralFromVault(_vaultId, _amount); IVaultsDataProvider.Vault memory v = a.vaultsData().vaults(_vaultId); IERC20 asset = IERC20(v.collateralType); asset.safeTransfer(msg.sender, _amount); } /** Withdraws ETH from a WETH vault. @dev Only the owner of a vault can withdraw collateral from it. `withdraw()` will fail if it would bring the vault below the minimum collateralization treshold. @param _vaultId the ID of the vault from which to withdraw the collateral. @param _amount the amount of ETH to be withdrawn in WEI. **/ function withdrawETH(uint256 _vaultId, uint256 _amount) public override onlyVaultOwner(_vaultId) nonReentrant { _removeCollateralFromVault(_vaultId, _amount); IVaultsDataProvider.Vault memory v = a.vaultsData().vaults(_vaultId); require(v.collateralType == address(WETH)); WETH.withdraw(_amount); msg.sender.transfer(_amount); } function _removeCollateralFromVault(uint256 _vaultId, uint256 _amount) internal { IVaultsDataProvider.Vault memory v = a.vaultsData().vaults(_vaultId); require(_amount <= v.collateralBalance); uint256 newCollateralBalance = v.collateralBalance.sub(_amount); a.vaultsData().setCollateralBalance(_vaultId, newCollateralBalance); if (v.baseDebt > 0) { // Save gas cost when withdrawing from 0 debt vault state.refreshCollateral(v.collateralType); uint256 newCollateralValue = a.priceFeed().convertFrom(v.collateralType, newCollateralBalance); require( a.liquidationManager().isHealthy( newCollateralValue, a.vaultsData().vaultDebt(_vaultId), a.config().collateralConfigs(a.config().collateralIds(v.collateralType)).minCollateralRatio ) ); } emit Withdrawn(_vaultId, _amount, msg.sender); } /** Borrow new PAR tokens from a vault. @dev Only the owner of a vault can borrow from it. `borrow()` will update the outstanding vault debt to the current time before attempting the withdrawal. `borrow()` will fail if it would bring the vault below the minimum collateralization treshold. @param _vaultId the ID of the vault from which to borrow. @param _amount the amount of borrowed PAR tokens in WEI. **/ function borrow(uint256 _vaultId, uint256 _amount) public override onlyVaultOwner(_vaultId) nonReentrant { IVaultsDataProvider.Vault memory v = a.vaultsData().vaults(_vaultId); // Make sure current rate is up to date state.refreshCollateral(v.collateralType); uint256 originationFeePercentage = a.config().collateralOriginationFee(v.collateralType); uint256 newDebt = _amount; if (originationFeePercentage > 0) { newDebt = newDebt.add(_amount.wadMul(originationFeePercentage)); } // Increment vault borrow balance uint256 newBaseDebt = a.ratesManager().calculateBaseDebt(newDebt, cumulativeRates(v.collateralType)); a.vaultsData().setBaseDebt(_vaultId, v.baseDebt.add(newBaseDebt)); uint256 collateralValue = a.priceFeed().convertFrom(v.collateralType, v.collateralBalance); uint256 newVaultDebt = a.vaultsData().vaultDebt(_vaultId); require(a.vaultsData().collateralDebt(v.collateralType) <= a.config().collateralDebtLimit(v.collateralType)); bool isHealthy = a.liquidationManager().isHealthy( collateralValue, newVaultDebt, a.config().collateralConfigs(a.config().collateralIds(v.collateralType)).minCollateralRatio ); require(isHealthy); a.stablex().mint(msg.sender, _amount); debtNotifier.debtChanged(_vaultId); emit Borrowed(_vaultId, _amount, msg.sender); } /** Convenience function to repay all debt of a vault @dev `repayAll()` will update the outstanding vault debt to the current time. @param _vaultId the ID of the vault for which to repay the debt. **/ function repayAll(uint256 _vaultId) public override { repay(_vaultId, _MAX_INT); } /** Repay an outstanding PAR balance to a vault. @dev `repay()` will update the outstanding vault debt to the current time. @param _vaultId the ID of the vault for which to repay the outstanding debt balance. @param _amount the amount of PAR tokens in WEI to be repaid. **/ function repay(uint256 _vaultId, uint256 _amount) public override nonReentrant { address collateralType = a.vaultsData().vaultCollateralType(_vaultId); // Make sure current rate is up to date state.refreshCollateral(collateralType); uint256 currentVaultDebt = a.vaultsData().vaultDebt(_vaultId); // Decrement vault borrow balance if (_amount >= currentVaultDebt) { //full repayment _amount = currentVaultDebt; //only pay back what's outstanding } _reduceVaultDebt(_vaultId, _amount); a.stablex().burn(msg.sender, _amount); debtNotifier.debtChanged(_vaultId); emit Repaid(_vaultId, _amount, msg.sender); } /** Internal helper function to reduce the debt of a vault. @dev assumes cumulative rates for the vault's collateral type are up to date. please call `refreshCollateral()` before calling this function. @param _vaultId the ID of the vault for which to reduce the debt. @param _amount the amount of debt to be reduced. **/ function _reduceVaultDebt(uint256 _vaultId, uint256 _amount) internal { address collateralType = a.vaultsData().vaultCollateralType(_vaultId); uint256 currentVaultDebt = a.vaultsData().vaultDebt(_vaultId); uint256 remainder = currentVaultDebt.sub(_amount); uint256 cumulativeRate = cumulativeRates(collateralType); if (remainder == 0) { a.vaultsData().setBaseDebt(_vaultId, 0); } else { uint256 newBaseDebt = a.ratesManager().calculateBaseDebt(remainder, cumulativeRate); a.vaultsData().setBaseDebt(_vaultId, newBaseDebt); } } /** Liquidate a vault that is below the liquidation treshold by repaying its outstanding debt. @dev `liquidate()` will update the outstanding vault debt to the current time and pay a `liquidationBonus` to the liquidator. `liquidate()` can be called by anyone. @param _vaultId the ID of the vault to be liquidated. **/ function liquidate(uint256 _vaultId) public override { liquidatePartial(_vaultId, _MAX_INT); } /** Liquidate a vault partially that is below the liquidation treshold by repaying part of its outstanding debt. @dev `liquidatePartial()` will update the outstanding vault debt to the current time and pay a `liquidationBonus` to the liquidator. A LiquidationFee will be applied to the borrower during the liquidation. This means that the change in outstanding debt can be smaller than the repaid amount. `liquidatePartial()` can be called by anyone. @param _vaultId the ID of the vault to be liquidated. @param _amount the amount of debt+liquidationFee to repay. **/ function liquidatePartial(uint256 _vaultId, uint256 _amount) public override nonReentrant { IVaultsDataProvider.Vault memory v = a.vaultsData().vaults(_vaultId); state.refreshCollateral(v.collateralType); uint256 collateralValue = a.priceFeed().convertFrom(v.collateralType, v.collateralBalance); uint256 currentVaultDebt = a.vaultsData().vaultDebt(_vaultId); require( !a.liquidationManager().isHealthy( collateralValue, currentVaultDebt, a.config().collateralConfigs(a.config().collateralIds(v.collateralType)).liquidationRatio ) ); uint256 repaymentAfterLiquidationFeeRatio = WadRayMath.wad().sub( a.config().collateralLiquidationFee(v.collateralType) ); uint256 maxLiquiditionCost = currentVaultDebt.wadDiv(repaymentAfterLiquidationFeeRatio); uint256 repayAmount; if (_amount > maxLiquiditionCost) { _amount = maxLiquiditionCost; repayAmount = currentVaultDebt; } else { repayAmount = _amount.wadMul(repaymentAfterLiquidationFeeRatio); } // collateral value to be received by the liquidator is based on the total amount repaid (including the liquidationFee). uint256 collateralValueToReceive = _amount.add(a.liquidationManager().liquidationBonus(v.collateralType, _amount)); uint256 insuranceAmount = 0; if (collateralValueToReceive >= collateralValue) { // Not enough collateral for debt & liquidation fee collateralValueToReceive = collateralValue; uint256 discountedCollateralValue = a.liquidationManager().applyLiquidationDiscount( v.collateralType, collateralValue ); if (currentVaultDebt > discountedCollateralValue) { // Not enough collateral for debt alone insuranceAmount = currentVaultDebt.sub(discountedCollateralValue); require(a.stablex().balanceOf(address(this)) >= insuranceAmount); a.stablex().burn(address(this), insuranceAmount); // Insurance uses local reserves to pay down debt emit InsurancePaid(_vaultId, insuranceAmount, msg.sender); } repayAmount = currentVaultDebt.sub(insuranceAmount); _amount = discountedCollateralValue; } // reduce the vault debt by repayAmount _reduceVaultDebt(_vaultId, repayAmount.add(insuranceAmount)); a.stablex().burn(msg.sender, _amount); // send the claimed collateral to the liquidator uint256 collateralToReceive = a.priceFeed().convertTo(v.collateralType, collateralValueToReceive); a.vaultsData().setCollateralBalance(_vaultId, v.collateralBalance.sub(collateralToReceive)); IERC20 asset = IERC20(v.collateralType); asset.safeTransfer(msg.sender, collateralToReceive); debtNotifier.debtChanged(_vaultId); emit Liquidated(_vaultId, repayAmount, collateralToReceive, v.owner, msg.sender); } /** Returns the cumulativeRate of a collateral type. This function exists for backwards compatibility with the VaultsDataProvider. @param _collateralType the address of the collateral type. **/ function cumulativeRates(address _collateralType) public view override returns (uint256) { return state.cumulativeRates(_collateralType); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
[{"inputs":[{"internalType":"contract IAddressProvider","name":"_addresses","type":"address"},{"internalType":"contract IWETH","name":"_IWETH","type":"address"},{"internalType":"contract IVaultsCoreState","name":"_vaultsCoreState","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"Borrowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"insuranceAmount","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"InsurancePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtRepaid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralLiquidated","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"Liquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collateralType","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"Opened","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"Repaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"a","outputs":[{"internalType":"contract IAddressProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_oldVaultsCore","type":"address"}],"name":"acceptUpgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralType","type":"address"}],"name":"cumulativeRates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtNotifier","outputs":[{"internalType":"contract IDebtNotifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralType","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralType","type":"address"},{"internalType":"uint256","name":"_depositAmount","type":"uint256"},{"internalType":"uint256","name":"_borrowAmount","type":"uint256"}],"name":"depositAndBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositByVaultId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_borrowAmount","type":"uint256"}],"name":"depositETHAndBorrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"depositETHByVaultId","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"liquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"liquidatePartial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"}],"name":"repayAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IDebtNotifier","name":"_debtNotifier","type":"address"}],"name":"setDebtNotifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"state","outputs":[{"internalType":"contract IVaultsCoreState","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newVaultsCore","type":"address"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vaultId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005d3c38038062005d3c8339810160408190526200003491620000b8565b60016000556001600160a01b0383166200004d57600080fd5b6001600160a01b0382166200006157600080fd5b6001600160a01b0381166200007557600080fd5b600180546001600160a01b039485166001600160a01b03199182161790915560028054938516938216939093179092556003805491909316911617905562000124565b600080600060608486031215620000cd578283fd5b8351620000da816200010b565b6020850151909350620000ed816200010b565b604085015190925062000100816200010b565b809150509250925092565b6001600160a01b03811681146200012157600080fd5b50565b615c0880620001346000396000f3fe60806040526004361061012e5760003560e01c806385d36cd7116100ab578063c7cdea371161006f578063c7cdea371461031b578063ce2810411461033b578063cfc1b4191461035b578063d18343f31461037b578063d8aed1451461038e578063f6326fb3146103ae5761014c565b806385d36cd71461028f578063a1789085146102bc578063ad5c4648146102dc578063bd1b7146146102f1578063c19d93fb146103065761014c565b8063415f1240116100f2578063415f1240146101fc578063441a3e701461021c57806347e7ef241461023c5780634b9698661461025c57806357f256e31461027c5761014c565b80630900f010146101515780630dbe671f146101715780630ecbcdab1461019c5780631e6b6267146101bc5780633221be54146101dc5761014c565b3661014c576002546001600160a01b0316331461014a57600080fd5b005b600080fd5b34801561015d57600080fd5b5061014a61016c3660046156fc565b6103b6565b34801561017d57600080fd5b506101866108fa565b6040516101939190615902565b60405180910390f35b3480156101a857600080fd5b5061014a6101b73660046158c5565b610909565b3480156101c857600080fd5b5061014a6101d73660046158c5565b6117c0565b3480156101e857600080fd5b5061014a6101f73660046158ad565b61282e565b34801561020857600080fd5b5061014a6102173660046158ad565b61283d565b34801561022857600080fd5b5061014a6102373660046158c5565b612849565b34801561024857600080fd5b5061014a610257366004615734565b612ac8565b34801561026857600080fd5b5061014a6102773660046156fc565b612bf7565b61014a61028a3660046158ad565b612e2d565b34801561029b57600080fd5b506102af6102aa3660046156fc565b612f41565b6040516101939190615b3d565b3480156102c857600080fd5b5061014a6102d736600461575f565b612fc8565b3480156102e857600080fd5b506101866130de565b3480156102fd57600080fd5b506101866130ed565b34801561031257600080fd5b506101866130fc565b34801561032757600080fd5b5061014a6103363660046158c5565b61310b565b34801561034757600080fd5b5061014a6103563660046158c5565b613413565b34801561036757600080fd5b5061014a6103763660046156fc565b613554565b61014a6103893660046158ad565b613aa3565b34801561039a57600080fd5b5061014a6103a93660046158c5565b613c3e565b61014a614070565b600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561040457600080fd5b505afa158015610418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043c9190615718565b6001600160a01b03166391d14854600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561049857600080fd5b505afa1580156104ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d09190615718565b6001600160a01b031663ec87621c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050857600080fd5b505afa15801561051c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054091906157b3565b336040518363ffffffff1660e01b815260040161055e92919061596d565b60206040518083038186803b15801561057657600080fd5b505afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190615793565b6105b757600080fd5b6001600160a01b0381166105ca57600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561061857600080fd5b505afa15801561062c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106509190615718565b6001600160a01b031663095ea7b3826000196040518363ffffffff1660e01b815260040161067f929190615916565b602060405180830381600087803b15801561069957600080fd5b505af11580156106ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d19190615793565b6106da57600080fd5b60015b600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b15801561072b57600080fd5b505afa15801561073f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107639190615718565b6001600160a01b031663d47e470d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561079b57600080fd5b505afa1580156107af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d391906157b3565b81116108f657600154604080516379502c5560e01b815290516000926001600160a01b0316916379502c55916004808301926020929190829003018186803b15801561081e57600080fd5b505afa158015610832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108569190615718565b6001600160a01b0316634a6e0dd0836040518263ffffffff1660e01b81526004016108819190615b3d565b6101006040518083038186803b15801561089a57600080fd5b505afa1580156108ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d291906157cb565b519050806108ec6001600160a01b038216856000196140f3565b50506001016106dd565b5050565b6001546001600160a01b031681565b81336001600160a01b0316600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099a9190615718565b6001600160a01b0316633c2ecfe5836040518263ffffffff1660e01b81526004016109c59190615b3d565b60206040518083038186803b1580156109dd57600080fd5b505afa1580156109f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a159190615718565b6001600160a01b031614610a2857600080fd5b60026000541415610a545760405162461bcd60e51b8152600401610a4b90615ab0565b60405180910390fd5b6002600055610a616156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015610aaf57600080fd5b505afa158015610ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae79190615718565b6001600160a01b0316638c64ea4a856040518263ffffffff1660e01b8152600401610b129190615b3d565b60a06040518083038186803b158015610b2a57600080fd5b505afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b629190615848565b600354815160405163fe042ceb60e01b81529293506001600160a01b039091169163fe042ceb91610b9591600401615902565b600060405180830381600087803b158015610baf57600080fd5b505af1158015610bc3573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1757600080fd5b505afa158015610c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4f9190615718565b8251604051631775a5f760e21b81526001600160a01b039290921691635dd697dc91610c7d91600401615902565b60206040518083038186803b158015610c9557600080fd5b505afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd91906157b3565b9050838115610ced57610cea610ce386846141ed565b8290614224565b90505b6001546040805163b8091c5b60e01b815290516000926001600160a01b03169163b8091c5b916004808301926020929190829003018186803b158015610d3257600080fd5b505afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6a9190615718565b6001600160a01b0316633a282c0a83610d868760000151612f41565b6040518363ffffffff1660e01b8152600401610da3929190615b46565b60206040518083038186803b158015610dbb57600080fd5b505afa158015610dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df391906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4357600080fd5b505afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7b9190615718565b6001600160a01b031663ef18fcb488610ea184886060015161422490919063ffffffff16565b6040518363ffffffff1660e01b8152600401610ebe929190615b46565b600060405180830381600087803b158015610ed857600080fd5b505af1158015610eec573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4057600080fd5b505afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190615718565b6001600160a01b031663724091e0866000015187604001516040518363ffffffff1660e01b8152600401610fad929190615916565b60206040518083038186803b158015610fc557600080fd5b505afa158015610fd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd91906157b3565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561104f57600080fd5b505afa158015611063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110879190615718565b6001600160a01b031663d310f49b8a6040518263ffffffff1660e01b81526004016110b29190615b3d565b60206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110291906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b15801561115257600080fd5b505afa158015611166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a9190615718565b8651604051638a98b12d60e01b81526001600160a01b039290921691638a98b12d916111b891600401615902565b60206040518083038186803b1580156111d057600080fd5b505afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120891906157b3565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561125657600080fd5b505afa15801561126a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128e9190615718565b87516040516309552ee360e11b81526001600160a01b0392909216916312aa5dc6916112bc91600401615902565b60206040518083038186803b1580156112d457600080fd5b505afa1580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c91906157b3565b111561131757600080fd5b600154604080516307bce81360e21b815290516000926001600160a01b031691631ef3a04c916004808301926020929190829003018186803b15801561135c57600080fd5b505afa158015611370573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113949190615718565b6001600160a01b0316630e84c2b38484600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f257600080fd5b505afa158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a9190615718565b6001600160a01b0316634a6e0dd0600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b15801561148657600080fd5b505afa15801561149a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be9190615718565b8d5160405163db67c4d560e01b81526001600160a01b03929092169163db67c4d5916114ec91600401615902565b60206040518083038186803b15801561150457600080fd5b505afa158015611518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153c91906157b3565b6040518263ffffffff1660e01b81526004016115589190615b3d565b6101006040518083038186803b15801561157157600080fd5b505afa158015611585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a991906157cb565b606001516040518463ffffffff1660e01b81526004016115cb93929190615b54565b60206040518083038186803b1580156115e357600080fd5b505afa1580156115f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161b9190615793565b90508061162757600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561167557600080fd5b505afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190615718565b6001600160a01b03166340c10f19338b6040518363ffffffff1660e01b81526004016116da929190615916565b600060405180830381600087803b1580156116f457600080fd5b505af1158015611708573d6000803e3d6000fd5b505060048054604051631d3fa1c760e31b81526001600160a01b03909116935063e9fd0e38925061173b918e9101615b3d565b600060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b50505050336001600160a01b03168a7feaf3bd02ad76e4b07064f7a219cd7722f0124fcc8b391721b63bc069aa4cbeb88b6040516117a79190615b3d565b60405180910390a3505060016000555050505050505050565b600260005414156117e35760405162461bcd60e51b8152600401610a4b90615ab0565b60026000556117f06156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561183e57600080fd5b505afa158015611852573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118769190615718565b6001600160a01b0316638c64ea4a846040518263ffffffff1660e01b81526004016118a19190615b3d565b60a06040518083038186803b1580156118b957600080fd5b505afa1580156118cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f19190615848565b600354815160405163fe042ceb60e01b81529293506001600160a01b039091169163fe042ceb9161192491600401615902565b600060405180830381600087803b15801561193e57600080fd5b505af1158015611952573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119a657600080fd5b505afa1580156119ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119de9190615718565b6001600160a01b031663724091e0836000015184604001516040518363ffffffff1660e01b8152600401611a13929190615916565b60206040518083038186803b158015611a2b57600080fd5b505afa158015611a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6391906157b3565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab557600080fd5b505afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed9190615718565b6001600160a01b031663d310f49b866040518263ffffffff1660e01b8152600401611b189190615b3d565b60206040518083038186803b158015611b3057600080fd5b505afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6891906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b0316631ef3a04c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bb857600080fd5b505afa158015611bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf09190615718565b6001600160a01b0316630e84c2b38383600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015611c4e57600080fd5b505afa158015611c62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c869190615718565b6001600160a01b0316634a6e0dd0600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce257600080fd5b505afa158015611cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1a9190615718565b895160405163db67c4d560e01b81526001600160a01b03929092169163db67c4d591611d4891600401615902565b60206040518083038186803b158015611d6057600080fd5b505afa158015611d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9891906157b3565b6040518263ffffffff1660e01b8152600401611db49190615b3d565b6101006040518083038186803b158015611dcd57600080fd5b505afa158015611de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0591906157cb565b604001516040518463ffffffff1660e01b8152600401611e2793929190615b54565b60206040518083038186803b158015611e3f57600080fd5b505afa158015611e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e779190615793565b15611e8157600080fd5b6000611f98600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015611ed457600080fd5b505afa158015611ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0c9190615718565b8551604051637df10f2360e01b81526001600160a01b039290921691637df10f2391611f3a91600401615902565b60206040518083038186803b158015611f5257600080fd5b505afa158015611f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8a91906157b3565b611f92614249565b90614255565b90506000611fa68383614297565b9050600081871115611fbc575094508482611fc9565b611fc687846141ed565b90505b60006120db600160009054906101000a90046001600160a01b03166001600160a01b0316631ef3a04c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561201c57600080fd5b505afa158015612030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120549190615718565b8851604051630f81b64f60e31b81526001600160a01b039290921691637c0db27891612084918d90600401615916565b60206040518083038186803b15801561209c57600080fd5b505afa1580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d491906157b3565b8990614224565b9050600086821061244157600154604080516307bce81360e21b815290518994506000926001600160a01b031691631ef3a04c916004808301926020929190829003018186803b15801561212e57600080fd5b505afa158015612142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121669190615718565b8951604051636b075c8d60e11b81526001600160a01b03929092169163d60eb91a91612196918c90600401615916565b60206040518083038186803b1580156121ae57600080fd5b505afa1580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e691906157b3565b905080871115612431576121fa8782614255565b915081600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561224b57600080fd5b505afa15801561225f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122839190615718565b6001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016122ae9190615902565b60206040518083038186803b1580156122c657600080fd5b505afa1580156122da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fe91906157b3565b101561230957600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561235757600080fd5b505afa15801561236b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238f9190615718565b6001600160a01b0316639dc29fac30846040518363ffffffff1660e01b81526004016123bc929190615916565b600060405180830381600087803b1580156123d657600080fd5b505af11580156123ea573d6000803e3d6000fd5b50505050336001600160a01b03168b7fee59f0ab11beb3caf57d8bff0a6295df41b8a08d3adcabc7840e70ad1e4c9c57846040516124289190615b3d565b60405180910390a35b61243b8783614255565b90995092505b6124548a61244f8584614224565b6142c5565b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124da9190615718565b6001600160a01b0316639dc29fac338b6040518363ffffffff1660e01b8152600401612507929190615916565b600060405180830381600087803b15801561252157600080fd5b505af1158015612535573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561258957600080fd5b505afa15801561259d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c19190615718565b8951604051639bfa518160e01b81526001600160a01b039290921691639bfa5181916125f1918790600401615916565b60206040518083038186803b15801561260957600080fd5b505afa15801561261d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264191906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561269157600080fd5b505afa1580156126a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c99190615718565b6001600160a01b031663c7eb222b8c6126ef848d6040015161425590919063ffffffff16565b6040518363ffffffff1660e01b815260040161270c929190615b46565b600060405180830381600087803b15801561272657600080fd5b505af115801561273a573d6000803e3d6000fd5b50508a51915061275690506001600160a01b03821633846147ba565b600460009054906101000a90046001600160a01b03166001600160a01b031663e9fd0e388d6040518263ffffffff1660e01b81526004016127979190615b3d565b600060405180830381600087803b1580156127b157600080fd5b505af11580156127c5573d6000803e3d6000fd5b50505050336001600160a01b03168a602001516001600160a01b03168d7faba5d629ca14a7d184b55def9058e247debfb64f6ccebd9782b8c9c65307ccb08886604051612813929190615b46565b60405180910390a45050600160005550505050505050505050565b61283a81600019613c3e565b50565b61283a816000196117c0565b81336001600160a01b0316600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b1580156128a257600080fd5b505afa1580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da9190615718565b6001600160a01b0316633c2ecfe5836040518263ffffffff1660e01b81526004016129059190615b3d565b60206040518083038186803b15801561291d57600080fd5b505afa158015612931573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129559190615718565b6001600160a01b03161461296857600080fd5b6002600054141561298b5760405162461bcd60e51b8152600401610a4b90615ab0565b600260005561299a83836147d9565b6129a26156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b1580156129f057600080fd5b505afa158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190615718565b6001600160a01b0316638c64ea4a856040518263ffffffff1660e01b8152600401612a539190615b3d565b60a06040518083038186803b158015612a6b57600080fd5b505afa158015612a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa39190615848565b8051909150612abc6001600160a01b03821633866147ba565b50506001600055505050565b600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015612b1657600080fd5b505afa158015612b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4e9190615718565b6001600160a01b031663db67c4d5836040518263ffffffff1660e01b8152600401612b799190615902565b60206040518083038186803b158015612b9157600080fd5b505afa158015612ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc991906157b3565b612bd257600080fd5b81612be86001600160a01b038216333085614fc4565b612bf28383614fe5565b505050565b600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015612c4557600080fd5b505afa158015612c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7d9190615718565b6001600160a01b03166391d14854600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015612cd957600080fd5b505afa158015612ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d119190615718565b6001600160a01b031663ec87621c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d4957600080fd5b505afa158015612d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8191906157b3565b336040518363ffffffff1660e01b8152600401612d9f92919061596d565b60206040518083038186803b158015612db757600080fd5b505afa158015612dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612def9190615793565b612df857600080fd5b6001600160a01b038116612e0b57600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b612e35614070565b600154604080516365d5528760e01b815290516000926001600160a01b0316916365d55287916004808301926020929190829003018186803b158015612e7a57600080fd5b505afa158015612e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb29190615718565b60025460405163bd44815f60e01b81526001600160a01b039283169263bd44815f92612ee592911690339060040161592f565b60206040518083038186803b158015612efd57600080fd5b505afa158015612f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3591906157b3565b90506108f68183610909565b6003546040516385d36cd760e01b81526000916001600160a01b0316906385d36cd790612f72908590600401615902565b60206040518083038186803b158015612f8a57600080fd5b505afa158015612f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc291906157b3565b92915050565b612fd28383612ac8565b600154604080516365d5528760e01b815290516000926001600160a01b0316916365d55287916004808301926020929190829003018186803b15801561301757600080fd5b505afa15801561302b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061304f9190615718565b6001600160a01b031663bd44815f85336040518363ffffffff1660e01b815260040161307c92919061592f565b60206040518083038186803b15801561309457600080fd5b505afa1580156130a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130cc91906157b3565b90506130d88183610909565b50505050565b6002546001600160a01b031681565b6004546001600160a01b031681565b6003546001600160a01b031681565b81336001600160a01b0316600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561316457600080fd5b505afa158015613178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319c9190615718565b6001600160a01b0316633c2ecfe5836040518263ffffffff1660e01b81526004016131c79190615b3d565b60206040518083038186803b1580156131df57600080fd5b505afa1580156131f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132179190615718565b6001600160a01b03161461322a57600080fd5b6002600054141561324d5760405162461bcd60e51b8152600401610a4b90615ab0565b600260005561325c83836147d9565b6132646156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b1580156132b257600080fd5b505afa1580156132c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ea9190615718565b6001600160a01b0316638c64ea4a856040518263ffffffff1660e01b81526004016133159190615b3d565b60a06040518083038186803b15801561332d57600080fd5b505afa158015613341573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133659190615848565b60025481519192506001600160a01b0391821691161461338457600080fd5b600254604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d906133b4908690600401615b3d565b600060405180830381600087803b1580156133ce57600080fd5b505af11580156133e2573d6000803e3d6000fd5b505060405133925085156108fc02915085906000818181858888f19350505050158015612abc573d6000803e3d6000fd5b61341b6156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561346957600080fd5b505afa15801561347d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a19190615718565b6001600160a01b0316638c64ea4a846040518263ffffffff1660e01b81526004016134cc9190615b3d565b60a06040518083038186803b1580156134e457600080fd5b505afa1580156134f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061351c9190615848565b80519091506001600160a01b031661353357600080fd5b805161354a6001600160a01b038216333086614fc4565b6130d884846151f4565b600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156135a257600080fd5b505afa1580156135b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135da9190615718565b6001600160a01b03166391d14854600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561363657600080fd5b505afa15801561364a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366e9190615718565b6001600160a01b031663ec87621c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156136a657600080fd5b505afa1580156136ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136de91906157b3565b336040518363ffffffff1660e01b81526004016136fc92919061596d565b60206040518083038186803b15801561371457600080fd5b505afa158015613728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374c9190615793565b61375557600080fd5b600154604080516316d8a5a960e01b815290516000926001600160a01b0316916316d8a5a9916004808301926020929190829003018186803b15801561379a57600080fd5b505afa1580156137ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d29190615718565b90506138678230836001600160a01b03166370a08231866040518263ffffffff1660e01b81526004016138059190615902565b60206040518083038186803b15801561381d57600080fd5b505afa158015613831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385591906157b3565b6001600160a01b038516929190614fc4565b60015b600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b1580156138b857600080fd5b505afa1580156138cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f09190615718565b6001600160a01b031663d47e470d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561392857600080fd5b505afa15801561393c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396091906157b3565b8111612bf257600154604080516379502c5560e01b815290516000926001600160a01b0316916379502c55916004808301926020929190829003018186803b1580156139ab57600080fd5b505afa1580156139bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e39190615718565b6001600160a01b0316634a6e0dd0836040518263ffffffff1660e01b8152600401613a0e9190615b3d565b6101006040518083038186803b158015613a2757600080fd5b505afa158015613a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5f91906157cb565b516040516370a0823160e01b81529091508190613a9990869030906001600160a01b038516906370a0823190613805908590600401615902565b505060010161386a565b613aab6156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015613af957600080fd5b505afa158015613b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b319190615718565b6001600160a01b0316638c64ea4a836040518263ffffffff1660e01b8152600401613b5c9190615b3d565b60a06040518083038186803b158015613b7457600080fd5b505afa158015613b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bac9190615848565b60025481519192506001600160a01b03918216911614613bcb57600080fd5b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015613c1b57600080fd5b505af1158015613c2f573d6000803e3d6000fd5b50505050506108f682346151f4565b60026000541415613c615760405162461bcd60e51b8152600401610a4b90615ab0565b60026000908155600154604080516365d5528760e01b815290516001600160a01b03909216916365d5528791600480820192602092909190829003018186803b158015613cad57600080fd5b505afa158015613cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce59190615718565b6001600160a01b031663b508bc59846040518263ffffffff1660e01b8152600401613d109190615b3d565b60206040518083038186803b158015613d2857600080fd5b505afa158015613d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d609190615718565b60035460405163fe042ceb60e01b81529192506001600160a01b03169063fe042ceb90613d91908490600401615902565b600060405180830381600087803b158015613dab57600080fd5b505af1158015613dbf573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015613e1357600080fd5b505afa158015613e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e4b9190615718565b6001600160a01b031663d310f49b856040518263ffffffff1660e01b8152600401613e769190615b3d565b60206040518083038186803b158015613e8e57600080fd5b505afa158015613ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec691906157b3565b9050808310613ed3578092505b613edd84846142c5565b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b158015613f2b57600080fd5b505afa158015613f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f639190615718565b6001600160a01b0316639dc29fac33856040518363ffffffff1660e01b8152600401613f90929190615916565b600060405180830381600087803b158015613faa57600080fd5b505af1158015613fbe573d6000803e3d6000fd5b505060048054604051631d3fa1c760e31b81526001600160a01b03909116935063e9fd0e389250613ff191889101615b3d565b600060405180830381600087803b15801561400b57600080fd5b505af115801561401f573d6000803e3d6000fd5b50505050336001600160a01b0316847fec0b41ca9a2a301ec07412b3c841535558e6b49d98c606aeca50e85f164182f28560405161405d9190615b3d565b60405180910390a3505060016000555050565b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156140c057600080fd5b505af11580156140d4573d6000803e3d6000fd5b50506002546140f193506001600160a01b03169150349050614fe5565b565b80158061417b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90614129903090869060040161592f565b60206040518083038186803b15801561414157600080fd5b505afa158015614155573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061417991906157b3565b155b6141975760405162461bcd60e51b8152600401610a4b90615ae7565b612bf28363095ea7b360e01b84846040516024016141b6929190615916565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152615441565b600061421d670de0b6b3a764000061421761420886866154d0565b6706f05b59d3b2000090614224565b9061550a565b9392505050565b60008282018381101561421d5760405162461bcd60e51b8152600401610a4b906159b7565b670de0b6b3a764000090565b600061421d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061554c565b6000600282046142bd836142176142b687670de0b6b3a76400006154d0565b8490614224565b949350505050565b600154604080516365d5528760e01b815290516000926001600160a01b0316916365d55287916004808301926020929190829003018186803b15801561430a57600080fd5b505afa15801561431e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143429190615718565b6001600160a01b031663b508bc59846040518263ffffffff1660e01b815260040161436d9190615b3d565b60206040518083038186803b15801561438557600080fd5b505afa158015614399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143bd9190615718565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561440f57600080fd5b505afa158015614423573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144479190615718565b6001600160a01b031663d310f49b856040518263ffffffff1660e01b81526004016144729190615b3d565b60206040518083038186803b15801561448a57600080fd5b505afa15801561449e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c291906157b3565b905060006144d08285614255565b905060006144dd84612f41565b9050816145cf57600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061456a9190615718565b6001600160a01b031663ef18fcb48760006040518363ffffffff1660e01b8152600401614598929190615b46565b600060405180830381600087803b1580156145b257600080fd5b505af11580156145c6573d6000803e3d6000fd5b505050506147b2565b6001546040805163b8091c5b60e01b815290516000926001600160a01b03169163b8091c5b916004808301926020929190829003018186803b15801561461457600080fd5b505afa158015614628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061464c9190615718565b6001600160a01b0316633a282c0a84846040518363ffffffff1660e01b8152600401614679929190615b46565b60206040518083038186803b15801561469157600080fd5b505afa1580156146a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146c991906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561471957600080fd5b505afa15801561472d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147519190615718565b6001600160a01b031663ef18fcb488836040518363ffffffff1660e01b815260040161477e929190615b46565b600060405180830381600087803b15801561479857600080fd5b505af11580156147ac573d6000803e3d6000fd5b50505050505b505050505050565b612bf28363a9059cbb60e01b84846040516024016141b6929190615916565b6147e16156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561482f57600080fd5b505afa158015614843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148679190615718565b6001600160a01b0316638c64ea4a846040518263ffffffff1660e01b81526004016148929190615b3d565b60a06040518083038186803b1580156148aa57600080fd5b505afa1580156148be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148e29190615848565b905080604001518211156148f557600080fd5b60408101516000906149079084614255565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561495757600080fd5b505afa15801561496b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061498f9190615718565b6001600160a01b031663c7eb222b85836040518363ffffffff1660e01b81526004016149bc929190615b46565b600060405180830381600087803b1580156149d657600080fd5b505af11580156149ea573d6000803e3d6000fd5b50505050606082015115614f7c57600354825160405163fe042ceb60e01b81526001600160a01b039092169163fe042ceb91614a2891600401615902565b600060405180830381600087803b158015614a4257600080fd5b505af1158015614a56573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b158015614aaa57600080fd5b505afa158015614abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ae29190615718565b8351604051630392048f60e51b81526001600160a01b03929092169163724091e091614b12918690600401615916565b60206040518083038186803b158015614b2a57600080fd5b505afa158015614b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b6291906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b0316631ef3a04c6040518163ffffffff1660e01b815260040160206040518083038186803b158015614bb257600080fd5b505afa158015614bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bea9190615718565b6001600160a01b0316630e84c2b382600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015614c4757600080fd5b505afa158015614c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7f9190615718565b6001600160a01b031663d310f49b896040518263ffffffff1660e01b8152600401614caa9190615b3d565b60206040518083038186803b158015614cc257600080fd5b505afa158015614cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cfa91906157b3565b600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015614d4857600080fd5b505afa158015614d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d809190615718565b6001600160a01b0316634a6e0dd0600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015614ddc57600080fd5b505afa158015614df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e149190615718565b895160405163db67c4d560e01b81526001600160a01b03929092169163db67c4d591614e4291600401615902565b60206040518083038186803b158015614e5a57600080fd5b505afa158015614e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e9291906157b3565b6040518263ffffffff1660e01b8152600401614eae9190615b3d565b6101006040518083038186803b158015614ec757600080fd5b505afa158015614edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614eff91906157cb565b606001516040518463ffffffff1660e01b8152600401614f2193929190615b54565b60206040518083038186803b158015614f3957600080fd5b505afa158015614f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f719190615793565b614f7a57600080fd5b505b336001600160a01b0316847f02ffa641367f5b897c0f8be81bce51f2ef055b4113d7a1e4fd082feea749bf5285604051614fb69190615b3d565b60405180910390a350505050565b6130d8846323b872dd60e01b8585856040516024016141b693929190615949565b600154604080516365d5528760e01b815290516000926001600160a01b0316916365d55287916004808301926020929190829003018186803b15801561502a57600080fd5b505afa15801561503e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150629190615718565b6001600160a01b031663bd44815f84336040518363ffffffff1660e01b815260040161508f92919061592f565b60206040518083038186803b1580156150a757600080fd5b505afa1580156150bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150df91906157b3565b9050806151ee57600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561513457600080fd5b505afa158015615148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061516c9190615718565b6001600160a01b031663cc92d31c84336040518363ffffffff1660e01b815260040161519992919061592f565b602060405180830381600087803b1580156151b357600080fd5b505af11580156151c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151eb91906157b3565b90505b612bf281835b6151fc6156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561524a57600080fd5b505afa15801561525e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152829190615718565b6001600160a01b0316638c64ea4a846040518263ffffffff1660e01b81526004016152ad9190615b3d565b60a06040518083038186803b1580156152c557600080fd5b505afa1580156152d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152fd9190615848565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561534d57600080fd5b505afa158015615361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153859190615718565b6001600160a01b031663c7eb222b846153ab85856040015161422490919063ffffffff16565b6040518363ffffffff1660e01b81526004016153c8929190615b46565b600060405180830381600087803b1580156153e257600080fd5b505af11580156153f6573d6000803e3d6000fd5b50505050336001600160a01b0316837ffaddc2a572d923daf0944fe20bf804595e90ca57c85045b1081d338d1510bf14846040516154349190615b3d565b60405180910390a3505050565b6060615496826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166155789092919063ffffffff16565b805190915015612bf257808060200190518101906154b49190615793565b612bf25760405162461bcd60e51b8152600401610a4b90615a66565b6000826154df57506000612fc2565b828202828482816154ec57fe5b041461421d5760405162461bcd60e51b8152600401610a4b906159ee565b600061421d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615587565b600081848411156155705760405162461bcd60e51b8152600401610a4b9190615984565b505050900390565b60606142bd84846000856155be565b600081836155a85760405162461bcd60e51b8152600401610a4b9190615984565b5060008385816155b457fe5b0495945050505050565b60606155c985615682565b6155e55760405162461bcd60e51b8152600401610a4b90615a2f565b60006060866001600160a01b0316858760405161560291906158e6565b60006040518083038185875af1925050503d806000811461563f576040519150601f19603f3d011682016040523d82523d6000602084013e615644565b606091505b509150915081156156585791506142bd9050565b8051156156685780518082602001fd5b8360405162461bcd60e51b8152600401610a4b9190615984565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906142bd575050151592915050565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b60006020828403121561570d578081fd5b813561421d81615bbd565b600060208284031215615729578081fd5b815161421d81615bbd565b60008060408385031215615746578081fd5b823561575181615bbd565b946020939093013593505050565b600080600060608486031215615773578081fd5b833561577e81615bbd565b95602085013595506040909401359392505050565b6000602082840312156157a4578081fd5b8151801515811461421d578182fd5b6000602082840312156157c4578081fd5b5051919050565b60006101008083850312156157de578182fd5b6157e781615b6a565b905082516157f481615bbd565b808252506020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201528091505092915050565b600060a08284031215615859578081fd5b61586360a0615b6a565b825161586e81615bbd565b8152602083015161587e81615bbd565b806020830152506040830151604082015260608301516060820152608083015160808201528091505092915050565b6000602082840312156158be578081fd5b5035919050565b600080604083850312156158d7578182fd5b50508035926020909101359150565b600082516158f8818460208701615b91565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b9182526001600160a01b0316602082015260400190565b60006020825282518060208401526159a3816040850160208701615b91565b601f01601f19169190910160400192915050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715615b8957600080fd5b604052919050565b60005b83811015615bac578181015183820152602001615b94565b838111156130d85750506000910152565b6001600160a01b038116811461283a57600080fdfea2646970667358221220272d682c0fa0a0318048c8d2d5239e76060ecbf432ce8311989c062d303c4b5864736f6c634300060c00330000000000000000000000006fae125de41c03fa7d917ccfa17ba54ef4feb014000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000009a99a3911357f3f1934dc423956713e087ef6f25Deployed Bytecode
0x60806040526004361061012e5760003560e01c806385d36cd7116100ab578063c7cdea371161006f578063c7cdea371461031b578063ce2810411461033b578063cfc1b4191461035b578063d18343f31461037b578063d8aed1451461038e578063f6326fb3146103ae5761014c565b806385d36cd71461028f578063a1789085146102bc578063ad5c4648146102dc578063bd1b7146146102f1578063c19d93fb146103065761014c565b8063415f1240116100f2578063415f1240146101fc578063441a3e701461021c57806347e7ef241461023c5780634b9698661461025c57806357f256e31461027c5761014c565b80630900f010146101515780630dbe671f146101715780630ecbcdab1461019c5780631e6b6267146101bc5780633221be54146101dc5761014c565b3661014c576002546001600160a01b0316331461014a57600080fd5b005b600080fd5b34801561015d57600080fd5b5061014a61016c3660046156fc565b6103b6565b34801561017d57600080fd5b506101866108fa565b6040516101939190615902565b60405180910390f35b3480156101a857600080fd5b5061014a6101b73660046158c5565b610909565b3480156101c857600080fd5b5061014a6101d73660046158c5565b6117c0565b3480156101e857600080fd5b5061014a6101f73660046158ad565b61282e565b34801561020857600080fd5b5061014a6102173660046158ad565b61283d565b34801561022857600080fd5b5061014a6102373660046158c5565b612849565b34801561024857600080fd5b5061014a610257366004615734565b612ac8565b34801561026857600080fd5b5061014a6102773660046156fc565b612bf7565b61014a61028a3660046158ad565b612e2d565b34801561029b57600080fd5b506102af6102aa3660046156fc565b612f41565b6040516101939190615b3d565b3480156102c857600080fd5b5061014a6102d736600461575f565b612fc8565b3480156102e857600080fd5b506101866130de565b3480156102fd57600080fd5b506101866130ed565b34801561031257600080fd5b506101866130fc565b34801561032757600080fd5b5061014a6103363660046158c5565b61310b565b34801561034757600080fd5b5061014a6103563660046158c5565b613413565b34801561036757600080fd5b5061014a6103763660046156fc565b613554565b61014a6103893660046158ad565b613aa3565b34801561039a57600080fd5b5061014a6103a93660046158c5565b613c3e565b61014a614070565b600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561040457600080fd5b505afa158015610418573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043c9190615718565b6001600160a01b03166391d14854600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561049857600080fd5b505afa1580156104ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104d09190615718565b6001600160a01b031663ec87621c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050857600080fd5b505afa15801561051c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054091906157b3565b336040518363ffffffff1660e01b815260040161055e92919061596d565b60206040518083038186803b15801561057657600080fd5b505afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190615793565b6105b757600080fd5b6001600160a01b0381166105ca57600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561061857600080fd5b505afa15801561062c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106509190615718565b6001600160a01b031663095ea7b3826000196040518363ffffffff1660e01b815260040161067f929190615916565b602060405180830381600087803b15801561069957600080fd5b505af11580156106ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d19190615793565b6106da57600080fd5b60015b600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b15801561072b57600080fd5b505afa15801561073f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107639190615718565b6001600160a01b031663d47e470d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561079b57600080fd5b505afa1580156107af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d391906157b3565b81116108f657600154604080516379502c5560e01b815290516000926001600160a01b0316916379502c55916004808301926020929190829003018186803b15801561081e57600080fd5b505afa158015610832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108569190615718565b6001600160a01b0316634a6e0dd0836040518263ffffffff1660e01b81526004016108819190615b3d565b6101006040518083038186803b15801561089a57600080fd5b505afa1580156108ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d291906157cb565b519050806108ec6001600160a01b038216856000196140f3565b50506001016106dd565b5050565b6001546001600160a01b031681565b81336001600160a01b0316600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561096257600080fd5b505afa158015610976573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099a9190615718565b6001600160a01b0316633c2ecfe5836040518263ffffffff1660e01b81526004016109c59190615b3d565b60206040518083038186803b1580156109dd57600080fd5b505afa1580156109f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a159190615718565b6001600160a01b031614610a2857600080fd5b60026000541415610a545760405162461bcd60e51b8152600401610a4b90615ab0565b60405180910390fd5b6002600055610a616156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015610aaf57600080fd5b505afa158015610ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae79190615718565b6001600160a01b0316638c64ea4a856040518263ffffffff1660e01b8152600401610b129190615b3d565b60a06040518083038186803b158015610b2a57600080fd5b505afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b629190615848565b600354815160405163fe042ceb60e01b81529293506001600160a01b039091169163fe042ceb91610b9591600401615902565b600060405180830381600087803b158015610baf57600080fd5b505af1158015610bc3573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015610c1757600080fd5b505afa158015610c2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4f9190615718565b8251604051631775a5f760e21b81526001600160a01b039290921691635dd697dc91610c7d91600401615902565b60206040518083038186803b158015610c9557600080fd5b505afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd91906157b3565b9050838115610ced57610cea610ce386846141ed565b8290614224565b90505b6001546040805163b8091c5b60e01b815290516000926001600160a01b03169163b8091c5b916004808301926020929190829003018186803b158015610d3257600080fd5b505afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6a9190615718565b6001600160a01b0316633a282c0a83610d868760000151612f41565b6040518363ffffffff1660e01b8152600401610da3929190615b46565b60206040518083038186803b158015610dbb57600080fd5b505afa158015610dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df391906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015610e4357600080fd5b505afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7b9190615718565b6001600160a01b031663ef18fcb488610ea184886060015161422490919063ffffffff16565b6040518363ffffffff1660e01b8152600401610ebe929190615b46565b600060405180830381600087803b158015610ed857600080fd5b505af1158015610eec573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4057600080fd5b505afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190615718565b6001600160a01b031663724091e0866000015187604001516040518363ffffffff1660e01b8152600401610fad929190615916565b60206040518083038186803b158015610fc557600080fd5b505afa158015610fd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd91906157b3565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561104f57600080fd5b505afa158015611063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110879190615718565b6001600160a01b031663d310f49b8a6040518263ffffffff1660e01b81526004016110b29190615b3d565b60206040518083038186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110291906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b15801561115257600080fd5b505afa158015611166573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118a9190615718565b8651604051638a98b12d60e01b81526001600160a01b039290921691638a98b12d916111b891600401615902565b60206040518083038186803b1580156111d057600080fd5b505afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120891906157b3565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561125657600080fd5b505afa15801561126a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128e9190615718565b87516040516309552ee360e11b81526001600160a01b0392909216916312aa5dc6916112bc91600401615902565b60206040518083038186803b1580156112d457600080fd5b505afa1580156112e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130c91906157b3565b111561131757600080fd5b600154604080516307bce81360e21b815290516000926001600160a01b031691631ef3a04c916004808301926020929190829003018186803b15801561135c57600080fd5b505afa158015611370573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113949190615718565b6001600160a01b0316630e84c2b38484600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f257600080fd5b505afa158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a9190615718565b6001600160a01b0316634a6e0dd0600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b15801561148657600080fd5b505afa15801561149a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114be9190615718565b8d5160405163db67c4d560e01b81526001600160a01b03929092169163db67c4d5916114ec91600401615902565b60206040518083038186803b15801561150457600080fd5b505afa158015611518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153c91906157b3565b6040518263ffffffff1660e01b81526004016115589190615b3d565b6101006040518083038186803b15801561157157600080fd5b505afa158015611585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a991906157cb565b606001516040518463ffffffff1660e01b81526004016115cb93929190615b54565b60206040518083038186803b1580156115e357600080fd5b505afa1580156115f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161b9190615793565b90508061162757600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561167557600080fd5b505afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190615718565b6001600160a01b03166340c10f19338b6040518363ffffffff1660e01b81526004016116da929190615916565b600060405180830381600087803b1580156116f457600080fd5b505af1158015611708573d6000803e3d6000fd5b505060048054604051631d3fa1c760e31b81526001600160a01b03909116935063e9fd0e38925061173b918e9101615b3d565b600060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b50505050336001600160a01b03168a7feaf3bd02ad76e4b07064f7a219cd7722f0124fcc8b391721b63bc069aa4cbeb88b6040516117a79190615b3d565b60405180910390a3505060016000555050505050505050565b600260005414156117e35760405162461bcd60e51b8152600401610a4b90615ab0565b60026000556117f06156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561183e57600080fd5b505afa158015611852573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118769190615718565b6001600160a01b0316638c64ea4a846040518263ffffffff1660e01b81526004016118a19190615b3d565b60a06040518083038186803b1580156118b957600080fd5b505afa1580156118cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f19190615848565b600354815160405163fe042ceb60e01b81529293506001600160a01b039091169163fe042ceb9161192491600401615902565b600060405180830381600087803b15801561193e57600080fd5b505af1158015611952573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119a657600080fd5b505afa1580156119ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119de9190615718565b6001600160a01b031663724091e0836000015184604001516040518363ffffffff1660e01b8152600401611a13929190615916565b60206040518083038186803b158015611a2b57600080fd5b505afa158015611a3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6391906157b3565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab557600080fd5b505afa158015611ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aed9190615718565b6001600160a01b031663d310f49b866040518263ffffffff1660e01b8152600401611b189190615b3d565b60206040518083038186803b158015611b3057600080fd5b505afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6891906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b0316631ef3a04c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611bb857600080fd5b505afa158015611bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf09190615718565b6001600160a01b0316630e84c2b38383600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015611c4e57600080fd5b505afa158015611c62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c869190615718565b6001600160a01b0316634a6e0dd0600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce257600080fd5b505afa158015611cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1a9190615718565b895160405163db67c4d560e01b81526001600160a01b03929092169163db67c4d591611d4891600401615902565b60206040518083038186803b158015611d6057600080fd5b505afa158015611d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d9891906157b3565b6040518263ffffffff1660e01b8152600401611db49190615b3d565b6101006040518083038186803b158015611dcd57600080fd5b505afa158015611de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0591906157cb565b604001516040518463ffffffff1660e01b8152600401611e2793929190615b54565b60206040518083038186803b158015611e3f57600080fd5b505afa158015611e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e779190615793565b15611e8157600080fd5b6000611f98600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015611ed457600080fd5b505afa158015611ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0c9190615718565b8551604051637df10f2360e01b81526001600160a01b039290921691637df10f2391611f3a91600401615902565b60206040518083038186803b158015611f5257600080fd5b505afa158015611f66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8a91906157b3565b611f92614249565b90614255565b90506000611fa68383614297565b9050600081871115611fbc575094508482611fc9565b611fc687846141ed565b90505b60006120db600160009054906101000a90046001600160a01b03166001600160a01b0316631ef3a04c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561201c57600080fd5b505afa158015612030573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120549190615718565b8851604051630f81b64f60e31b81526001600160a01b039290921691637c0db27891612084918d90600401615916565b60206040518083038186803b15801561209c57600080fd5b505afa1580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d491906157b3565b8990614224565b9050600086821061244157600154604080516307bce81360e21b815290518994506000926001600160a01b031691631ef3a04c916004808301926020929190829003018186803b15801561212e57600080fd5b505afa158015612142573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121669190615718565b8951604051636b075c8d60e11b81526001600160a01b03929092169163d60eb91a91612196918c90600401615916565b60206040518083038186803b1580156121ae57600080fd5b505afa1580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e691906157b3565b905080871115612431576121fa8782614255565b915081600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561224b57600080fd5b505afa15801561225f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122839190615718565b6001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016122ae9190615902565b60206040518083038186803b1580156122c657600080fd5b505afa1580156122da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fe91906157b3565b101561230957600080fd5b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b15801561235757600080fd5b505afa15801561236b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238f9190615718565b6001600160a01b0316639dc29fac30846040518363ffffffff1660e01b81526004016123bc929190615916565b600060405180830381600087803b1580156123d657600080fd5b505af11580156123ea573d6000803e3d6000fd5b50505050336001600160a01b03168b7fee59f0ab11beb3caf57d8bff0a6295df41b8a08d3adcabc7840e70ad1e4c9c57846040516124289190615b3d565b60405180910390a35b61243b8783614255565b90995092505b6124548a61244f8584614224565b6142c5565b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124da9190615718565b6001600160a01b0316639dc29fac338b6040518363ffffffff1660e01b8152600401612507929190615916565b600060405180830381600087803b15801561252157600080fd5b505af1158015612535573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561258957600080fd5b505afa15801561259d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c19190615718565b8951604051639bfa518160e01b81526001600160a01b039290921691639bfa5181916125f1918790600401615916565b60206040518083038186803b15801561260957600080fd5b505afa15801561261d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264191906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561269157600080fd5b505afa1580156126a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c99190615718565b6001600160a01b031663c7eb222b8c6126ef848d6040015161425590919063ffffffff16565b6040518363ffffffff1660e01b815260040161270c929190615b46565b600060405180830381600087803b15801561272657600080fd5b505af115801561273a573d6000803e3d6000fd5b50508a51915061275690506001600160a01b03821633846147ba565b600460009054906101000a90046001600160a01b03166001600160a01b031663e9fd0e388d6040518263ffffffff1660e01b81526004016127979190615b3d565b600060405180830381600087803b1580156127b157600080fd5b505af11580156127c5573d6000803e3d6000fd5b50505050336001600160a01b03168a602001516001600160a01b03168d7faba5d629ca14a7d184b55def9058e247debfb64f6ccebd9782b8c9c65307ccb08886604051612813929190615b46565b60405180910390a45050600160005550505050505050505050565b61283a81600019613c3e565b50565b61283a816000196117c0565b81336001600160a01b0316600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b1580156128a257600080fd5b505afa1580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da9190615718565b6001600160a01b0316633c2ecfe5836040518263ffffffff1660e01b81526004016129059190615b3d565b60206040518083038186803b15801561291d57600080fd5b505afa158015612931573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129559190615718565b6001600160a01b03161461296857600080fd5b6002600054141561298b5760405162461bcd60e51b8152600401610a4b90615ab0565b600260005561299a83836147d9565b6129a26156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b1580156129f057600080fd5b505afa158015612a04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a289190615718565b6001600160a01b0316638c64ea4a856040518263ffffffff1660e01b8152600401612a539190615b3d565b60a06040518083038186803b158015612a6b57600080fd5b505afa158015612a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa39190615848565b8051909150612abc6001600160a01b03821633866147ba565b50506001600055505050565b600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015612b1657600080fd5b505afa158015612b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4e9190615718565b6001600160a01b031663db67c4d5836040518263ffffffff1660e01b8152600401612b799190615902565b60206040518083038186803b158015612b9157600080fd5b505afa158015612ba5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc991906157b3565b612bd257600080fd5b81612be86001600160a01b038216333085614fc4565b612bf28383614fe5565b505050565b600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015612c4557600080fd5b505afa158015612c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7d9190615718565b6001600160a01b03166391d14854600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b158015612cd957600080fd5b505afa158015612ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d119190615718565b6001600160a01b031663ec87621c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612d4957600080fd5b505afa158015612d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8191906157b3565b336040518363ffffffff1660e01b8152600401612d9f92919061596d565b60206040518083038186803b158015612db757600080fd5b505afa158015612dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612def9190615793565b612df857600080fd5b6001600160a01b038116612e0b57600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b612e35614070565b600154604080516365d5528760e01b815290516000926001600160a01b0316916365d55287916004808301926020929190829003018186803b158015612e7a57600080fd5b505afa158015612e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eb29190615718565b60025460405163bd44815f60e01b81526001600160a01b039283169263bd44815f92612ee592911690339060040161592f565b60206040518083038186803b158015612efd57600080fd5b505afa158015612f11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f3591906157b3565b90506108f68183610909565b6003546040516385d36cd760e01b81526000916001600160a01b0316906385d36cd790612f72908590600401615902565b60206040518083038186803b158015612f8a57600080fd5b505afa158015612f9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc291906157b3565b92915050565b612fd28383612ac8565b600154604080516365d5528760e01b815290516000926001600160a01b0316916365d55287916004808301926020929190829003018186803b15801561301757600080fd5b505afa15801561302b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061304f9190615718565b6001600160a01b031663bd44815f85336040518363ffffffff1660e01b815260040161307c92919061592f565b60206040518083038186803b15801561309457600080fd5b505afa1580156130a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130cc91906157b3565b90506130d88183610909565b50505050565b6002546001600160a01b031681565b6004546001600160a01b031681565b6003546001600160a01b031681565b81336001600160a01b0316600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561316457600080fd5b505afa158015613178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319c9190615718565b6001600160a01b0316633c2ecfe5836040518263ffffffff1660e01b81526004016131c79190615b3d565b60206040518083038186803b1580156131df57600080fd5b505afa1580156131f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132179190615718565b6001600160a01b03161461322a57600080fd5b6002600054141561324d5760405162461bcd60e51b8152600401610a4b90615ab0565b600260005561325c83836147d9565b6132646156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b1580156132b257600080fd5b505afa1580156132c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ea9190615718565b6001600160a01b0316638c64ea4a856040518263ffffffff1660e01b81526004016133159190615b3d565b60a06040518083038186803b15801561332d57600080fd5b505afa158015613341573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133659190615848565b60025481519192506001600160a01b0391821691161461338457600080fd5b600254604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d906133b4908690600401615b3d565b600060405180830381600087803b1580156133ce57600080fd5b505af11580156133e2573d6000803e3d6000fd5b505060405133925085156108fc02915085906000818181858888f19350505050158015612abc573d6000803e3d6000fd5b61341b6156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561346957600080fd5b505afa15801561347d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a19190615718565b6001600160a01b0316638c64ea4a846040518263ffffffff1660e01b81526004016134cc9190615b3d565b60a06040518083038186803b1580156134e457600080fd5b505afa1580156134f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061351c9190615848565b80519091506001600160a01b031661353357600080fd5b805161354a6001600160a01b038216333086614fc4565b6130d884846151f4565b600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b1580156135a257600080fd5b505afa1580156135b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135da9190615718565b6001600160a01b03166391d14854600160009054906101000a90046001600160a01b03166001600160a01b031663f77c47916040518163ffffffff1660e01b815260040160206040518083038186803b15801561363657600080fd5b505afa15801561364a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366e9190615718565b6001600160a01b031663ec87621c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156136a657600080fd5b505afa1580156136ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136de91906157b3565b336040518363ffffffff1660e01b81526004016136fc92919061596d565b60206040518083038186803b15801561371457600080fd5b505afa158015613728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374c9190615793565b61375557600080fd5b600154604080516316d8a5a960e01b815290516000926001600160a01b0316916316d8a5a9916004808301926020929190829003018186803b15801561379a57600080fd5b505afa1580156137ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d29190615718565b90506138678230836001600160a01b03166370a08231866040518263ffffffff1660e01b81526004016138059190615902565b60206040518083038186803b15801561381d57600080fd5b505afa158015613831573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385591906157b3565b6001600160a01b038516929190614fc4565b60015b600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b1580156138b857600080fd5b505afa1580156138cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f09190615718565b6001600160a01b031663d47e470d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561392857600080fd5b505afa15801561393c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396091906157b3565b8111612bf257600154604080516379502c5560e01b815290516000926001600160a01b0316916379502c55916004808301926020929190829003018186803b1580156139ab57600080fd5b505afa1580156139bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e39190615718565b6001600160a01b0316634a6e0dd0836040518263ffffffff1660e01b8152600401613a0e9190615b3d565b6101006040518083038186803b158015613a2757600080fd5b505afa158015613a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a5f91906157cb565b516040516370a0823160e01b81529091508190613a9990869030906001600160a01b038516906370a0823190613805908590600401615902565b505060010161386a565b613aab6156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015613af957600080fd5b505afa158015613b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b319190615718565b6001600160a01b0316638c64ea4a836040518263ffffffff1660e01b8152600401613b5c9190615b3d565b60a06040518083038186803b158015613b7457600080fd5b505afa158015613b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bac9190615848565b60025481519192506001600160a01b03918216911614613bcb57600080fd5b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015613c1b57600080fd5b505af1158015613c2f573d6000803e3d6000fd5b50505050506108f682346151f4565b60026000541415613c615760405162461bcd60e51b8152600401610a4b90615ab0565b60026000908155600154604080516365d5528760e01b815290516001600160a01b03909216916365d5528791600480820192602092909190829003018186803b158015613cad57600080fd5b505afa158015613cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ce59190615718565b6001600160a01b031663b508bc59846040518263ffffffff1660e01b8152600401613d109190615b3d565b60206040518083038186803b158015613d2857600080fd5b505afa158015613d3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d609190615718565b60035460405163fe042ceb60e01b81529192506001600160a01b03169063fe042ceb90613d91908490600401615902565b600060405180830381600087803b158015613dab57600080fd5b505af1158015613dbf573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015613e1357600080fd5b505afa158015613e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e4b9190615718565b6001600160a01b031663d310f49b856040518263ffffffff1660e01b8152600401613e769190615b3d565b60206040518083038186803b158015613e8e57600080fd5b505afa158015613ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec691906157b3565b9050808310613ed3578092505b613edd84846142c5565b600160009054906101000a90046001600160a01b03166001600160a01b03166316d8a5a96040518163ffffffff1660e01b815260040160206040518083038186803b158015613f2b57600080fd5b505afa158015613f3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f639190615718565b6001600160a01b0316639dc29fac33856040518363ffffffff1660e01b8152600401613f90929190615916565b600060405180830381600087803b158015613faa57600080fd5b505af1158015613fbe573d6000803e3d6000fd5b505060048054604051631d3fa1c760e31b81526001600160a01b03909116935063e9fd0e389250613ff191889101615b3d565b600060405180830381600087803b15801561400b57600080fd5b505af115801561401f573d6000803e3d6000fd5b50505050336001600160a01b0316847fec0b41ca9a2a301ec07412b3c841535558e6b49d98c606aeca50e85f164182f28560405161405d9190615b3d565b60405180910390a3505060016000555050565b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156140c057600080fd5b505af11580156140d4573d6000803e3d6000fd5b50506002546140f193506001600160a01b03169150349050614fe5565b565b80158061417b5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90614129903090869060040161592f565b60206040518083038186803b15801561414157600080fd5b505afa158015614155573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061417991906157b3565b155b6141975760405162461bcd60e51b8152600401610a4b90615ae7565b612bf28363095ea7b360e01b84846040516024016141b6929190615916565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152615441565b600061421d670de0b6b3a764000061421761420886866154d0565b6706f05b59d3b2000090614224565b9061550a565b9392505050565b60008282018381101561421d5760405162461bcd60e51b8152600401610a4b906159b7565b670de0b6b3a764000090565b600061421d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061554c565b6000600282046142bd836142176142b687670de0b6b3a76400006154d0565b8490614224565b949350505050565b600154604080516365d5528760e01b815290516000926001600160a01b0316916365d55287916004808301926020929190829003018186803b15801561430a57600080fd5b505afa15801561431e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143429190615718565b6001600160a01b031663b508bc59846040518263ffffffff1660e01b815260040161436d9190615b3d565b60206040518083038186803b15801561438557600080fd5b505afa158015614399573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143bd9190615718565b90506000600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561440f57600080fd5b505afa158015614423573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144479190615718565b6001600160a01b031663d310f49b856040518263ffffffff1660e01b81526004016144729190615b3d565b60206040518083038186803b15801561448a57600080fd5b505afa15801561449e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144c291906157b3565b905060006144d08285614255565b905060006144dd84612f41565b9050816145cf57600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561453257600080fd5b505afa158015614546573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061456a9190615718565b6001600160a01b031663ef18fcb48760006040518363ffffffff1660e01b8152600401614598929190615b46565b600060405180830381600087803b1580156145b257600080fd5b505af11580156145c6573d6000803e3d6000fd5b505050506147b2565b6001546040805163b8091c5b60e01b815290516000926001600160a01b03169163b8091c5b916004808301926020929190829003018186803b15801561461457600080fd5b505afa158015614628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061464c9190615718565b6001600160a01b0316633a282c0a84846040518363ffffffff1660e01b8152600401614679929190615b46565b60206040518083038186803b15801561469157600080fd5b505afa1580156146a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146c991906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561471957600080fd5b505afa15801561472d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147519190615718565b6001600160a01b031663ef18fcb488836040518363ffffffff1660e01b815260040161477e929190615b46565b600060405180830381600087803b15801561479857600080fd5b505af11580156147ac573d6000803e3d6000fd5b50505050505b505050505050565b612bf28363a9059cbb60e01b84846040516024016141b6929190615916565b6147e16156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561482f57600080fd5b505afa158015614843573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148679190615718565b6001600160a01b0316638c64ea4a846040518263ffffffff1660e01b81526004016148929190615b3d565b60a06040518083038186803b1580156148aa57600080fd5b505afa1580156148be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148e29190615848565b905080604001518211156148f557600080fd5b60408101516000906149079084614255565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561495757600080fd5b505afa15801561496b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061498f9190615718565b6001600160a01b031663c7eb222b85836040518363ffffffff1660e01b81526004016149bc929190615b46565b600060405180830381600087803b1580156149d657600080fd5b505af11580156149ea573d6000803e3d6000fd5b50505050606082015115614f7c57600354825160405163fe042ceb60e01b81526001600160a01b039092169163fe042ceb91614a2891600401615902565b600060405180830381600087803b158015614a4257600080fd5b505af1158015614a56573d6000803e3d6000fd5b505050506000600160009054906101000a90046001600160a01b03166001600160a01b031663741bef1a6040518163ffffffff1660e01b815260040160206040518083038186803b158015614aaa57600080fd5b505afa158015614abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ae29190615718565b8351604051630392048f60e51b81526001600160a01b03929092169163724091e091614b12918690600401615916565b60206040518083038186803b158015614b2a57600080fd5b505afa158015614b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b6291906157b3565b9050600160009054906101000a90046001600160a01b03166001600160a01b0316631ef3a04c6040518163ffffffff1660e01b815260040160206040518083038186803b158015614bb257600080fd5b505afa158015614bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bea9190615718565b6001600160a01b0316630e84c2b382600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b158015614c4757600080fd5b505afa158015614c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c7f9190615718565b6001600160a01b031663d310f49b896040518263ffffffff1660e01b8152600401614caa9190615b3d565b60206040518083038186803b158015614cc257600080fd5b505afa158015614cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cfa91906157b3565b600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015614d4857600080fd5b505afa158015614d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d809190615718565b6001600160a01b0316634a6e0dd0600160009054906101000a90046001600160a01b03166001600160a01b03166379502c556040518163ffffffff1660e01b815260040160206040518083038186803b158015614ddc57600080fd5b505afa158015614df0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e149190615718565b895160405163db67c4d560e01b81526001600160a01b03929092169163db67c4d591614e4291600401615902565b60206040518083038186803b158015614e5a57600080fd5b505afa158015614e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e9291906157b3565b6040518263ffffffff1660e01b8152600401614eae9190615b3d565b6101006040518083038186803b158015614ec757600080fd5b505afa158015614edb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614eff91906157cb565b606001516040518463ffffffff1660e01b8152600401614f2193929190615b54565b60206040518083038186803b158015614f3957600080fd5b505afa158015614f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f719190615793565b614f7a57600080fd5b505b336001600160a01b0316847f02ffa641367f5b897c0f8be81bce51f2ef055b4113d7a1e4fd082feea749bf5285604051614fb69190615b3d565b60405180910390a350505050565b6130d8846323b872dd60e01b8585856040516024016141b693929190615949565b600154604080516365d5528760e01b815290516000926001600160a01b0316916365d55287916004808301926020929190829003018186803b15801561502a57600080fd5b505afa15801561503e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150629190615718565b6001600160a01b031663bd44815f84336040518363ffffffff1660e01b815260040161508f92919061592f565b60206040518083038186803b1580156150a757600080fd5b505afa1580156150bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150df91906157b3565b9050806151ee57600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561513457600080fd5b505afa158015615148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061516c9190615718565b6001600160a01b031663cc92d31c84336040518363ffffffff1660e01b815260040161519992919061592f565b602060405180830381600087803b1580156151b357600080fd5b505af11580156151c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151eb91906157b3565b90505b612bf281835b6151fc6156bb565b600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561524a57600080fd5b505afa15801561525e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152829190615718565b6001600160a01b0316638c64ea4a846040518263ffffffff1660e01b81526004016152ad9190615b3d565b60a06040518083038186803b1580156152c557600080fd5b505afa1580156152d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152fd9190615848565b9050600160009054906101000a90046001600160a01b03166001600160a01b03166365d552876040518163ffffffff1660e01b815260040160206040518083038186803b15801561534d57600080fd5b505afa158015615361573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153859190615718565b6001600160a01b031663c7eb222b846153ab85856040015161422490919063ffffffff16565b6040518363ffffffff1660e01b81526004016153c8929190615b46565b600060405180830381600087803b1580156153e257600080fd5b505af11580156153f6573d6000803e3d6000fd5b50505050336001600160a01b0316837ffaddc2a572d923daf0944fe20bf804595e90ca57c85045b1081d338d1510bf14846040516154349190615b3d565b60405180910390a3505050565b6060615496826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166155789092919063ffffffff16565b805190915015612bf257808060200190518101906154b49190615793565b612bf25760405162461bcd60e51b8152600401610a4b90615a66565b6000826154df57506000612fc2565b828202828482816154ec57fe5b041461421d5760405162461bcd60e51b8152600401610a4b906159ee565b600061421d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250615587565b600081848411156155705760405162461bcd60e51b8152600401610a4b9190615984565b505050900390565b60606142bd84846000856155be565b600081836155a85760405162461bcd60e51b8152600401610a4b9190615984565b5060008385816155b457fe5b0495945050505050565b60606155c985615682565b6155e55760405162461bcd60e51b8152600401610a4b90615a2f565b60006060866001600160a01b0316858760405161560291906158e6565b60006040518083038185875af1925050503d806000811461563f576040519150601f19603f3d011682016040523d82523d6000602084013e615644565b606091505b509150915081156156585791506142bd9050565b8051156156685780518082602001fd5b8360405162461bcd60e51b8152600401610a4b9190615984565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906142bd575050151592915050565b6040518060a0016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081525090565b60006020828403121561570d578081fd5b813561421d81615bbd565b600060208284031215615729578081fd5b815161421d81615bbd565b60008060408385031215615746578081fd5b823561575181615bbd565b946020939093013593505050565b600080600060608486031215615773578081fd5b833561577e81615bbd565b95602085013595506040909401359392505050565b6000602082840312156157a4578081fd5b8151801515811461421d578182fd5b6000602082840312156157c4578081fd5b5051919050565b60006101008083850312156157de578182fd5b6157e781615b6a565b905082516157f481615bbd565b808252506020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201528091505092915050565b600060a08284031215615859578081fd5b61586360a0615b6a565b825161586e81615bbd565b8152602083015161587e81615bbd565b806020830152506040830151604082015260608301516060820152608083015160808201528091505092915050565b6000602082840312156158be578081fd5b5035919050565b600080604083850312156158d7578182fd5b50508035926020909101359150565b600082516158f8818460208701615b91565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b9182526001600160a01b0316602082015260400190565b60006020825282518060208401526159a3816040850160208701615b91565b601f01601f19169190910160400192915050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff81118282101715615b8957600080fd5b604052919050565b60005b83811015615bac578181015183820152602001615b94565b838111156130d85750506000910152565b6001600160a01b038116811461283a57600080fdfea2646970667358221220272d682c0fa0a0318048c8d2d5239e76060ecbf432ce8311989c062d303c4b5864736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006fae125de41c03fa7d917ccfa17ba54ef4feb014000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000009a99a3911357f3f1934dc423956713e087ef6f25
-----Decoded View---------------
Arg [0] : _addresses (address): 0x6fAE125De41C03fa7d917CCfa17Ba54eF4FEb014
Arg [1] : _IWETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _vaultsCoreState (address): 0x9A99a3911357F3f1934dc423956713E087eF6F25
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006fae125de41c03fa7d917ccfa17ba54ef4feb014
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 0000000000000000000000009a99a3911357f3f1934dc423956713e087ef6f25Loading...LoadingLoading...Loading
Loading...Loading
Loading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...LoadingLoading...Loading[ Download: CSV Export ][ Download: CSV Export ]A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addressesPrivate Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.Compiler specific version warnings:
The compiled contract might be susceptible to FullInlinerNonExpressionSplitArgumentEvaluationOrder (low-severity), MissingSideEffectsOnSelectorAccess (low-severity), AbiReencodingHeadOverflowWithStaticArrayCleanup (medium-severity), DirtyBytesArrayToStorage (low-severity), DataLocationChangeInInternalOverride (very low-severity), NestedCalldataArrayAbiReencodingSizeValidation (very low-severity), SignedImmutables (very low-severity), ABIDecodeTwoDimensionalArrayMemory (very low-severity), KeccakCaching (medium-severity), EmptyByteArrayCopy (medium-severity), DynamicArrayCleanup (medium-severity) Solidity Compiler Bugs.
Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Connect a Wallet
Connecting wallet for read function is optional, useful if you want to call certain functions or simply use your wallet's node.Address Cards
To use this feature, please login to your Etherscan account and return to this page.Before You Copy
This website uses cookies to improve your experience. By continuing to use this website, you agree to its Terms and Privacy Policy.