Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AToken
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-17 */ // SPDX-License-Identifier: agpl-3.0 pragma solidity ^0.8.0; 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); } 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'); } } library SafeERC20 { 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)); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { 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 callOptionalReturn(IERC20 token, bytes memory data) private { require(address(token).isContract(), 'SafeERC20: call to non-contract'); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, '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'); } } } interface ILendingPoolAddressesProvider { event MarketIdSet(string newMarketId); event LendingPoolUpdated(address indexed newAddress); event IncentiveControllerUpdated(address indexed newAddress); event IncentiveTokenUpdated(address indexed newAddress); event ConfigurationAdminUpdated(address indexed newAddress); event EmergencyAdminUpdated(address indexed newAddress); event LendingPoolConfiguratorUpdated(address indexed newAddress); event LendingPoolCollateralManagerUpdated(address indexed newAddress); event PriceOracleUpdated(address indexed newAddress); event LendingRateOracleUpdated(address indexed newAddress); event ProxyCreated(bytes32 id, address indexed newAddress); event AddressSet(bytes32 id, address indexed newAddress, bool hasProxy); function getMarketId() external view returns (string memory); function setMarketId(string calldata marketId) external payable; function setAddress(bytes32 id, address newAddress) external payable; function setAddressAsProxy(bytes32 id, address impl) external payable; function getAddress(bytes32 id) external view returns (address); function getLendingPool() external view returns (address); function setLendingPoolImpl(address pool) external payable; function getIncentiveController() external view returns (address); function setIncentiveControllerImpl(address incentiveController) external payable; function getIncentiveToken() external view returns (address); function setIncentiveTokenImpl(address incentiveToken) external payable; function getLendingPoolConfigurator() external view returns (address); function setLendingPoolConfiguratorImpl(address configurator) external payable; function getLendingPoolCollateralManager() external view returns (address); function setLendingPoolCollateralManager(address manager) external payable; function getPoolAdmin() external view returns (address); function setPoolAdmin(address admin) external payable; function getEmergencyAdmin() external view returns (address); function setEmergencyAdmin(address admin) external payable; function getPriceOracle() external view returns (address); function setPriceOracle(address priceOracle) external payable; function getLendingRateOracle() external view returns (address); function setLendingRateOracle(address lendingRateOracle) external payable; } library DataTypes { // refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties. struct ReserveData { //stores the reserve configuration ReserveConfigurationMap configuration; //the liquidity index. Expressed in ray uint128 liquidityIndex; //variable borrow index. Expressed in ray uint128 variableBorrowIndex; //the current supply rate. Expressed in ray uint128 currentLiquidityRate; //the current variable borrow rate. Expressed in ray uint128 currentVariableBorrowRate; //the current stable borrow rate. Expressed in ray uint128 currentStableBorrowRate; uint40 lastUpdateTimestamp; //tokens addresses address aTokenAddress; address stableDebtTokenAddress; address variableDebtTokenAddress; //address of the interest rate strategy address interestRateStrategyAddress; //address of the yield contract address yieldAddress; //the id of the reserve. Represents the position in the list of the active reserves uint8 id; } struct ReserveConfigurationMap { //bit 0-15: LTV //bit 16-31: Liq. threshold //bit 32-47: Liq. bonus //bit 48-55: Decimals //bit 56: Reserve is active //bit 57: reserve is frozen //bit 58: borrowing is enabled //bit 59: stable rate borrowing enabled //bit 60-63: reserved //bit 64-79: reserve factor uint256 data; } struct UserConfigurationMap { uint256 data; } enum InterestRateMode { NONE, STABLE, VARIABLE } } interface ILendingPool { /** * @dev Emitted on deposit() * @param reserve The address of the underlying asset of the reserve * @param user The address initiating the deposit * @param onBehalfOf The beneficiary of the deposit, receiving the aTokens * @param amount The amount deposited * @param referral The referral code used **/ event Deposit( address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, uint16 indexed referral ); /** * @dev Emitted on withdraw() * @param reserve The address of the underlyng asset being withdrawn * @param user The address initiating the withdrawal, owner of aTokens * @param to Address that will receive the underlying * @param amount The amount to be withdrawn **/ event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount); /** * @dev Emitted on borrow() and flashLoan() when debt needs to be opened * @param reserve The address of the underlying asset being borrowed * @param user The address of the user initiating the borrow(), receiving the funds on borrow() or just * initiator of the transaction on flashLoan() * @param onBehalfOf The address that will be getting the debt * @param amount The amount borrowed out * @param borrowRateMode The rate mode: 1 for Stable, 2 for Variable * @param borrowRate The numeric rate at which the user has borrowed * @param referral The referral code used **/ event Borrow( address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, uint256 borrowRateMode, uint256 borrowRate, uint16 indexed referral ); /** * @dev Emitted on repay() * @param reserve The address of the underlying asset of the reserve * @param user The beneficiary of the repayment, getting his debt reduced * @param repayer The address of the user initiating the repay(), providing the funds * @param amount The amount repaid **/ event Repay( address indexed reserve, address indexed user, address indexed repayer, uint256 amount ); /** * @dev Emitted on setUserUseReserveAsCollateral() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user enabling the usage as collateral **/ event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user); /** * @dev Emitted on setUserUseReserveAsCollateral() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user enabling the usage as collateral **/ event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user); /** * @dev Emitted on flashLoan() * @param target The address of the flash loan receiver contract * @param initiator The address initiating the flash loan * @param asset The address of the asset being flash borrowed * @param amount The amount flash borrowed * @param premium The fee flash borrowed * @param referralCode The referral code used **/ event FlashLoan( address indexed target, address indexed initiator, address indexed asset, uint256 amount, uint256 premium, uint16 referralCode ); /** * @dev Emitted when the pause is triggered. */ event Paused(); /** * @dev Emitted when the pause is lifted. */ event Unpaused(); /** * @dev Emitted when a borrower is liquidated. This event is emitted by the LendingPool via * LendingPoolCollateral manager using a DELEGATECALL * This allows to have the events in the generated ABI for LendingPool. * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation * @param user The address of the borrower getting liquidated * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover * @param liquidatedCollateralAmount The amount of collateral received by the liiquidator * @param liquidator The address of the liquidator * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants * to receive the underlying collateral asset directly **/ event LiquidationCall( address indexed collateralAsset, address indexed debtAsset, address indexed user, uint256 debtToCover, uint256 liquidatedCollateralAmount, address liquidator, bool receiveAToken ); /** * @dev Emitted when the state of a reserve is updated. NOTE: This event is actually declared * in the ReserveLogic library and emitted in the updateInterestRates() function. Since the function is internal, * the event will actually be fired by the LendingPool contract. The event is therefore replicated here so it * gets added to the LendingPool ABI * @param reserve The address of the underlying asset of the reserve * @param liquidityRate The new liquidity rate * @param stableBorrowRate The new stable borrow rate * @param variableBorrowRate The new variable borrow rate * @param liquidityIndex The new liquidity index * @param variableBorrowIndex The new variable borrow index **/ event ReserveDataUpdated( address indexed reserve, uint256 liquidityRate, uint256 stableBorrowRate, uint256 variableBorrowRate, uint256 liquidityIndex, uint256 variableBorrowIndex ); /** * @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. * - E.g. User deposits 100 USDC and gets in return 100 aUSDC * - Caller is anyone. * @param asset The address of the underlying asset to deposit * @param amount The amount to be deposited * @param onBehalfOf The address that will receive the aTokens, same as msg.sender if the user * wants to receive them on his own wallet, or a different address if the beneficiary of aTokens * is a different wallet * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man **/ function deposit( address asset, uint256 amount, address onBehalfOf, uint16 referralCode ) external; /** * @dev Deposits an `amount` of underlying asset into the reserve for supplier from vault * - Caller is only Vault which is registered in this contract * @param asset The address of the underlying asset to deposit * @param amount The amount to be deposited **/ function depositYield(address asset, uint256 amount) external; /** * @dev Grab an Yield `amount` of underlying asset into the vault * - Caller is only Vault which is registered in this contract * @param asset The address of the underlying asset to get yield * @param amount The yield amount **/ function getYield(address asset, uint256 amount) external; /** * @dev Get underlying asset and aToken's total balance * @param asset The address of the underlying asset **/ function getTotalBalanceOfAssetPair(address asset) external view returns (uint256, uint256); /** * @dev Get total underlying asset which is borrowable * and also list of underlying asset **/ function getBorrowingAssetAndVolumes() external view returns ( uint256, uint256[] memory, address[] memory, uint256 ); /** * @dev Register the vault address * - To check if the caller is vault for some functions * - Caller is only LendingPoolConfigurator * @param _vaultAddress The address of the Vault **/ function registerVault(address _vaultAddress) external payable; /** * @dev Unregister the vault address * - To check if the caller is vault for some functions * - Caller is only LendingPoolConfigurator * @param _vaultAddress The address of the Vault **/ function unregisterVault(address _vaultAddress) external payable; /** * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned * - E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC * - Caller is anyone * @param asset The address of the underlying asset to withdraw * @param amount The underlying amount to be withdrawn * - Send the value type(uint256).max in order to withdraw the whole aToken balance * @param to Address that will receive the underlying, same as msg.sender if the user * wants to receive it on his own wallet, or a different address if the beneficiary is a * different wallet * @return The final amount withdrawn **/ function withdraw( address asset, uint256 amount, address to ) external returns (uint256); /** * @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent aTokens owned * - E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC * - Caller is anyone * @param asset The address of the underlying asset to withdraw * @param amount The underlying amount to be withdrawn * - Send the value type(uint256).max in order to withdraw the whole aToken balance * @param from The address of user who is depositor of underlying asset * @param to Address that will receive the underlying, same as msg.sender if the user * wants to receive it on his own wallet, or a different address if the beneficiary is a * different wallet * @return The final amount withdrawn **/ function withdrawFrom( address asset, uint256 amount, address from, address to ) external returns (uint256); /** * @dev Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower * already deposited enough collateral, or he was given enough allowance by a credit delegator on the * corresponding debt token (StableDebtToken or VariableDebtToken) * - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet * and 100 stable/variable debt tokens, depending on the `interestRateMode` * - Caller is anyone * @param asset The address of the underlying asset to borrow * @param amount The amount to be borrowed * @param interestRateMode The interest rate mode at which the user wants to borrow: 1 for Stable, 2 for Variable * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man * @param onBehalfOf Address of the user who will receive the debt. Should be the address of the borrower itself * calling the function if he wants to borrow against his own collateral, or the address of the credit delegator * if he has been given credit delegation allowance **/ function borrow( address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf ) external; /** * @notice Repays a borrowed `amount` on a specific reserve, burning the equivalent debt tokens owned * - E.g. User repays 100 USDC, burning 100 variable/stable debt tokens of the `onBehalfOf` address * - Caller is anyone * @param asset The address of the borrowed underlying asset previously borrowed * @param amount The amount to repay * - Send the value type(uint256).max in order to repay the whole debt for `asset` on the specific `debtMode` * @param rateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable * @param onBehalfOf Address of the user who will get his debt reduced/removed. Should be the address of the * user calling the function if he wants to reduce/remove his own debt, or the address of any other * other borrower whose debt should be removed * @return The final amount repaid **/ function repay( address asset, uint256 amount, uint256 rateMode, address onBehalfOf ) external returns (uint256); /** * @dev Allows depositors to enable/disable a specific deposited asset as collateral * @param asset The address of the underlying asset deposited * @param useAsCollateral `true` if the user wants to use the deposit as collateral, `false` otherwise **/ function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; /** * @dev Function to liquidate a non-healthy position collateral-wise, with Health Factor below 1 * - The caller (liquidator) covers `debtToCover` amount of debt of the user getting liquidated, and receives * a proportionally amount of the `collateralAsset` plus a bonus to cover market risk * - Caller is anyone * @param collateralAsset The address of the underlying asset used as collateral, to receive as result of the liquidation * @param debtAsset The address of the underlying borrowed asset to be repaid with the liquidation * @param user The address of the borrower getting liquidated * @param debtToCover The debt amount of borrowed `asset` the liquidator wants to cover * @param receiveAToken `true` if the liquidators wants to receive the collateral aTokens, `false` if he wants * to receive the underlying collateral asset directly **/ function liquidationCall( address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken ) external; /** * @dev Returns the user account data across all the reserves * @param user The address of the user * @return totalCollateralETH the total collateral in ETH of the user * @return totalDebtETH the total debt in ETH of the user * @return availableBorrowsETH the borrowing power left of the user * @return currentLiquidationThreshold the liquidation threshold of the user * @return ltv the loan to value of the user * @return healthFactor the current health factor of the user **/ function getUserAccountData(address user) external view returns ( uint256 totalCollateralETH, uint256 totalDebtETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor ); /** * @dev Initializes a reserve, activating it, assigning an aToken and debt tokens and an * interest rate strategy * - Only callable by the LendingPoolConfigurator contract * - Caller is only LendingPoolConfigurator * @param reserve The address of the underlying asset of the reserve * @param yieldAddress The address of the underlying asset's yield contract of the reserve * @param aTokenAddress The address of the aToken that will be assigned to the reserve * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve * @param interestRateStrategyAddress The address of the interest rate strategy contract **/ function initReserve( address reserve, address yieldAddress, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress ) external payable; /** * @dev Updates the address of the interest rate strategy contract * - Caller is only LendingPoolConfigurator * @param reserve The address of the underlying asset of the reserve * @param rateStrategyAddress The address of the interest rate strategy contract **/ function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress) external payable; /** * @dev Sets the configuration bitmap of the reserve as a whole * - Caller is only LendingPoolConfigurator * @param reserve The address of the underlying asset of the reserve * @param configuration The new configuration bitmap **/ function setConfiguration(address reserve, uint256 configuration) external payable; /** * @dev Returns the configuration of the reserve * @param asset The address of the underlying asset of the reserve * @return The configuration of the reserve **/ function getConfiguration(address asset) external view returns (DataTypes.ReserveConfigurationMap memory); /** * @dev Returns the configuration of the user across all the reserves * @param user The user address * @return The configuration of the user **/ function getUserConfiguration(address user) external view returns (DataTypes.UserConfigurationMap memory); /** * @dev Returns the normalized income normalized income of the reserve * @param asset The address of the underlying asset of the reserve * @return The reserve's normalized income */ function getReserveNormalizedIncome(address asset) external view returns (uint256); /** * @dev Returns the normalized variable debt per unit of asset * @param asset The address of the underlying asset of the reserve * @return The reserve normalized variable debt */ function getReserveNormalizedVariableDebt(address asset) external view returns (uint256); /** * @dev Returns the state and configuration of the reserve * @param asset The address of the underlying asset of the reserve * @return The state of the reserve **/ function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); /** * @dev Validates and finalizes an aToken transfer * - Only callable by the overlying aToken of the `asset` * - Caller is only aToken contract which is storing the underlying asset of depositors * @param asset The address of the underlying asset of the aToken * @param from The user from which the aTokens are transferred * @param to The user receiving the aTokens * @param amount The amount being transferred/withdrawn * @param balanceFromAfter The aToken balance of the `from` user before the transfer * @param balanceToBefore The aToken balance of the `to` user before the transfer */ function finalizeTransfer( address asset, address from, address to, uint256 amount, uint256 balanceFromAfter, uint256 balanceToBefore ) external; /** * @dev Returns the list of the initialized reserves **/ function getReservesList() external view returns (address[] memory); /** * @dev Returns the cached LendingPoolAddressesProvider connected to this contract **/ function getAddressesProvider() external view returns (ILendingPoolAddressesProvider); /** * @dev Set the _pause state of a reserve * - Caller is only LendingPoolConfigurator * @param val `true` to pause the reserve, `false` to un-pause it */ function setPause(bool val) external payable; /** * @dev Returns if the LendingPool is paused */ function paused() external view returns (bool); } interface IScaledBalanceToken { /** * @dev Returns the scaled balance of the user. The scaled balance is the sum of all the * updated stored balance divided by the reserve's liquidity index at the moment of the update * @param user The user whose balance is calculated * @return The scaled balance of the user **/ function scaledBalanceOf(address user) external view returns (uint256); /** * @dev Returns the scaled balance of the user and the scaled total supply. * @param user The address of the user * @return The scaled balance of the user * @return The scaled balance and the scaled total supply **/ function getScaledUserBalanceAndSupply(address user) external view returns (uint256, uint256); /** * @dev Returns the scaled total supply of the variable debt token. Represents sum(debt/index) * @return The scaled total supply **/ function scaledTotalSupply() external view returns (uint256); } interface ISturdyIncentivesController { event RewardsAccrued(address indexed user, uint256 amount); event RewardsClaimed(address indexed user, address indexed to, uint256 amount); event RewardsClaimed( address indexed user, address indexed to, address indexed claimer, uint256 amount ); event ClaimerSet(address indexed user, address indexed claimer); /* * @dev Returns the configuration of the distribution for a certain asset * @param asset The address of the reference asset of the distribution * @return The asset index, the emission per second and the last updated timestamp **/ function getAssetData(address asset) external view returns ( uint256, uint256, uint256 ); /** * @dev Whitelists an address to claim the rewards on behalf of another address * @param user The address of the user * @param claimer The address of the claimer */ function setClaimer(address user, address claimer) external payable; /** * @dev Returns the whitelisted claimer for a certain address (0x0 if not set) * @param user The address of the user * @return The claimer address */ function getClaimer(address user) external view returns (address); /** * @dev Configure assets for a certain rewards emission * @param assets The assets to incentivize * @param emissionsPerSecond The emission for each asset */ function configureAssets(address[] calldata assets, uint256[] calldata emissionsPerSecond) external payable; /** * @dev Called by the corresponding asset on any update that affects the rewards distribution * @param user The address of the user * @param userBalance The balance of the user of the asset in the lending pool * @param totalSupply The total supply of the asset in the lending pool **/ function handleAction( address user, uint256 totalSupply, uint256 userBalance ) external; /** * @dev Returns the total of rewards of an user, already accrued + not yet accrued * @param user The address of the user * @return The rewards **/ function getRewardsBalance(address[] calldata assets, address user) external view returns (uint256); /** * @dev Claims reward for an user, on all the assets of the lending pool, accumulating the pending rewards * @param amount Amount of rewards to claim * @param to Address that will be receiving the rewards * @return Rewards claimed **/ function claimRewards( address[] calldata assets, uint256 amount, address to ) external returns (uint256); /** * @dev Claims reward for an user on behalf, on all the assets of the lending pool, accumulating the pending rewards. The caller must * be whitelisted via "allowClaimOnBehalf" function by the RewardsAdmin role manager * @param amount Amount of rewards to claim * @param user Address to check and claim rewards * @param to Address that will be receiving the rewards * @return Rewards claimed **/ function claimRewardsOnBehalf( address[] calldata assets, uint256 amount, address user, address to ) external returns (uint256); /** * @dev returns the unclaimed rewards of the user * @param user the address of the user * @return the unclaimed user rewards */ function getUserUnclaimedRewards(address user) external view returns (uint256); /** * @dev returns the unclaimed rewards of the user * @param user the address of the user * @param asset The asset to incentivize * @return the user index for the asset */ function getUserAssetData(address user, address asset) external view returns (uint256); /** * @dev for backward compatibility with previous implementation of the Incentives controller */ function REWARD_TOKEN() external view returns (address); /** * @dev for backward compatibility with previous implementation of the Incentives controller */ function PRECISION() external view returns (uint8); /** * @dev Gets the distribution end timestamp of the emissions */ function DISTRIBUTION_END() external view returns (uint256); } interface IInitializableAToken { /** * @dev Emitted when an aToken is initialized * @param underlyingAsset The address of the underlying asset * @param pool The address of the associated lending pool * @param treasury The address of the treasury * @param incentivesController The address of the incentives controller for this aToken * @param aTokenDecimals the decimals of the underlying * @param aTokenName the name of the aToken * @param aTokenSymbol the symbol of the aToken * @param params A set of encoded parameters for additional initialization **/ event Initialized( address indexed underlyingAsset, address indexed pool, address treasury, address incentivesController, uint8 aTokenDecimals, string aTokenName, string aTokenSymbol, bytes params ); /** * @dev Initializes the aToken * @param pool The address of the lending pool where this aToken will be used * @param treasury The address of the Sturdy treasury, receiving the fees on this aToken * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) * @param incentivesController The smart contract managing potential incentives distribution * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's * @param aTokenName The name of the aToken * @param aTokenSymbol The symbol of the aToken */ function initialize( ILendingPool pool, address treasury, address underlyingAsset, ISturdyIncentivesController incentivesController, uint8 aTokenDecimals, string calldata aTokenName, string calldata aTokenSymbol, bytes calldata params ) external; } interface IAToken is IERC20, IScaledBalanceToken, IInitializableAToken { /** * @dev Emitted after the mint action * @param from The address performing the mint * @param value The amount being * @param index The new liquidity index of the reserve **/ event Mint(address indexed from, uint256 value, uint256 index); /** * @dev Mints `amount` aTokens to `user` * @param user The address receiving the minted tokens * @param amount The amount of tokens getting minted * @param index The new liquidity index of the reserve * @return `true` if the the previous balance of the user was 0 */ function mint( address user, uint256 amount, uint256 index ) external payable returns (bool); /** * @dev Emitted after aTokens are burned * @param from The owner of the aTokens, getting them burned * @param target The address that will receive the underlying * @param value The amount being burned * @param index The new liquidity index of the reserve **/ event Burn(address indexed from, address indexed target, uint256 value, uint256 index); /** * @dev Emitted during the transfer action * @param from The user whose tokens are being transferred * @param to The recipient * @param value The amount being transferred * @param index The new liquidity index of the reserve **/ event BalanceTransfer(address indexed from, address indexed to, uint256 value, uint256 index); /** * @dev Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` * @param user The owner of the aTokens, getting them burned * @param receiverOfUnderlying The address that will receive the underlying * @param amount The amount being burned * @param index The new liquidity index of the reserve **/ function burn( address user, address receiverOfUnderlying, uint256 amount, uint256 index ) external payable; /** * @dev Mints aTokens to the reserve treasury * @param amount The amount of tokens getting minted * @param index The new liquidity index of the reserve */ function mintToTreasury(uint256 amount, uint256 index) external payable; /** * @dev Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken * @param from The address getting liquidated, current owner of the aTokens * @param to The recipient * @param value The amount of tokens getting transferred **/ function transferOnLiquidation( address from, address to, uint256 value ) external payable; /** * @dev Transfers the underlying asset to `target`. Used by the LendingPool to transfer * assets in borrow(), withdraw() and flashLoan() * @param user The recipient of the underlying * @param amount The amount getting transferred * @return The amount transferred **/ function transferUnderlyingTo(address user, uint256 amount) external payable returns (uint256); /** * @dev Invoked to execute actions on the aToken side after a repayment. * @param user The user executing the repayment * @param amount The amount getting repaid **/ function handleRepayment(address user, uint256 amount) external; /** * @dev Returns the address of the incentives controller contract **/ function getIncentivesController() external view returns (ISturdyIncentivesController); /** * @dev Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) **/ function UNDERLYING_ASSET_ADDRESS() external view returns (address); } library Errors { //common errors string internal constant CALLER_NOT_POOL_ADMIN = '33'; // 'The caller must be the pool admin' string internal constant BORROW_ALLOWANCE_NOT_ENOUGH = '59'; // User borrows on behalf, but allowance are too small //contract specific errors string internal constant VL_INVALID_AMOUNT = '1'; // 'Amount must be greater than 0' string internal constant VL_NO_ACTIVE_RESERVE = '2'; // 'Action requires an active reserve' string internal constant VL_RESERVE_FROZEN = '3'; // 'Action cannot be performed because the reserve is frozen' string internal constant VL_CURRENT_AVAILABLE_LIQUIDITY_NOT_ENOUGH = '4'; // 'The current liquidity is not enough' string internal constant VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE = '5'; // 'User cannot withdraw more than the available balance' string internal constant VL_TRANSFER_NOT_ALLOWED = '6'; // 'Transfer cannot be allowed.' string internal constant VL_BORROWING_NOT_ENABLED = '7'; // 'Borrowing is not enabled' string internal constant VL_INVALID_INTEREST_RATE_MODE_SELECTED = '8'; // 'Invalid interest rate mode selected' string internal constant VL_COLLATERAL_BALANCE_IS_0 = '9'; // 'The collateral balance is 0' string internal constant VL_HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '10'; // 'Health factor is lesser than the liquidation threshold' string internal constant VL_COLLATERAL_CANNOT_COVER_NEW_BORROW = '11'; // 'There is not enough collateral to cover a new borrow' string internal constant VL_STABLE_BORROWING_NOT_ENABLED = '12'; // stable borrowing not enabled string internal constant VL_COLLATERAL_SAME_AS_BORROWING_CURRENCY = '13'; // collateral is (mostly) the same currency that is being borrowed string internal constant VL_AMOUNT_BIGGER_THAN_MAX_LOAN_SIZE_STABLE = '14'; // 'The requested amount is greater than the max loan size in stable rate mode string internal constant VL_NO_DEBT_OF_SELECTED_TYPE = '15'; // 'for repayment of stable debt, the user needs to have stable debt, otherwise, he needs to have variable debt' string internal constant VL_NO_EXPLICIT_AMOUNT_TO_REPAY_ON_BEHALF = '16'; // 'To repay on behalf of an user an explicit amount to repay is needed' string internal constant VL_NO_STABLE_RATE_LOAN_IN_RESERVE = '17'; // 'User does not have a stable rate loan in progress on this reserve' string internal constant VL_NO_VARIABLE_RATE_LOAN_IN_RESERVE = '18'; // 'User does not have a variable rate loan in progress on this reserve' string internal constant VL_UNDERLYING_BALANCE_NOT_GREATER_THAN_0 = '19'; // 'The underlying balance needs to be greater than 0' string internal constant VL_DEPOSIT_ALREADY_IN_USE = '20'; // 'User deposit is already being used as collateral' string internal constant LP_NOT_ENOUGH_STABLE_BORROW_BALANCE = '21'; // 'User does not have any stable rate loan for this reserve' string internal constant LP_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '22'; // 'Interest rate rebalance conditions were not met' string internal constant LP_LIQUIDATION_CALL_FAILED = '23'; // 'Liquidation call failed' string internal constant LP_NOT_ENOUGH_LIQUIDITY_TO_BORROW = '24'; // 'There is not enough liquidity available to borrow' string internal constant LP_REQUESTED_AMOUNT_TOO_SMALL = '25'; // 'The requested amount is too small for a FlashLoan.' string internal constant LP_INCONSISTENT_PROTOCOL_ACTUAL_BALANCE = '26'; // 'The actual balance of the protocol is inconsistent' string internal constant LP_CALLER_NOT_LENDING_POOL_CONFIGURATOR = '27'; // 'The caller of the function is not the lending pool configurator' string internal constant LP_INCONSISTENT_FLASHLOAN_PARAMS = '28'; string internal constant CT_CALLER_MUST_BE_LENDING_POOL = '29'; // 'The caller of this function must be a lending pool' string internal constant CT_CANNOT_GIVE_ALLOWANCE_TO_HIMSELF = '30'; // 'User cannot give allowance to himself' string internal constant CT_TRANSFER_AMOUNT_NOT_GT_0 = '31'; // 'Transferred amount needs to be greater than zero' string internal constant RL_RESERVE_ALREADY_INITIALIZED = '32'; // 'Reserve has already been initialized' string internal constant LPC_RESERVE_LIQUIDITY_NOT_0 = '34'; // 'The liquidity of the reserve needs to be 0' string internal constant LPC_INVALID_ATOKEN_POOL_ADDRESS = '35'; // 'The liquidity of the reserve needs to be 0' string internal constant LPC_INVALID_STABLE_DEBT_TOKEN_POOL_ADDRESS = '36'; // 'The liquidity of the reserve needs to be 0' string internal constant LPC_INVALID_VARIABLE_DEBT_TOKEN_POOL_ADDRESS = '37'; // 'The liquidity of the reserve needs to be 0' string internal constant LPC_INVALID_STABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = '38'; // 'The liquidity of the reserve needs to be 0' string internal constant LPC_INVALID_VARIABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = '39'; // 'The liquidity of the reserve needs to be 0' string internal constant LPC_INVALID_ADDRESSES_PROVIDER_ID = '40'; // 'The liquidity of the reserve needs to be 0' string internal constant LPC_INVALID_CONFIGURATION = '75'; // 'Invalid risk parameters for the reserve' string internal constant LPC_CALLER_NOT_EMERGENCY_ADMIN = '76'; // 'The caller must be the emergency admin' string internal constant LPAPR_PROVIDER_NOT_REGISTERED = '41'; // 'Provider is not registered' string internal constant LPCM_HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '42'; // 'Health factor is not below the threshold' string internal constant LPCM_COLLATERAL_CANNOT_BE_LIQUIDATED = '43'; // 'The collateral chosen cannot be liquidated' string internal constant LPCM_SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '44'; // 'User did not borrow the specified currency' string internal constant LPCM_NOT_ENOUGH_LIQUIDITY_TO_LIQUIDATE = '45'; // "There isn't enough liquidity available to liquidate" string internal constant LPCM_NO_ERRORS = '46'; // 'No errors' string internal constant LP_INVALID_FLASHLOAN_MODE = '47'; //Invalid flashloan mode selected string internal constant MATH_MULTIPLICATION_OVERFLOW = '48'; string internal constant MATH_ADDITION_OVERFLOW = '49'; string internal constant MATH_DIVISION_BY_ZERO = '50'; string internal constant RL_LIQUIDITY_INDEX_OVERFLOW = '51'; // Liquidity index overflows uint128 string internal constant RL_VARIABLE_BORROW_INDEX_OVERFLOW = '52'; // Variable borrow index overflows uint128 string internal constant RL_LIQUIDITY_RATE_OVERFLOW = '53'; // Liquidity rate overflows uint128 string internal constant RL_VARIABLE_BORROW_RATE_OVERFLOW = '54'; // Variable borrow rate overflows uint128 string internal constant RL_STABLE_BORROW_RATE_OVERFLOW = '55'; // Stable borrow rate overflows uint128 string internal constant CT_INVALID_MINT_AMOUNT = '56'; //invalid amount to mint string internal constant LP_FAILED_REPAY_WITH_COLLATERAL = '57'; string internal constant CT_INVALID_BURN_AMOUNT = '58'; //invalid amount to burn string internal constant LP_FAILED_COLLATERAL_SWAP = '60'; string internal constant LP_INVALID_EQUAL_ASSETS_TO_SWAP = '61'; string internal constant LP_REENTRANCY_NOT_ALLOWED = '62'; string internal constant LP_CALLER_MUST_BE_AN_ATOKEN = '63'; string internal constant LP_IS_PAUSED = '64'; // 'Pool is paused' string internal constant LP_NO_MORE_RESERVES_ALLOWED = '65'; string internal constant LP_INVALID_FLASH_LOAN_EXECUTOR_RETURN = '66'; string internal constant RC_INVALID_LTV = '67'; string internal constant RC_INVALID_LIQ_THRESHOLD = '68'; string internal constant RC_INVALID_LIQ_BONUS = '69'; string internal constant RC_INVALID_DECIMALS = '70'; string internal constant RC_INVALID_RESERVE_FACTOR = '71'; string internal constant LPAPR_INVALID_ADDRESSES_PROVIDER_ID = '72'; string internal constant VL_INCONSISTENT_FLASHLOAN_PARAMS = '73'; string internal constant LP_INCONSISTENT_PARAMS_LENGTH = '74'; string internal constant UL_INVALID_INDEX = '77'; string internal constant LP_NOT_CONTRACT = '78'; string internal constant SDT_STABLE_DEBT_OVERFLOW = '79'; string internal constant SDT_BURN_EXCEEDS_BALANCE = '80'; string internal constant VT_COLLATERAL_DEPOSIT_REQUIRE_ETH = '81'; //Only accept ETH for collateral deposit string internal constant VT_COLLATERAL_DEPOSIT_INVALID = '82'; //Collateral deposit failed string internal constant VT_LIQUIDITY_DEPOSIT_INVALID = '83'; //Only accept USDC, USDT, DAI for liquidity deposit string internal constant VT_COLLATERAL_WITHDRAW_INVALID = '84'; //Collateral withdraw failed string internal constant VT_COLLATERAL_WITHDRAW_INVALID_AMOUNT = '85'; //Collateral withdraw has not enough amount string internal constant VT_CONVERT_ASSET_BY_CURVE_INVALID = '86'; //Convert asset by curve invalid string internal constant VT_PROCESS_YIELD_INVALID = '87'; //Processing yield is invalid string internal constant VT_TREASURY_INVALID = '88'; //Treasury is invalid string internal constant LP_ATOKEN_INIT_INVALID = '89'; //aToken invalid init string internal constant VT_FEE_TOO_BIG = '90'; //Fee is too big string internal constant VT_COLLATERAL_DEPOSIT_VAULT_UNAVAILABLE = '91'; string internal constant LP_LIQUIDATION_CONVERT_FAILED = '92'; string internal constant VT_DEPLOY_FAILED = '93'; // Vault deploy failed string internal constant VT_INVALID_CONFIGURATION = '94'; // Invalid vault configuration string internal constant VL_OVERFLOW_MAX_RESERVE_CAPACITY = '95'; // overflow max capacity of reserve string internal constant VT_WITHDRAW_AMOUNT_MISMATCH = '96'; // not performed withdraw 100% string internal constant VT_SWAP_MISMATCH_RETURNED_AMOUNT = '97'; //Returned amount is not enough string internal constant CALLER_NOT_YIELD_PROCESSOR = '98'; // 'The caller must be the pool admin' string internal constant VT_EXTRA_REWARDS_INDEX_INVALID = '99'; // Invalid extraRewards index string internal constant VT_SWAP_PATH_LENGTH_INVALID = '100'; // Invalid token or fee length string internal constant VT_SWAP_PATH_TOKEN_INVALID = '101'; // Invalid token information string internal constant CLAIMER_UNAUTHORIZED = '102'; // 'The claimer is not authorized' string internal constant YD_INVALID_CONFIGURATION = '103'; // 'The yield distribution's invalid configuration' string internal constant CALLER_NOT_EMISSION_MANAGER = '104'; // 'The caller must be emission manager' string internal constant CALLER_NOT_INCENTIVE_CONTROLLER = '105'; // 'The caller must be incentive controller' string internal constant YD_VR_ASSET_ALREADY_IN_USE = '106'; // Vault is already registered string internal constant YD_VR_INVALID_VAULT = '107'; // Invalid vault is used for an asset string internal constant YD_VR_INVALID_REWARDS_AMOUNT = '108'; // Rewards amount should be bigger than before string internal constant YD_VR_REWARD_TOKEN_NOT_VALID = '109'; // The reward token must be same with configured address string internal constant YD_VR_ASSET_NOT_REGISTERED = '110'; string internal constant YD_VR_CALLER_NOT_VAULT = '111'; // The caller must be same with configured vault address string internal constant LS_INVALID_CONFIGURATION = '112'; // Invalid Leverage Swapper configuration string internal constant LS_SWAP_AMOUNT_NOT_GT_0 = '113'; // Collateral amount needs to be greater than zero string internal constant LS_STABLE_COIN_NOT_SUPPORTED = '114'; // Doesn't support swap for the stable coin string internal constant LS_SUPPLY_NOT_ALLOWED = '115'; // no sufficient funds string internal constant LS_SUPPLY_FAILED = '116'; // Deposit fails when leverage works string internal constant LS_REMOVE_ITERATION_OVER = '117'; // Withdraw iteration limit over string internal constant CALLER_NOT_WHITELIST_USER = '118'; // 'The caller must be whitelist user' enum CollateralManagerErrors { NO_ERROR, NO_COLLATERAL_AVAILABLE, COLLATERAL_CANNOT_BE_LIQUIDATED, CURRRENCY_NOT_BORROWED, HEALTH_FACTOR_ABOVE_THRESHOLD, NOT_ENOUGH_LIQUIDITY, NO_ACTIVE_RESERVE, HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD, INVALID_EQUAL_ASSETS_TO_SWAP, FROZEN_RESERVE } } library WadRayMath { uint256 internal constant WAD = 1e18; uint256 internal constant halfWAD = WAD / 2; uint256 internal constant RAY = 1e27; uint256 internal constant halfRAY = RAY / 2; uint256 internal constant WAD_RAY_RATIO = 1e9; /** * @return One ray, 1e27 **/ function ray() internal pure returns (uint256) { return RAY; } /** * @return One wad, 1e18 **/ function wad() internal pure returns (uint256) { return WAD; } /** * @return Half ray, 1e27/2 **/ function halfRay() internal pure returns (uint256) { return halfRAY; } /** * @return Half ray, 1e18/2 **/ function halfWad() internal pure returns (uint256) { return halfWAD; } /** * @dev Multiplies two wad, rounding half up to the nearest wad * @param a Wad * @param b Wad * @return The result of a*b, in wad **/ function wadMul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0 || b == 0) { return 0; } return (a * b + halfWAD) / WAD; } /** * @dev Divides two wad, rounding half up to the nearest wad * @param a Wad * @param b Wad * @return The result of a/b, in wad **/ function wadDiv(uint256 a, uint256 b) internal pure returns (uint256) { uint256 halfB = b / 2; return (a * WAD + halfB) / b; } /** * @dev Multiplies two ray, rounding half up to the nearest ray * @param a Ray * @param b Ray * @return The result of a*b, in ray **/ function rayMul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0 || b == 0) { return 0; } return (a * b + halfRAY) / RAY; } /** * @dev Divides two ray, rounding half up to the nearest ray * @param a Ray * @param b Ray * @return The result of a/b, in ray **/ function rayDiv(uint256 a, uint256 b) internal pure returns (uint256) { uint256 halfB = b / 2; return (a * RAY + halfB) / b; } /** * @dev Casts ray down to wad * @param a Ray * @return a casted to wad, rounded half up to the nearest wad **/ function rayToWad(uint256 a) internal pure returns (uint256) { uint256 halfRatio = WAD_RAY_RATIO / 2; uint256 result = halfRatio + a; return result / WAD_RAY_RATIO; } /** * @dev Converts wad up to ray * @param a Wad * @return a converted in ray **/ function wadToRay(uint256 a) internal pure returns (uint256) { uint256 result = a * WAD_RAY_RATIO; return result; } } abstract contract VersionedInitializable { /** * @dev Indicates that the contract has been initialized. */ uint256 private lastInitializedRevision; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { uint256 revision = getRevision(); require( initializing || isConstructor() || revision > lastInitializedRevision, 'Contract instance has already been initialized' ); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; lastInitializedRevision = revision; } _; if (isTopLevelCall) { initializing = false; } } /** * @dev returns the revision number of the contract * Needs to be defined in the inherited class as a constant. * @return The revision number **/ function getRevision() internal pure virtual returns (uint256); /** * @dev Returns true if and only if the function is running in the constructor * @return `true` only if the function is running in the constructor **/ function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. uint256 cs; //solium-disable-next-line assembly { cs := extcodesize(address()) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } interface IERC20Detailed is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } abstract contract IncentivizedERC20 is Context, IERC20, IERC20Detailed { mapping(address => uint256) internal _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 internal _totalSupply; string private _name; string private _symbol; uint8 private _decimals; constructor( string memory name, string memory symbol, uint8 decimals ) { _name = name; _symbol = symbol; _decimals = decimals; } /** * @return The name of the token **/ function name() public view override returns (string memory) { return _name; } /** * @return The symbol of the token **/ function symbol() public view override returns (string memory) { return _symbol; } /** * @return The decimals of the token **/ function decimals() public view override returns (uint8) { return _decimals; } /** * @return The total supply of the token **/ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @return The balance of the token **/ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @return Abstract function implemented by the child aToken/debtToken. * Done this way in order to not break compatibility with previous versions of aTokens/debtTokens **/ function _getIncentivesController() internal view virtual returns (ISturdyIncentivesController); /** * @dev Executes a transfer of tokens from _msgSender() to recipient * @param recipient The recipient of the tokens * @param amount The amount of tokens being transferred * @return `true` if the transfer succeeds, `false` otherwise **/ function transfer(address recipient, uint256 amount) external virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); emit Transfer(_msgSender(), recipient, amount); return true; } /** * @dev Returns the allowance of spender on the tokens owned by owner * @param owner The owner of the tokens * @param spender The user allowed to spend the owner's tokens * @return The amount of owner's tokens spender is allowed to spend **/ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev Allows `spender` to spend the tokens owned by _msgSender() * @param spender The user allowed to spend _msgSender() tokens * @return `true` **/ function approve(address spender, uint256 amount) external virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev Executes a transfer of token from sender to recipient, if _msgSender() is allowed to do so * @param sender The owner of the tokens * @param recipient The recipient of the tokens * @param amount The amount of tokens being transferred * @return `true` if the transfer succeeds, `false` otherwise **/ function transferFrom( address sender, address recipient, uint256 amount ) external virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount); emit Transfer(sender, recipient, amount); return true; } /** * @dev Increases the allowance of spender to spend _msgSender() tokens * @param spender The user allowed to spend on behalf of _msgSender() * @param addedValue The amount being added to the allowance * @return `true` **/ function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Decreases the allowance of spender to spend _msgSender() tokens * @param spender The user allowed to spend on behalf of _msgSender() * @param subtractedValue The amount being subtracted to the allowance * @return `true` **/ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue); return true; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), 'ERC20: transfer from the zero address'); require(recipient != address(0), 'ERC20: transfer to the zero address'); _beforeTokenTransfer(sender, recipient, amount); uint256 oldSenderBalance = _balances[sender]; _balances[sender] = oldSenderBalance - amount; uint256 oldRecipientBalance = _balances[recipient]; _balances[recipient] += amount; if (address(_getIncentivesController()) != address(0)) { uint256 currentTotalSupply = _totalSupply; _getIncentivesController().handleAction(sender, currentTotalSupply, oldSenderBalance); if (sender != recipient) { _getIncentivesController().handleAction(recipient, currentTotalSupply, oldRecipientBalance); } } } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), 'ERC20: mint to the zero address'); _beforeTokenTransfer(address(0), account, amount); uint256 oldTotalSupply = _totalSupply; _totalSupply = oldTotalSupply + amount; uint256 oldAccountBalance = _balances[account]; _balances[account] = oldAccountBalance + amount; if (address(_getIncentivesController()) != address(0)) { _getIncentivesController().handleAction(account, oldTotalSupply, oldAccountBalance); } } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), 'ERC20: burn from the zero address'); _beforeTokenTransfer(account, address(0), amount); uint256 oldTotalSupply = _totalSupply; _totalSupply = oldTotalSupply - amount; uint256 oldAccountBalance = _balances[account]; _balances[account] = oldAccountBalance - amount; if (address(_getIncentivesController()) != address(0)) { _getIncentivesController().handleAction(account, oldTotalSupply, oldAccountBalance); } } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), 'ERC20: approve from the zero address'); require(spender != address(0), 'ERC20: approve to the zero address'); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _setName(string memory newName) internal { _name = newName; } function _setSymbol(string memory newSymbol) internal { _symbol = newSymbol; } function _setDecimals(uint8 newDecimals) internal { _decimals = newDecimals; } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } /** * @title Sturdy ERC20 AToken * @dev Implementation of the interest bearing token for the Sturdy protocol * @author Sturdy, inspiration from Aave */ contract AToken is VersionedInitializable, IncentivizedERC20('ATOKEN_IMPL', 'ATOKEN_IMPL', 0), IAToken { using WadRayMath for uint256; using SafeERC20 for IERC20; bytes private constant EIP712_REVISION = bytes('1'); bytes32 internal constant EIP712_DOMAIN = keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); bytes32 private constant PERMIT_TYPEHASH = keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); uint256 private constant ATOKEN_REVISION = 0x2; /// @dev owner => next valid nonce to submit with permit() mapping(address => uint256) public _nonces; bytes32 public DOMAIN_SEPARATOR; ILendingPool internal _pool; address internal _treasury; address internal _underlyingAsset; ISturdyIncentivesController internal _incentivesController; modifier onlyLendingPool() { require(_msgSender() == address(_pool), Errors.CT_CALLER_MUST_BE_LENDING_POOL); _; } function getRevision() internal pure virtual override returns (uint256) { return ATOKEN_REVISION; } /** * @dev Initializes the aToken * - Caller is initializer (LendingPoolAddressesProvider or deployer) * @param pool The address of the lending pool where this aToken will be used * @param treasury The address of the Sturdy treasury, receiving the fees on this aToken * @param underlyingAsset The address of the underlying asset of this aToken (E.g. WETH for aWETH) * @param incentivesController The smart contract managing potential incentives distribution * @param aTokenDecimals The decimals of the aToken, same as the underlying asset's * @param aTokenName The name of the aToken * @param aTokenSymbol The symbol of the aToken */ function initialize( ILendingPool pool, address treasury, address underlyingAsset, ISturdyIncentivesController incentivesController, uint8 aTokenDecimals, string calldata aTokenName, string calldata aTokenSymbol, bytes calldata params ) external override initializer { require(address(pool) != address(0), Errors.LPC_INVALID_CONFIGURATION); require(treasury != address(0), Errors.LPC_INVALID_CONFIGURATION); require(underlyingAsset != address(0), Errors.LPC_INVALID_CONFIGURATION); require(address(incentivesController) != address(0), Errors.LPC_INVALID_CONFIGURATION); require(aTokenDecimals != 0, Errors.LPC_INVALID_CONFIGURATION); uint256 chainId; //solium-disable-next-line assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( EIP712_DOMAIN, keccak256(bytes(aTokenName)), keccak256(EIP712_REVISION), chainId, address(this) ) ); _setName(aTokenName); _setSymbol(aTokenSymbol); _setDecimals(aTokenDecimals); _pool = pool; _treasury = treasury; _underlyingAsset = underlyingAsset; _incentivesController = incentivesController; emit Initialized( underlyingAsset, address(pool), treasury, address(incentivesController), aTokenDecimals, aTokenName, aTokenSymbol, params ); } /** * @dev Burns aTokens from `user` and sends the equivalent amount of underlying to `receiverOfUnderlying` * - Caller is only LendingPool, as extra state updates there need to be managed * @param user The owner of the aTokens, getting them burned * @param receiverOfUnderlying The address that will receive the underlying * @param amount The amount being burned * @param index The new liquidity index of the reserve **/ function burn( address user, address receiverOfUnderlying, uint256 amount, uint256 index ) external payable override onlyLendingPool { uint256 amountScaled = amount.rayDiv(index); require(amountScaled != 0, Errors.CT_INVALID_BURN_AMOUNT); _burn(user, amountScaled); IERC20(_underlyingAsset).safeTransfer(receiverOfUnderlying, amount); emit Transfer(user, address(0), amount); emit Burn(user, receiverOfUnderlying, amount, index); } /** * @dev Mints `amount` aTokens to `user` * - Caller is only LendingPool, as extra state updates there need to be managed * @param user The address receiving the minted tokens * @param amount The amount of tokens getting minted * @param index The new liquidity index of the reserve * @return `true` if the the previous balance of the user was 0 */ function mint( address user, uint256 amount, uint256 index ) external payable override onlyLendingPool returns (bool) { uint256 previousBalance = super.balanceOf(user); uint256 amountScaled = amount.rayDiv(index); require(amountScaled != 0, Errors.CT_INVALID_MINT_AMOUNT); _mint(user, amountScaled); emit Transfer(address(0), user, amount); emit Mint(user, amount, index); return previousBalance == 0; } /** * @dev Mints aTokens to the reserve treasury * - Caller is only LendingPool * @param amount The amount of tokens getting minted * @param index The new liquidity index of the reserve */ function mintToTreasury(uint256 amount, uint256 index) external payable override onlyLendingPool { if (amount == 0) { return; } address treasury = _treasury; // Compared to the normal mint, we don't check for rounding errors. // The amount to mint can easily be very small since it is a fraction of the interest ccrued. // In that case, the treasury will experience a (very small) loss, but it // wont cause potentially valid transactions to fail. _mint(treasury, amount.rayDiv(index)); emit Transfer(address(0), treasury, amount); emit Mint(treasury, amount, index); } /** * @dev Only possible for collateral aToken, so no need to implement * - Caller is only LendingPool * @param from The address getting liquidated, current owner of the aTokens * @param to The recipient * @param value The amount of tokens getting transferred **/ function transferOnLiquidation( address from, address to, uint256 value ) external payable override onlyLendingPool { revert('NOT_SUPPORTED'); } /** * @dev Calculates the balance of the user: principal balance + interest generated by the principal * @param user The user whose balance is calculated * @return The balance of the user **/ function balanceOf(address user) public view override(IncentivizedERC20, IERC20) returns (uint256) { return super.balanceOf(user).rayMul(_pool.getReserveNormalizedIncome(_underlyingAsset)); } /** * @dev Returns the scaled balance of the user. The scaled balance is the sum of all the * updated stored balance divided by the reserve's liquidity index at the moment of the update * @param user The user whose balance is calculated * @return The scaled balance of the user **/ function scaledBalanceOf(address user) external view override returns (uint256) { return super.balanceOf(user); } /** * @dev Returns the scaled balance of the user and the scaled total supply. * @param user The address of the user * @return The scaled balance of the user * @return The scaled balance and the scaled total supply **/ function getScaledUserBalanceAndSupply(address user) external view override returns (uint256, uint256) { return (super.balanceOf(user), super.totalSupply()); } /** * @dev calculates the total supply of the specific aToken * since the balance of every single user increases over time, the total supply * does that too. * @return the current total supply **/ function totalSupply() public view override(IncentivizedERC20, IERC20) returns (uint256) { uint256 currentSupplyScaled = super.totalSupply(); if (currentSupplyScaled == 0) { return 0; } return currentSupplyScaled.rayMul(_pool.getReserveNormalizedIncome(_underlyingAsset)); } /** * @dev Returns the scaled total supply of the variable debt token. Represents sum(debt/index) * @return the scaled total supply **/ function scaledTotalSupply() public view virtual override returns (uint256) { return super.totalSupply(); } /** * @dev Returns the address of the Sturdy treasury, receiving the fees on this aToken * @return The address of the treasury **/ function RESERVE_TREASURY_ADDRESS() public view returns (address) { return _treasury; } /** * @dev Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) * @return The address of the underlying asset of aToken **/ function UNDERLYING_ASSET_ADDRESS() public view override returns (address) { return _underlyingAsset; } /** * @dev Returns the address of the lending pool where this aToken is used * @return The address of the lending pool **/ function POOL() public view returns (ILendingPool) { return _pool; } /** * @dev For internal usage in the logic of the parent contract IncentivizedERC20 * @return The address of the incentive controller **/ function _getIncentivesController() internal view override returns (ISturdyIncentivesController) { return _incentivesController; } /** * @dev Returns the address of the incentives controller contract * @return The address of the lending pool **/ function getIncentivesController() external view override returns (ISturdyIncentivesController) { return _getIncentivesController(); } /** * @dev Transfers the underlying asset to `target`. Used by the LendingPool to transfer * assets in borrow(), withdraw() and flashLoan() * - Caller is only LendingPool * @param target The recipient of the aTokens * @param amount The amount getting transferred * @return The amount transferred **/ function transferUnderlyingTo(address target, uint256 amount) external payable override onlyLendingPool returns (uint256) { IERC20(_underlyingAsset).safeTransfer(target, amount); return amount; } /** * @dev Invoked to execute actions on the aToken side after a repayment. * - Caller is only LendingPool * @param user The user executing the repayment * @param amount The amount getting repaid **/ function handleRepayment(address user, uint256 amount) external override onlyLendingPool {} /** * @dev implements the permit function as for * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md * - Caller is anyone * @param owner The owner of the funds * @param spender The spender * @param value The amount * @param deadline The deadline timestamp, type(uint256).max for max deadline * @param v Signature param * @param s Signature param * @param r Signature param */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(owner != address(0), 'INVALID_OWNER'); //solium-disable-next-line require(block.timestamp <= deadline, 'INVALID_EXPIRATION'); uint256 currentValidNonce = _nonces[owner]; bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', _domain_separator(), keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, currentValidNonce, deadline)) ) ); require(owner == ecrecover(digest, v, r, s), 'INVALID_SIGNATURE'); _nonces[owner] = currentValidNonce + 1; _approve(owner, spender, value); } /** * @dev Transfers the aTokens between two users. Validates the transfer * (ie checks for valid HF after the transfer) if required * @param from The source address * @param to The destination address * @param amount The amount getting transferred * @param validate `true` if the transfer needs to be validated **/ function _transfer( address from, address to, uint256 amount, bool validate ) internal { address underlyingAsset = _underlyingAsset; ILendingPool pool = _pool; uint256 index = pool.getReserveNormalizedIncome(underlyingAsset); uint256 fromBalanceBefore = super.balanceOf(from).rayMul(index); uint256 toBalanceBefore = super.balanceOf(to).rayMul(index); super._transfer(from, to, amount.rayDiv(index)); if (validate) { pool.finalizeTransfer(underlyingAsset, from, to, amount, fromBalanceBefore, toBalanceBefore); } emit BalanceTransfer(from, to, amount, index); } /** * @dev Overrides the parent _transfer to force validated transfer() and transferFrom() * @param from The source address * @param to The destination address * @param amount The amount getting transferred **/ function _transfer( address from, address to, uint256 amount ) internal override { _transfer(from, to, amount, true); } /** * @dev get the domain_separator value * @return the domain_separator **/ function _domain_separator() internal view returns (bytes32) { uint256 chainId; //solium-disable-next-line assembly { chainId := chainid() } return keccak256( abi.encode( EIP712_DOMAIN, keccak256(bytes(name())), keccak256(EIP712_REVISION), chainId, address(this) ) ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"BalanceTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"underlyingAsset","type":"address"},{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"treasury","type":"address"},{"indexed":false,"internalType":"address","name":"incentivesController","type":"address"},{"indexed":false,"internalType":"uint8","name":"aTokenDecimals","type":"uint8"},{"indexed":false,"internalType":"string","name":"aTokenName","type":"string"},{"indexed":false,"internalType":"string","name":"aTokenSymbol","type":"string"},{"indexed":false,"internalType":"bytes","name":"params","type":"bytes"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POOL","outputs":[{"internalType":"contract ILendingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_TREASURY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNDERLYING_ASSET_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"receiverOfUnderlying","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getIncentivesController","outputs":[{"internalType":"contract ISturdyIncentivesController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getScaledUserBalanceAndSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"handleRepayment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ILendingPool","name":"pool","type":"address"},{"internalType":"address","name":"treasury","type":"address"},{"internalType":"address","name":"underlyingAsset","type":"address"},{"internalType":"contract ISturdyIncentivesController","name":"incentivesController","type":"address"},{"internalType":"uint8","name":"aTokenDecimals","type":"uint8"},{"internalType":"string","name":"aTokenName","type":"string"},{"internalType":"string","name":"aTokenSymbol","type":"string"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"mintToTreasury","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"scaledBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scaledTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferOnLiquidation","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferUnderlyingTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600b8082526a105513d2d15397d253541360aa1b6020808401828152855180870190965292855284015281519192916000916200005c916037919062000090565b5081516200007290603890602085019062000090565b506039805460ff191660ff9290921691909117905550620001739050565b8280546200009e9062000136565b90600052602060002090601f016020900481019282620000c257600085556200010d565b82601f10620000dd57805160ff19168380011785556200010d565b828001600101855582156200010d579182015b828111156200010d578251825591602001919060010190620000f0565b506200011b9291506200011f565b5090565b5b808211156200011b576000815560010162000120565b600181811c908216806200014b57607f821691505b602082108114156200016d57634e487b7160e01b600052602260045260246000fd5b50919050565b6124a180620001836000396000f3fe6080604052600436106101b75760003560e01c806375d26413116100ec578063b16a19de1161008a578063d505accf11610064578063d505accf146104d6578063d7020d0a146104f6578063dd62ed3e14610509578063f866c3191461054f57600080fd5b8063b16a19de14610476578063b1bf962d14610494578063b9844d8d146104a957600080fd5b806395d89b41116100c657806395d89b4114610403578063a457c2d714610418578063a9059cbb14610438578063ae1673351461045857600080fd5b806375d26413146103bb5780637df5bd3b146103d057806388dd91a1146103e357600080fd5b806323b872dd11610159578063395093511161013357806339509351146103365780634efecaa51461035657806370a08231146103695780637535d2461461038957600080fd5b806323b872dd146102de578063313ce567146102fe5780633644e5151461032057600080fd5b8063156e29f611610195578063156e29f61461026657806318160ddd14610279578063183fb4131461029c5780631da24f3e146102be57600080fd5b806306fdde03146101bc578063095ea7b3146101e75780630afbcdc914610217575b600080fd5b3480156101c857600080fd5b506101d1610562565b6040516101de9190611f1b565b60405180910390f35b3480156101f357600080fd5b50610207610202366004611f76565b6105f4565b60405190151581526020016101de565b34801561022357600080fd5b50610251610232366004611fa2565b6001600160a01b03166000908152603460205260409020546036549091565b604080519283526020830191909152016101de565b610207610274366004611fbf565b61060b565b34801561028557600080fd5b5061028e610742565b6040519081526020016101de565b3480156102a857600080fd5b506102bc6102b736600461204e565b6107e0565b005b3480156102ca57600080fd5b5061028e6102d9366004611fa2565b610c10565b3480156102ea57600080fd5b506102076102f9366004612142565b610c2e565b34801561030a57600080fd5b5060395460405160ff90911681526020016101de565b34801561032c57600080fd5b5061028e603b5481565b34801561034257600080fd5b50610207610351366004611f76565b610cbb565b61028e610364366004611f76565b610cf2565b34801561037557600080fd5b5061028e610384366004611fa2565b610d57565b34801561039557600080fd5b50603c546001600160a01b03165b6040516001600160a01b0390911681526020016101de565b3480156103c757600080fd5b506103a3610ded565b6102bc6103de366004612183565b610e06565b3480156103ef57600080fd5b506102bc6103fe366004611f76565b610ef8565b34801561040f57600080fd5b506101d1610f4d565b34801561042457600080fd5b50610207610433366004611f76565b610f5c565b34801561044457600080fd5b50610207610453366004611f76565b610f93565b34801561046457600080fd5b50603d546001600160a01b03166103a3565b34801561048257600080fd5b50603e546001600160a01b03166103a3565b3480156104a057600080fd5b5061028e610fd7565b3480156104b557600080fd5b5061028e6104c4366004611fa2565b603a6020526000908152604090205481565b3480156104e257600080fd5b506102bc6104f13660046121a5565b610fe2565b6102bc610504366004612213565b611228565b34801561051557600080fd5b5061028e610524366004612259565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6102bc61055d366004612142565b61136d565b60606037805461057190612292565b80601f016020809104026020016040519081016040528092919081815260200182805461059d90612292565b80156105ea5780601f106105bf576101008083540402835291602001916105ea565b820191906000526020600020905b8154815290600101906020018083116105cd57829003601f168201915b5050505050905090565b60006106013384846113f6565b5060015b92915050565b603c54604080518082019091526002815261323960f01b60208201526000916001600160a01b0316331461065b5760405162461bcd60e51b81526004016106529190611f1b565b60405180910390fd5b506001600160a01b03841660009081526034602052604081205490610680858561151a565b6040805180820190915260028152611a9b60f11b6020820152909150816106ba5760405162461bcd60e51b81526004016106529190611f1b565b506106c5868261155e565b6040518581526001600160a01b0387169060009060008051602061244c8339815191529060200160405180910390a360408051868152602081018690526001600160a01b038816917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a25015949350505050565b60008061074e60365490565b90508061075d57600091505090565b603c54603e5460405163d15e005360e01b81526001600160a01b0391821660048201526107da92919091169063d15e005390602401602060405180830381865afa1580156107af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d391906122c7565b8290611681565b91505090565b60015460029060ff16806107f35750303b155b806107ff575060005481115b6108625760405162461bcd60e51b815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201526d195b881a5b9a5d1a585b1a5e995960921b6064820152608401610652565b60015460ff16158015610881576001805460ff19168117905560008290555b604080518082019091526002815261373560f01b60208201526001600160a01b038e166108c15760405162461bcd60e51b81526004016106529190611f1b565b50604080518082019091526002815261373560f01b60208201526001600160a01b038d166109025760405162461bcd60e51b81526004016106529190611f1b565b50604080518082019091526002815261373560f01b60208201526001600160a01b038c166109435760405162461bcd60e51b81526004016106529190611f1b565b50604080518082019091526002815261373560f01b60208201526001600160a01b038b166109845760405162461bcd60e51b81526004016106529190611f1b565b50604080518082019091526002815261373560f01b602082015260ff8a166109bf5760405162461bcd60e51b81526004016106529190611f1b565b5060405146907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f906109f4908b908b906122e0565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160408051601f198184030181528282528051602091820120603b55601f8b01819004810283018101909152898252610aaa91908b908b90819084018382808284376000920191909152506116d892505050565b610ae987878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116eb92505050565b6039805460ff191660ff8c161790558d603c60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508c603d60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b603e60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a603f60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508d6001600160a01b03168c6001600160a01b03167fb19e051f8af41150ccccb3fc2c2d8d15f4a4cf434f32a559ba75fe73d6eea20b8f8e8e8e8e8e8e8e8e604051610be799989796959493929190612319565b60405180910390a3508015610c01576001805460ff191690555b50505050505050505050505050565b6001600160a01b038116600090815260346020526040812054610605565b6000610c3b8484846116fe565b6001600160a01b038416600090815260356020908152604080832033808552925290912054610c76918691610c7190869061239d565b6113f6565b826001600160a01b0316846001600160a01b031660008051602061244c83398151915284604051610ca991815260200190565b60405180910390a35060019392505050565b3360008181526035602090815260408083206001600160a01b03871684529091528120549091610601918590610c719086906123b4565b603c54604080518082019091526002815261323960f01b60208201526000916001600160a01b03163314610d395760405162461bcd60e51b81526004016106529190611f1b565b50603e54610d51906001600160a01b0316848461170b565b50919050565b603c54603e5460405163d15e005360e01b81526001600160a01b03918216600482015260009261060592169063d15e005390602401602060405180830381865afa158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd91906122c7565b6001600160a01b0384166000908152603460205260409020545b90611681565b6000610e01603f546001600160a01b031690565b905090565b603c546001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161323960f01b81525090610e565760405162461bcd60e51b81526004016106529190611f1b565b5081610e60575050565b603d546001600160a01b0316610e7f81610e7a858561151a565b61155e565b6040518381526001600160a01b0382169060009060008051602061244c8339815191529060200160405180910390a360408051848152602081018490526001600160a01b038316917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a2505b5050565b603c546001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161323960f01b81525090610f485760405162461bcd60e51b81526004016106529190611f1b565b505050565b60606038805461057190612292565b3360008181526035602090815260408083206001600160a01b03871684529091528120549091610601918590610c7190869061239d565b6000610fa03384846116fe565b6040518281526001600160a01b03841690339060008051602061244c8339815191529060200160405180910390a350600192915050565b6000610e0160365490565b6001600160a01b0387166110285760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b6044820152606401610652565b8342111561106d5760405162461bcd60e51b815260206004820152601260248201527124a72b20a624a22fa2ac2824a920aa24a7a760711b6044820152606401610652565b6001600160a01b0387166000908152603a60205260408120549061108f61175d565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e0016040516020818303038152906040528051906020012060405160200161112892919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201206000845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015611190573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b0316146111ee5760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b6044820152606401610652565b6111f98260016123b4565b6001600160a01b038a166000908152603a602052604090205561121d8989896113f6565b505050505050505050565b603c546001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161323960f01b815250906112785760405162461bcd60e51b81526004016106529190611f1b565b506000611285838361151a565b60408051808201909152600281526106a760f31b6020820152909150816112bf5760405162461bcd60e51b81526004016106529190611f1b565b506112ca8582611809565b603e546112e1906001600160a01b0316858561170b565b6040518381526000906001600160a01b0387169060008051602061244c8339815191529060200160405180910390a3836001600160a01b0316856001600160a01b03167f5d624aa9c148153ab3446c1b154f660ee7701e549fe9b62dab7171b1c80e6fa2858560405161135e929190918252602082015260400190565b60405180910390a35050505050565b603c546001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161323960f01b815250906113bd5760405162461bcd60e51b81526004016106529190611f1b565b5060405162461bcd60e51b815260206004820152600d60248201526c1393d517d4d5541413d4951151609a1b6044820152606401610652565b6001600160a01b0383166114585760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610652565b6001600160a01b0382166114b95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610652565b6001600160a01b0383811660008181526035602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000806115286002846123cc565b905082816115426b033b2e3c9fd0803ce8000000876123ee565b61154c91906123b4565b61155691906123cc565b949350505050565b6001600160a01b0382166115b45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610652565b6036546115c182826123b4565b6036556001600160a01b0383166000908152603460205260409020546115e783826123b4565b6001600160a01b03858116600090815260346020526040902091909155603f54161561167b57603f546040516318c39f1760e11b81526001600160a01b0386811660048301526024820185905260448201849052909116906331873e2e90606401600060405180830381600087803b15801561166257600080fd5b505af1158015611676573d6000803e3d6000fd5b505050505b50505050565b600082158061168e575081155b1561169b57506000610605565b6b033b2e3c9fd0803ce80000006116b36002826123cc565b6116bd84866123ee565b6116c791906123b4565b6116d191906123cc565b9392505050565b8051610ef4906037906020840190611e56565b8051610ef4906038906020840190611e56565b610f48838383600161189c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f48908490611a61565b6000467f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611789610562565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c0016040516020818303038152906040528051906020012091505090565b6001600160a01b0382166118695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610652565b603654611876828261239d565b6036556001600160a01b0383166000908152603460205260409020546115e7838261239d565b603e54603c5460405163d15e005360e01b81526001600160a01b03928316600482018190529290911690600090829063d15e005390602401602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191591906122c7565b9050600061193c82610de78a6001600160a01b031660009081526034602052604090205490565b9050600061196383610de78a6001600160a01b031660009081526034602052604090205490565b905061197989896119748a8761151a565b611be8565b8515611a005760405163d5ed393360e01b81526001600160a01b0386811660048301528a811660248301528981166044830152606482018990526084820184905260a4820183905285169063d5ed39339060c401600060405180830381600087803b1580156119e757600080fd5b505af11580156119fb573d6000803e3d6000fd5b505050505b876001600160a01b0316896001600160a01b03167f4beccb90f994c31aced7a23b5611020728a23d8ec5cddd1a3e9d97b96fda86668986604051611a4e929190918252602082015260400190565b60405180910390a3505050505050505050565b611a73826001600160a01b0316611e1d565b611abf5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006044820152606401610652565b600080836001600160a01b031683604051611ada919061240d565b6000604051808303816000865af19150503d8060008114611b17576040519150601f19603f3d011682016040523d82523d6000602084013e611b1c565b606091505b509150915081611b6e5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610652565b80511561167b5780806020019051810190611b899190612429565b61167b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610652565b6001600160a01b038316611c4c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610652565b6001600160a01b038216611cae5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610652565b6001600160a01b038316600090815260346020526040902054611cd1828261239d565b6001600160a01b03808616600090815260346020526040808220939093559085168152908120805491849190611d0783856123b4565b9091555050603f546001600160a01b031615611e1657603654603f546040516318c39f1760e11b81526001600160a01b0388811660048301526024820184905260448201869052909116906331873e2e90606401600060405180830381600087803b158015611d7557600080fd5b505af1158015611d89573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b031614611e1457603f546040516318c39f1760e11b81526001600160a01b0387811660048301526024820184905260448201859052909116906331873e2e90606401600060405180830381600087803b158015611dfb57600080fd5b505af1158015611e0f573d6000803e3d6000fd5b505050505b505b5050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611556575050151592915050565b828054611e6290612292565b90600052602060002090601f016020900481019282611e845760008555611eca565b82601f10611e9d57805160ff1916838001178555611eca565b82800160010185558215611eca579182015b82811115611eca578251825591602001919060010190611eaf565b50611ed6929150611eda565b5090565b5b80821115611ed65760008155600101611edb565b60005b83811015611f0a578181015183820152602001611ef2565b8381111561167b5750506000910152565b6020815260008251806020840152611f3a816040850160208701611eef565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611f6357600080fd5b50565b8035611f7181611f4e565b919050565b60008060408385031215611f8957600080fd5b8235611f9481611f4e565b946020939093013593505050565b600060208284031215611fb457600080fd5b81356116d181611f4e565b600080600060608486031215611fd457600080fd5b8335611fdf81611f4e565b95602085013595506040909401359392505050565b803560ff81168114611f7157600080fd5b60008083601f84011261201757600080fd5b50813567ffffffffffffffff81111561202f57600080fd5b60208301915083602082850101111561204757600080fd5b9250929050565b60008060008060008060008060008060006101008c8e03121561207057600080fd5b6120798c611f66565b9a5061208760208d01611f66565b995061209560408d01611f66565b98506120a360608d01611f66565b97506120b160808d01611ff4565b965067ffffffffffffffff8060a08e013511156120cd57600080fd5b6120dd8e60a08f01358f01612005565b909750955060c08d01358110156120f357600080fd5b6121038e60c08f01358f01612005565b909550935060e08d013581101561211957600080fd5b5061212a8d60e08e01358e01612005565b81935080925050509295989b509295989b9093969950565b60008060006060848603121561215757600080fd5b833561216281611f4e565b9250602084013561217281611f4e565b929592945050506040919091013590565b6000806040838503121561219657600080fd5b50508035926020909101359150565b600080600080600080600060e0888a0312156121c057600080fd5b87356121cb81611f4e565b965060208801356121db81611f4e565b955060408801359450606088013593506121f760808901611ff4565b925060a0880135915060c0880135905092959891949750929550565b6000806000806080858703121561222957600080fd5b843561223481611f4e565b9350602085013561224481611f4e565b93969395505050506040820135916060013590565b6000806040838503121561226c57600080fd5b823561227781611f4e565b9150602083013561228781611f4e565b809150509250929050565b600181811c908216806122a657607f821691505b60208210811415610d5157634e487b7160e01b600052602260045260246000fd5b6000602082840312156122d957600080fd5b5051919050565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038a811682528916602082015260ff8816604082015260c06060820181905260009061234f908301888a6122f0565b82810360808401526123628187896122f0565b905082810360a08401526123778185876122f0565b9c9b505050505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156123af576123af612387565b500390565b600082198211156123c7576123c7612387565b500190565b6000826123e957634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561240857612408612387565b500290565b6000825161241f818460208701611eef565b9190910192915050565b60006020828403121561243b57600080fd5b815180151581146116d157600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202c04a4d382cc6509a16849d3ce197641b64c0010b8cd5d312aa19e246df2c75d64736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106101b75760003560e01c806375d26413116100ec578063b16a19de1161008a578063d505accf11610064578063d505accf146104d6578063d7020d0a146104f6578063dd62ed3e14610509578063f866c3191461054f57600080fd5b8063b16a19de14610476578063b1bf962d14610494578063b9844d8d146104a957600080fd5b806395d89b41116100c657806395d89b4114610403578063a457c2d714610418578063a9059cbb14610438578063ae1673351461045857600080fd5b806375d26413146103bb5780637df5bd3b146103d057806388dd91a1146103e357600080fd5b806323b872dd11610159578063395093511161013357806339509351146103365780634efecaa51461035657806370a08231146103695780637535d2461461038957600080fd5b806323b872dd146102de578063313ce567146102fe5780633644e5151461032057600080fd5b8063156e29f611610195578063156e29f61461026657806318160ddd14610279578063183fb4131461029c5780631da24f3e146102be57600080fd5b806306fdde03146101bc578063095ea7b3146101e75780630afbcdc914610217575b600080fd5b3480156101c857600080fd5b506101d1610562565b6040516101de9190611f1b565b60405180910390f35b3480156101f357600080fd5b50610207610202366004611f76565b6105f4565b60405190151581526020016101de565b34801561022357600080fd5b50610251610232366004611fa2565b6001600160a01b03166000908152603460205260409020546036549091565b604080519283526020830191909152016101de565b610207610274366004611fbf565b61060b565b34801561028557600080fd5b5061028e610742565b6040519081526020016101de565b3480156102a857600080fd5b506102bc6102b736600461204e565b6107e0565b005b3480156102ca57600080fd5b5061028e6102d9366004611fa2565b610c10565b3480156102ea57600080fd5b506102076102f9366004612142565b610c2e565b34801561030a57600080fd5b5060395460405160ff90911681526020016101de565b34801561032c57600080fd5b5061028e603b5481565b34801561034257600080fd5b50610207610351366004611f76565b610cbb565b61028e610364366004611f76565b610cf2565b34801561037557600080fd5b5061028e610384366004611fa2565b610d57565b34801561039557600080fd5b50603c546001600160a01b03165b6040516001600160a01b0390911681526020016101de565b3480156103c757600080fd5b506103a3610ded565b6102bc6103de366004612183565b610e06565b3480156103ef57600080fd5b506102bc6103fe366004611f76565b610ef8565b34801561040f57600080fd5b506101d1610f4d565b34801561042457600080fd5b50610207610433366004611f76565b610f5c565b34801561044457600080fd5b50610207610453366004611f76565b610f93565b34801561046457600080fd5b50603d546001600160a01b03166103a3565b34801561048257600080fd5b50603e546001600160a01b03166103a3565b3480156104a057600080fd5b5061028e610fd7565b3480156104b557600080fd5b5061028e6104c4366004611fa2565b603a6020526000908152604090205481565b3480156104e257600080fd5b506102bc6104f13660046121a5565b610fe2565b6102bc610504366004612213565b611228565b34801561051557600080fd5b5061028e610524366004612259565b6001600160a01b03918216600090815260356020908152604080832093909416825291909152205490565b6102bc61055d366004612142565b61136d565b60606037805461057190612292565b80601f016020809104026020016040519081016040528092919081815260200182805461059d90612292565b80156105ea5780601f106105bf576101008083540402835291602001916105ea565b820191906000526020600020905b8154815290600101906020018083116105cd57829003601f168201915b5050505050905090565b60006106013384846113f6565b5060015b92915050565b603c54604080518082019091526002815261323960f01b60208201526000916001600160a01b0316331461065b5760405162461bcd60e51b81526004016106529190611f1b565b60405180910390fd5b506001600160a01b03841660009081526034602052604081205490610680858561151a565b6040805180820190915260028152611a9b60f11b6020820152909150816106ba5760405162461bcd60e51b81526004016106529190611f1b565b506106c5868261155e565b6040518581526001600160a01b0387169060009060008051602061244c8339815191529060200160405180910390a360408051868152602081018690526001600160a01b038816917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a25015949350505050565b60008061074e60365490565b90508061075d57600091505090565b603c54603e5460405163d15e005360e01b81526001600160a01b0391821660048201526107da92919091169063d15e005390602401602060405180830381865afa1580156107af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d391906122c7565b8290611681565b91505090565b60015460029060ff16806107f35750303b155b806107ff575060005481115b6108625760405162461bcd60e51b815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201526d195b881a5b9a5d1a585b1a5e995960921b6064820152608401610652565b60015460ff16158015610881576001805460ff19168117905560008290555b604080518082019091526002815261373560f01b60208201526001600160a01b038e166108c15760405162461bcd60e51b81526004016106529190611f1b565b50604080518082019091526002815261373560f01b60208201526001600160a01b038d166109025760405162461bcd60e51b81526004016106529190611f1b565b50604080518082019091526002815261373560f01b60208201526001600160a01b038c166109435760405162461bcd60e51b81526004016106529190611f1b565b50604080518082019091526002815261373560f01b60208201526001600160a01b038b166109845760405162461bcd60e51b81526004016106529190611f1b565b50604080518082019091526002815261373560f01b602082015260ff8a166109bf5760405162461bcd60e51b81526004016106529190611f1b565b5060405146907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f906109f4908b908b906122e0565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c00160408051601f198184030181528282528051602091820120603b55601f8b01819004810283018101909152898252610aaa91908b908b90819084018382808284376000920191909152506116d892505050565b610ae987878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506116eb92505050565b6039805460ff191660ff8c161790558d603c60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508c603d60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508b603e60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a603f60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508d6001600160a01b03168c6001600160a01b03167fb19e051f8af41150ccccb3fc2c2d8d15f4a4cf434f32a559ba75fe73d6eea20b8f8e8e8e8e8e8e8e8e604051610be799989796959493929190612319565b60405180910390a3508015610c01576001805460ff191690555b50505050505050505050505050565b6001600160a01b038116600090815260346020526040812054610605565b6000610c3b8484846116fe565b6001600160a01b038416600090815260356020908152604080832033808552925290912054610c76918691610c7190869061239d565b6113f6565b826001600160a01b0316846001600160a01b031660008051602061244c83398151915284604051610ca991815260200190565b60405180910390a35060019392505050565b3360008181526035602090815260408083206001600160a01b03871684529091528120549091610601918590610c719086906123b4565b603c54604080518082019091526002815261323960f01b60208201526000916001600160a01b03163314610d395760405162461bcd60e51b81526004016106529190611f1b565b50603e54610d51906001600160a01b0316848461170b565b50919050565b603c54603e5460405163d15e005360e01b81526001600160a01b03918216600482015260009261060592169063d15e005390602401602060405180830381865afa158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd91906122c7565b6001600160a01b0384166000908152603460205260409020545b90611681565b6000610e01603f546001600160a01b031690565b905090565b603c546001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161323960f01b81525090610e565760405162461bcd60e51b81526004016106529190611f1b565b5081610e60575050565b603d546001600160a01b0316610e7f81610e7a858561151a565b61155e565b6040518381526001600160a01b0382169060009060008051602061244c8339815191529060200160405180910390a360408051848152602081018490526001600160a01b038316917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a2505b5050565b603c546001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161323960f01b81525090610f485760405162461bcd60e51b81526004016106529190611f1b565b505050565b60606038805461057190612292565b3360008181526035602090815260408083206001600160a01b03871684529091528120549091610601918590610c7190869061239d565b6000610fa03384846116fe565b6040518281526001600160a01b03841690339060008051602061244c8339815191529060200160405180910390a350600192915050565b6000610e0160365490565b6001600160a01b0387166110285760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b6044820152606401610652565b8342111561106d5760405162461bcd60e51b815260206004820152601260248201527124a72b20a624a22fa2ac2824a920aa24a7a760711b6044820152606401610652565b6001600160a01b0387166000908152603a60205260408120549061108f61175d565b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808d1692820192909252908a1660608201526080810189905260a0810184905260c0810188905260e0016040516020818303038152906040528051906020012060405160200161112892919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201206000845290830180835281905260ff8816918301919091526060820186905260808201859052915060019060a0016020604051602081039080840390855afa158015611190573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b0316146111ee5760405162461bcd60e51b8152602060048201526011602482015270494e56414c49445f5349474e415455524560781b6044820152606401610652565b6111f98260016123b4565b6001600160a01b038a166000908152603a602052604090205561121d8989896113f6565b505050505050505050565b603c546001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161323960f01b815250906112785760405162461bcd60e51b81526004016106529190611f1b565b506000611285838361151a565b60408051808201909152600281526106a760f31b6020820152909150816112bf5760405162461bcd60e51b81526004016106529190611f1b565b506112ca8582611809565b603e546112e1906001600160a01b0316858561170b565b6040518381526000906001600160a01b0387169060008051602061244c8339815191529060200160405180910390a3836001600160a01b0316856001600160a01b03167f5d624aa9c148153ab3446c1b154f660ee7701e549fe9b62dab7171b1c80e6fa2858560405161135e929190918252602082015260400190565b60405180910390a35050505050565b603c546001600160a01b0316336001600160a01b03161460405180604001604052806002815260200161323960f01b815250906113bd5760405162461bcd60e51b81526004016106529190611f1b565b5060405162461bcd60e51b815260206004820152600d60248201526c1393d517d4d5541413d4951151609a1b6044820152606401610652565b6001600160a01b0383166114585760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610652565b6001600160a01b0382166114b95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610652565b6001600160a01b0383811660008181526035602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000806115286002846123cc565b905082816115426b033b2e3c9fd0803ce8000000876123ee565b61154c91906123b4565b61155691906123cc565b949350505050565b6001600160a01b0382166115b45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610652565b6036546115c182826123b4565b6036556001600160a01b0383166000908152603460205260409020546115e783826123b4565b6001600160a01b03858116600090815260346020526040902091909155603f54161561167b57603f546040516318c39f1760e11b81526001600160a01b0386811660048301526024820185905260448201849052909116906331873e2e90606401600060405180830381600087803b15801561166257600080fd5b505af1158015611676573d6000803e3d6000fd5b505050505b50505050565b600082158061168e575081155b1561169b57506000610605565b6b033b2e3c9fd0803ce80000006116b36002826123cc565b6116bd84866123ee565b6116c791906123b4565b6116d191906123cc565b9392505050565b8051610ef4906037906020840190611e56565b8051610ef4906038906020840190611e56565b610f48838383600161189c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610f48908490611a61565b6000467f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611789610562565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018290523060a082015260c0016040516020818303038152906040528051906020012091505090565b6001600160a01b0382166118695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610652565b603654611876828261239d565b6036556001600160a01b0383166000908152603460205260409020546115e7838261239d565b603e54603c5460405163d15e005360e01b81526001600160a01b03928316600482018190529290911690600090829063d15e005390602401602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191591906122c7565b9050600061193c82610de78a6001600160a01b031660009081526034602052604090205490565b9050600061196383610de78a6001600160a01b031660009081526034602052604090205490565b905061197989896119748a8761151a565b611be8565b8515611a005760405163d5ed393360e01b81526001600160a01b0386811660048301528a811660248301528981166044830152606482018990526084820184905260a4820183905285169063d5ed39339060c401600060405180830381600087803b1580156119e757600080fd5b505af11580156119fb573d6000803e3d6000fd5b505050505b876001600160a01b0316896001600160a01b03167f4beccb90f994c31aced7a23b5611020728a23d8ec5cddd1a3e9d97b96fda86668986604051611a4e929190918252602082015260400190565b60405180910390a3505050505050505050565b611a73826001600160a01b0316611e1d565b611abf5760405162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006044820152606401610652565b600080836001600160a01b031683604051611ada919061240d565b6000604051808303816000865af19150503d8060008114611b17576040519150601f19603f3d011682016040523d82523d6000602084013e611b1c565b606091505b509150915081611b6e5760405162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646044820152606401610652565b80511561167b5780806020019051810190611b899190612429565b61167b5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610652565b6001600160a01b038316611c4c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610652565b6001600160a01b038216611cae5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610652565b6001600160a01b038316600090815260346020526040902054611cd1828261239d565b6001600160a01b03808616600090815260346020526040808220939093559085168152908120805491849190611d0783856123b4565b9091555050603f546001600160a01b031615611e1657603654603f546040516318c39f1760e11b81526001600160a01b0388811660048301526024820184905260448201869052909116906331873e2e90606401600060405180830381600087803b158015611d7557600080fd5b505af1158015611d89573d6000803e3d6000fd5b50505050846001600160a01b0316866001600160a01b031614611e1457603f546040516318c39f1760e11b81526001600160a01b0387811660048301526024820184905260448201859052909116906331873e2e90606401600060405180830381600087803b158015611dfb57600080fd5b505af1158015611e0f573d6000803e3d6000fd5b505050505b505b5050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611556575050151592915050565b828054611e6290612292565b90600052602060002090601f016020900481019282611e845760008555611eca565b82601f10611e9d57805160ff1916838001178555611eca565b82800160010185558215611eca579182015b82811115611eca578251825591602001919060010190611eaf565b50611ed6929150611eda565b5090565b5b80821115611ed65760008155600101611edb565b60005b83811015611f0a578181015183820152602001611ef2565b8381111561167b5750506000910152565b6020815260008251806020840152611f3a816040850160208701611eef565b601f01601f19169190910160400192915050565b6001600160a01b0381168114611f6357600080fd5b50565b8035611f7181611f4e565b919050565b60008060408385031215611f8957600080fd5b8235611f9481611f4e565b946020939093013593505050565b600060208284031215611fb457600080fd5b81356116d181611f4e565b600080600060608486031215611fd457600080fd5b8335611fdf81611f4e565b95602085013595506040909401359392505050565b803560ff81168114611f7157600080fd5b60008083601f84011261201757600080fd5b50813567ffffffffffffffff81111561202f57600080fd5b60208301915083602082850101111561204757600080fd5b9250929050565b60008060008060008060008060008060006101008c8e03121561207057600080fd5b6120798c611f66565b9a5061208760208d01611f66565b995061209560408d01611f66565b98506120a360608d01611f66565b97506120b160808d01611ff4565b965067ffffffffffffffff8060a08e013511156120cd57600080fd5b6120dd8e60a08f01358f01612005565b909750955060c08d01358110156120f357600080fd5b6121038e60c08f01358f01612005565b909550935060e08d013581101561211957600080fd5b5061212a8d60e08e01358e01612005565b81935080925050509295989b509295989b9093969950565b60008060006060848603121561215757600080fd5b833561216281611f4e565b9250602084013561217281611f4e565b929592945050506040919091013590565b6000806040838503121561219657600080fd5b50508035926020909101359150565b600080600080600080600060e0888a0312156121c057600080fd5b87356121cb81611f4e565b965060208801356121db81611f4e565b955060408801359450606088013593506121f760808901611ff4565b925060a0880135915060c0880135905092959891949750929550565b6000806000806080858703121561222957600080fd5b843561223481611f4e565b9350602085013561224481611f4e565b93969395505050506040820135916060013590565b6000806040838503121561226c57600080fd5b823561227781611f4e565b9150602083013561228781611f4e565b809150509250929050565b600181811c908216806122a657607f821691505b60208210811415610d5157634e487b7160e01b600052602260045260246000fd5b6000602082840312156122d957600080fd5b5051919050565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b038a811682528916602082015260ff8816604082015260c06060820181905260009061234f908301888a6122f0565b82810360808401526123628187896122f0565b905082810360a08401526123778185876122f0565b9c9b505050505050505050505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156123af576123af612387565b500390565b600082198211156123c7576123c7612387565b500190565b6000826123e957634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561240857612408612387565b500290565b6000825161241f818460208701611eef565b9190910192915050565b60006020828403121561243b57600080fd5b815180151581146116d157600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202c04a4d382cc6509a16849d3ce197641b64c0010b8cd5d312aa19e246df2c75d64736f6c634300080a0033
Deployed Bytecode Sourcemap
65288:13862:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58423:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60560:161;;;;;;;;;;-1:-1:-1;60560:161:0;;;;;:::i;:::-;;:::i;:::-;;;1425:14:1;;1418:22;1400:41;;1388:2;1373:18;60560:161:0;1260:187:1;72831:190:0;;;;;;;;;;-1:-1:-1;72831:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;59129:18:0;72936:7;59129:18;;;:9;:18;;;;;;58954:12;;59129:18;;72831:190;;;;;1878:25:1;;;1934:2;1919:18;;1912:34;;;;1851:18;72831:190:0;1704:248:1;69927:465:0;;;;;;:::i;:::-;;:::i;73247:308::-;;;;;;;;;;;;;:::i;:::-;;;2491:25:1;;;2479:2;2464:18;73247:308:0;2345:177:1;67115:1475:0;;;;;;;;;;-1:-1:-1;67115:1475:0;;;;;:::i;:::-;;:::i;:::-;;72462:121;;;;;;;;;;-1:-1:-1;72462:121:0;;;;;:::i;:::-;;:::i;61063:329::-;;;;;;;;;;-1:-1:-1;61063:329:0;;;;;:::i;:::-;;:::i;58719:86::-;;;;;;;;;;-1:-1:-1;58790:9:0;;58719:86;;58790:9;;;;5071:36:1;;5059:2;5044:18;58719:86:0;4929:184:1;65989:31:0;;;;;;;;;;;;;;;;61646:207;;;;;;;;;;-1:-1:-1;61646:207:0;;;;;:::i;:::-;;:::i;75490:236::-;;;;;;:::i;:::-;;:::i;71929:222::-;;;;;;;;;;-1:-1:-1;71929:222:0;;;;;:::i;:::-;;:::i;74502:76::-;;;;;;;;;;-1:-1:-1;74567:5:0;;-1:-1:-1;;;;;74567:5:0;74502:76;;;-1:-1:-1;;;;;5484:32:1;;;5466:51;;5454:2;5439:18;74502:76:0;5300:223:1;75011:142:0;;;;;;;;;;;;;:::i;70610:635::-;;;;;;:::i;:::-;;:::i;75955:91::-;;;;;;;;;;-1:-1:-1;75955:91:0;;;;;:::i;:::-;;:::i;58568:90::-;;;;;;;;;;;;;:::i;62117:233::-;;;;;;;;;;-1:-1:-1;62117:233:0;;;;;:::i;:::-;;:::i;59714:220::-;;;;;;;;;;-1:-1:-1;59714:220:0;;;;;:::i;:::-;;:::i;73979:95::-;;;;;;;;;;-1:-1:-1;74059:9:0;;-1:-1:-1;;;;;74059:9:0;73979:95;;74247:111;;;;;;;;;;-1:-1:-1;74336:16:0;;-1:-1:-1;;;;;74336:16:0;74247:111;;73712:115;;;;;;;;;;;;;:::i;65940:42::-;;;;;;;;;;-1:-1:-1;65940:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;76521:746;;;;;;;;;;-1:-1:-1;76521:746:0;;;;;:::i;:::-;;:::i;69049:491::-;;;;;;:::i;:::-;;:::i;60208:173::-;;;;;;;;;;-1:-1:-1;60208:173:0;;;;;:::i;:::-;-1:-1:-1;;;;;60348:18:0;;;60322:7;60348:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;60208:173;71542:170;;;;;;:::i;:::-;;:::i;58423:86::-;58469:13;58498:5;58491:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58423:86;:::o;60560:161::-;60645:4;60658:39;57541:10;60681:7;60690:6;60658:8;:39::i;:::-;-1:-1:-1;60711:4:0;60560:161;;;;;:::o;69927:465::-;66259:5;;66267:37;;;;;;;;;;;;-1:-1:-1;;;66267:37:0;;;;-1:-1:-1;;;;;;;66259:5:0;57541:10;66235:30;66227:78;;;;-1:-1:-1;;;66227:78:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;;59129:18:0;;70070:23:::1;59129:18:::0;;;:9;:18;;;;;;;70149:20:::1;:6:::0;70163:5;70149:13:::1;:20::i;:::-;70203:29;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;70203:29:0::1;::::0;::::1;::::0;70126:43;;-1:-1:-1;70184:17:0;70176:57:::1;;;;-1:-1:-1::0;;;70176:57:0::1;;;;;;;;:::i;:::-;;70240:25;70246:4;70252:12;70240:5;:25::i;:::-;70279:34;::::0;2491:25:1;;;-1:-1:-1;;;;;70279:34:0;::::1;::::0;70296:1:::1;::::0;-1:-1:-1;;;;;;;;;;;70279:34:0;2479:2:1;2464:18;70279:34:0::1;;;;;;;70325:25;::::0;;1878::1;;;1934:2;1919:18;;1912:34;;;-1:-1:-1;;;;;70325:25:0;::::1;::::0;::::1;::::0;1851:18:1;70325:25:0::1;;;;;;;-1:-1:-1::0;70366:20:0;;69927:465;-1:-1:-1;;;;69927:465:0:o;73247:308::-;73327:7;73343:27;73373:19;58954:12;;;58870:102;73373:19;73343:49;-1:-1:-1;73405:24:0;73401:55;;73447:1;73440:8;;;73247:308;:::o;73401:55::-;73498:5;;73531:16;;73498:50;;-1:-1:-1;;;73498:50:0;;-1:-1:-1;;;;;73531:16:0;;;73498:50;;;5466:51:1;73471:78:0;;73498:5;;;;;:32;;5439:18:1;;73498:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73471:19;;:26;:78::i;:::-;73464:85;;;73247:308;:::o;67115:1475::-;56022:12;;65868:3;;56022:12;;;:31;;-1:-1:-1;57276:9:0;57264:22;57306:7;56038:15;56022:69;;;;56068:23;;56057:8;:34;56022:69;56006:149;;;;-1:-1:-1;;;56006:149:0;;8671:2:1;56006:149:0;;;8653:21:1;8710:2;8690:18;;;8683:30;8749:34;8729:18;;;8722:62;-1:-1:-1;;;8800:18:1;;;8793:44;8854:19;;56006:149:0;8469:410:1;56006:149:0;56187:12;;;;56186:13;56206:99;;;;56250:4;56235:19;;-1:-1:-1;;56235:19:0;;;;;:12;56263:34;;;56206:99;67469:32:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;67469:32:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;67440:27:0;::::1;67432:70;;;;-1:-1:-1::0;;;67432:70:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;67541:32:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;67541:32:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;67517:22:0;::::1;67509:65;;;;-1:-1:-1::0;;;67509:65:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;67620:32:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;67620:32:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;67589:29:0;::::1;67581:72;;;;-1:-1:-1::0;;;67581:72:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;67713:32:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;67713:32:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;67668:43:0;::::1;67660:86;;;;-1:-1:-1::0;;;67660:86:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;67782:32:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;67782:32:0::1;::::0;::::1;::::0;67761:19:::1;::::0;::::1;67753:62;;;;-1:-1:-1::0;;;67753:62:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;68015:28:0::1;::::0;67909:9:::1;::::0;65575:95:::1;::::0;68015:28:::1;::::0;68031:10;;;;68015:28:::1;:::i;:::-;;::::0;;;;;::::1;::::0;;65513:10;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;65513:10:0::1;::::0;;::::1;::::0;67970:161;;;;::::1;9419:25:1::0;;;;9460:18;;9453:34;;;;68054:26:0;9503:18:1;;;9496:34;9546:18;;;9539:34;;;68117:4:0::1;9589:19:1::0;;;9582:61;9391:19;;67970:161:0::1;::::0;;-1:-1:-1;;67970:161:0;;::::1;::::0;;;;;;67952:186;;67970:161:::1;67952:186:::0;;::::1;::::0;67933:16:::1;:205:::0;68147:20:::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;67970:161;68156:10;;;;;;68147:20;::::1;68156:10:::0;;;;68147:20;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;68147:8:0::1;::::0;-1:-1:-1;;;68147:20:0:i:1;:::-;68174:24;68185:12;;68174:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;68174:10:0::1;::::0;-1:-1:-1;;;68174:24:0:i:1;:::-;64974:9:::0;:23;;-1:-1:-1;;64974:23:0;;;;;;;68250:4:::1;68242:5;;:12;;;;;-1:-1:-1::0;;;;;68242:12:0::1;;;;;-1:-1:-1::0;;;;;68242:12:0::1;;;;;;68273:8;68261:9;;:20;;;;;-1:-1:-1::0;;;;;68261:20:0::1;;;;;-1:-1:-1::0;;;;;68261:20:0::1;;;;;;68307:15;68288:16;;:34;;;;;-1:-1:-1::0;;;;;68288:34:0::1;;;;;-1:-1:-1::0;;;;;68288:34:0::1;;;;;;68353:20;68329:21;;:44;;;;;-1:-1:-1::0;;;;;68329:44:0::1;;;;;-1:-1:-1::0;;;;;68329:44:0::1;;;;;;68439:4;-1:-1:-1::0;;;;;68387:197:0::1;68407:15;-1:-1:-1::0;;;;;68387:197:0::1;;68453:8;68478:20;68508:14;68531:10;;68550:12;;68571:6;;68387:197;;;;;;;;;;;;;;:::i;:::-;;;;;;;;67425:1165;56327:14:::0;56323:57;;;56352:12;:20;;-1:-1:-1;;56352:20:0;;;56323:57;55960:425;;67115:1475;;;;;;;;;;;:::o;72462:121::-;-1:-1:-1;;;;;59129:18:0;;72533:7;59129:18;;;:9;:18;;;;;;72556:21;59032:121;61063:329;61191:4;61204:36;61214:6;61222:9;61233:6;61204:9;:36::i;:::-;-1:-1:-1;;;;;61278:19:0;;;;;;:11;:19;;;;;;;;57541:10;61278:33;;;;;;;;;61247:74;;61256:6;;61278:42;;61314:6;;61278:42;:::i;:::-;61247:8;:74::i;:::-;61350:9;-1:-1:-1;;;;;61333:35:0;61342:6;-1:-1:-1;;;;;61333:35:0;-1:-1:-1;;;;;;;;;;;61361:6:0;61333:35;;;;2491:25:1;;2479:2;2464:18;;2345:177;61333:35:0;;;;;;;;-1:-1:-1;61382:4:0;61063:329;;;;;:::o;61646:207::-;57541:10;61736:4;61781:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;61781:34:0;;;;;;;;;;61736:4;;61749:80;;61772:7;;61781:47;;61818:10;;61781:47;:::i;75490:236::-;66259:5;;66267:37;;;;;;;;;;;;-1:-1:-1;;;66267:37:0;;;;-1:-1:-1;;;;;;;66259:5:0;57541:10;66235:30;66227:78;;;;-1:-1:-1;;;66227:78:0;;;;;;;;:::i;:::-;-1:-1:-1;75654:16:0::1;::::0;75647:53:::1;::::0;-1:-1:-1;;;;;75654:16:0::1;75685:6:::0;75693;75647:37:::1;:53::i;:::-;-1:-1:-1::0;75714:6:0;75490:236;-1:-1:-1;75490:236:0:o;71929:222::-;72094:5;;72127:16;;72094:50;;-1:-1:-1;;;72094:50:0;;-1:-1:-1;;;;;72127:16:0;;;72094:50;;;5466:51:1;72039:7:0;;72065:80;;72094:5;;:32;;5439:18:1;;72094:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;59129:18:0;;59106:7;59129:18;;;:9;:18;;;;;;72065:21;:28;;:80::i;75011:142::-;75078:27;75121:26;74848:21;;-1:-1:-1;;;;;74848:21:0;;74737:138;75121:26;75114:33;;75011:142;:::o;70610:635::-;66259:5;;-1:-1:-1;;;;;66259:5:0;57541:10;-1:-1:-1;;;;;66235:30:0;;66267:37;;;;;;;;;;;;;-1:-1:-1;;;66267:37:0;;;66227:78;;;;;-1:-1:-1;;;66227:78:0;;;;;;;;:::i;:::-;-1:-1:-1;70718:11:0;70714:40:::1;;70610:635:::0;;:::o;70714:40::-:1;70781:9;::::0;-1:-1:-1;;;;;70781:9:0::1;71109:37;70781:9:::0;71125:20:::1;:6:::0;71139:5;71125:13:::1;:20::i;:::-;71109:5;:37::i;:::-;71160:38;::::0;2491:25:1;;;-1:-1:-1;;;;;71160:38:0;::::1;::::0;71177:1:::1;::::0;-1:-1:-1;;;;;;;;;;;71160:38:0;2479:2:1;2464:18;71160:38:0::1;;;;;;;71210:29;::::0;;1878:25:1;;;1934:2;1919:18;;1912:34;;;-1:-1:-1;;;;;71210:29:0;::::1;::::0;::::1;::::0;1851:18:1;71210:29:0::1;;;;;;;70707:538;66312:1;70610:635:::0;;:::o;75955:91::-;66259:5;;-1:-1:-1;;;;;66259:5:0;57541:10;-1:-1:-1;;;;;66235:30:0;;66267:37;;;;;;;;;;;;;-1:-1:-1;;;66267:37:0;;;66227:78;;;;;-1:-1:-1;;;66227:78:0;;;;;;;;:::i;:::-;;75955:91;;:::o;58568:90::-;58616:13;58645:7;58638:14;;;;;:::i;62117:233::-;57541:10;62225:4;62273:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;62273:34:0;;;;;;;;;;62225:4;;62241:85;;62264:7;;62273:52;;62310:15;;62273:52;:::i;59714:220::-;59802:4;59815:42;57541:10;59839:9;59850:6;59815:9;:42::i;:::-;59869:41;;2491:25:1;;;-1:-1:-1;;;;;59869:41:0;;;57541:10;;-1:-1:-1;;;;;;;;;;;59869:41:0;2479:2:1;2464:18;59869:41:0;;;;;;;-1:-1:-1;59924:4:0;59714:220;;;;:::o;73712:115::-;73779:7;73802:19;58954:12;;;58870:102;76521:746;-1:-1:-1;;;;;76697:19:0;;76689:45;;;;-1:-1:-1;;;76689:45:0;;11433:2:1;76689:45:0;;;11415:21:1;11472:2;11452:18;;;11445:30;-1:-1:-1;;;11491:18:1;;;11484:43;11544:18;;76689:45:0;11231:337:1;76689:45:0;76800:8;76781:15;:27;;76773:58;;;;-1:-1:-1;;;76773:58:0;;11775:2:1;76773:58:0;;;11757:21:1;11814:2;11794:18;;;11787:30;-1:-1:-1;;;11833:18:1;;;11826:48;11891:18;;76773:58:0;11573:342:1;76773:58:0;-1:-1:-1;;;;;76866:14:0;;76838:25;76866:14;;;:7;:14;;;;;;;76970:19;:17;:19::i;:::-;77010:79;;;65723:95;77010:79;;;12207:25:1;-1:-1:-1;;;;;12306:15:1;;;12286:18;;;12279:43;;;;12358:15;;;12338:18;;;12331:43;12390:18;;;12383:34;;;12433:19;;;12426:35;;;12477:19;;;12470:35;;;12179:19;;77010:79:0;;;;;;;;;;;;77000:90;;;;;;76922:177;;;;;;;;-1:-1:-1;;;12774:27:1;;12826:1;12817:11;;12810:27;;;;12862:2;12853:12;;12846:28;12899:2;12890:12;;12516:392;76922:177:0;;;;-1:-1:-1;;76922:177:0;;;;;;;;;76904:202;;76922:177;76904:202;;;;77130:26;;;;;;;;;13140:25:1;;;13213:4;13201:17;;13181:18;;;13174:45;;;;13235:18;;;13228:34;;;13278:18;;;13271:34;;;76904:202:0;-1:-1:-1;77130:26:0;;13112:19:1;;77130:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77121:35:0;:5;-1:-1:-1;;;;;77121:35:0;;77113:65;;;;-1:-1:-1;;;77113:65:0;;13518:2:1;77113:65:0;;;13500:21:1;13557:2;13537:18;;;13530:30;-1:-1:-1;;;13576:18:1;;;13569:47;13633:18;;77113:65:0;13316:341:1;77113:65:0;77202:21;:17;77222:1;77202:21;:::i;:::-;-1:-1:-1;;;;;77185:14:0;;;;;;:7;:14;;;;;:38;77230:31;77193:5;77246:7;77255:5;77230:8;:31::i;:::-;76682:585;;76521:746;;;;;;;:::o;69049:491::-;66259:5;;-1:-1:-1;;;;;66259:5:0;57541:10;-1:-1:-1;;;;;66235:30:0;;66267:37;;;;;;;;;;;;;-1:-1:-1;;;66267:37:0;;;66227:78;;;;;-1:-1:-1;;;66227:78:0;;;;;;;;:::i;:::-;-1:-1:-1;69212:20:0::1;69235;:6:::0;69249:5;69235:13:::1;:20::i;:::-;69289:29;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;69289:29:0::1;::::0;::::1;::::0;69212:43;;-1:-1:-1;69270:17:0;69262:57:::1;;;;-1:-1:-1::0;;;69262:57:0::1;;;;;;;;:::i;:::-;;69326:25;69332:4;69338:12;69326:5;:25::i;:::-;69367:16;::::0;69360:67:::1;::::0;-1:-1:-1;;;;;69367:16:0::1;69398:20:::0;69420:6;69360:37:::1;:67::i;:::-;69441:34;::::0;2491:25:1;;;69464:1:0::1;::::0;-1:-1:-1;;;;;69441:34:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;69441:34:0;2479:2:1;2464:18;69441:34:0::1;;;;;;;69498:20;-1:-1:-1::0;;;;;69487:47:0::1;69492:4;-1:-1:-1::0;;;;;69487:47:0::1;;69520:6;69528:5;69487:47;;;;;;1878:25:1::0;;;1934:2;1919:18;;1912:34;1866:2;1851:18;;1704:248;69487:47:0::1;;;;;;;;69205:335;69049:491:::0;;;;:::o;71542:170::-;66259:5;;-1:-1:-1;;;;;66259:5:0;57541:10;-1:-1:-1;;;;;66235:30:0;;66267:37;;;;;;;;;;;;;-1:-1:-1;;;66267:37:0;;;66227:78;;;;;-1:-1:-1;;;66227:78:0;;;;;;;;:::i;:::-;-1:-1:-1;71683:23:0::1;::::0;-1:-1:-1;;;71683:23:0;;13864:2:1;71683:23:0::1;::::0;::::1;13846:21:1::0;13903:2;13883:18;;;13876:30;-1:-1:-1;;;13922:18:1;;;13915:43;13975:18;;71683:23:0::1;13662:337:1::0;64387:348:0;-1:-1:-1;;;;;64505:19:0;;64497:68;;;;-1:-1:-1;;;64497:68:0;;14206:2:1;64497:68:0;;;14188:21:1;14245:2;14225:18;;;14218:30;14284:34;14264:18;;;14257:62;-1:-1:-1;;;14335:18:1;;;14328:34;14379:19;;64497:68:0;14004:400:1;64497:68:0;-1:-1:-1;;;;;64580:21:0;;64572:68;;;;-1:-1:-1;;;64572:68:0;;14611:2:1;64572:68:0;;;14593:21:1;14650:2;14630:18;;;14623:30;14689:34;14669:18;;;14662:62;-1:-1:-1;;;14740:18:1;;;14733:32;14782:19;;64572:68:0;14409:398:1;64572:68:0;-1:-1:-1;;;;;64649:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;64697:32;;2491:25:1;;;64697:32:0;;2464:18:1;64697:32:0;;;;;;;64387:348;;;:::o;54851:141::-;54912:7;;54944:5;54948:1;54944;:5;:::i;:::-;54928:21;-1:-1:-1;54985:1:0;54928:21;54966:7;53111:4;54966:1;:7;:::i;:::-;:15;;;;:::i;:::-;54965:21;;;;:::i;:::-;54958:28;54851:141;-1:-1:-1;;;;54851:141:0:o;63245:564::-;-1:-1:-1;;;;;63325:21:0;;63317:65;;;;-1:-1:-1;;;63317:65:0;;15409:2:1;63317:65:0;;;15391:21:1;15448:2;15428:18;;;15421:30;15487:33;15467:18;;;15460:61;15538:18;;63317:65:0;15207:355:1;63317:65:0;63474:12;;63508:23;63525:6;63474:12;63508:23;:::i;:::-;63493:12;:38;-1:-1:-1;;;;;63568:18:0;;63540:25;63568:18;;;:9;:18;;;;;;63614:26;63634:6;63568:18;63614:26;:::i;:::-;-1:-1:-1;;;;;63593:18:0;;;;;;;:9;:18;;;;;:47;;;;74848:21;;;63653:49;63649:155;;74848:21;;63713:83;;-1:-1:-1;;;63713:83:0;;-1:-1:-1;;;;;15787:32:1;;;63713:83:0;;;15769:51:1;15836:18;;;15829:34;;;15879:18;;;15872:34;;;74848:21:0;;;;63713:39;;15742:18:1;;63713:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63649:155;63310:499;;63245:564;;:::o;54520:168::-;54581:7;54601:6;;;:16;;-1:-1:-1;54611:6:0;;54601:16;54597:47;;;-1:-1:-1;54635:1:0;54628:8;;54597:47;53111:4;53156:7;53162:1;53111:4;53156:7;:::i;:::-;54660:5;54664:1;54660;:5;:::i;:::-;:15;;;;:::i;:::-;54659:23;;;;:::i;:::-;54652:30;54520:168;-1:-1:-1;;;54520:168:0:o;64741:78::-;64798:15;;;;:5;;:15;;;;;:::i;64825:86::-;64886:19;;;;:7;;:19;;;;;:::i;78509:145::-;78615:33;78625:4;78631:2;78635:6;78643:4;78615:9;:33::i;5115:190::-;5240:58;;;-1:-1:-1;;;;;16109:32:1;;5240:58:0;;;16091:51:1;16158:18;;;;16151:34;;;5240:58:0;;;;;;;;;;16064:18:1;;;;5240:58:0;;;;;;;;-1:-1:-1;;;;;5240:58:0;-1:-1:-1;;;5240:58:0;;;5214:85;;5233:5;;5214:18;:85::i;78752:395::-;78804:7;78905:9;65575:95;79028:6;:4;:6::i;:::-;79012:24;;;;;;;65513:10;;;;;;;;;;;-1:-1:-1;;;65513:10:0;;;;78963:169;;;;;9419:25:1;;;;9460:18;;;9453:34;;;;79049:26:0;9503:18:1;;;9496:34;9546:18;;;9539:34;;;79116:4:0;9589:19:1;;;9582:61;9391:19;;78963:169:0;;;;;;;;;;;;78943:198;;;;;;78929:212;;;78752:395;:::o;63815:566::-;-1:-1:-1;;;;;63895:21:0;;63887:67;;;;-1:-1:-1;;;63887:67:0;;16398:2:1;63887:67:0;;;16380:21:1;16437:2;16417:18;;;16410:30;16476:34;16456:18;;;16449:62;-1:-1:-1;;;16527:18:1;;;16520:31;16568:19;;63887:67:0;16196:397:1;63887:67:0;64046:12;;64080:23;64097:6;64046:12;64080:23;:::i;:::-;64065:12;:38;-1:-1:-1;;;;;64140:18:0;;64112:25;64140:18;;;:9;:18;;;;;;64186:26;64206:6;64140:18;64186:26;:::i;77620:649::-;77763:16;;77806:5;;77836:48;;-1:-1:-1;;;77836:48:0;;-1:-1:-1;;;;;77763:16:0;;;77836:48;;;5466:51:1;;;77763:16:0;77806:5;;;;77737:23;;77806:5;;77836:31;;5439:18:1;;77836:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77820:64;;77893:25;77921:35;77950:5;77921:21;77937:4;-1:-1:-1;;;;;59129:18:0;59106:7;59129:18;;;:9;:18;;;;;;;59032:121;77921:35;77893:63;;77963:23;77989:33;78016:5;77989:19;78005:2;-1:-1:-1;;;;;59129:18:0;59106:7;59129:18;;;:9;:18;;;;;;;59032:121;77989:33;77963:59;-1:-1:-1;78031:47:0;78047:4;78053:2;78057:20;:6;78071:5;78057:13;:20::i;:::-;78031:15;:47::i;:::-;78091:8;78087:123;;;78110:92;;-1:-1:-1;;;78110:92:0;;-1:-1:-1;;;;;16941:15:1;;;78110:92:0;;;16923:34:1;16993:15;;;16973:18;;;16966:43;17045:15;;;17025:18;;;17018:43;17077:18;;;17070:34;;;17120:19;;;17113:35;;;17164:19;;;17157:35;;;78110:21:0;;;;;16857:19:1;;78110:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78087:123;78245:2;-1:-1:-1;;;;;78223:40:0;78239:4;-1:-1:-1;;;;;78223:40:0;;78249:6;78257:5;78223:40;;;;;;1878:25:1;;;1934:2;1919:18;;1912:34;1866:2;1851:18;;1704:248;78223:40:0;;;;;;;;77730:539;;;;;77620:649;;;;:::o;5901:568::-;5985:27;5993:5;-1:-1:-1;;;;;5985:25:0;;:27::i;:::-;5977:71;;;;-1:-1:-1;;;5977:71:0;;17405:2:1;5977:71:0;;;17387:21:1;17444:2;17424:18;;;17417:30;17483:33;17463:18;;;17456:61;17534:18;;5977:71:0;17203:355:1;5977:71:0;6114:12;6128:23;6163:5;-1:-1:-1;;;;;6155:19:0;6175:4;6155:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6113:67;;;;6195:7;6187:52;;;;-1:-1:-1;;;6187:52:0;;18044:2:1;6187:52:0;;;18026:21:1;;;18063:18;;;18056:30;18122:34;18102:18;;;18095:62;18174:18;;6187:52:0;17842:356:1;6187:52:0;6252:17;;:22;6248:216;;6390:10;6379:30;;;;;;;;;;;;:::i;:::-;6371:85;;;;-1:-1:-1;;;6371:85:0;;18687:2:1;6371:85:0;;;18669:21:1;18726:2;18706:18;;;18699:30;18765:34;18745:18;;;18738:62;-1:-1:-1;;;18816:18:1;;;18809:40;18866:19;;6371:85:0;18485:406:1;62356:883:0;-1:-1:-1;;;;;62478:20:0;;62470:70;;;;-1:-1:-1;;;62470:70:0;;19098:2:1;62470:70:0;;;19080:21:1;19137:2;19117:18;;;19110:30;19176:34;19156:18;;;19149:62;-1:-1:-1;;;19227:18:1;;;19220:35;19272:19;;62470:70:0;18896:401:1;62470:70:0;-1:-1:-1;;;;;62555:23:0;;62547:71;;;;-1:-1:-1;;;62547:71:0;;19504:2:1;62547:71:0;;;19486:21:1;19543:2;19523:18;;;19516:30;19582:34;19562:18;;;19555:62;-1:-1:-1;;;19633:18:1;;;19626:33;19676:19;;62547:71:0;19302:399:1;62547:71:0;-1:-1:-1;;;;;62710:17:0;;62683:24;62710:17;;;:9;:17;;;;;;62754:25;62773:6;62710:17;62754:25;:::i;:::-;-1:-1:-1;;;;;62734:17:0;;;;;;;:9;:17;;;;;;:45;;;;62816:20;;;;;;;;;;;62867:6;;62816:20;62843:30;62867:6;62816:20;62843:30;:::i;:::-;;;;-1:-1:-1;;74848:21:0;;-1:-1:-1;;;;;74848:21:0;62886:49;62882:352;;62975:12;;74848:21;;62996:85;;-1:-1:-1;;;62996:85:0;;-1:-1:-1;;;;;15787:32:1;;;62996:85:0;;;15769:51:1;15836:18;;;15829:34;;;15879:18;;;15872:34;;;74848:21:0;;;;62996:39;;15742:18:1;;62996:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63104:9;-1:-1:-1;;;;;63094:19:0;:6;-1:-1:-1;;;;;63094:19:0;;63090:137;;74848:21;;63126:91;;-1:-1:-1;;;63126:91:0;;-1:-1:-1;;;;;15787:32:1;;;63126:91:0;;;15769:51:1;15836:18;;;15829:34;;;15879:18;;;15872:34;;;74848:21:0;;;;63126:39;;15742:18:1;;63126:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63090:137;62937:297;62882:352;62463:776;;62356:883;;;:::o;3178:597::-;3238:4;3685:20;;3529:66;3726:23;;;;;;:42;;-1:-1:-1;;3753:15:0;;;3718:51;-1:-1:-1;;3178:597:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:258:1;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:131::-;-1:-1:-1;;;;;740:31:1;;730:42;;720:70;;786:1;783;776:12;720:70;665:131;:::o;801:134::-;869:20;;898:31;869:20;898:31;:::i;:::-;801:134;;;:::o;940:315::-;1008:6;1016;1069:2;1057:9;1048:7;1044:23;1040:32;1037:52;;;1085:1;1082;1075:12;1037:52;1124:9;1111:23;1143:31;1168:5;1143:31;:::i;:::-;1193:5;1245:2;1230:18;;;;1217:32;;-1:-1:-1;;;940:315:1:o;1452:247::-;1511:6;1564:2;1552:9;1543:7;1539:23;1535:32;1532:52;;;1580:1;1577;1570:12;1532:52;1619:9;1606:23;1638:31;1663:5;1638:31;:::i;1957:383::-;2034:6;2042;2050;2103:2;2091:9;2082:7;2078:23;2074:32;2071:52;;;2119:1;2116;2109:12;2071:52;2158:9;2145:23;2177:31;2202:5;2177:31;:::i;:::-;2227:5;2279:2;2264:18;;2251:32;;-1:-1:-1;2330:2:1;2315:18;;;2302:32;;1957:383;-1:-1:-1;;;1957:383:1:o;2527:156::-;2593:20;;2653:4;2642:16;;2632:27;;2622:55;;2673:1;2670;2663:12;2688:348;2740:8;2750:6;2804:3;2797:4;2789:6;2785:17;2781:27;2771:55;;2822:1;2819;2812:12;2771:55;-1:-1:-1;2845:20:1;;2888:18;2877:30;;2874:50;;;2920:1;2917;2910:12;2874:50;2957:4;2949:6;2945:17;2933:29;;3009:3;3002:4;2993:6;2985;2981:19;2977:30;2974:39;2971:59;;;3026:1;3023;3016:12;2971:59;2688:348;;;;;:::o;3041:1422::-;3252:6;3260;3268;3276;3284;3292;3300;3308;3316;3324;3332:7;3386:3;3374:9;3365:7;3361:23;3357:33;3354:53;;;3403:1;3400;3393:12;3354:53;3426:29;3445:9;3426:29;:::i;:::-;3416:39;;3474:38;3508:2;3497:9;3493:18;3474:38;:::i;:::-;3464:48;;3531:38;3565:2;3554:9;3550:18;3531:38;:::i;:::-;3521:48;;3588:38;3622:2;3611:9;3607:18;3588:38;:::i;:::-;3578:48;;3645:37;3677:3;3666:9;3662:19;3645:37;:::i;:::-;3635:47;;3701:18;3769:2;3762:3;3751:9;3747:19;3734:33;3731:41;3728:61;;;3785:1;3782;3775:12;3728:61;3824:86;3902:7;3894:3;3883:9;3879:19;3866:33;3855:9;3851:49;3824:86;:::i;:::-;3929:8;;-1:-1:-1;3956:8:1;-1:-1:-1;4007:3:1;3992:19;;3979:33;3976:41;-1:-1:-1;3973:61:1;;;4030:1;4027;4020:12;3973:61;4069:86;4147:7;4139:3;4128:9;4124:19;4111:33;4100:9;4096:49;4069:86;:::i;:::-;4174:8;;-1:-1:-1;4201:8:1;-1:-1:-1;4252:3:1;4237:19;;4224:33;4221:41;-1:-1:-1;4218:61:1;;;4275:1;4272;4265:12;4218:61;;4315:86;4393:7;4385:3;4374:9;4370:19;4357:33;4346:9;4342:49;4315:86;:::i;:::-;4420:8;4410:18;;4448:9;4437:20;;;;3041:1422;;;;;;;;;;;;;;:::o;4468:456::-;4545:6;4553;4561;4614:2;4602:9;4593:7;4589:23;4585:32;4582:52;;;4630:1;4627;4620:12;4582:52;4669:9;4656:23;4688:31;4713:5;4688:31;:::i;:::-;4738:5;-1:-1:-1;4795:2:1;4780:18;;4767:32;4808:33;4767:32;4808:33;:::i;:::-;4468:456;;4860:7;;-1:-1:-1;;;4914:2:1;4899:18;;;;4886:32;;4468:456::o;5772:248::-;5840:6;5848;5901:2;5889:9;5880:7;5876:23;5872:32;5869:52;;;5917:1;5914;5907:12;5869:52;-1:-1:-1;;5940:23:1;;;6010:2;5995:18;;;5982:32;;-1:-1:-1;5772:248:1:o;6233:734::-;6344:6;6352;6360;6368;6376;6384;6392;6445:3;6433:9;6424:7;6420:23;6416:33;6413:53;;;6462:1;6459;6452:12;6413:53;6501:9;6488:23;6520:31;6545:5;6520:31;:::i;:::-;6570:5;-1:-1:-1;6627:2:1;6612:18;;6599:32;6640:33;6599:32;6640:33;:::i;:::-;6692:7;-1:-1:-1;6746:2:1;6731:18;;6718:32;;-1:-1:-1;6797:2:1;6782:18;;6769:32;;-1:-1:-1;6820:37:1;6852:3;6837:19;;6820:37;:::i;:::-;6810:47;;6904:3;6893:9;6889:19;6876:33;6866:43;;6956:3;6945:9;6941:19;6928:33;6918:43;;6233:734;;;;;;;;;;:::o;6972:525::-;7058:6;7066;7074;7082;7135:3;7123:9;7114:7;7110:23;7106:33;7103:53;;;7152:1;7149;7142:12;7103:53;7191:9;7178:23;7210:31;7235:5;7210:31;:::i;:::-;7260:5;-1:-1:-1;7317:2:1;7302:18;;7289:32;7330:33;7289:32;7330:33;:::i;:::-;6972:525;;7382:7;;-1:-1:-1;;;;7436:2:1;7421:18;;7408:32;;7487:2;7472:18;7459:32;;6972:525::o;7502:388::-;7570:6;7578;7631:2;7619:9;7610:7;7606:23;7602:32;7599:52;;;7647:1;7644;7637:12;7599:52;7686:9;7673:23;7705:31;7730:5;7705:31;:::i;:::-;7755:5;-1:-1:-1;7812:2:1;7797:18;;7784:32;7825:33;7784:32;7825:33;:::i;:::-;7877:7;7867:17;;;7502:388;;;;;:::o;7895:380::-;7974:1;7970:12;;;;8017;;;8038:61;;8092:4;8084:6;8080:17;8070:27;;8038:61;8145:2;8137:6;8134:14;8114:18;8111:38;8108:161;;;8191:10;8186:3;8182:20;8179:1;8172:31;8226:4;8223:1;8216:15;8254:4;8251:1;8244:15;8280:184;8350:6;8403:2;8391:9;8382:7;8378:23;8374:32;8371:52;;;8419:1;8416;8409:12;8371:52;-1:-1:-1;8442:16:1;;8280:184;-1:-1:-1;8280:184:1:o;8884:271::-;9067:6;9059;9054:3;9041:33;9023:3;9093:16;;9118:13;;;9093:16;8884:271;-1:-1:-1;8884:271:1:o;9654:267::-;9743:6;9738:3;9731:19;9795:6;9788:5;9781:4;9776:3;9772:14;9759:43;-1:-1:-1;9847:1:1;9822:16;;;9840:4;9818:27;;;9811:38;;;;9903:2;9882:15;;;-1:-1:-1;;9878:29:1;9869:39;;;9865:50;;9654:267::o;9926:905::-;-1:-1:-1;;;;;10317:15:1;;;10299:34;;10369:15;;10364:2;10349:18;;10342:43;10433:4;10421:17;;10416:2;10401:18;;10394:45;10475:3;10470:2;10455:18;;10448:31;;;10242:4;;10502:63;;10545:19;;10537:6;10529;10502:63;:::i;:::-;10614:9;10606:6;10602:22;10596:3;10585:9;10581:19;10574:51;10648:50;10691:6;10683;10675;10648:50;:::i;:::-;10634:64;;10747:9;10739:6;10735:22;10729:3;10718:9;10714:19;10707:51;10775:50;10818:6;10810;10802;10775:50;:::i;:::-;10767:58;9926:905;-1:-1:-1;;;;;;;;;;;;9926:905:1:o;10836:127::-;10897:10;10892:3;10888:20;10885:1;10878:31;10928:4;10925:1;10918:15;10952:4;10949:1;10942:15;10968:125;11008:4;11036:1;11033;11030:8;11027:34;;;11041:18;;:::i;:::-;-1:-1:-1;11078:9:1;;10968:125::o;11098:128::-;11138:3;11169:1;11165:6;11162:1;11159:13;11156:39;;;11175:18;;:::i;:::-;-1:-1:-1;11211:9:1;;11098:128::o;14812:217::-;14852:1;14878;14868:132;;14922:10;14917:3;14913:20;14910:1;14903:31;14957:4;14954:1;14947:15;14985:4;14982:1;14975:15;14868:132;-1:-1:-1;15014:9:1;;14812:217::o;15034:168::-;15074:7;15140:1;15136;15132:6;15128:14;15125:1;15122:21;15117:1;15110:9;15103:17;15099:45;15096:71;;;15147:18;;:::i;:::-;-1:-1:-1;15187:9:1;;15034:168::o;17563:274::-;17692:3;17730:6;17724:13;17746:53;17792:6;17787:3;17780:4;17772:6;17768:17;17746:53;:::i;:::-;17815:16;;;;;17563:274;-1:-1:-1;;17563:274:1:o;18203:277::-;18270:6;18323:2;18311:9;18302:7;18298:23;18294:32;18291:52;;;18339:1;18336;18329:12;18291:52;18371:9;18365:16;18424:5;18417:13;18410:21;18403:5;18400:32;18390:60;;18446:1;18443;18436:12
Swarm Source
ipfs://2c04a4d382cc6509a16849d3ce197641b64c0010b8cd5d312aa19e246df2c75d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.