Contract Overview
Balance:
0 CELO
CELO Value:
$0.00
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xd2e84b12f1122fa2bb21e8eb6aff463ec3c3666dd4ecaebbc89967a976471d9e | 0x60806040 | 16420217 | 191 days 14 hrs ago | 0x643c574128c7c56a1835e021ad0ecc2592e72624 | IN | Create: ATokenV4 | 0 CELO | 0.0019818225 |
[ Download CSV Export ]
Contract Name:
ATokenV4
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at celoscan.io on 2022-11-30 */ pragma solidity 0.6.12; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/dependencies/openzeppelin/contracts/SafeMath.sol /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/dependencies/openzeppelin/contracts/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, 'Address: insufficient balance'); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } } // File contracts/dependencies/openzeppelin/contracts/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } 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'); } } } // File contracts/interfaces/ILendingPoolAddressesProvider.sol /** * @title LendingPoolAddressesProvider contract * @dev Main registry of addresses part of or connected to the protocol, including permissioned roles * - Acting also as factory of proxies and admin of those, so with right to change its implementations * - Owned by the Aave Governance * @author Aave **/ interface ILendingPoolAddressesProvider { event MarketIdSet(string newMarketId); event LendingPoolUpdated(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; function setAddress(bytes32 id, address newAddress) external; function setAddressAsProxy(bytes32 id, address impl) external; function getAddress(bytes32 id) external view returns (address); function getLendingPool() external view returns (address); function setLendingPoolImpl(address pool) external; function getLendingPoolConfigurator() external view returns (address); function setLendingPoolConfiguratorImpl(address configurator) external; function getLendingPoolCollateralManager() external view returns (address); function setLendingPoolCollateralManager(address manager) external; function getPoolAdmin() external view returns (address); function setPoolAdmin(address admin) external; function getEmergencyAdmin() external view returns (address); function setEmergencyAdmin(address admin) external; function getPriceOracle() external view returns (address); function setPriceOracle(address priceOracle) external; function getLendingRateOracle() external view returns (address); function setLendingRateOracle(address lendingRateOracle) external; } // File contracts/protocol/libraries/types/DataTypes.sol 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; //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 } } // File contracts/interfaces/ILendingPool.sol pragma experimental ABIEncoderV2; 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 swapBorrowRateMode() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user swapping his rate mode * @param rateMode The rate mode that the user wants to swap to **/ event Swap(address indexed reserve, address indexed user, uint256 rateMode); /** * @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 rebalanceStableBorrowRate() * @param reserve The address of the underlying asset of the reserve * @param user The address of the user for which the rebalance has been executed **/ event RebalanceStableBorrowRate(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 * @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 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 * @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 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` * @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 * @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 a borrower to swap his debt between stable and variable mode, or viceversa * @param asset The address of the underlying asset borrowed * @param rateMode The rate mode that the user wants to swap to **/ function swapBorrowRateMode(address asset, uint256 rateMode) external; /** * @dev Rebalances the stable interest rate of a user to the current stable rate defined on the reserve. * - Users can be rebalanced if the following conditions are satisfied: * 1. Usage ratio is above 95% * 2. the current deposit APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too much has been * borrowed at a stable rate and depositors are not earning enough * @param asset The address of the underlying asset borrowed * @param user The address of the user to be rebalanced **/ function rebalanceStableBorrowRate(address asset, address user) external; /** * @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 * @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 Allows smartcontracts to access the liquidity of the pool within one transaction, * as long as the amount taken plus a fee is returned. * IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept into consideration. * For further details please visit https://developers.aave.com * @param receiverAddress The address of the contract receiving the funds, implementing the IFlashLoanReceiver interface * @param assets The addresses of the assets being flash-borrowed * @param amounts The amounts amounts being flash-borrowed * @param modes Types of the debt to open if the flash loan is not returned: * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 * @param params Variadic packed params to pass to the receiver as extra information * @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 flashLoan( address receiverAddress, address[] calldata assets, uint256[] calldata amounts, uint256[] calldata modes, address onBehalfOf, bytes calldata params, uint16 referralCode ) 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 ); function initReserve( address reserve, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress ) external; function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress) external; function setConfiguration(address reserve, uint256 configuration) external; /** * @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); function finalizeTransfer( address asset, address from, address to, uint256 amount, uint256 balanceFromAfter, uint256 balanceToBefore ) external; function getReservesList() external view returns (address[] memory); function getAddressesProvider() external view returns (ILendingPoolAddressesProvider); function setPause(bool val) external; function paused() external view returns (bool); } // File contracts/interfaces/IScaledBalanceToken.sol 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); } // File contracts/interfaces/IAaveIncentivesController.sol interface IAaveIncentivesController { function handleAction( address user, uint256 userBalance, uint256 totalSupply ) external; } // File contracts/interfaces/IInitializableAToken.sol /** * @title IInitializableAToken * @notice Interface for the initialize function on AToken * @author Aave **/ 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 Aave 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, IAaveIncentivesController incentivesController, uint8 aTokenDecimals, string calldata aTokenName, string calldata aTokenSymbol, bytes calldata params ) external; } // File contracts/interfaces/IAToken.sol 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 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; /** * @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; /** * @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; /** * @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 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 (IAaveIncentivesController); /** * @dev Returns the address of the Aave treasury, receiving the fees on this aToken **/ function RESERVE_TREASURY_ADDRESS() external view returns (address); } // File contracts/protocol/libraries/helpers/Errors.sol /** * @title Errors library * @author Aave * @notice Defines the error messages emitted by the different contracts of the Aave protocol * @dev Error messages prefix glossary: * - VL = ValidationLogic * - MATH = Math libraries * - CT = Common errors between tokens (AToken, VariableDebtToken and StableDebtToken) * - AT = AToken * - SDT = StableDebtToken * - VDT = VariableDebtToken * - LP = LendingPool * - LPAPR = LendingPoolAddressesProviderRegistry * - LPC = LendingPoolConfiguration * - RL = ReserveLogic * - LPCM = LendingPoolCollateralManager * - P = Pausable */ library Errors { //common errors string public constant CALLER_NOT_POOL_ADMIN = '33'; // 'The caller must be the pool admin' string public constant BORROW_ALLOWANCE_NOT_ENOUGH = '59'; // User borrows on behalf, but allowance are too small //contract specific errors string public constant VL_INVALID_AMOUNT = '1'; // 'Amount must be greater than 0' string public constant VL_NO_ACTIVE_RESERVE = '2'; // 'Action requires an active reserve' string public constant VL_RESERVE_FROZEN = '3'; // 'Action cannot be performed because the reserve is frozen' string public constant VL_CURRENT_AVAILABLE_LIQUIDITY_NOT_ENOUGH = '4'; // 'The current liquidity is not enough' string public constant VL_NOT_ENOUGH_AVAILABLE_USER_BALANCE = '5'; // 'User cannot withdraw more than the available balance' string public constant VL_TRANSFER_NOT_ALLOWED = '6'; // 'Transfer cannot be allowed.' string public constant VL_BORROWING_NOT_ENABLED = '7'; // 'Borrowing is not enabled' string public constant VL_INVALID_INTEREST_RATE_MODE_SELECTED = '8'; // 'Invalid interest rate mode selected' string public constant VL_COLLATERAL_BALANCE_IS_0 = '9'; // 'The collateral balance is 0' string public constant VL_HEALTH_FACTOR_LOWER_THAN_LIQUIDATION_THRESHOLD = '10'; // 'Health factor is lesser than the liquidation threshold' string public constant VL_COLLATERAL_CANNOT_COVER_NEW_BORROW = '11'; // 'There is not enough collateral to cover a new borrow' string public constant VL_STABLE_BORROWING_NOT_ENABLED = '12'; // stable borrowing not enabled string public constant VL_COLLATERAL_SAME_AS_BORROWING_CURRENCY = '13'; // collateral is (mostly) the same currency that is being borrowed string public 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 public 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 public 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 public constant VL_NO_STABLE_RATE_LOAN_IN_RESERVE = '17'; // 'User does not have a stable rate loan in progress on this reserve' string public constant VL_NO_VARIABLE_RATE_LOAN_IN_RESERVE = '18'; // 'User does not have a variable rate loan in progress on this reserve' string public constant VL_UNDERLYING_BALANCE_NOT_GREATER_THAN_0 = '19'; // 'The underlying balance needs to be greater than 0' string public constant VL_DEPOSIT_ALREADY_IN_USE = '20'; // 'User deposit is already being used as collateral' string public constant LP_NOT_ENOUGH_STABLE_BORROW_BALANCE = '21'; // 'User does not have any stable rate loan for this reserve' string public constant LP_INTEREST_RATE_REBALANCE_CONDITIONS_NOT_MET = '22'; // 'Interest rate rebalance conditions were not met' string public constant LP_LIQUIDATION_CALL_FAILED = '23'; // 'Liquidation call failed' string public constant LP_NOT_ENOUGH_LIQUIDITY_TO_BORROW = '24'; // 'There is not enough liquidity available to borrow' string public constant LP_REQUESTED_AMOUNT_TOO_SMALL = '25'; // 'The requested amount is too small for a FlashLoan.' string public constant LP_INCONSISTENT_PROTOCOL_ACTUAL_BALANCE = '26'; // 'The actual balance of the protocol is inconsistent' string public constant LP_CALLER_NOT_LENDING_POOL_CONFIGURATOR = '27'; // 'The caller of the function is not the lending pool configurator' string public constant LP_INCONSISTENT_FLASHLOAN_PARAMS = '28'; string public constant CT_CALLER_MUST_BE_LENDING_POOL = '29'; // 'The caller of this function must be a lending pool' string public constant CT_CANNOT_GIVE_ALLOWANCE_TO_HIMSELF = '30'; // 'User cannot give allowance to himself' string public constant CT_TRANSFER_AMOUNT_NOT_GT_0 = '31'; // 'Transferred amount needs to be greater than zero' string public constant RL_RESERVE_ALREADY_INITIALIZED = '32'; // 'Reserve has already been initialized' string public constant LPC_RESERVE_LIQUIDITY_NOT_0 = '34'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_ATOKEN_POOL_ADDRESS = '35'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_STABLE_DEBT_TOKEN_POOL_ADDRESS = '36'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_VARIABLE_DEBT_TOKEN_POOL_ADDRESS = '37'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_STABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = '38'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_VARIABLE_DEBT_TOKEN_UNDERLYING_ADDRESS = '39'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_ADDRESSES_PROVIDER_ID = '40'; // 'The liquidity of the reserve needs to be 0' string public constant LPC_INVALID_CONFIGURATION = '75'; // 'Invalid risk parameters for the reserve' string public constant LPC_CALLER_NOT_EMERGENCY_ADMIN = '76'; // 'The caller must be the emergency admin' string public constant LPAPR_PROVIDER_NOT_REGISTERED = '41'; // 'Provider is not registered' string public constant LPCM_HEALTH_FACTOR_NOT_BELOW_THRESHOLD = '42'; // 'Health factor is not below the threshold' string public constant LPCM_COLLATERAL_CANNOT_BE_LIQUIDATED = '43'; // 'The collateral chosen cannot be liquidated' string public constant LPCM_SPECIFIED_CURRENCY_NOT_BORROWED_BY_USER = '44'; // 'User did not borrow the specified currency' string public constant LPCM_NOT_ENOUGH_LIQUIDITY_TO_LIQUIDATE = '45'; // "There isn't enough liquidity available to liquidate" string public constant LPCM_NO_ERRORS = '46'; // 'No errors' string public constant LP_INVALID_FLASHLOAN_MODE = '47'; //Invalid flashloan mode selected string public constant MATH_MULTIPLICATION_OVERFLOW = '48'; string public constant MATH_ADDITION_OVERFLOW = '49'; string public constant MATH_DIVISION_BY_ZERO = '50'; string public constant RL_LIQUIDITY_INDEX_OVERFLOW = '51'; // Liquidity index overflows uint128 string public constant RL_VARIABLE_BORROW_INDEX_OVERFLOW = '52'; // Variable borrow index overflows uint128 string public constant RL_LIQUIDITY_RATE_OVERFLOW = '53'; // Liquidity rate overflows uint128 string public constant RL_VARIABLE_BORROW_RATE_OVERFLOW = '54'; // Variable borrow rate overflows uint128 string public constant RL_STABLE_BORROW_RATE_OVERFLOW = '55'; // Stable borrow rate overflows uint128 string public constant CT_INVALID_MINT_AMOUNT = '56'; //invalid amount to mint string public constant LP_FAILED_REPAY_WITH_COLLATERAL = '57'; string public constant CT_INVALID_BURN_AMOUNT = '58'; //invalid amount to burn string public constant LP_FAILED_COLLATERAL_SWAP = '60'; string public constant LP_INVALID_EQUAL_ASSETS_TO_SWAP = '61'; string public constant LP_REENTRANCY_NOT_ALLOWED = '62'; string public constant LP_CALLER_MUST_BE_AN_ATOKEN = '63'; string public constant LP_IS_PAUSED = '64'; // 'Pool is paused' string public constant LP_NO_MORE_RESERVES_ALLOWED = '65'; string public constant LP_INVALID_FLASH_LOAN_EXECUTOR_RETURN = '66'; string public constant RC_INVALID_LTV = '67'; string public constant RC_INVALID_LIQ_THRESHOLD = '68'; string public constant RC_INVALID_LIQ_BONUS = '69'; string public constant RC_INVALID_DECIMALS = '70'; string public constant RC_INVALID_RESERVE_FACTOR = '71'; string public constant LPAPR_INVALID_ADDRESSES_PROVIDER_ID = '72'; string public constant VL_INCONSISTENT_FLASHLOAN_PARAMS = '73'; string public constant LP_INCONSISTENT_PARAMS_LENGTH = '74'; string public constant UL_INVALID_INDEX = '77'; string public constant LP_NOT_CONTRACT = '78'; string public constant SDT_STABLE_DEBT_OVERFLOW = '79'; string public constant SDT_BURN_EXCEEDS_BALANCE = '80'; 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 } } // File contracts/protocol/libraries/math/WadRayMath.sol /** * @title WadRayMath library * @author Aave * @dev Provides mul and div function for wads (decimal numbers with 18 digits precision) and rays (decimals with 27 digits) **/ library WadRayMath { 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; } require(a <= (type(uint256).max - halfWAD) / b, Errors.MATH_MULTIPLICATION_OVERFLOW); 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) { require(b != 0, Errors.MATH_DIVISION_BY_ZERO); uint256 halfB = b / 2; require(a <= (type(uint256).max - halfB) / WAD, Errors.MATH_MULTIPLICATION_OVERFLOW); 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; } require(a <= (type(uint256).max - halfRAY) / b, Errors.MATH_MULTIPLICATION_OVERFLOW); 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) { require(b != 0, Errors.MATH_DIVISION_BY_ZERO); uint256 halfB = b / 2; require(a <= (type(uint256).max - halfB) / RAY, Errors.MATH_MULTIPLICATION_OVERFLOW); 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; require(result >= halfRatio, Errors.MATH_ADDITION_OVERFLOW); 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; require(result / WAD_RAY_RATIO == a, Errors.MATH_MULTIPLICATION_OVERFLOW); return result; } } // File contracts/protocol/libraries/aave-upgradeability/VersionedInitializable.sol /** * @title VersionedInitializable * * @dev Helper contract to implement initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. * * @author Aave, inspired by the OpenZeppelin Initializable contract */ abstract contract VersionedInitializable { /** * @dev Indicates that the contract has been initialized. */ uint256 private lastInitializedRevision = 0; /** * @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. **/ function getRevision() internal pure virtual returns (uint256); /** * @dev Returns true if and 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; } // File contracts/dependencies/openzeppelin/contracts/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File contracts/dependencies/openzeppelin/contracts/IERC20Detailed.sol interface IERC20Detailed is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } // File contracts/protocol/tokenization/IncentivizedERC20.sol /** * @title ERC20 * @notice Basic ERC20 implementation * @author Aave, inspired by the Openzeppelin ERC20 implementation **/ abstract contract IncentivizedERC20 is Context, IERC20, IERC20Detailed { using SafeMath for uint256; 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 ) public { _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 (IAaveIncentivesController); /** * @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) public 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) public 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 ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, 'ERC20: transfer amount exceeds allowance') ); 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) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(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].sub( subtractedValue, 'ERC20: decreased allowance below zero' ) ); 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.sub(amount, 'ERC20: transfer amount exceeds balance'); uint256 oldRecipientBalance = _balances[recipient]; _balances[recipient] = _balances[recipient].add(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.add(amount); uint256 oldAccountBalance = _balances[account]; _balances[account] = oldAccountBalance.add(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.sub(amount); uint256 oldAccountBalance = _balances[account]; _balances[account] = oldAccountBalance.sub(amount, 'ERC20: burn amount exceeds balance'); 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 {} } // File contracts/protocol/tokenization/AToken.sol /** * @title Aave ERC20 AToken * @dev Implementation of the interest bearing token for the Aave protocol * @author Aave */ contract ATokenV4 is VersionedInitializable, IncentivizedERC20('ATOKEN_IMPL', 'ATOKEN_IMPL', 0), IAToken { using WadRayMath for uint256; using SafeERC20 for IERC20; bytes public constant EIP712_REVISION = bytes('1'); bytes32 internal constant EIP712_DOMAIN = keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); bytes32 public constant PERMIT_TYPEHASH = keccak256('Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'); uint256 public constant ATOKEN_REVISION = 0x4; /// @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; IAaveIncentivesController 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 * @param pool The address of the lending pool where this aToken will be used * @param treasury The address of the Aave 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, IAaveIncentivesController incentivesController, uint8 aTokenDecimals, string calldata aTokenName, string calldata aTokenSymbol, bytes calldata params ) external override initializer { 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` * - Only callable by the 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 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` * - Only callable by the 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 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 * - Only callable by the 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 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 Transfers aTokens in the event of a borrow being liquidated, in case the liquidators reclaims the aToken * - Only callable by the 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 override onlyLendingPool { // Being a normal transfer, the Transfer() and BalanceTransfer() are emitted // so no need to emit a specific event here _transfer(from, to, value, false); emit Transfer(from, to, value); } /** * @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 Aave treasury, receiving the fees on this aToken **/ function RESERVE_TREASURY_ADDRESS() public view override returns (address) { return _treasury; } /** * @dev Returns the address of the underlying asset of this aToken (E.g. WETH for aWETH) **/ function UNDERLYING_ASSET_ADDRESS() public view returns (address) { return _underlyingAsset; } /** * @dev Returns the address of the lending pool where this aToken is used **/ function POOL() public view returns (ILendingPool) { return _pool; } /** * @dev For internal usage in the logic of the parent contract IncentivizedERC20 **/ function _getIncentivesController() internal view override returns (IAaveIncentivesController) { return _incentivesController; } /** * @dev Returns the address of the incentives controller contract **/ function getIncentivesController() external view override returns (IAaveIncentivesController) { return _getIncentivesController(); } /** * @dev Transfers the underlying asset to `target`. Used by the LendingPool to transfer * assets in borrow(), withdraw() and flashLoan() * @param target The recipient of the aTokens * @param amount The amount getting transferred * @return The amount transferred **/ function transferUnderlyingTo(address target, uint256 amount) external override onlyLendingPool returns (uint256) { IERC20(_underlyingAsset).safeTransfer(target, amount); return amount; } /** * @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 override onlyLendingPool {} /** * @dev implements the permit function as for * https://github.com/ethereum/EIPs/blob/8a34d644aacf0f9f8f00815307fd7dd5da07655f/EIPS/eip-2612.md * @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.add(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); } }
[{"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":"ATOKEN_REVISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EIP712_REVISION","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","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":"nonpayable","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 IAaveIncentivesController","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 IAaveIncentivesController","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"mintToTreasury","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferUnderlyingTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600080553480156200001557600080fd5b506040518060400160405280600b81526020017f41544f4b454e5f494d504c0000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f41544f4b454e5f494d504c000000000000000000000000000000000000000000815250600082603790805190602001906200009c929190620000da565b508160389080519060200190620000b5929190620000da565b5080603960006101000a81548160ff021916908360ff16021790555050505062000180565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200011d57805160ff19168380011785556200014e565b828001600101855582156200014e579182015b828111156200014d57825182559160200191906001019062000130565b5b5090506200015d919062000161565b5090565b5b808211156200017c57600081600090555060010162000162565b5090565b61462880620001906000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80637535d2461161010f578063ae167335116100a2578063d505accf11610071578063d505accf146105d5578063d7020d0a146105f1578063dd62ed3e1461060d578063f866c3191461063d576101e5565b8063ae1673351461054b578063b16a19de14610569578063b1bf962d14610587578063b9844d8d146105a5576101e5565b806388dd91a1116100de57806388dd91a1146104b157806395d89b41146104cd578063a457c2d7146104eb578063a9059cbb1461051b576101e5565b80637535d2461461043b57806375d264131461045957806378160376146104775780637df5bd3b14610495576101e5565b80631da24f3e116101875780633644e515116101565780633644e5151461038d57806339509351146103ab5780634efecaa5146103db57806370a082311461040b576101e5565b80631da24f3e146102f157806323b872dd1461032157806330adf81f14610351578063313ce5671461036f576101e5565b80630bd7ad3b116101c35780630bd7ad3b14610269578063156e29f61461028757806318160ddd146102b7578063183fb413146102d5576101e5565b806306fdde03146101ea578063095ea7b3146102085780630afbcdc914610238575b600080fd5b6101f2610659565b6040516101ff9190614105565b60405180910390f35b610222600480360381019061021d9190613532565b6106fb565b60405161022f9190613f7e565b60405180910390f35b610252600480360381019061024d919061337d565b610719565b604051610260929190614302565b60405180910390f35b610271610736565b60405161027e91906142e7565b60405180910390f35b6102a1600480360381019061029c919061356e565b61073b565b6040516102ae9190613f7e565b60405180910390f35b6102bf61097d565b6040516102cc91906142e7565b60405180910390f35b6102ef60048036038101906102ea91906135e6565b610a83565b005b61030b6004803603810190610306919061337d565b610e31565b60405161031891906142e7565b60405180910390f35b61033b600480360381019061033691906133e2565b610e43565b6040516103489190613f7e565b60405180910390f35b610359610f81565b6040516103669190613f99565b60405180910390f35b610377610fa5565b604051610384919061432b565b60405180910390f35b610395610fbc565b6040516103a29190613f99565b60405180910390f35b6103c560048036038101906103c09190613532565b610fc2565b6040516103d29190613f7e565b60405180910390f35b6103f560048036038101906103f09190613532565b611075565b60405161040291906142e7565b60405180910390f35b6104256004803603810190610420919061337d565b61119d565b60405161043291906142e7565b60405180910390f35b61044361128d565b60405161045091906140ea565b60405180910390f35b6104616112b7565b60405161046e91906140cf565b60405180910390f35b61047f6112c6565b60405161048c91906140ad565b60405180910390f35b6104af60048036038101906104aa9190613717565b6112ff565b005b6104cb60048036038101906104c69190613532565b6114dc565b005b6104d56115b0565b6040516104e29190614105565b60405180910390f35b61050560048036038101906105009190613532565b611652565b6040516105129190613f7e565b60405180910390f35b61053560048036038101906105309190613532565b61171f565b6040516105429190613f7e565b60405180910390f35b6105536117a9565b6040516105609190613e26565b60405180910390f35b6105716117d3565b60405161057e9190613e26565b60405180910390f35b61058f6117fd565b60405161059c91906142e7565b60405180910390f35b6105bf60048036038101906105ba919061337d565b61180c565b6040516105cc91906142e7565b60405180910390f35b6105ef60048036038101906105ea9190613494565b611824565b005b61060b60048036038101906106069190613431565b611ac3565b005b610627600480360381019061062291906133a6565b611d52565b60405161063491906142e7565b60405180910390f35b610657600480360381019061065291906133e2565b611dd9565b005b606060378054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106f15780601f106106c6576101008083540402835291602001916106f1565b820191906000526020600020905b8154815290600101906020018083116106d457829003601f168201915b5050505050905090565b600061070f610708611f20565b8484611f28565b6001905092915050565b600080610725836120f3565b61072d61213c565b91509150915091565b600481565b6000603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661077e611f20565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600281526020017f32390000000000000000000000000000000000000000000000000000000000008152509061080c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108039190614105565b60405180910390fd5b506000610818856120f3565b9050600061082f848661214690919063ffffffff16565b905060008114156040518060400160405280600281526020017f3536000000000000000000000000000000000000000000000000000000000000815250906108ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a49190614105565b60405180910390fd5b506108b886826122a9565b8573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161091691906142e7565b60405180910390a38573ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f8686604051610966929190614302565b60405180910390a260008214925050509392505050565b60008061098861213c565b9050600081141561099d576000915050610a80565b610a7c603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d15e0053603e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401610a1d9190613e26565b60206040518083038186803b158015610a3557600080fd5b505afa158015610a49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6d91906136ee565b8261249790919063ffffffff16565b9150505b90565b6000610a8d6125ab565b9050600160009054906101000a900460ff1680610aae5750610aad6125b4565b5b80610aba575060005481115b610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af0906141c7565b60405180910390fd5b6000600160009054906101000a900460ff161590508015610b365760018060006101000a81548160ff021916908315150217905550816000819055505b60004690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8989604051610b6c929190613dbf565b60405180910390206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001208330604051602001610bc7959493929190614015565b60405160208183030381529060405280519060200120603b81905550610c3089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506125c5565b610c7d87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506125df565b610c868a6125f9565b8d603c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508c603d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508b603e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508a603f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508d73ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167fb19e051f8af41150ccccb3fc2c2d8d15f4a4cf434f32a559ba75fe73d6eea20b8f8e8e8e8e8e8e8e8e604051610df799989796959493929190613ea2565b60405180910390a3508015610e22576000600160006101000a81548160ff0219169083151502179055505b50505050505050505050505050565b6000610e3c826120f3565b9050919050565b6000610e50848484612617565b610f1184610e5c611f20565b610f0c856040518060600160405280602881526020016145a660289139603560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ec2611f20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126299092919063ffffffff16565b611f28565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f6e91906142e7565b60405180910390a3600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000603960009054906101000a900460ff16905090565b603b5481565b600061106b610fcf611f20565b846110668560356000610fe0611f20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461268490919063ffffffff16565b611f28565b6001905092915050565b6000603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166110b8611f20565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600281526020017f323900000000000000000000000000000000000000000000000000000000000081525090611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d9190614105565b60405180910390fd5b506111948383603e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126d99092919063ffffffff16565b81905092915050565b6000611286603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d15e0053603e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b815260040161121f9190613e26565b60206040518083038186803b15801561123757600080fd5b505afa15801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f91906136ee565b611278846120f3565b61249790919063ffffffff16565b9050919050565b6000603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006112c161275f565b905090565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611340611f20565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600281526020017f3239000000000000000000000000000000000000000000000000000000000000815250906113ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c59190614105565b60405180910390fd5b5060008214156113dd576114d8565b6000603d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506114208161141b848661214690919063ffffffff16565b6122a9565b8073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161147e91906142e7565b60405180910390a38073ffffffffffffffffffffffffffffffffffffffff167f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f84846040516114ce929190614302565b60405180910390a2505b5050565b603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661151d611f20565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600281526020017f3239000000000000000000000000000000000000000000000000000000000000815250906115ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a29190614105565b60405180910390fd5b505050565b606060388054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116485780601f1061161d57610100808354040283529160200191611648565b820191906000526020600020905b81548152906001019060200180831161162b57829003601f168201915b5050505050905090565b600061171561165f611f20565b84611710856040518060600160405280602581526020016145ce6025913960356000611689611f20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126299092919063ffffffff16565b611f28565b6001905092915050565b600061173361172c611f20565b8484612617565b8273ffffffffffffffffffffffffffffffffffffffff16611752611f20565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161179791906142e7565b60405180910390a36001905092915050565b6000603d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000603e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061180761213c565b905090565b603a6020528060005260406000206000915090505481565b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188b90614207565b60405180910390fd5b834211156118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce906141e7565b60405180910390fd5b6000603a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000603b547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a868b60405160200161195b96959493929190613fb4565b60405160208183030381529060405280519060200120604051602001611982929190613def565b604051602081830303815290604052805190602001209050600181868686604051600081526020016040526040516119bd9493929190614068565b6020604051602081039080840390855afa1580156119df573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d906141a7565b60405180910390fd5b611a6a60018361268490919063ffffffff16565b603a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ab8898989611f28565b505050505050505050565b603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611b04611f20565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600281526020017f323900000000000000000000000000000000000000000000000000000000000081525090611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b899190614105565b60405180910390fd5b506000611ba8828461214690919063ffffffff16565b905060008114156040518060400160405280600281526020017f353800000000000000000000000000000000000000000000000000000000000081525090611c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1d9190614105565b60405180910390fd5b50611c318582612789565b611c7e8484603e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126d99092919063ffffffff16565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611cdc91906142e7565b60405180910390a38373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f5d624aa9c148153ab3446c1b154f660ee7701e549fe9b62dab7171b1c80e6fa28585604051611d43929190614302565b60405180910390a35050505050565b6000603560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e1a611f20565b73ffffffffffffffffffffffffffffffffffffffff16146040518060400160405280600281526020017f323900000000000000000000000000000000000000000000000000000000000081525090611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f9190614105565b60405180910390fd5b50611eb68383836000612991565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f1391906142e7565b60405180910390a3505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8f90614267565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fff90614147565b60405180910390fd5b80603560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120e691906142e7565b60405180910390a3505050565b6000603460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000603654905090565b6000808214156040518060400160405280600281526020017f3530000000000000000000000000000000000000000000000000000000000000815250906121c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ba9190614105565b60405180910390fd5b506000600283816121d057fe5b0490506b033b2e3c9fd0803ce8000000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038161220a57fe5b048411156040518060400160405280600281526020017f343800000000000000000000000000000000000000000000000000000000000081525090612285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227c9190614105565b60405180910390fd5b5082816b033b2e3c9fd0803ce80000008602018161229f57fe5b0491505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612319576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612310906142c7565b60405180910390fd5b61232560008383612bb5565b6000603654905061233f828261268490919063ffffffff16565b6036819055506000603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061239c838261268490919063ffffffff16565b603460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff166123ff61275f565b73ffffffffffffffffffffffffffffffffffffffff16146124915761242261275f565b73ffffffffffffffffffffffffffffffffffffffff166331873e2e8584846040518463ffffffff1660e01b815260040161245e93929190613f47565b600060405180830381600087803b15801561247857600080fd5b505af115801561248c573d6000803e3d6000fd5b505050505b50505050565b6000808314806124a75750600082145b156124b557600090506125a5565b8160026b033b2e3c9fd0803ce8000000816124cc57fe5b047fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03816124f657fe5b048311156040518060400160405280600281526020017f343800000000000000000000000000000000000000000000000000000000000081525090612571576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125689190614105565b60405180910390fd5b506b033b2e3c9fd0803ce800000060026b033b2e3c9fd0803ce80000008161259557fe5b0483850201816125a157fe5b0490505b92915050565b60006004905090565b600080303b90506000811491505090565b80603790805190602001906125db9291906131a4565b5050565b80603890805190602001906125f59291906131a4565b5050565b80603960006101000a81548160ff021916908360ff16021790555050565b6126248383836001612991565b505050565b6000838311158290612671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126689190614105565b60405180910390fd5b5060008385039050809150509392505050565b6000808284019050838110156126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c690614167565b60405180910390fd5b8091505092915050565b61275a8363a9059cbb60e01b84846040516024016126f8929190613f1e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612bba565b505050565b6000603f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090614227565b60405180910390fd5b61280582600083612bb5565b6000603654905061281f8282612d2c90919063ffffffff16565b6036819055506000603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506128968360405180606001604052806022815260200161455e60229139836126299092919063ffffffff16565b603460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff166128f961275f565b73ffffffffffffffffffffffffffffffffffffffff161461298b5761291c61275f565b73ffffffffffffffffffffffffffffffffffffffff166331873e2e8584846040518463ffffffff1660e01b815260040161295893929190613f47565b600060405180830381600087803b15801561297257600080fd5b505af1158015612986573d6000803e3d6000fd5b505050505b50505050565b6000603e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000603c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663d15e0053846040518263ffffffff1660e01b8152600401612a1a9190613e26565b60206040518083038186803b158015612a3257600080fd5b505afa158015612a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6a91906136ee565b90506000612a8982612a7b8a6120f3565b61249790919063ffffffff16565b90506000612aa883612a9a8a6120f3565b61249790919063ffffffff16565b9050612ac78989612ac2868b61214690919063ffffffff16565b612d76565b8515612b43578373ffffffffffffffffffffffffffffffffffffffff1663d5ed3933868b8b8b87876040518763ffffffff1660e01b8152600401612b1096959493929190613e41565b600060405180830381600087803b158015612b2a57600080fd5b505af1158015612b3e573d6000803e3d6000fd5b505050505b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167f4beccb90f994c31aced7a23b5611020728a23d8ec5cddd1a3e9d97b96fda86668986604051612ba2929190614302565b60405180910390a3505050505050505050565b505050565b612bd98273ffffffffffffffffffffffffffffffffffffffff16613159565b612c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0f906142a7565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051612c419190613dd8565b6000604051808303816000865af19150503d8060008114612c7e576040519150601f19603f3d011682016040523d82523d6000602084013e612c83565b606091505b509150915081612cc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cbf90614187565b60405180910390fd5b600081511115612d265780806020019051810190612ce691906135bd565b612d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1c90614287565b60405180910390fd5b5b50505050565b6000612d6e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612629565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd90614247565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4d90614127565b60405180910390fd5b612e61838383612bb5565b6000603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612ed28260405180606001604052806026815260200161458060269139836126299092919063ffffffff16565b603460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000603460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050612fab83603460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461268490919063ffffffff16565b603460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff1661300e61275f565b73ffffffffffffffffffffffffffffffffffffffff1614613152576000603654905061303861275f565b73ffffffffffffffffffffffffffffffffffffffff166331873e2e8783866040518463ffffffff1660e01b815260040161307493929190613f47565b600060405180830381600087803b15801561308e57600080fd5b505af11580156130a2573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613150576130e161275f565b73ffffffffffffffffffffffffffffffffffffffff166331873e2e8683856040518463ffffffff1660e01b815260040161311d93929190613f47565b600060405180830381600087803b15801561313757600080fd5b505af115801561314b573d6000803e3d6000fd5b505050505b505b5050505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561319b57506000801b8214155b92505050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106131e557805160ff1916838001178555613213565b82800160010185558215613213579182015b828111156132125782518255916020019190600101906131f7565b5b5090506132209190613224565b5090565b5b8082111561323d576000816000905550600101613225565b5090565b600081359050613250816144bc565b92915050565b600081519050613265816144d3565b92915050565b60008135905061327a816144ea565b92915050565b60008083601f84011261329257600080fd5b8235905067ffffffffffffffff8111156132ab57600080fd5b6020830191508360018202830111156132c357600080fd5b9250929050565b6000813590506132d981614501565b92915050565b6000813590506132ee81614518565b92915050565b60008083601f84011261330657600080fd5b8235905067ffffffffffffffff81111561331f57600080fd5b60208301915083600182028301111561333757600080fd5b9250929050565b60008135905061334d8161452f565b92915050565b6000815190506133628161452f565b92915050565b60008135905061337781614546565b92915050565b60006020828403121561338f57600080fd5b600061339d84828501613241565b91505092915050565b600080604083850312156133b957600080fd5b60006133c785828601613241565b92505060206133d885828601613241565b9150509250929050565b6000806000606084860312156133f757600080fd5b600061340586828701613241565b935050602061341686828701613241565b92505060406134278682870161333e565b9150509250925092565b6000806000806080858703121561344757600080fd5b600061345587828801613241565b945050602061346687828801613241565b93505060406134778782880161333e565b92505060606134888782880161333e565b91505092959194509250565b600080600080600080600060e0888a0312156134af57600080fd5b60006134bd8a828b01613241565b97505060206134ce8a828b01613241565b96505060406134df8a828b0161333e565b95505060606134f08a828b0161333e565b94505060806135018a828b01613368565b93505060a06135128a828b0161326b565b92505060c06135238a828b0161326b565b91505092959891949750929550565b6000806040838503121561354557600080fd5b600061355385828601613241565b92505060206135648582860161333e565b9150509250929050565b60008060006060848603121561358357600080fd5b600061359186828701613241565b93505060206135a28682870161333e565b92505060406135b38682870161333e565b9150509250925092565b6000602082840312156135cf57600080fd5b60006135dd84828501613256565b91505092915050565b60008060008060008060008060008060006101008c8e03121561360857600080fd5b60006136168e828f016132df565b9b505060206136278e828f01613241565b9a505060406136388e828f01613241565b99505060606136498e828f016132ca565b985050608061365a8e828f01613368565b97505060a08c013567ffffffffffffffff81111561367757600080fd5b6136838e828f016132f4565b965096505060c08c013567ffffffffffffffff8111156136a257600080fd5b6136ae8e828f016132f4565b945094505060e08c013567ffffffffffffffff8111156136cd57600080fd5b6136d98e828f01613280565b92509250509295989b509295989b9093969950565b60006020828403121561370057600080fd5b600061370e84828501613353565b91505092915050565b6000806040838503121561372a57600080fd5b60006137388582860161333e565b92505060206137498582860161333e565b9150509250929050565b61375c81614394565b82525050565b61376b816143a6565b82525050565b61377a816143b2565b82525050565b61379161378c826143b2565b6144a1565b82525050565b60006137a3838561435c565b93506137b083858461445f565b6137b9836144ab565b840190509392505050565b60006137d0838561436d565b93506137dd83858461445f565b82840190509392505050565b60006137f482614346565b6137fe818561435c565b935061380e81856020860161446e565b613817816144ab565b840191505092915050565b600061382d82614346565b613837818561436d565b935061384781856020860161446e565b80840191505092915050565b61385c81614417565b82525050565b61386b8161443b565b82525050565b600061387d8385614378565b935061388a83858461445f565b613893836144ab565b840190509392505050565b60006138a982614351565b6138b38185614378565b93506138c381856020860161446e565b6138cc816144ab565b840191505092915050565b60006138e4602383614378565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061394a602283614378565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139b0600283614389565b91507f19010000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b60006139f0601b83614378565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613a30602083614378565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000613a70601183614378565b91507f494e56414c49445f5349474e41545552450000000000000000000000000000006000830152602082019050919050565b6000613ab0602e83614378565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000613b16601283614378565b91507f494e56414c49445f45585049524154494f4e00000000000000000000000000006000830152602082019050919050565b6000613b56600d83614378565b91507f494e56414c49445f4f574e4552000000000000000000000000000000000000006000830152602082019050919050565b6000613b96602183614378565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bfc602583614378565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c62602483614378565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cc8602a83614378565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d2e601f83614378565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b6000613d6e601f83614378565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b613daa81614400565b82525050565b613db98161440a565b82525050565b6000613dcc8284866137c4565b91508190509392505050565b6000613de48284613822565b915081905092915050565b6000613dfa826139a3565b9150613e068285613780565b602082019150613e168284613780565b6020820191508190509392505050565b6000602082019050613e3b6000830184613753565b92915050565b600060c082019050613e566000830189613753565b613e636020830188613753565b613e706040830187613753565b613e7d6060830186613da1565b613e8a6080830185613da1565b613e9760a0830184613da1565b979650505050505050565b600060c082019050613eb7600083018c613753565b613ec4602083018b613753565b613ed1604083018a613db0565b8181036060830152613ee481888a613871565b90508181036080830152613ef9818688613871565b905081810360a0830152613f0e818486613797565b90509a9950505050505050505050565b6000604082019050613f336000830185613753565b613f406020830184613da1565b9392505050565b6000606082019050613f5c6000830186613753565b613f696020830185613da1565b613f766040830184613da1565b949350505050565b6000602082019050613f936000830184613762565b92915050565b6000602082019050613fae6000830184613771565b92915050565b600060c082019050613fc96000830189613771565b613fd66020830188613753565b613fe36040830187613753565b613ff06060830186613da1565b613ffd6080830185613da1565b61400a60a0830184613da1565b979650505050505050565b600060a08201905061402a6000830188613771565b6140376020830187613771565b6140446040830186613771565b6140516060830185613da1565b61405e6080830184613753565b9695505050505050565b600060808201905061407d6000830187613771565b61408a6020830186613db0565b6140976040830185613771565b6140a46060830184613771565b95945050505050565b600060208201905081810360008301526140c781846137e9565b905092915050565b60006020820190506140e46000830184613853565b92915050565b60006020820190506140ff6000830184613862565b92915050565b6000602082019050818103600083015261411f818461389e565b905092915050565b60006020820190508181036000830152614140816138d7565b9050919050565b600060208201905081810360008301526141608161393d565b9050919050565b60006020820190508181036000830152614180816139e3565b9050919050565b600060208201905081810360008301526141a081613a23565b9050919050565b600060208201905081810360008301526141c081613a63565b9050919050565b600060208201905081810360008301526141e081613aa3565b9050919050565b6000602082019050818103600083015261420081613b09565b9050919050565b6000602082019050818103600083015261422081613b49565b9050919050565b6000602082019050818103600083015261424081613b89565b9050919050565b6000602082019050818103600083015261426081613bef565b9050919050565b6000602082019050818103600083015261428081613c55565b9050919050565b600060208201905081810360008301526142a081613cbb565b9050919050565b600060208201905081810360008301526142c081613d21565b9050919050565b600060208201905081810360008301526142e081613d61565b9050919050565b60006020820190506142fc6000830184613da1565b92915050565b60006040820190506143176000830185613da1565b6143246020830184613da1565b9392505050565b60006020820190506143406000830184613db0565b92915050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061439f826143e0565b9050919050565b60008115159050919050565b6000819050919050565b60006143c782614394565b9050919050565b60006143d982614394565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061442282614429565b9050919050565b6000614434826143e0565b9050919050565b60006144468261444d565b9050919050565b6000614458826143e0565b9050919050565b82818337600083830152505050565b60005b8381101561448c578082015181840152602081019050614471565b8381111561449b576000848401525b50505050565b6000819050919050565b6000601f19601f8301169050919050565b6144c581614394565b81146144d057600080fd5b50565b6144dc816143a6565b81146144e757600080fd5b50565b6144f3816143b2565b81146144fe57600080fd5b50565b61450a816143bc565b811461451557600080fd5b50565b614521816143ce565b811461452c57600080fd5b50565b61453881614400565b811461454357600080fd5b50565b61454f8161440a565b811461455a57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122072b61089810bfc83015b2ff0e91dc44c6e2728c86ad9c241c6429fcb9a582eb464736f6c634300060c0033
Deployed ByteCode Sourcemap
65016:12751:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57839:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59972:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72303:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;65553:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69187:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72719:308;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66765:1081;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71934:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60473:402;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65404:142;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58135:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65716:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61129:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74673:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71401:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73824:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74231:140;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65202:50;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69868:627;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75090:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57984:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61601:332;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59128:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73407:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73624:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73184:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65667:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75631:746;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68311:483;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59620:173;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70842:342;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57839:86;57885:13;57914:5;57907:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57839:86;:::o;59972:159::-;60055:4;60068:39;60077:12;:10;:12::i;:::-;60091:7;60100:6;60068:8;:39::i;:::-;60121:4;60114:11;;59972:159;;;;:::o;72303:190::-;72408:7;72417;72444:21;72460:4;72444:15;:21::i;:::-;72467:19;:17;:19::i;:::-;72436:51;;;;72303:190;;;:::o;65553:45::-;65595:3;65553:45;:::o;69187:457::-;69309:4;65984:5;;;;;;;;;;;65960:30;;:12;:10;:12::i;:::-;:30;;;65992:37;;;;;;;;;;;;;;;;;65952:78;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;69322:23:::1;69348:21;69364:4;69348:15;:21::i;:::-;69322:47;;69378:20;69401;69415:5;69401:6;:13;;:20;;;;:::i;:::-;69378:43;;69452:1;69436:12;:17;;69455:29;;;;;;;;;;;;;;;;::::0;69428:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;69492:25;69498:4;69504:12;69492:5;:25::i;:::-;69552:4;69531:34;;69548:1;69531:34;;;69558:6;69531:34;;;;;;:::i;:::-;;;;;;;;69582:4;69577:25;;;69588:6;69596:5;69577:25;;;;;;;:::i;:::-;;;;;;;;69637:1;69618:15;:20;69611:27;;;;69187:457:::0;;;;;:::o;72719:308::-;72799:7;72815:27;72845:19;:17;:19::i;:::-;72815:49;;72900:1;72877:19;:24;72873:55;;;72919:1;72912:8;;;;;72873:55;72943:78;72970:5;;;;;;;;;;;:32;;;73003:16;;;;;;;;;;;72970:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72943:19;:26;;:78;;;;:::i;:::-;72936:85;;;72719:308;;:::o;66765:1081::-;54458:16;54477:13;:11;:13::i;:::-;54458:32;;54513:12;;;;;;;;;;;:31;;;;54529:15;:13;:15::i;:::-;54513:31;:69;;;;54559:23;;54548:8;:34;54513:69;54497:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;54655:19;54678:12;;;;;;;;;;;54677:13;54655:35;;54701:14;54697:99;;;54741:4;54726:12;;:19;;;;;;;;;;;;;;;;;;54780:8;54754:23;:34;;;;54697:99;67080:15:::1;67165:9;67154:20;;65304:95;67287:10;;67271:28;;;;;;;:::i;:::-;;;;;;;;65242:10;;;;;;;;;;;;;;;;::::0;67310:26:::1;;;;;;67347:7;67373:4;67226:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67208:186;;;;;;67189:16;:205;;;;67403:20;67412:10;;67403:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:20::i;:::-;67430:24;67441:12;;67430:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:24::i;:::-;67461:28;67474:14;67461:12;:28::i;:::-;67506:4;67498:5;;:12;;;;;;;;;;;;;;;;;;67529:8;67517:9;;:20;;;;;;;;;;;;;;;;;;67563:15;67544:16;;:34;;;;;;;;;;;;;;;;;;67609:20;67585:21;;:44;;;;;;;;;;;;;;;;;;67695:4;67643:197;;67663:15;67643:197;;;67709:8;67734:20;67764:14;67787:10;;67806:12;;67827:6;;67643:197;;;;;;;;;;;;;;:::i;:::-;;;;;;;;54804:1;54818:14:::0;54814:57;;;54858:5;54843:12;;:20;;;;;;;;;;;;;;;;;;54814:57;66765:1081;;;;;;;;;;;;;:::o;71934:121::-;72005:7;72028:21;72044:4;72028:15;:21::i;:::-;72021:28;;71934:121;;;:::o;60473:402::-;60599:4;60612:36;60622:6;60630:9;60641:6;60612:9;:36::i;:::-;60655:149;60672:6;60687:12;:10;:12::i;:::-;60708:89;60746:6;60708:89;;;;;;;;;;;;;;;;;:11;:19;60720:6;60708:19;;;;;;;;;;;;;;;:33;60728:12;:10;:12::i;:::-;60708:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;60655:8;:149::i;:::-;60833:9;60816:35;;60825:6;60816:35;;;60844:6;60816:35;;;;;;:::i;:::-;;;;;;;;60865:4;60858:11;;60473:402;;;;;:::o;65404:142::-;65451:95;65404:142;:::o;58135:86::-;58185:5;58206:9;;;;;;;;;;;58199:16;;58135:86;:::o;65716:31::-;;;;:::o;61129:208::-;61217:4;61230:83;61239:12;:10;:12::i;:::-;61253:7;61262:50;61301:10;61262:11;:25;61274:12;:10;:12::i;:::-;61262:25;;;;;;;;;;;;;;;:34;61288:7;61262:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;61230:8;:83::i;:::-;61327:4;61320:11;;61129:208;;;;:::o;74673:223::-;74798:7;65984:5;;;;;;;;;;;65960:30;;:12;:10;:12::i;:::-;:30;;;65992:37;;;;;;;;;;;;;;;;;65952:78;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;74817:53:::1;74855:6;74863;74824:16;;;;;;;;;;;74817:37;;;;:53;;;;;:::i;:::-;74884:6;74877:13;;74673:223:::0;;;;:::o;71401:222::-;71511:7;71537:80;71566:5;;;;;;;;;;;:32;;;71599:16;;;;;;;;;;;71566:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71537:21;71553:4;71537:15;:21::i;:::-;:28;;:80;;;;:::i;:::-;71530:87;;71401:222;;;:::o;73824:76::-;73861:12;73889:5;;;;;;;;;;;73882:12;;73824:76;:::o;74231:140::-;74298:25;74339:26;:24;:26::i;:::-;74332:33;;74231:140;:::o;65202:50::-;65242:10;;;;;;;;;;;;;;;;;65202:50;:::o;69868:627::-;65984:5;;;;;;;;;;;65960:30;;:12;:10;:12::i;:::-;:30;;;65992:37;;;;;;;;;;;;;;;;;65952:78;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;69978:1:::1;69968:6;:11;69964:40;;;69990:7;;69964:40;70012:16;70031:9;;;;;;;;;;;70012:28;;70359:37;70365:8;70375:20;70389:5;70375:6;:13;;:20;;;;:::i;:::-;70359:5;:37::i;:::-;70431:8;70410:38;;70427:1;70410:38;;;70441:6;70410:38;;;;;;:::i;:::-;;;;;;;;70465:8;70460:29;;;70475:6;70483:5;70460:29;;;;;;;:::i;:::-;;;;;;;;66037:1;;69868:627:::0;;:::o;75090:91::-;65984:5;;;;;;;;;;;65960:30;;:12;:10;:12::i;:::-;:30;;;65992:37;;;;;;;;;;;;;;;;;65952:78;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;75090:91;;:::o;57984:90::-;58032:13;58061:7;58054:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57984:90;:::o;61601:332::-;61709:4;61725:184;61742:12;:10;:12::i;:::-;61763:7;61779:123;61828:15;61779:123;;;;;;;;;;;;;;;;;:11;:25;61791:12;:10;:12::i;:::-;61779:25;;;;;;;;;;;;;;;:34;61805:7;61779:34;;;;;;;;;;;;;;;;:38;;:123;;;;;:::i;:::-;61725:8;:184::i;:::-;61923:4;61916:11;;61601:332;;;;:::o;59128:218::-;59214:4;59227:42;59237:12;:10;:12::i;:::-;59251:9;59262:6;59227:9;:42::i;:::-;59304:9;59281:41;;59290:12;:10;:12::i;:::-;59281:41;;;59315:6;59281:41;;;;;;:::i;:::-;;;;;;;;59336:4;59329:11;;59128:218;;;;:::o;73407:104::-;73473:7;73496:9;;;;;;;;;;;73489:16;;73407:104;:::o;73624:102::-;73681:7;73704:16;;;;;;;;;;;73697:23;;73624:102;:::o;73184:115::-;73251:7;73274:19;:17;:19::i;:::-;73267:26;;73184:115;:::o;65667:42::-;;;;;;;;;;;;;;;;;:::o;75631:746::-;75824:1;75807:19;;:5;:19;;;;75799:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;75910:8;75891:15;:27;;75883:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75948:25;75976:7;:14;75984:5;75976:14;;;;;;;;;;;;;;;;75948:42;;75997:14;76080:16;;65451:95;76145:5;76152:7;76161:5;76168:17;76187:8;76117:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76107:90;;;;;;76032:174;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76014:199;;;;;;75997:216;;76237:26;76247:6;76255:1;76258;76261;76237:26;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76228:35;;:5;:35;;;76220:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;76309:24;76331:1;76309:17;:21;;:24;;;;:::i;:::-;76292:7;:14;76300:5;76292:14;;;;;;;;;;;;;;;:41;;;;76340:31;76349:5;76356:7;76365:5;76340:8;:31::i;:::-;75631:746;;;;;;;;;:::o;68311:483::-;65984:5;;;;;;;;;;;65960:30;;:12;:10;:12::i;:::-;:30;;;65992:37;;;;;;;;;;;;;;;;;65952:78;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;68466:20:::1;68489;68503:5;68489:6;:13;;:20;;;;:::i;:::-;68466:43;;68540:1;68524:12;:17;;68543:29;;;;;;;;;;;;;;;;::::0;68516:57:::1;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;68580:25;68586:4;68592:12;68580:5;:25::i;:::-;68614:67;68652:20;68674:6;68621:16;;;;;;;;;;;68614:37;;;;:67;;;;;:::i;:::-;68718:1;68695:34;;68704:4;68695:34;;;68722:6;68695:34;;;;;;:::i;:::-;;;;;;;;68752:20;68741:47;;68746:4;68741:47;;;68774:6;68782:5;68741:47;;;;;;;:::i;:::-;;;;;;;;66037:1;68311:483:::0;;;;:::o;59620:173::-;59734:7;59760:11;:18;59772:5;59760:18;;;;;;;;;;;;;;;:27;59779:7;59760:27;;;;;;;;;;;;;;;;59753:34;;59620:173;;;;:::o;70842:342::-;65984:5;;;;;;;;;;;65960:30;;:12;:10;:12::i;:::-;:30;;;65992:37;;;;;;;;;;;;;;;;;65952:78;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;71106:33:::1;71116:4;71122:2;71126:5;71133;71106:9;:33::i;:::-;71168:2;71153:25;;71162:4;71153:25;;;71172:5;71153:25;;;;;;:::i;:::-;;;;;;;;70842:342:::0;;;:::o;56429:100::-;56482:15;56513:10;56506:17;;56429:100;:::o;64090:348::-;64225:1;64208:19;;:5;:19;;;;64200:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64302:1;64283:21;;:7;:21;;;;64275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64382:6;64352:11;:18;64364:5;64352:18;;;;;;;;;;;;;;;:27;64371:7;64352:27;;;;;;;;;;;;;;;:36;;;;64416:7;64400:32;;64409:5;64400:32;;;64425:6;64400:32;;;;;;:::i;:::-;;;;;;;;64090:348;;;:::o;58448:121::-;58522:7;58545:9;:18;58555:7;58545:18;;;;;;;;;;;;;;;;58538:25;;58448:121;;;:::o;58286:102::-;58347:7;58370:12;;58363:19;;58286:102;:::o;52243:286::-;52304:7;52333:1;52328;:6;;52336:28;;;;;;;;;;;;;;;;;52320:45;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;52372:13;52392:1;52388;:5;;;;;;52372:21;;50172:4;52436:5;52416:17;:25;52415:33;;;;;;52410:1;:38;;52450:35;;;;;;;;;;;;;;;;;52402:84;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;52522:1;52513:5;50172:4;52503:1;:7;:15;52502:21;;;;;;52495:28;;;52243:286;;;;:::o;62898:570::-;62997:1;62978:21;;:7;:21;;;;62970:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63044:49;63073:1;63077:7;63086:6;63044:20;:49::i;:::-;63102:22;63127:12;;63102:37;;63161:26;63180:6;63161:14;:18;;:26;;;;:::i;:::-;63146:12;:41;;;;63196:25;63224:9;:18;63234:7;63224:18;;;;;;;;;;;;;;;;63196:46;;63270:29;63292:6;63270:17;:21;;:29;;;;:::i;:::-;63249:9;:18;63259:7;63249:18;;;;;;;;;;;;;;;:50;;;;63359:1;63312:49;;63320:26;:24;:26::i;:::-;63312:49;;;63308:155;;63372:26;:24;:26::i;:::-;:39;;;63412:7;63421:14;63437:17;63372:83;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63308:155;62898:570;;;;:::o;51819:261::-;51880:7;51905:1;51900;:6;:16;;;;51915:1;51910;:6;51900:16;51896:47;;;51934:1;51927:8;;;;51896:47;51996:1;50223;50172:4;50217:7;;;;;;51965:17;:27;51964:33;;;;;;51959:1;:38;;51999:35;;;;;;;;;;;;;;;;;51951:84;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;50172:4;50223:1;50172:4;50217:7;;;;;;52056:1;52052;:5;:15;52051:23;;;;;;52044:30;;51819:261;;;;;:::o;66050:107::-;66113:7;65595:3;66129:22;;66050:107;:::o;55182:522::-;55229:4;55576:10;55661:9;55649:22;55643:28;;55697:1;55691:2;:7;55684:14;;;55182:522;:::o;64444:78::-;64509:7;64501:5;:15;;;;;;;;;;;;:::i;:::-;;64444:78;:::o;64528:86::-;64599:9;64589:7;:19;;;;;;;;;;;;:::i;:::-;;64528:86;:::o;64620:::-;64689:11;64677:9;;:23;;;;;;;;;;;;;;;;;;64620:86;:::o;77619:145::-;77725:33;77735:4;77741:2;77745:6;77753:4;77725:9;:33::i;:::-;77619:145;;;:::o;4347:198::-;4453:7;4482:1;4477;:6;;4485:12;4469:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;4505:9;4521:1;4517;:5;4505:17;;4538:1;4531:8;;;4347:198;;;;;:::o;3520:167::-;3578:7;3594:9;3610:1;3606;:5;3594:17;;3631:1;3626;:6;;3618:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3680:1;3673:8;;;3520:167;;;;:::o;10997:190::-;11096:85;11115:5;11145:23;;;11170:2;11174:5;11122:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11096:18;:85::i;:::-;10997:190;;;:::o;74005:136::-;74073:25;74114:21;;;;;;;;;;;74107:28;;74005:136;:::o;63474:610::-;63573:1;63554:21;;:7;:21;;;;63546:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63622:49;63643:7;63660:1;63664:6;63622:20;:49::i;:::-;63680:22;63705:12;;63680:37;;63739:26;63758:6;63739:14;:18;;:26;;;;:::i;:::-;63724:12;:41;;;;63774:25;63802:9;:18;63812:7;63802:18;;;;;;;;;;;;;;;;63774:46;;63848:67;63870:6;63848:67;;;;;;;;;;;;;;;;;:17;:21;;:67;;;;;:::i;:::-;63827:9;:18;63837:7;63827:18;;;;;;;;;;;;;;;:88;;;;63975:1;63928:49;;63936:26;:24;:26::i;:::-;63928:49;;;63924:155;;63988:26;:24;:26::i;:::-;:39;;;64028:7;64037:14;64053:17;63988:83;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63924:155;63474:610;;;;:::o;76730:649::-;76847:23;76873:16;;;;;;;;;;;76847:42;;76896:17;76916:5;;;;;;;;;;;76896:25;;76930:13;76946:4;:31;;;76978:15;76946:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76930:64;;77003:25;77031:35;77060:5;77031:21;77047:4;77031:15;:21::i;:::-;:28;;:35;;;;:::i;:::-;77003:63;;77073:23;77099:33;77126:5;77099:19;77115:2;77099:15;:19::i;:::-;:26;;:33;;;;:::i;:::-;77073:59;;77141:47;77157:4;77163:2;77167:20;77181:5;77167:6;:13;;:20;;;;:::i;:::-;77141:15;:47::i;:::-;77201:8;77197:123;;;77220:4;:21;;;77242:15;77259:4;77265:2;77269:6;77277:17;77296:15;77220:92;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77197:123;77355:2;77333:40;;77349:4;77333:40;;;77359:6;77367:5;77333:40;;;;;;;:::i;:::-;;;;;;;;76730:649;;;;;;;;;:::o;64712:111::-;;;;:::o;11783:567::-;11867:27;11875:5;11867:25;;;:27::i;:::-;11859:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11996:12;12010:23;12045:5;12037:19;;12057:4;12037:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11995:67;;;;12077:7;12069:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;12154:1;12134:10;:17;:21;12130:215;;;12271:10;12260:30;;;;;;;;;;;;:::i;:::-;12252:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;12130:215;11783:567;;;;:::o;3942:130::-;4000:7;4023:43;4027:1;4030;4023:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4016:50;;3942:130;;;;:::o;61939:953::-;62079:1;62061:20;;:6;:20;;;;62053:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;62159:1;62138:23;;:9;:23;;;;62130:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62210:47;62231:6;62239:9;62250:6;62210:20;:47::i;:::-;62266:24;62293:9;:17;62303:6;62293:17;;;;;;;;;;;;;;;;62266:44;;62337:70;62358:6;62337:70;;;;;;;;;;;;;;;;;:16;:20;;:70;;;;;:::i;:::-;62317:9;:17;62327:6;62317:17;;;;;;;;;;;;;;;:90;;;;62414:27;62444:9;:20;62454:9;62444:20;;;;;;;;;;;;;;;;62414:50;;62494:32;62519:6;62494:9;:20;62504:9;62494:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;62471:9;:20;62481:9;62471:20;;;;;;;;;;;;;;;:55;;;;62586:1;62539:49;;62547:26;:24;:26::i;:::-;62539:49;;;62535:352;;62599:26;62628:12;;62599:41;;62649:26;:24;:26::i;:::-;:39;;;62689:6;62697:18;62717:16;62649:85;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62757:9;62747:19;;:6;:19;;;62743:137;;62779:26;:24;:26::i;:::-;:39;;;62819:9;62830:18;62850:19;62779:91;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62743:137;62535:352;;61939:953;;;;;:::o;8491:597::-;8551:4;8797:16;8820:19;8842:66;8820:88;;;;9010:7;8998:20;8986:32;;9051:11;9039:8;:23;;:42;;;;;9078:3;9066:15;;:8;:15;;9039:42;9031:51;;;;8491:597;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:128::-;;223:6;217:13;208:22;;235:30;259:5;235:30;:::i;:::-;202:68;;;;:::o;277:130::-;;357:6;344:20;335:29;;369:33;396:5;369:33;:::i;:::-;329:78;;;;:::o;428:336::-;;;542:3;535:4;527:6;523:17;519:27;509:2;;560:1;557;550:12;509:2;593:6;580:20;570:30;;620:18;612:6;609:30;606:2;;;652:1;649;642:12;606:2;686:4;678:6;674:17;662:29;;737:3;729:4;721:6;717:17;707:8;703:32;700:41;697:2;;;754:1;751;744:12;697:2;502:262;;;;;:::o;772:198::-;;886:6;873:20;864:29;;898:67;959:5;898:67;:::i;:::-;858:112;;;;:::o;977:172::-;;1078:6;1065:20;1056:29;;1090:54;1138:5;1090:54;:::i;:::-;1050:99;;;;:::o;1171:337::-;;;1286:3;1279:4;1271:6;1267:17;1263:27;1253:2;;1304:1;1301;1294:12;1253:2;1337:6;1324:20;1314:30;;1364:18;1356:6;1353:30;1350:2;;;1396:1;1393;1386:12;1350:2;1430:4;1422:6;1418:17;1406:29;;1481:3;1473:4;1465:6;1461:17;1451:8;1447:32;1444:41;1441:2;;;1498:1;1495;1488:12;1441:2;1246:262;;;;;:::o;1516:130::-;;1596:6;1583:20;1574:29;;1608:33;1635:5;1608:33;:::i;:::-;1568:78;;;;:::o;1653:134::-;;1737:6;1731:13;1722:22;;1749:33;1776:5;1749:33;:::i;:::-;1716:71;;;;:::o;1794:126::-;;1872:6;1859:20;1850:29;;1884:31;1909:5;1884:31;:::i;:::-;1844:76;;;;:::o;1927:241::-;;2031:2;2019:9;2010:7;2006:23;2002:32;1999:2;;;2047:1;2044;2037:12;1999:2;2082:1;2099:53;2144:7;2135:6;2124:9;2120:22;2099:53;:::i;:::-;2089:63;;2061:97;1993:175;;;;:::o;2175:366::-;;;2296:2;2284:9;2275:7;2271:23;2267:32;2264:2;;;2312:1;2309;2302:12;2264:2;2347:1;2364:53;2409:7;2400:6;2389:9;2385:22;2364:53;:::i;:::-;2354:63;;2326:97;2454:2;2472:53;2517:7;2508:6;2497:9;2493:22;2472:53;:::i;:::-;2462:63;;2433:98;2258:283;;;;;:::o;2548:491::-;;;;2686:2;2674:9;2665:7;2661:23;2657:32;2654:2;;;2702:1;2699;2692:12;2654:2;2737:1;2754:53;2799:7;2790:6;2779:9;2775:22;2754:53;:::i;:::-;2744:63;;2716:97;2844:2;2862:53;2907:7;2898:6;2887:9;2883:22;2862:53;:::i;:::-;2852:63;;2823:98;2952:2;2970:53;3015:7;3006:6;2995:9;2991:22;2970:53;:::i;:::-;2960:63;;2931:98;2648:391;;;;;:::o;3046:617::-;;;;;3201:3;3189:9;3180:7;3176:23;3172:33;3169:2;;;3218:1;3215;3208:12;3169:2;3253:1;3270:53;3315:7;3306:6;3295:9;3291:22;3270:53;:::i;:::-;3260:63;;3232:97;3360:2;3378:53;3423:7;3414:6;3403:9;3399:22;3378:53;:::i;:::-;3368:63;;3339:98;3468:2;3486:53;3531:7;3522:6;3511:9;3507:22;3486:53;:::i;:::-;3476:63;;3447:98;3576:2;3594:53;3639:7;3630:6;3619:9;3615:22;3594:53;:::i;:::-;3584:63;;3555:98;3163:500;;;;;;;:::o;3670:991::-;;;;;;;;3874:3;3862:9;3853:7;3849:23;3845:33;3842:2;;;3891:1;3888;3881:12;3842:2;3926:1;3943:53;3988:7;3979:6;3968:9;3964:22;3943:53;:::i;:::-;3933:63;;3905:97;4033:2;4051:53;4096:7;4087:6;4076:9;4072:22;4051:53;:::i;:::-;4041:63;;4012:98;4141:2;4159:53;4204:7;4195:6;4184:9;4180:22;4159:53;:::i;:::-;4149:63;;4120:98;4249:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4228:98;4357:3;4376:51;4419:7;4410:6;4399:9;4395:22;4376:51;:::i;:::-;4366:61;;4336:97;4464:3;4483:53;4528:7;4519:6;4508:9;4504:22;4483:53;:::i;:::-;4473:63;;4443:99;4573:3;4592:53;4637:7;4628:6;4617:9;4613:22;4592:53;:::i;:::-;4582:63;;4552:99;3836:825;;;;;;;;;;:::o;4668:366::-;;;4789:2;4777:9;4768:7;4764:23;4760:32;4757:2;;;4805:1;4802;4795:12;4757:2;4840:1;4857:53;4902:7;4893:6;4882:9;4878:22;4857:53;:::i;:::-;4847:63;;4819:97;4947:2;4965:53;5010:7;5001:6;4990:9;4986:22;4965:53;:::i;:::-;4955:63;;4926:98;4751:283;;;;;:::o;5041:491::-;;;;5179:2;5167:9;5158:7;5154:23;5150:32;5147:2;;;5195:1;5192;5185:12;5147:2;5230:1;5247:53;5292:7;5283:6;5272:9;5268:22;5247:53;:::i;:::-;5237:63;;5209:97;5337:2;5355:53;5400:7;5391:6;5380:9;5376:22;5355:53;:::i;:::-;5345:63;;5316:98;5445:2;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5424:98;5141:391;;;;;:::o;5539:257::-;;5651:2;5639:9;5630:7;5626:23;5622:32;5619:2;;;5667:1;5664;5657:12;5619:2;5702:1;5719:61;5772:7;5763:6;5752:9;5748:22;5719:61;:::i;:::-;5709:71;;5681:105;5613:183;;;;:::o;5803:1605::-;;;;;;;;;;;;6139:3;6127:9;6118:7;6114:23;6110:33;6107:2;;;6156:1;6153;6146:12;6107:2;6191:1;6208:74;6274:7;6265:6;6254:9;6250:22;6208:74;:::i;:::-;6198:84;;6170:118;6319:2;6337:53;6382:7;6373:6;6362:9;6358:22;6337:53;:::i;:::-;6327:63;;6298:98;6427:2;6445:53;6490:7;6481:6;6470:9;6466:22;6445:53;:::i;:::-;6435:63;;6406:98;6535:2;6553:87;6632:7;6623:6;6612:9;6608:22;6553:87;:::i;:::-;6543:97;;6514:132;6677:3;6696:51;6739:7;6730:6;6719:9;6715:22;6696:51;:::i;:::-;6686:61;;6656:97;6812:3;6801:9;6797:19;6784:33;6837:18;6829:6;6826:30;6823:2;;;6869:1;6866;6859:12;6823:2;6897:65;6954:7;6945:6;6934:9;6930:22;6897:65;:::i;:::-;6879:83;;;;6763:205;7027:3;7016:9;7012:19;6999:33;7052:18;7044:6;7041:30;7038:2;;;7084:1;7081;7074:12;7038:2;7112:65;7169:7;7160:6;7149:9;7145:22;7112:65;:::i;:::-;7094:83;;;;6978:205;7242:3;7231:9;7227:19;7214:33;7267:18;7259:6;7256:30;7253:2;;;7299:1;7296;7289:12;7253:2;7328:64;7384:7;7375:6;7364:9;7360:22;7328:64;:::i;:::-;7309:83;;;;7193:205;6101:1307;;;;;;;;;;;;;;:::o;7415:263::-;;7530:2;7518:9;7509:7;7505:23;7501:32;7498:2;;;7546:1;7543;7536:12;7498:2;7581:1;7598:64;7654:7;7645:6;7634:9;7630:22;7598:64;:::i;:::-;7588:74;;7560:108;7492:186;;;;:::o;7685:366::-;;;7806:2;7794:9;7785:7;7781:23;7777:32;7774:2;;;7822:1;7819;7812:12;7774:2;7857:1;7874:53;7919:7;7910:6;7899:9;7895:22;7874:53;:::i;:::-;7864:63;;7836:97;7964:2;7982:53;8027:7;8018:6;8007:9;8003:22;7982:53;:::i;:::-;7972:63;;7943:98;7768:283;;;;;:::o;8058:113::-;8141:24;8159:5;8141:24;:::i;:::-;8136:3;8129:37;8123:48;;:::o;8178:104::-;8255:21;8270:5;8255:21;:::i;:::-;8250:3;8243:34;8237:45;;:::o;8289:113::-;8372:24;8390:5;8372:24;:::i;:::-;8367:3;8360:37;8354:48;;:::o;8409:152::-;8510:45;8530:24;8548:5;8530:24;:::i;:::-;8510:45;:::i;:::-;8505:3;8498:58;8492:69;;:::o;8591:297::-;;8705:70;8768:6;8763:3;8705:70;:::i;:::-;8698:77;;8787:43;8823:6;8818:3;8811:5;8787:43;:::i;:::-;8852:29;8874:6;8852:29;:::i;:::-;8847:3;8843:39;8836:46;;8691:197;;;;;:::o;8919:310::-;;9051:88;9132:6;9127:3;9051:88;:::i;:::-;9044:95;;9151:43;9187:6;9182:3;9175:5;9151:43;:::i;:::-;9216:6;9211:3;9207:16;9200:23;;9037:192;;;;;:::o;9237:343::-;;9347:38;9379:5;9347:38;:::i;:::-;9397:70;9460:6;9455:3;9397:70;:::i;:::-;9390:77;;9472:52;9517:6;9512:3;9505:4;9498:5;9494:16;9472:52;:::i;:::-;9545:29;9567:6;9545:29;:::i;:::-;9540:3;9536:39;9529:46;;9327:253;;;;;:::o;9587:356::-;;9715:38;9747:5;9715:38;:::i;:::-;9765:88;9846:6;9841:3;9765:88;:::i;:::-;9758:95;;9858:52;9903:6;9898:3;9891:4;9884:5;9880:16;9858:52;:::i;:::-;9931:6;9926:3;9922:16;9915:23;;9695:248;;;;;:::o;9950:194::-;10067:71;10132:5;10067:71;:::i;:::-;10062:3;10055:84;10049:95;;:::o;10151:168::-;10255:58;10307:5;10255:58;:::i;:::-;10250:3;10243:71;10237:82;;:::o;10351:300::-;;10467:71;10531:6;10526:3;10467:71;:::i;:::-;10460:78;;10550:43;10586:6;10581:3;10574:5;10550:43;:::i;:::-;10615:29;10637:6;10615:29;:::i;:::-;10610:3;10606:39;10599:46;;10453:198;;;;;:::o;10659:347::-;;10771:39;10804:5;10771:39;:::i;:::-;10822:71;10886:6;10881:3;10822:71;:::i;:::-;10815:78;;10898:52;10943:6;10938:3;10931:4;10924:5;10920:16;10898:52;:::i;:::-;10971:29;10993:6;10971:29;:::i;:::-;10966:3;10962:39;10955:46;;10751:255;;;;;:::o;11014:372::-;;11174:67;11238:2;11233:3;11174:67;:::i;:::-;11167:74;;11274:34;11270:1;11265:3;11261:11;11254:55;11343:5;11338:2;11333:3;11329:12;11322:27;11377:2;11372:3;11368:12;11361:19;;11160:226;;;:::o;11395:371::-;;11555:67;11619:2;11614:3;11555:67;:::i;:::-;11548:74;;11655:34;11651:1;11646:3;11642:11;11635:55;11724:4;11719:2;11714:3;11710:12;11703:26;11757:2;11752:3;11748:12;11741:19;;11541:225;;;:::o;11775:398::-;;11953:84;12035:1;12030:3;11953:84;:::i;:::-;11946:91;;12070:66;12066:1;12061:3;12057:11;12050:87;12165:1;12160:3;12156:11;12149:18;;11939:234;;;:::o;12182:327::-;;12342:67;12406:2;12401:3;12342:67;:::i;:::-;12335:74;;12442:29;12438:1;12433:3;12429:11;12422:50;12500:2;12495:3;12491:12;12484:19;;12328:181;;;:::o;12518:332::-;;12678:67;12742:2;12737:3;12678:67;:::i;:::-;12671:74;;12778:34;12774:1;12769:3;12765:11;12758:55;12841:2;12836:3;12832:12;12825:19;;12664:186;;;:::o;12859:317::-;;13019:67;13083:2;13078:3;13019:67;:::i;:::-;13012:74;;13119:19;13115:1;13110:3;13106:11;13099:40;13167:2;13162:3;13158:12;13151:19;;13005:171;;;:::o;13185:383::-;;13345:67;13409:2;13404:3;13345:67;:::i;:::-;13338:74;;13445:34;13441:1;13436:3;13432:11;13425:55;13514:16;13509:2;13504:3;13500:12;13493:38;13559:2;13554:3;13550:12;13543:19;;13331:237;;;:::o;13577:318::-;;13737:67;13801:2;13796:3;13737:67;:::i;:::-;13730:74;;13837:20;13833:1;13828:3;13824:11;13817:41;13886:2;13881:3;13877:12;13870:19;;13723:172;;;:::o;13904:313::-;;14064:67;14128:2;14123:3;14064:67;:::i;:::-;14057:74;;14164:15;14160:1;14155:3;14151:11;14144:36;14208:2;14203:3;14199:12;14192:19;;14050:167;;;:::o;14226:370::-;;14386:67;14450:2;14445:3;14386:67;:::i;:::-;14379:74;;14486:34;14482:1;14477:3;14473:11;14466:55;14555:3;14550:2;14545:3;14541:12;14534:25;14587:2;14582:3;14578:12;14571:19;;14372:224;;;:::o;14605:374::-;;14765:67;14829:2;14824:3;14765:67;:::i;:::-;14758:74;;14865:34;14861:1;14856:3;14852:11;14845:55;14934:7;14929:2;14924:3;14920:12;14913:29;14970:2;14965:3;14961:12;14954:19;;14751:228;;;:::o;14988:373::-;;15148:67;15212:2;15207:3;15148:67;:::i;:::-;15141:74;;15248:34;15244:1;15239:3;15235:11;15228:55;15317:6;15312:2;15307:3;15303:12;15296:28;15352:2;15347:3;15343:12;15336:19;;15134:227;;;:::o;15370:379::-;;15530:67;15594:2;15589:3;15530:67;:::i;:::-;15523:74;;15630:34;15626:1;15621:3;15617:11;15610:55;15699:12;15694:2;15689:3;15685:12;15678:34;15740:2;15735:3;15731:12;15724:19;;15516:233;;;:::o;15758:331::-;;15918:67;15982:2;15977:3;15918:67;:::i;:::-;15911:74;;16018:33;16014:1;16009:3;16005:11;15998:54;16080:2;16075:3;16071:12;16064:19;;15904:185;;;:::o;16098:331::-;;16258:67;16322:2;16317:3;16258:67;:::i;:::-;16251:74;;16358:33;16354:1;16349:3;16345:11;16338:54;16420:2;16415:3;16411:12;16404:19;;16244:185;;;:::o;16437:113::-;16520:24;16538:5;16520:24;:::i;:::-;16515:3;16508:37;16502:48;;:::o;16557:107::-;16636:22;16652:5;16636:22;:::i;:::-;16631:3;16624:35;16618:46;;:::o;16671:291::-;;16834:103;16933:3;16924:6;16916;16834:103;:::i;:::-;16827:110;;16954:3;16947:10;;16815:147;;;;;:::o;16969:271::-;;17122:93;17211:3;17202:6;17122:93;:::i;:::-;17115:100;;17232:3;17225:10;;17103:137;;;;:::o;17247:659::-;;17511:148;17655:3;17511:148;:::i;:::-;17504:155;;17670:75;17741:3;17732:6;17670:75;:::i;:::-;17767:2;17762:3;17758:12;17751:19;;17781:75;17852:3;17843:6;17781:75;:::i;:::-;17878:2;17873:3;17869:12;17862:19;;17898:3;17891:10;;17492:414;;;;;:::o;17913:222::-;;18040:2;18029:9;18025:18;18017:26;;18054:71;18122:1;18111:9;18107:17;18098:6;18054:71;:::i;:::-;18011:124;;;;:::o;18142:780::-;;18409:3;18398:9;18394:19;18386:27;;18424:71;18492:1;18481:9;18477:17;18468:6;18424:71;:::i;:::-;18506:72;18574:2;18563:9;18559:18;18550:6;18506:72;:::i;:::-;18589;18657:2;18646:9;18642:18;18633:6;18589:72;:::i;:::-;18672;18740:2;18729:9;18725:18;18716:6;18672:72;:::i;:::-;18755:73;18823:3;18812:9;18808:19;18799:6;18755:73;:::i;:::-;18839;18907:3;18896:9;18892:19;18883:6;18839:73;:::i;:::-;18380:542;;;;;;;;;:::o;18929:1092::-;;19280:3;19269:9;19265:19;19257:27;;19295:71;19363:1;19352:9;19348:17;19339:6;19295:71;:::i;:::-;19377:72;19445:2;19434:9;19430:18;19421:6;19377:72;:::i;:::-;19460:68;19524:2;19513:9;19509:18;19500:6;19460:68;:::i;:::-;19576:9;19570:4;19566:20;19561:2;19550:9;19546:18;19539:48;19601:88;19684:4;19675:6;19667;19601:88;:::i;:::-;19593:96;;19738:9;19732:4;19728:20;19722:3;19711:9;19707:19;19700:49;19763:88;19846:4;19837:6;19829;19763:88;:::i;:::-;19755:96;;19900:9;19894:4;19890:20;19884:3;19873:9;19869:19;19862:49;19925:86;20006:4;19997:6;19989;19925:86;:::i;:::-;19917:94;;19251:770;;;;;;;;;;;;:::o;20028:333::-;;20183:2;20172:9;20168:18;20160:26;;20197:71;20265:1;20254:9;20250:17;20241:6;20197:71;:::i;:::-;20279:72;20347:2;20336:9;20332:18;20323:6;20279:72;:::i;:::-;20154:207;;;;;:::o;20368:444::-;;20551:2;20540:9;20536:18;20528:26;;20565:71;20633:1;20622:9;20618:17;20609:6;20565:71;:::i;:::-;20647:72;20715:2;20704:9;20700:18;20691:6;20647:72;:::i;:::-;20730;20798:2;20787:9;20783:18;20774:6;20730:72;:::i;:::-;20522:290;;;;;;:::o;20819:210::-;;20940:2;20929:9;20925:18;20917:26;;20954:65;21016:1;21005:9;21001:17;20992:6;20954:65;:::i;:::-;20911:118;;;;:::o;21036:222::-;;21163:2;21152:9;21148:18;21140:26;;21177:71;21245:1;21234:9;21230:17;21221:6;21177:71;:::i;:::-;21134:124;;;;:::o;21265:780::-;;21532:3;21521:9;21517:19;21509:27;;21547:71;21615:1;21604:9;21600:17;21591:6;21547:71;:::i;:::-;21629:72;21697:2;21686:9;21682:18;21673:6;21629:72;:::i;:::-;21712;21780:2;21769:9;21765:18;21756:6;21712:72;:::i;:::-;21795;21863:2;21852:9;21848:18;21839:6;21795:72;:::i;:::-;21878:73;21946:3;21935:9;21931:19;21922:6;21878:73;:::i;:::-;21962;22030:3;22019:9;22015:19;22006:6;21962:73;:::i;:::-;21503:542;;;;;;;;;:::o;22052:668::-;;22291:3;22280:9;22276:19;22268:27;;22306:71;22374:1;22363:9;22359:17;22350:6;22306:71;:::i;:::-;22388:72;22456:2;22445:9;22441:18;22432:6;22388:72;:::i;:::-;22471;22539:2;22528:9;22524:18;22515:6;22471:72;:::i;:::-;22554;22622:2;22611:9;22607:18;22598:6;22554:72;:::i;:::-;22637:73;22705:3;22694:9;22690:19;22681:6;22637:73;:::i;:::-;22262:458;;;;;;;;:::o;22727:548::-;;22934:3;22923:9;22919:19;22911:27;;22949:71;23017:1;23006:9;23002:17;22993:6;22949:71;:::i;:::-;23031:68;23095:2;23084:9;23080:18;23071:6;23031:68;:::i;:::-;23110:72;23178:2;23167:9;23163:18;23154:6;23110:72;:::i;:::-;23193;23261:2;23250:9;23246:18;23237:6;23193:72;:::i;:::-;22905:370;;;;;;;:::o;23282:306::-;;23427:2;23416:9;23412:18;23404:26;;23477:9;23471:4;23467:20;23463:1;23452:9;23448:17;23441:47;23502:76;23573:4;23564:6;23502:76;:::i;:::-;23494:84;;23398:190;;;;:::o;23595:290::-;;23756:2;23745:9;23741:18;23733:26;;23770:105;23872:1;23861:9;23857:17;23848:6;23770:105;:::i;:::-;23727:158;;;;:::o;23892:264::-;;24040:2;24029:9;24025:18;24017:26;;24054:92;24143:1;24132:9;24128:17;24119:6;24054:92;:::i;:::-;24011:145;;;;:::o;24163:310::-;;24310:2;24299:9;24295:18;24287:26;;24360:9;24354:4;24350:20;24346:1;24335:9;24331:17;24324:47;24385:78;24458:4;24449:6;24385:78;:::i;:::-;24377:86;;24281:192;;;;:::o;24480:416::-;;24680:2;24669:9;24665:18;24657:26;;24730:9;24724:4;24720:20;24716:1;24705:9;24701:17;24694:47;24755:131;24881:4;24755:131;:::i;:::-;24747:139;;24651:245;;;:::o;24903:416::-;;25103:2;25092:9;25088:18;25080:26;;25153:9;25147:4;25143:20;25139:1;25128:9;25124:17;25117:47;25178:131;25304:4;25178:131;:::i;:::-;25170:139;;25074:245;;;:::o;25326:416::-;;25526:2;25515:9;25511:18;25503:26;;25576:9;25570:4;25566:20;25562:1;25551:9;25547:17;25540:47;25601:131;25727:4;25601:131;:::i;:::-;25593:139;;25497:245;;;:::o;25749:416::-;;25949:2;25938:9;25934:18;25926:26;;25999:9;25993:4;25989:20;25985:1;25974:9;25970:17;25963:47;26024:131;26150:4;26024:131;:::i;:::-;26016:139;;25920:245;;;:::o;26172:416::-;;26372:2;26361:9;26357:18;26349:26;;26422:9;26416:4;26412:20;26408:1;26397:9;26393:17;26386:47;26447:131;26573:4;26447:131;:::i;:::-;26439:139;;26343:245;;;:::o;26595:416::-;;26795:2;26784:9;26780:18;26772:26;;26845:9;26839:4;26835:20;26831:1;26820:9;26816:17;26809:47;26870:131;26996:4;26870:131;:::i;:::-;26862:139;;26766:245;;;:::o;27018:416::-;;27218:2;27207:9;27203:18;27195:26;;27268:9;27262:4;27258:20;27254:1;27243:9;27239:17;27232:47;27293:131;27419:4;27293:131;:::i;:::-;27285:139;;27189:245;;;:::o;27441:416::-;;27641:2;27630:9;27626:18;27618:26;;27691:9;27685:4;27681:20;27677:1;27666:9;27662:17;27655:47;27716:131;27842:4;27716:131;:::i;:::-;27708:139;;27612:245;;;:::o;27864:416::-;;28064:2;28053:9;28049:18;28041:26;;28114:9;28108:4;28104:20;28100:1;28089:9;28085:17;28078:47;28139:131;28265:4;28139:131;:::i;:::-;28131:139;;28035:245;;;:::o;28287:416::-;;28487:2;28476:9;28472:18;28464:26;;28537:9;28531:4;28527:20;28523:1;28512:9;28508:17;28501:47;28562:131;28688:4;28562:131;:::i;:::-;28554:139;;28458:245;;;:::o;28710:416::-;;28910:2;28899:9;28895:18;28887:26;;28960:9;28954:4;28950:20;28946:1;28935:9;28931:17;28924:47;28985:131;29111:4;28985:131;:::i;:::-;28977:139;;28881:245;;;:::o;29133:416::-;;29333:2;29322:9;29318:18;29310:26;;29383:9;29377:4;29373:20;29369:1;29358:9;29354:17;29347:47;29408:131;29534:4;29408:131;:::i;:::-;29400:139;;29304:245;;;:::o;29556:416::-;;29756:2;29745:9;29741:18;29733:26;;29806:9;29800:4;29796:20;29792:1;29781:9;29777:17;29770:47;29831:131;29957:4;29831:131;:::i;:::-;29823:139;;29727:245;;;:::o;29979:416::-;;30179:2;30168:9;30164:18;30156:26;;30229:9;30223:4;30219:20;30215:1;30204:9;30200:17;30193:47;30254:131;30380:4;30254:131;:::i;:::-;30246:139;;30150:245;;;:::o;30402:222::-;;30529:2;30518:9;30514:18;30506:26;;30543:71;30611:1;30600:9;30596:17;30587:6;30543:71;:::i;:::-;30500:124;;;;:::o;30631:333::-;;30786:2;30775:9;30771:18;30763:26;;30800:71;30868:1;30857:9;30853:17;30844:6;30800:71;:::i;:::-;30882:72;30950:2;30939:9;30935:18;30926:6;30882:72;:::i;:::-;30757:207;;;;;:::o;30971:214::-;;31094:2;31083:9;31079:18;31071:26;;31108:67;31172:1;31161:9;31157:17;31148:6;31108:67;:::i;:::-;31065:120;;;;:::o;31192:121::-;;31285:5;31279:12;31269:22;;31250:63;;;:::o;31320:122::-;;31414:5;31408:12;31398:22;;31379:63;;;:::o;31450:162::-;;31564:6;31559:3;31552:19;31601:4;31596:3;31592:14;31577:29;;31545:67;;;;:::o;31621:144::-;;31756:3;31741:18;;31734:31;;;;:::o;31774:163::-;;31889:6;31884:3;31877:19;31926:4;31921:3;31917:14;31902:29;;31870:67;;;;:::o;31946:145::-;;32082:3;32067:18;;32060:31;;;;:::o;32099:91::-;;32161:24;32179:5;32161:24;:::i;:::-;32150:35;;32144:46;;;:::o;32197:85::-;;32270:5;32263:13;32256:21;32245:32;;32239:43;;;:::o;32289:72::-;;32351:5;32340:16;;32334:27;;;:::o;32368:125::-;;32464:24;32482:5;32464:24;:::i;:::-;32453:35;;32447:46;;;:::o;32500:112::-;;32583:24;32601:5;32583:24;:::i;:::-;32572:35;;32566:46;;;:::o;32619:121::-;;32692:42;32685:5;32681:54;32670:65;;32664:76;;;:::o;32747:72::-;;32809:5;32798:16;;32792:27;;;:::o;32826:81::-;;32897:4;32890:5;32886:16;32875:27;;32869:38;;;:::o;32914:189::-;;33027:71;33092:5;33027:71;:::i;:::-;33014:84;;33008:95;;;:::o;33110:142::-;;33223:24;33241:5;33223:24;:::i;:::-;33210:37;;33204:48;;;:::o;33259:163::-;;33359:58;33411:5;33359:58;:::i;:::-;33346:71;;33340:82;;;:::o;33429:129::-;;33529:24;33547:5;33529:24;:::i;:::-;33516:37;;33510:48;;;:::o;33566:145::-;33647:6;33642:3;33637;33624:30;33703:1;33694:6;33689:3;33685:16;33678:27;33617:94;;;:::o;33720:268::-;33785:1;33792:101;33806:6;33803:1;33800:13;33792:101;;;33882:1;33877:3;33873:11;33867:18;33863:1;33858:3;33854:11;33847:39;33828:2;33825:1;33821:10;33816:15;;33792:101;;;33908:6;33905:1;33902:13;33899:2;;;33973:1;33964:6;33959:3;33955:16;33948:27;33899:2;33769:219;;;;:::o;33996:74::-;;34060:5;34049:16;;34043:27;;;:::o;34077:97::-;;34165:2;34161:7;34156:2;34149:5;34145:14;34141:28;34131:38;;34125:49;;;:::o;34182:117::-;34251:24;34269:5;34251:24;:::i;:::-;34244:5;34241:35;34231:2;;34290:1;34287;34280:12;34231:2;34225:74;:::o;34306:111::-;34372:21;34387:5;34372:21;:::i;:::-;34365:5;34362:32;34352:2;;34408:1;34405;34398:12;34352:2;34346:71;:::o;34424:117::-;34493:24;34511:5;34493:24;:::i;:::-;34486:5;34483:35;34473:2;;34532:1;34529;34522:12;34473:2;34467:74;:::o;34548:185::-;34651:58;34703:5;34651:58;:::i;:::-;34644:5;34641:69;34631:2;;34724:1;34721;34714:12;34631:2;34625:108;:::o;34740:159::-;34830:45;34869:5;34830:45;:::i;:::-;34823:5;34820:56;34810:2;;34890:1;34887;34880:12;34810:2;34804:95;:::o;34906:117::-;34975:24;34993:5;34975:24;:::i;:::-;34968:5;34965:35;34955:2;;35014:1;35011;35004:12;34955:2;34949:74;:::o;35030:113::-;35097:22;35113:5;35097:22;:::i;:::-;35090:5;35087:33;35077:2;;35134:1;35131;35124:12;35077:2;35071:72;:::o
Swarm Source
ipfs://72b61089810bfc83015b2ff0e91dc44c6e2728c86ad9c241c6429fcb9a582eb4
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.