Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 15,004 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap And Repay | 21016602 | 36 days ago | IN | 0 ETH | 0.00545164 | ||||
Swap And Repay | 20419133 | 119 days ago | IN | 0 ETH | 0.00533241 | ||||
Swap And Repay | 20402745 | 122 days ago | IN | 0 ETH | 0.00010471 | ||||
Swap And Repay | 20402744 | 122 days ago | IN | 0 ETH | 0.00214778 | ||||
Swap And Repay | 20402744 | 122 days ago | IN | 0 ETH | 0.00211128 | ||||
Swap And Repay | 20304358 | 135 days ago | IN | 0 ETH | 0.00115258 | ||||
Swap And Repay | 20262984 | 141 days ago | IN | 0 ETH | 0.00098704 | ||||
Swap And Repay | 20262984 | 141 days ago | IN | 0 ETH | 0.00511584 | ||||
Swap And Repay | 20105400 | 163 days ago | IN | 0 ETH | 0.00420937 | ||||
Swap And Repay | 20019808 | 175 days ago | IN | 0 ETH | 0.00795791 | ||||
Swap And Repay | 19948272 | 185 days ago | IN | 0 ETH | 0.00837449 | ||||
Swap And Repay | 19915781 | 190 days ago | IN | 0 ETH | 0.00677086 | ||||
Swap And Repay | 19767062 | 210 days ago | IN | 0 ETH | 0.005872 | ||||
Swap And Repay | 19676514 | 223 days ago | IN | 0 ETH | 0.02329076 | ||||
Swap And Repay | 19658044 | 226 days ago | IN | 0 ETH | 0.00940932 | ||||
Swap And Repay | 19568572 | 238 days ago | IN | 0 ETH | 0.04006513 | ||||
Swap And Repay | 19440165 | 256 days ago | IN | 0 ETH | 0.02420227 | ||||
Swap And Repay | 19118966 | 301 days ago | IN | 0 ETH | 0.01179301 | ||||
Swap And Repay | 19070012 | 308 days ago | IN | 0 ETH | 0.0171672 | ||||
Swap And Repay | 19070006 | 308 days ago | IN | 0 ETH | 0.00857262 | ||||
Swap And Repay | 18935797 | 327 days ago | IN | 0 ETH | 0.01712174 | ||||
Swap And Repay | 18840408 | 340 days ago | IN | 0 ETH | 0.02157693 | ||||
Swap And Repay | 18700222 | 360 days ago | IN | 0 ETH | 0.02396836 | ||||
Swap And Repay | 18590957 | 375 days ago | IN | 0 ETH | 0.01352761 | ||||
Swap And Repay | 18470528 | 392 days ago | IN | 0 ETH | 0.01724134 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UniswapRepayAdapter
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-08 */ // SPDX-License-Identifier: agpl-3.0 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; interface IBaseUniswapAdapter { event Swapped(address fromAsset, address toAsset, uint256 fromAmount, uint256 receivedAmount); struct PermitSignature { uint256 amount; uint256 deadline; uint8 v; bytes32 r; bytes32 s; } struct AmountCalc { uint256 calculatedAmount; uint256 relativePrice; uint256 amountInUsd; uint256 amountOutUsd; address[] path; } function WETH_ADDRESS() external returns (address); function MAX_SLIPPAGE_PERCENT() external returns (uint256); function FLASHLOAN_PREMIUM_TOTAL() external returns (uint256); function USD_ADDRESS() external returns (address); function ORACLE() external returns (IPriceOracleGetter); function UNISWAP_ROUTER() external returns (IUniswapV2Router02); /** * @dev Given an input asset amount, returns the maximum output amount of the other asset and the prices * @param amountIn Amount of reserveIn * @param reserveIn Address of the asset to be swap from * @param reserveOut Address of the asset to be swap to * @return uint256 Amount out of the reserveOut * @return uint256 The price of out amount denominated in the reserveIn currency (18 decimals) * @return uint256 In amount of reserveIn value denominated in USD (8 decimals) * @return uint256 Out amount of reserveOut value denominated in USD (8 decimals) * @return address[] The exchange path */ function getAmountsOut( uint256 amountIn, address reserveIn, address reserveOut ) external view returns ( uint256, uint256, uint256, uint256, address[] memory ); /** * @dev Returns the minimum input asset amount required to buy the given output asset amount and the prices * @param amountOut Amount of reserveOut * @param reserveIn Address of the asset to be swap from * @param reserveOut Address of the asset to be swap to * @return uint256 Amount in of the reserveIn * @return uint256 The price of in amount denominated in the reserveOut currency (18 decimals) * @return uint256 In amount of reserveIn value denominated in USD (8 decimals) * @return uint256 Out amount of reserveOut value denominated in USD (8 decimals) * @return address[] The exchange path */ function getAmountsIn( uint256 amountOut, address reserveIn, address reserveOut ) external view returns ( uint256, uint256, uint256, uint256, address[] memory ); } /** * @title IFlashLoanReceiver interface * @notice Interface for the Aave fee IFlashLoanReceiver. * @author Aave * @dev implement this interface to develop a flashloan-compatible flashLoanReceiver contract **/ interface IFlashLoanReceiver { function executeOperation( address[] calldata assets, uint256[] calldata amounts, uint256[] calldata premiums, address initiator, bytes calldata params ) external returns (bool); function ADDRESSES_PROVIDER() external view returns (ILendingPoolAddressesProvider); function LENDING_POOL() external view returns (ILendingPool); } abstract contract FlashLoanReceiverBase is IFlashLoanReceiver { using SafeERC20 for IERC20; using SafeMath for uint256; ILendingPoolAddressesProvider public immutable override ADDRESSES_PROVIDER; ILendingPool public immutable override LENDING_POOL; constructor(ILendingPoolAddressesProvider provider) public { ADDRESSES_PROVIDER = provider; LENDING_POOL = ILendingPool(provider.getLendingPool()); } } interface IPriceOracleGetter { /** * @dev returns the asset price in ETH * @param asset the address of the asset * @return the ETH price of the asset **/ function getAssetPrice(address asset) external view returns (uint256); } interface IUniswapV2Router02 { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint256[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } 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} } /** * @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; } /* * @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 virtual view returns (address payable) { return msg.sender; } function _msgData() internal virtual view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), 'Ownable: caller is not the owner'); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), 'Ownable: new owner is the zero address'); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @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'); } } /** * @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'); } } } /** * @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); } interface IERC20Detailed is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } interface IERC20WithPermit is IERC20 { function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; } /** * @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; } } /** * @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 } } 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); } /** * @title PercentageMath library * @author Aave * @notice Provides functions to perform percentage calculations * @dev Percentages are defined by default with 2 decimals of precision (100.00). The precision is indicated by PERCENTAGE_FACTOR * @dev Operations are rounded half up **/ library PercentageMath { uint256 constant PERCENTAGE_FACTOR = 1e4; //percentage plus two decimals uint256 constant HALF_PERCENT = PERCENTAGE_FACTOR / 2; /** * @dev Executes a percentage multiplication * @param value The value of which the percentage needs to be calculated * @param percentage The percentage of the value to be calculated * @return The percentage of value **/ function percentMul(uint256 value, uint256 percentage) internal pure returns (uint256) { if (value == 0 || percentage == 0) { return 0; } require( value <= (type(uint256).max - HALF_PERCENT) / percentage, Errors.MATH_MULTIPLICATION_OVERFLOW ); return (value * percentage + HALF_PERCENT) / PERCENTAGE_FACTOR; } /** * @dev Executes a percentage division * @param value The value of which the percentage needs to be calculated * @param percentage The percentage of the value to be calculated * @return The value divided the percentage **/ function percentDiv(uint256 value, uint256 percentage) internal pure returns (uint256) { require(percentage != 0, Errors.MATH_DIVISION_BY_ZERO); uint256 halfPercentage = percentage / 2; require( value <= (type(uint256).max - halfPercentage) / PERCENTAGE_FACTOR, Errors.MATH_MULTIPLICATION_OVERFLOW ); return (value * PERCENTAGE_FACTOR + halfPercentage) / percentage; } } /** * @title BaseUniswapAdapter * @notice Implements the logic for performing assets swaps in Uniswap V2 * @author Aave **/ abstract contract BaseUniswapAdapter is FlashLoanReceiverBase, IBaseUniswapAdapter, Ownable { using SafeMath for uint256; using PercentageMath for uint256; using SafeERC20 for IERC20; // Max slippage percent allowed uint256 public constant override MAX_SLIPPAGE_PERCENT = 3000; // 30% // FLash Loan fee set in lending pool uint256 public constant override FLASHLOAN_PREMIUM_TOTAL = 9; // USD oracle asset address address public constant override USD_ADDRESS = 0x10F7Fc1F91Ba351f9C629c5947AD69bD03C05b96; // address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; mainnet // address public constant WETH_ADDRESS = 0xd0a1e359811322d97991e03f863a0c30c2cf029c; kovan address public immutable override WETH_ADDRESS; IPriceOracleGetter public immutable override ORACLE; IUniswapV2Router02 public immutable override UNISWAP_ROUTER; constructor( ILendingPoolAddressesProvider addressesProvider, IUniswapV2Router02 uniswapRouter, address wethAddress ) public FlashLoanReceiverBase(addressesProvider) { ORACLE = IPriceOracleGetter(addressesProvider.getPriceOracle()); UNISWAP_ROUTER = uniswapRouter; WETH_ADDRESS = wethAddress; } /** * @dev Given an input asset amount, returns the maximum output amount of the other asset and the prices * @param amountIn Amount of reserveIn * @param reserveIn Address of the asset to be swap from * @param reserveOut Address of the asset to be swap to * @return uint256 Amount out of the reserveOut * @return uint256 The price of out amount denominated in the reserveIn currency (18 decimals) * @return uint256 In amount of reserveIn value denominated in USD (8 decimals) * @return uint256 Out amount of reserveOut value denominated in USD (8 decimals) */ function getAmountsOut( uint256 amountIn, address reserveIn, address reserveOut ) external view override returns ( uint256, uint256, uint256, uint256, address[] memory ) { AmountCalc memory results = _getAmountsOutData(reserveIn, reserveOut, amountIn); return ( results.calculatedAmount, results.relativePrice, results.amountInUsd, results.amountOutUsd, results.path ); } /** * @dev Returns the minimum input asset amount required to buy the given output asset amount and the prices * @param amountOut Amount of reserveOut * @param reserveIn Address of the asset to be swap from * @param reserveOut Address of the asset to be swap to * @return uint256 Amount in of the reserveIn * @return uint256 The price of in amount denominated in the reserveOut currency (18 decimals) * @return uint256 In amount of reserveIn value denominated in USD (8 decimals) * @return uint256 Out amount of reserveOut value denominated in USD (8 decimals) */ function getAmountsIn( uint256 amountOut, address reserveIn, address reserveOut ) external view override returns ( uint256, uint256, uint256, uint256, address[] memory ) { AmountCalc memory results = _getAmountsInData(reserveIn, reserveOut, amountOut); return ( results.calculatedAmount, results.relativePrice, results.amountInUsd, results.amountOutUsd, results.path ); } /** * @dev Swaps an exact `amountToSwap` of an asset to another * @param assetToSwapFrom Origin asset * @param assetToSwapTo Destination asset * @param amountToSwap Exact amount of `assetToSwapFrom` to be swapped * @param minAmountOut the min amount of `assetToSwapTo` to be received from the swap * @return the amount received from the swap */ function _swapExactTokensForTokens( address assetToSwapFrom, address assetToSwapTo, uint256 amountToSwap, uint256 minAmountOut, bool useEthPath ) internal returns (uint256) { uint256 fromAssetDecimals = _getDecimals(assetToSwapFrom); uint256 toAssetDecimals = _getDecimals(assetToSwapTo); uint256 fromAssetPrice = _getPrice(assetToSwapFrom); uint256 toAssetPrice = _getPrice(assetToSwapTo); uint256 expectedMinAmountOut = amountToSwap .mul(fromAssetPrice.mul(10**toAssetDecimals)) .div(toAssetPrice.mul(10**fromAssetDecimals)) .percentMul(PercentageMath.PERCENTAGE_FACTOR.sub(MAX_SLIPPAGE_PERCENT)); require(expectedMinAmountOut < minAmountOut, 'minAmountOut exceed max slippage'); // Approves the transfer for the swap. Approves for 0 first to comply with tokens that implement the anti frontrunning approval fix. IERC20(assetToSwapFrom).safeApprove(address(UNISWAP_ROUTER), 0); IERC20(assetToSwapFrom).safeApprove(address(UNISWAP_ROUTER), amountToSwap); address[] memory path; if (useEthPath) { path = new address[](3); path[0] = assetToSwapFrom; path[1] = WETH_ADDRESS; path[2] = assetToSwapTo; } else { path = new address[](2); path[0] = assetToSwapFrom; path[1] = assetToSwapTo; } uint256[] memory amounts = UNISWAP_ROUTER.swapExactTokensForTokens( amountToSwap, minAmountOut, path, address(this), block.timestamp ); emit Swapped(assetToSwapFrom, assetToSwapTo, amounts[0], amounts[amounts.length - 1]); return amounts[amounts.length - 1]; } /** * @dev Receive an exact amount `amountToReceive` of `assetToSwapTo` tokens for as few `assetToSwapFrom` tokens as * possible. * @param assetToSwapFrom Origin asset * @param assetToSwapTo Destination asset * @param maxAmountToSwap Max amount of `assetToSwapFrom` allowed to be swapped * @param amountToReceive Exact amount of `assetToSwapTo` to receive * @return the amount swapped */ function _swapTokensForExactTokens( address assetToSwapFrom, address assetToSwapTo, uint256 maxAmountToSwap, uint256 amountToReceive, bool useEthPath ) internal returns (uint256) { uint256 fromAssetDecimals = _getDecimals(assetToSwapFrom); uint256 toAssetDecimals = _getDecimals(assetToSwapTo); uint256 fromAssetPrice = _getPrice(assetToSwapFrom); uint256 toAssetPrice = _getPrice(assetToSwapTo); uint256 expectedMaxAmountToSwap = amountToReceive .mul(toAssetPrice.mul(10**fromAssetDecimals)) .div(fromAssetPrice.mul(10**toAssetDecimals)) .percentMul(PercentageMath.PERCENTAGE_FACTOR.add(MAX_SLIPPAGE_PERCENT)); require(maxAmountToSwap < expectedMaxAmountToSwap, 'maxAmountToSwap exceed max slippage'); // Approves the transfer for the swap. Approves for 0 first to comply with tokens that implement the anti frontrunning approval fix. IERC20(assetToSwapFrom).safeApprove(address(UNISWAP_ROUTER), 0); IERC20(assetToSwapFrom).safeApprove(address(UNISWAP_ROUTER), maxAmountToSwap); address[] memory path; if (useEthPath) { path = new address[](3); path[0] = assetToSwapFrom; path[1] = WETH_ADDRESS; path[2] = assetToSwapTo; } else { path = new address[](2); path[0] = assetToSwapFrom; path[1] = assetToSwapTo; } uint256[] memory amounts = UNISWAP_ROUTER.swapTokensForExactTokens( amountToReceive, maxAmountToSwap, path, address(this), block.timestamp ); emit Swapped(assetToSwapFrom, assetToSwapTo, amounts[0], amounts[amounts.length - 1]); return amounts[0]; } /** * @dev Get the price of the asset from the oracle denominated in eth * @param asset address * @return eth price for the asset */ function _getPrice(address asset) internal view returns (uint256) { return ORACLE.getAssetPrice(asset); } /** * @dev Get the decimals of an asset * @return number of decimals of the asset */ function _getDecimals(address asset) internal view returns (uint256) { return IERC20Detailed(asset).decimals(); } /** * @dev Get the aToken associated to the asset * @return address of the aToken */ function _getReserveData(address asset) internal view returns (DataTypes.ReserveData memory) { return LENDING_POOL.getReserveData(asset); } /** * @dev Pull the ATokens from the user * @param reserve address of the asset * @param reserveAToken address of the aToken of the reserve * @param user address * @param amount of tokens to be transferred to the contract * @param permitSignature struct containing the permit signature */ function _pullAToken( address reserve, address reserveAToken, address user, uint256 amount, PermitSignature memory permitSignature ) internal { if (_usePermit(permitSignature)) { IERC20WithPermit(reserveAToken).permit( user, address(this), permitSignature.amount, permitSignature.deadline, permitSignature.v, permitSignature.r, permitSignature.s ); } // transfer from user to adapter IERC20(reserveAToken).safeTransferFrom(user, address(this), amount); // withdraw reserve LENDING_POOL.withdraw(reserve, amount, address(this)); } /** * @dev Tells if the permit method should be called by inspecting if there is a valid signature. * If signature params are set to 0, then permit won't be called. * @param signature struct containing the permit signature * @return whether or not permit should be called */ function _usePermit(PermitSignature memory signature) internal pure returns (bool) { return !(uint256(signature.deadline) == uint256(signature.v) && uint256(signature.deadline) == 0); } /** * @dev Calculates the value denominated in USD * @param reserve Address of the reserve * @param amount Amount of the reserve * @param decimals Decimals of the reserve * @return whether or not permit should be called */ function _calcUsdValue( address reserve, uint256 amount, uint256 decimals ) internal view returns (uint256) { uint256 ethUsdPrice = _getPrice(USD_ADDRESS); uint256 reservePrice = _getPrice(reserve); return amount.mul(reservePrice).div(10**decimals).mul(ethUsdPrice).div(10**18); } /** * @dev Given an input asset amount, returns the maximum output amount of the other asset * @param reserveIn Address of the asset to be swap from * @param reserveOut Address of the asset to be swap to * @param amountIn Amount of reserveIn * @return Struct containing the following information: * uint256 Amount out of the reserveOut * uint256 The price of out amount denominated in the reserveIn currency (18 decimals) * uint256 In amount of reserveIn value denominated in USD (8 decimals) * uint256 Out amount of reserveOut value denominated in USD (8 decimals) */ function _getAmountsOutData( address reserveIn, address reserveOut, uint256 amountIn ) internal view returns (AmountCalc memory) { // Subtract flash loan fee uint256 finalAmountIn = amountIn.sub(amountIn.mul(FLASHLOAN_PREMIUM_TOTAL).div(10000)); address[] memory simplePath = new address[](2); simplePath[0] = reserveIn; simplePath[1] = reserveOut; uint256[] memory amountsWithoutWeth; uint256[] memory amountsWithWeth; address[] memory pathWithWeth = new address[](3); if (reserveIn != WETH_ADDRESS && reserveOut != WETH_ADDRESS) { pathWithWeth[0] = reserveIn; pathWithWeth[1] = WETH_ADDRESS; pathWithWeth[2] = reserveOut; try UNISWAP_ROUTER.getAmountsOut(finalAmountIn, pathWithWeth) returns ( uint256[] memory resultsWithWeth ) { amountsWithWeth = resultsWithWeth; } catch { amountsWithWeth = new uint256[](3); } } else { amountsWithWeth = new uint256[](3); } uint256 bestAmountOut; try UNISWAP_ROUTER.getAmountsOut(finalAmountIn, simplePath) returns ( uint256[] memory resultAmounts ) { amountsWithoutWeth = resultAmounts; bestAmountOut = (amountsWithWeth[2] > amountsWithoutWeth[1]) ? amountsWithWeth[2] : amountsWithoutWeth[1]; } catch { amountsWithoutWeth = new uint256[](2); bestAmountOut = amountsWithWeth[2]; } uint256 reserveInDecimals = _getDecimals(reserveIn); uint256 reserveOutDecimals = _getDecimals(reserveOut); uint256 outPerInPrice = finalAmountIn.mul(10**18).mul(10**reserveOutDecimals).div( bestAmountOut.mul(10**reserveInDecimals) ); return AmountCalc( bestAmountOut, outPerInPrice, _calcUsdValue(reserveIn, amountIn, reserveInDecimals), _calcUsdValue(reserveOut, bestAmountOut, reserveOutDecimals), (bestAmountOut == 0) ? new address[](2) : (bestAmountOut == amountsWithoutWeth[1]) ? simplePath : pathWithWeth ); } /** * @dev Returns the minimum input asset amount required to buy the given output asset amount * @param reserveIn Address of the asset to be swap from * @param reserveOut Address of the asset to be swap to * @param amountOut Amount of reserveOut * @return Struct containing the following information: * uint256 Amount in of the reserveIn * uint256 The price of in amount denominated in the reserveOut currency (18 decimals) * uint256 In amount of reserveIn value denominated in USD (8 decimals) * uint256 Out amount of reserveOut value denominated in USD (8 decimals) */ function _getAmountsInData( address reserveIn, address reserveOut, uint256 amountOut ) internal view returns (AmountCalc memory) { (uint256[] memory amounts, address[] memory path) = _getAmountsInAndPath(reserveIn, reserveOut, amountOut); // Add flash loan fee uint256 finalAmountIn = amounts[0].add(amounts[0].mul(FLASHLOAN_PREMIUM_TOTAL).div(10000)); uint256 reserveInDecimals = _getDecimals(reserveIn); uint256 reserveOutDecimals = _getDecimals(reserveOut); uint256 inPerOutPrice = amountOut.mul(10**18).mul(10**reserveInDecimals).div( finalAmountIn.mul(10**reserveOutDecimals) ); return AmountCalc( finalAmountIn, inPerOutPrice, _calcUsdValue(reserveIn, finalAmountIn, reserveInDecimals), _calcUsdValue(reserveOut, amountOut, reserveOutDecimals), path ); } /** * @dev Calculates the input asset amount required to buy the given output asset amount * @param reserveIn Address of the asset to be swap from * @param reserveOut Address of the asset to be swap to * @param amountOut Amount of reserveOut * @return uint256[] amounts Array containing the amountIn and amountOut for a swap */ function _getAmountsInAndPath( address reserveIn, address reserveOut, uint256 amountOut ) internal view returns (uint256[] memory, address[] memory) { address[] memory simplePath = new address[](2); simplePath[0] = reserveIn; simplePath[1] = reserveOut; uint256[] memory amountsWithoutWeth; uint256[] memory amountsWithWeth; address[] memory pathWithWeth = new address[](3); if (reserveIn != WETH_ADDRESS && reserveOut != WETH_ADDRESS) { pathWithWeth[0] = reserveIn; pathWithWeth[1] = WETH_ADDRESS; pathWithWeth[2] = reserveOut; try UNISWAP_ROUTER.getAmountsIn(amountOut, pathWithWeth) returns ( uint256[] memory resultsWithWeth ) { amountsWithWeth = resultsWithWeth; } catch { amountsWithWeth = new uint256[](3); } } else { amountsWithWeth = new uint256[](3); } try UNISWAP_ROUTER.getAmountsIn(amountOut, simplePath) returns ( uint256[] memory resultAmounts ) { amountsWithoutWeth = resultAmounts; return (amountsWithWeth[2] > amountsWithoutWeth[1]) ? (amountsWithWeth, pathWithWeth) : (amountsWithoutWeth, simplePath); } catch { return (amountsWithWeth, pathWithWeth); } } /** * @dev Calculates the input asset amount required to buy the given output asset amount * @param reserveIn Address of the asset to be swap from * @param reserveOut Address of the asset to be swap to * @param amountOut Amount of reserveOut * @return uint256[] amounts Array containing the amountIn and amountOut for a swap */ function _getAmountsIn( address reserveIn, address reserveOut, uint256 amountOut, bool useEthPath ) internal view returns (uint256[] memory) { address[] memory path; if (useEthPath) { path = new address[](3); path[0] = reserveIn; path[1] = WETH_ADDRESS; path[2] = reserveOut; } else { path = new address[](2); path[0] = reserveIn; path[1] = reserveOut; } return UNISWAP_ROUTER.getAmountsIn(amountOut, path); } /** * @dev Emergency rescue for token stucked on this contract, as failsafe mechanism * - Funds should never remain in this contract more time than during transactions * - Only callable by the owner **/ function rescueTokens(IERC20 token) external onlyOwner { token.transfer(owner(), token.balanceOf(address(this))); } } /** * @title UniswapRepayAdapter * @notice Uniswap V2 Adapter to perform a repay of a debt with collateral. * @author Aave **/ contract UniswapRepayAdapter is BaseUniswapAdapter { struct RepayParams { address collateralAsset; uint256 collateralAmount; uint256 rateMode; PermitSignature permitSignature; bool useEthPath; } constructor( ILendingPoolAddressesProvider addressesProvider, IUniswapV2Router02 uniswapRouter, address wethAddress ) public BaseUniswapAdapter(addressesProvider, uniswapRouter, wethAddress) {} /** * @dev Uses the received funds from the flash loan to repay a debt on the protocol on behalf of the user. Then pulls * the collateral from the user and swaps it to the debt asset to repay the flash loan. * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset, swap it * and repay the flash loan. * Supports only one asset on the flash loan. * @param assets Address of debt asset * @param amounts Amount of the debt to be repaid * @param premiums Fee of the flash loan * @param initiator Address of the user * @param params Additional variadic field to include extra params. Expected parameters: * address collateralAsset Address of the reserve to be swapped * uint256 collateralAmount Amount of reserve to be swapped * uint256 rateMode Rate modes of the debt to be repaid * uint256 permitAmount Amount for the permit signature * uint256 deadline Deadline for the permit signature * uint8 v V param for the permit signature * bytes32 r R param for the permit signature * bytes32 s S param for the permit signature */ function executeOperation( address[] calldata assets, uint256[] calldata amounts, uint256[] calldata premiums, address initiator, bytes calldata params ) external override returns (bool) { require(msg.sender == address(LENDING_POOL), 'CALLER_MUST_BE_LENDING_POOL'); RepayParams memory decodedParams = _decodeParams(params); _swapAndRepay( decodedParams.collateralAsset, assets[0], amounts[0], decodedParams.collateralAmount, decodedParams.rateMode, initiator, premiums[0], decodedParams.permitSignature, decodedParams.useEthPath ); return true; } /** * @dev Swaps the user collateral for the debt asset and then repay the debt on the protocol on behalf of the user * without using flash loans. This method can be used when the temporary transfer of the collateral asset to this * contract does not affect the user position. * The user should give this contract allowance to pull the ATokens in order to withdraw the underlying asset * @param collateralAsset Address of asset to be swapped * @param debtAsset Address of debt asset * @param collateralAmount Amount of the collateral to be swapped * @param debtRepayAmount Amount of the debt to be repaid * @param debtRateMode Rate mode of the debt to be repaid * @param permitSignature struct containing the permit signature * @param useEthPath struct containing the permit signature */ function swapAndRepay( address collateralAsset, address debtAsset, uint256 collateralAmount, uint256 debtRepayAmount, uint256 debtRateMode, PermitSignature calldata permitSignature, bool useEthPath ) external { DataTypes.ReserveData memory collateralReserveData = _getReserveData(collateralAsset); DataTypes.ReserveData memory debtReserveData = _getReserveData(debtAsset); address debtToken = DataTypes.InterestRateMode(debtRateMode) == DataTypes.InterestRateMode.STABLE ? debtReserveData.stableDebtTokenAddress : debtReserveData.variableDebtTokenAddress; uint256 currentDebt = IERC20(debtToken).balanceOf(msg.sender); uint256 amountToRepay = debtRepayAmount <= currentDebt ? debtRepayAmount : currentDebt; if (collateralAsset != debtAsset) { uint256 maxCollateralToSwap = collateralAmount; if (amountToRepay < debtRepayAmount) { maxCollateralToSwap = maxCollateralToSwap.mul(amountToRepay).div(debtRepayAmount); } // Get exact collateral needed for the swap to avoid leftovers uint256[] memory amounts = _getAmountsIn(collateralAsset, debtAsset, amountToRepay, useEthPath); require(amounts[0] <= maxCollateralToSwap, 'slippage too high'); // Pull aTokens from user _pullAToken( collateralAsset, collateralReserveData.aTokenAddress, msg.sender, amounts[0], permitSignature ); // Swap collateral for debt asset _swapTokensForExactTokens(collateralAsset, debtAsset, amounts[0], amountToRepay, useEthPath); } else { // Pull aTokens from user _pullAToken( collateralAsset, collateralReserveData.aTokenAddress, msg.sender, amountToRepay, permitSignature ); } // Repay debt. Approves 0 first to comply with tokens that implement the anti frontrunning approval fix IERC20(debtAsset).safeApprove(address(LENDING_POOL), 0); IERC20(debtAsset).safeApprove(address(LENDING_POOL), amountToRepay); LENDING_POOL.repay(debtAsset, amountToRepay, debtRateMode, msg.sender); } /** * @dev Perform the repay of the debt, pulls the initiator collateral and swaps to repay the flash loan * * @param collateralAsset Address of token to be swapped * @param debtAsset Address of debt token to be received from the swap * @param amount Amount of the debt to be repaid * @param collateralAmount Amount of the reserve to be swapped * @param rateMode Rate mode of the debt to be repaid * @param initiator Address of the user * @param premium Fee of the flash loan * @param permitSignature struct containing the permit signature */ function _swapAndRepay( address collateralAsset, address debtAsset, uint256 amount, uint256 collateralAmount, uint256 rateMode, address initiator, uint256 premium, PermitSignature memory permitSignature, bool useEthPath ) internal { DataTypes.ReserveData memory collateralReserveData = _getReserveData(collateralAsset); // Repay debt. Approves for 0 first to comply with tokens that implement the anti frontrunning approval fix. IERC20(debtAsset).safeApprove(address(LENDING_POOL), 0); IERC20(debtAsset).safeApprove(address(LENDING_POOL), amount); uint256 repaidAmount = IERC20(debtAsset).balanceOf(address(this)); LENDING_POOL.repay(debtAsset, amount, rateMode, initiator); repaidAmount = repaidAmount.sub(IERC20(debtAsset).balanceOf(address(this))); if (collateralAsset != debtAsset) { uint256 maxCollateralToSwap = collateralAmount; if (repaidAmount < amount) { maxCollateralToSwap = maxCollateralToSwap.mul(repaidAmount).div(amount); } uint256 neededForFlashLoanDebt = repaidAmount.add(premium); uint256[] memory amounts = _getAmountsIn(collateralAsset, debtAsset, neededForFlashLoanDebt, useEthPath); require(amounts[0] <= maxCollateralToSwap, 'slippage too high'); // Pull aTokens from user _pullAToken( collateralAsset, collateralReserveData.aTokenAddress, initiator, amounts[0], permitSignature ); // Swap collateral asset to the debt asset _swapTokensForExactTokens(collateralAsset, debtAsset, amounts[0], neededForFlashLoanDebt, useEthPath); } else { // Pull aTokens from user _pullAToken( collateralAsset, collateralReserveData.aTokenAddress, initiator, repaidAmount.add(premium), permitSignature ); } // Repay flashloan. Approves for 0 first to comply with tokens that implement the anti frontrunning approval fix. IERC20(debtAsset).safeApprove(address(LENDING_POOL), 0); IERC20(debtAsset).safeApprove(address(LENDING_POOL), amount.add(premium)); } /** * @dev Decodes debt information encoded in the flash loan params * @param params Additional variadic field to include extra params. Expected parameters: * address collateralAsset Address of the reserve to be swapped * uint256 collateralAmount Amount of reserve to be swapped * uint256 rateMode Rate modes of the debt to be repaid * uint256 permitAmount Amount for the permit signature * uint256 deadline Deadline for the permit signature * uint8 v V param for the permit signature * bytes32 r R param for the permit signature * bytes32 s S param for the permit signature * @return RepayParams struct containing decoded params */ function _decodeParams(bytes memory params) internal pure returns (RepayParams memory) { ( address collateralAsset, uint256 collateralAmount, uint256 rateMode, uint256 permitAmount, uint256 deadline, uint8 v, bytes32 r, bytes32 s, bool useEthPath ) = abi.decode( params, (address, uint256, uint256, uint256, uint256, uint8, bytes32, bytes32, bool) ); return RepayParams( collateralAsset, collateralAmount, rateMode, PermitSignature(permitAmount, deadline, v, r, s), useEthPath ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"addressesProvider","type":"address"},{"internalType":"contract IUniswapV2Router02","name":"uniswapRouter","type":"address"},{"internalType":"address","name":"wethAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromAsset","type":"address"},{"indexed":false,"internalType":"address","name":"toAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receivedAmount","type":"uint256"}],"name":"Swapped","type":"event"},{"inputs":[],"name":"ADDRESSES_PROVIDER","outputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FLASHLOAN_PREMIUM_TOTAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LENDING_POOL","outputs":[{"internalType":"contract ILendingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SLIPPAGE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ORACLE","outputs":[{"internalType":"contract IPriceOracleGetter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNISWAP_ROUTER","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USD_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"reserveIn","type":"address"},{"internalType":"address","name":"reserveOut","type":"address"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"reserveIn","type":"address"},{"internalType":"address","name":"reserveOut","type":"address"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collateralAsset","type":"address"},{"internalType":"address","name":"debtAsset","type":"address"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"debtRepayAmount","type":"uint256"},{"internalType":"uint256","name":"debtRateMode","type":"uint256"},{"components":[{"internalType":"uint256","name":"amount","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"}],"internalType":"struct IBaseUniswapAdapter.PermitSignature","name":"permitSignature","type":"tuple"},{"internalType":"bool","name":"useEthPath","type":"bool"}],"name":"swapAndRepay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040523480156200001257600080fd5b506040516200345e3803806200345e8339810160408190526200003591620001fd565b82828282806001600160a01b03166080816001600160a01b031660601b81525050806001600160a01b0316630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009057600080fd5b505afa158015620000a5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000cb9190620001d7565b60601b6001600160601b03191660a052506000620000e8620001d3565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350826001600160a01b031663fca513a86040518163ffffffff1660e01b815260040160206040518083038186803b1580156200016c57600080fd5b505afa15801562000181573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a79190620001d7565b6001600160601b0319606091821b811660e05292811b8316610100521b1660c052506200026992505050565b3390565b600060208284031215620001e9578081fd5b8151620001f68162000250565b9392505050565b60008060006060848603121562000212578182fd5b83516200021f8162000250565b6020850151909350620002328162000250565b6040850151909250620002458162000250565b809150509250925092565b6001600160a01b03811681146200026657600080fd5b50565b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c61311a6200034460003980610601528061100c528061110052806116ae5280611936528061196b5280611aff528061201c528061210d5250806103a2528061228d52508061034f5280610ee65280610f235280610f8d528061159b52806119e95280611ef65280611f335280611f9d52508061045f528061057c5280610817528061084c52806108885280610aa75280610adc5280610b9a5280610db05280610ddb528061143252806117fc525080610373525061311a6000f3fe608060405234801561001057600080fd5b50600436106100ff5760003560e01c8063920f5c8411610097578063cdf58cd611610066578063cdf58cd6146101c8578063d8264920146101db578063e6813563146101e3578063f2fde38b146101f6576100ff565b8063920f5c84146101745780639d1211bf14610194578063b4dcfc771461019c578063baf7fa99146101a4576100ff565b806332e4b286116100d357806332e4b2861461015457806338013f021461015c578063715018a6146101645780638da5cb5b1461016c576100ff565b8062ae3bf814610104578063040141e5146101195780630542975c14610137578063074b2e431461013f575b600080fd5b6101176101123660046126a3565b610209565b005b61012161034d565b60405161012e9190612ba3565b60405180910390f35b610121610371565b610147610395565b60405161012e9190612fa8565b61014761039a565b6101216103a0565b6101176103c4565b610121610443565b6101876101823660046127cd565b610452565b60405161012e9190612cc6565b610121610562565b61012161057a565b6101b76101b2366004612ae7565b61059e565b60405161012e959493929190613006565b6101b76101d6366004612ae7565b6105e4565b6101216105ff565b6101176101f1366004612748565b610623565b6101176102043660046126a3565b610924565b6102116109da565b6000546001600160a01b039081169116146102475760405162461bcd60e51b815260040161023e90612e71565b60405180910390fd5b806001600160a01b031663a9059cbb61025e610443565b6040516370a0823160e01b81526001600160a01b038516906370a082319061028a903090600401612ba3565b60206040518083038186803b1580156102a257600080fd5b505afa1580156102b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102da9190612acf565b6040518363ffffffff1660e01b81526004016102f7929190612c5f565b602060405180830381600087803b15801561031157600080fd5b505af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061295f565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600981565b610bb881565b7f000000000000000000000000000000000000000000000000000000000000000081565b6103cc6109da565b6000546001600160a01b039081169116146103f95760405162461bcd60e51b815260040161023e90612e71565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461049c5760405162461bcd60e51b815260040161023e90612d04565b6104a46124d1565b6104e384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109de92505050565b905061055181600001518c8c60008181106104fa57fe5b905060200201602081019061050f91906126a3565b8b8b600081811061051c57fe5b90506020020135846020015185604001518a8d8d600081811061053b57fe5b9050602002013588606001518960800151610a85565b5060019a9950505050505050505050565b7310f7fc1f91ba351f9c629c5947ad69bd03c05b9681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060606105ae61250f565b6105b988888b610e22565b8051602082015160408301516060840151608090940151929d919c509a509198509650945050505050565b60008060008060606105f461250f565b6105b988888b61130f565b7f000000000000000000000000000000000000000000000000000000000000000081565b61062b61253e565b61063488611413565b905061063e61253e565b61064788611413565b90506000600186600281111561065957fe5b600281111561066457fe5b146106745781610120015161067b565b8161010001515b90506000816001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016106ab9190612ba3565b60206040518083038186803b1580156106c357600080fd5b505afa1580156106d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fb9190612acf565b905060008189111561070d578161070f565b885b90508a6001600160a01b03168c6001600160a01b0316146107ec57898982101561074a576107478a61074183856114be565b906114ff565b90505b60606107588e8e858b611541565b9050818160008151811061076857fe5b6020026020010151111561078e5760405162461bcd60e51b815260040161023e90612ea6565b6107c38e8860e0015133846000815181106107a557fe5b60200260200101518d8036038101906107be919061297b565b611743565b6107e48e8e836000815181106107d557fe5b6020026020010151868c61188f565b505050610808565b6108088c8660e0015133848b8036038101906107be919061297b565b61083d6001600160a01b038c167f00000000000000000000000000000000000000000000000000000000000000006000611c23565b6108716001600160a01b038c167f000000000000000000000000000000000000000000000000000000000000000083611c23565b60405163573ade8160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063573ade81906108c3908e9085908d903390600401612c9b565b602060405180830381600087803b1580156108dd57600080fd5b505af11580156108f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109159190612acf565b50505050505050505050505050565b61092c6109da565b6000546001600160a01b039081169116146109595760405162461bcd60e51b815260040161023e90612e71565b6001600160a01b03811661097f5760405162461bcd60e51b815260040161023e90612d3b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6109e66124d1565b60008060008060008060008060008a806020019051810190610a0891906126bf565b9850985098509850985098509850985098506040518060a001604052808a6001600160a01b031681526020018981526020018881526020016040518060a001604052808981526020018881526020018760ff1681526020018681526020018581525081526020018215158152509950505050505050505050919050565b610a8d61253e565b610a968a611413565b9050610acd6001600160a01b038a167f00000000000000000000000000000000000000000000000000000000000000006000611c23565b610b016001600160a01b038a167f00000000000000000000000000000000000000000000000000000000000000008a611c23565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190610b30903090600401612ba3565b60206040518083038186803b158015610b4857600080fd5b505afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b809190612acf565b60405163573ade8160e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063573ade8190610bd5908d908d908c908c90600401612c9b565b602060405180830381600087803b158015610bef57600080fd5b505af1158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190612acf565b506040516370a0823160e01b8152610caf906001600160a01b038c16906370a0823190610c58903090600401612ba3565b60206040518083038186803b158015610c7057600080fd5b505afa158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca89190612acf565b8290611d22565b9050896001600160a01b03168b6001600160a01b031614610d85578789821015610ce457610ce18a61074183856114be565b90505b6000610cf08388611d64565b90506060610d008e8e8489611541565b90508281600081518110610d1057fe5b60200260200101511115610d365760405162461bcd60e51b815260040161023e90612ea6565b610d5b8e8660e001518b84600081518110610d4d57fe5b60200260200101518b611743565b610d7c8e8e83600081518110610d6d57fe5b6020026020010151858a61188f565b50505050610da1565b60e0820151610da1908c9088610d9b858a611d64565b88611743565b610dd66001600160a01b038b167f00000000000000000000000000000000000000000000000000000000000000006000611c23565b610e157f0000000000000000000000000000000000000000000000000000000000000000610e048b88611d64565b6001600160a01b038d169190611c23565b5050505050505050505050565b610e2a61250f565b6000610e47610e406127106107418660096114be565b8490611d22565b6040805160028082526060808301845293945090916020830190803683370190505090508581600081518110610e7957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508481600181518110610ea757fe5b6001600160a01b0392909216602092830291909101820152604080516003808252608082019092526060928392839291820183803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614158015610f5857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b031614155b156110c4578881600081518110610f6b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610fb957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600281518110610fe757fe5b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063d06ca61f906110459088908590600401612fb1565b60006040518083038186803b15801561105d57600080fd5b505afa92505050801561109257506040513d6000823e601f3d908101601f1916820160405261108f91908101906128ca565b60015b6110bc576040805160038082526080820190925290602082016060803683370190505091506110bf565b91505b6110e6565b6040805160038082526080820190925290602082016060803683370190505091505b60405163d06ca61f60e01b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f906111379089908990600401612fb1565b60006040518083038186803b15801561114f57600080fd5b505afa92505050801561118457506040513d6000823e601f3d908101601f1916820160405261118191908101906128ca565b60015b6111c4576040805160028082526060820183529091602083019080368337019050509350826002815181106111b557fe5b6020026020010151905061122a565b809450846001815181106111d457fe5b6020026020010151846002815181106111e957fe5b602002602001015111611210578460018151811061120357fe5b6020026020010151611226565b8360028151811061121d57fe5b60200260200101515b9150505b60006112358b611d89565b905060006112428b611d89565b9050600061127761125785600a86900a6114be565b610741600a85900a6112718d670de0b6b3a76400006114be565b906114be565b90506040518060a0016040528085815260200182815260200161129b8f8e87611e05565b81526020016112ab8e8786611e05565b815260200185156112de57886001815181106112c357fe5b602002602001015186146112d757866112d9565b895b6112fc565b60408051600280825260608201835290916020830190803683375050505b90529d9c50505050505050505050505050565b61131761250f565b606080611325868686611e54565b91509150600061137f61135c61271061074160098760008151811061134657fe5b60200260200101516114be90919063ffffffff16565b8460008151811061136957fe5b6020026020010151611d6490919063ffffffff16565b9050600061138c88611d89565b9050600061139988611d89565b905060006113c86113ae85600a85900a6114be565b610741600a86900a6112718c670de0b6b3a76400006114be565b90506040518060a001604052808581526020018281526020016113ec8c8787611e05565b81526020016113fc8b8b86611e05565b815260200195909552509298975050505050505050565b61141b61253e565b6040516335ea6a7560e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906335ea6a7590611467908590600401612ba3565b6101806040518083038186803b15801561148057600080fd5b505afa158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b891906129d4565b92915050565b6000826114cd575060006114b8565b828202828482816114da57fe5b04146114f85760405162461bcd60e51b815260040161023e90612e30565b9392505050565b60006114f883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121f0565b606080821561161a57604080516003808252608082019092529060208201606080368337019050509050858160008151811061157957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106115c757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084816002815181106115f557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611697565b6040805160028082526060820183529091602083019080368337019050509050858160008151811061164857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061167657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b6040516307c0329d60e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631f00ca74906116e59087908590600401612fb1565b60006040518083038186803b1580156116fd57600080fd5b505afa158015611711573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261173991908101906128ca565b9695505050505050565b61174c81612227565b156117d057836001600160a01b031663d505accf8430846000015185602001518660400151876060015188608001516040518863ffffffff1660e01b815260040161179d9796959493929190612c1e565b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050505b6117e56001600160a01b03851684308561224c565b604051631a4ca37b60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906369328dec9061183590889086903090600401612c78565b602060405180830381600087803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190612acf565b505050505050565b60008061189b87611d89565b905060006118a887611d89565b905060006118b589612273565b905060006118c289612273565b905060006119066118d7612710610bb8611d64565b6119006118e886600a89900a6114be565b6107416118f987600a8c900a6114be565b8d906114be565b90612312565b90508089106119275760405162461bcd60e51b815260040161023e90612ded565b61195c6001600160a01b038c167f00000000000000000000000000000000000000000000000000000000000000006000611c23565b6119906001600160a01b038c167f00000000000000000000000000000000000000000000000000000000000000008b611c23565b60608715611a68576040805160038082526080820190925290602082016060803683370190505090508b816000815181106119c757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611a1557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508a81600281518110611a4357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611ae5565b60408051600280825260608201835290916020830190803683370190505090508b81600081518110611a9657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508a81600181518110611ac457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604051634401edf760e11b81526060906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638803dbee90611b3c908d908f90879030904290600401612fca565b600060405180830381600087803b158015611b5657600080fd5b505af1158015611b6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b9291908101906128ca565b90507fa078c4190abe07940190effc1846be0ccf03ad6007bc9e93f9697d0b460befbb8d8d83600081518110611bc457fe5b602002602001015184600186510381518110611bdc57fe5b6020026020010151604051611bf49493929190612bf5565b60405180910390a180600081518110611c0957fe5b602002602001015197505050505050505095945050505050565b801580611cab5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611c599030908690600401612bb7565b60206040518083038186803b158015611c7157600080fd5b505afa158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca99190612acf565b155b611cc75760405162461bcd60e51b815260040161023e90612f1b565b611d1d8363095ea7b360e01b8484604051602401611ce6929190612c5f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612384565b505050565b60006114f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612469565b6000828201838110156114f85760405162461bcd60e51b815260040161023e90612d81565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611dc457600080fd5b505afa158015611dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfc9190612b28565b60ff1692915050565b600080611e257310f7fc1f91ba351f9c629c5947ad69bd03c05b96612273565b90506000611e3286612273565b9050611739670de0b6b3a764000061074184611271600a89900a838b886114be565b6040805160028082526060828101909352829182918160200160208202803683370190505090508581600081518110611e8957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508481600181518110611eb757fe5b6001600160a01b0392909216602092830291909101820152604080516003808252608082019092526060928392839291820183803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614158015611f6857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316886001600160a01b031614155b156120d4578881600081518110611f7b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611fc957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600281518110611ff757fe5b6001600160a01b0392831660209182029290920101526040516307c0329d60e21b81527f000000000000000000000000000000000000000000000000000000000000000090911690631f00ca7490612055908a908590600401612fb1565b60006040518083038186803b15801561206d57600080fd5b505afa9250505080156120a257506040513d6000823e601f3d908101601f1916820160405261209f91908101906128ca565b60015b6120cc576040805160038082526080820190925290602082016060803683370190505091506120cf565b91505b6120f6565b6040805160038082526080820190925290602082016060803683370190505091505b6040516307c0329d60e21b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631f00ca7490612144908a908890600401612fb1565b60006040518083038186803b15801561215c57600080fd5b505afa92505050801561219157506040513d6000823e601f3d908101601f1916820160405261218e91908101906128ca565b60015b6121a25790945092506121e8915050565b809350836001815181106121b257fe5b6020026020010151836002815181106121c757fe5b6020026020010151116121db5783856121de565b82825b9650965050505050505b935093915050565b600081836122115760405162461bcd60e51b815260040161023e9190612cd1565b50600083858161221d57fe5b0495945050505050565b6000816040015160ff16826020015114801561224557506020820151155b1592915050565b61226d846323b872dd60e01b858585604051602401611ce693929190612bd1565b50505050565b60405163b3596f0760e01b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b3596f07906122c2908590600401612ba3565b60206040518083038186803b1580156122da57600080fd5b505afa1580156122ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b89190612acf565b600082158061231f575081155b1561232c575060006114b8565b81611388198161233857fe5b0483111560405180604001604052806002815260200161068760f31b815250906123755760405162461bcd60e51b815260040161023e9190612cd1565b50506127109102611388010490565b612396826001600160a01b0316612495565b6123b25760405162461bcd60e51b815260040161023e90612f71565b60006060836001600160a01b0316836040516123ce9190612b87565b6000604051808303816000865af19150503d806000811461240b576040519150601f19603f3d011682016040523d82523d6000602084013e612410565b606091505b5091509150816124325760405162461bcd60e51b815260040161023e90612db8565b80511561226d578080602001905181019061244d919061295f565b61226d5760405162461bcd60e51b815260040161023e90612ed1565b6000818484111561248d5760405162461bcd60e51b815260040161023e9190612cd1565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906124c957508115155b949350505050565b6040518060a0016040528060006001600160a01b0316815260200160008152602001600081526020016125026125a9565b8152600060209091015290565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001606081525090565b6040518061018001604052806125526125d7565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082018190526101609091015290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b6040518060200160405280600081525090565b80516114b8816130af565b60008083601f840112612606578182fd5b50813567ffffffffffffffff81111561261d578182fd5b602083019150836020808302850101111561263757600080fd5b9250929050565b60006020828403121561264f578081fd5b612659602061303c565b9151825250919050565b80516fffffffffffffffffffffffffffffffff811681146114b857600080fd5b805164ffffffffff811681146114b857600080fd5b80516114b8816130d5565b6000602082840312156126b4578081fd5b81356114f8816130af565b60008060008060008060008060006101208a8c0312156126dd578485fd5b89516126e8816130af565b8099505060208a0151975060408a0151965060608a0151955060808a0151945060a08a0151612716816130d5565b8094505060c08a0151925060e08a015191506101008a0151612737816130c7565b809150509295985092959850929598565b6000806000806000806000878903610160811215612764578182fd5b883561276f816130af565b9750602089013561277f816130af565b965060408901359550606089013594506080890135935060a0609f19820112156127a7578182fd5b5060a0880191506101408801356127bd816130c7565b8091505092959891949750929550565b600080600080600080600080600060a08a8c0312156127ea578283fd5b893567ffffffffffffffff80821115612801578485fd5b61280d8d838e016125f5565b909b50995060208c0135915080821115612825578485fd5b6128318d838e016125f5565b909950975060408c0135915080821115612849578485fd5b6128558d838e016125f5565b909750955060608c0135915061286a826130af565b90935060808b0135908082111561287f578384fd5b818c0191508c601f830112612892578384fd5b8135818111156128a0578485fd5b8d60208285010111156128b1578485fd5b6020830194508093505050509295985092959850929598565b600060208083850312156128dc578182fd5b825167ffffffffffffffff8111156128f2578283fd5b8301601f81018513612902578283fd5b805161291561291082613063565b61303c565b8181528381019083850185840285018601891015612931578687fd5b8694505b83851015612953578051835260019490940193918501918501612935565b50979650505050505050565b600060208284031215612970578081fd5b81516114f8816130c7565b600060a0828403121561298c578081fd5b61299660a061303c565b823581526020830135602082015260408301356129b2816130d5565b6040820152606083810135908201526080928301359281019290925250919050565b60006101808083850312156129e7578182fd5b6129f08161303c565b90506129fc848461263e565b8152612a0b8460208501612663565b6020820152612a1d8460408501612663565b6040820152612a2f8460608501612663565b6060820152612a418460808501612663565b6080820152612a538460a08501612663565b60a0820152612a658460c08501612683565b60c0820152612a778460e085016125ea565b60e0820152610100612a8b858286016125ea565b90820152610120612a9e858583016125ea565b90820152610140612ab1858583016125ea565b90820152610160612ac485858301612698565b908201529392505050565b600060208284031215612ae0578081fd5b5051919050565b600080600060608486031215612afb578081fd5b833592506020840135612b0d816130af565b91506040840135612b1d816130af565b809150509250925092565b600060208284031215612b39578081fd5b81516114f8816130d5565b6000815180845260208085019450808401835b83811015612b7c5781516001600160a01b031687529582019590820190600101612b57565b509495945050505050565b60008251612b99818460208701613083565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b901515815260200190565b6000602082528251806020840152612cf0816040850160208701613083565b601f01601f19169190910160400192915050565b6020808252601b908201527f43414c4c45525f4d5553545f42455f4c454e44494e475f504f4f4c0000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b60208082526023908201527f6d6178416d6f756e74546f5377617020657863656564206d617820736c69707060408201526261676560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152700e6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b90815260200190565b6000838252604060208301526124c96040830184612b44565b600086825285602083015260a06040830152612fe960a0830186612b44565b6001600160a01b0394909416606083015250608001529392505050565b600086825285602083015284604083015283606083015260a0608083015261303160a0830184612b44565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561305b57600080fd5b604052919050565b600067ffffffffffffffff821115613079578081fd5b5060209081020190565b60005b8381101561309e578181015183820152602001613086565b8381111561226d5750506000910152565b6001600160a01b03811681146130c457600080fd5b50565b80151581146130c457600080fd5b60ff811681146130c457600080fdfea26469706673582212204ce73a3161d672b9316458ff00ff51a9752c53a9e30d47f7b74cf10c0d809aa864736f6c634300060c0033000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c50000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ff5760003560e01c8063920f5c8411610097578063cdf58cd611610066578063cdf58cd6146101c8578063d8264920146101db578063e6813563146101e3578063f2fde38b146101f6576100ff565b8063920f5c84146101745780639d1211bf14610194578063b4dcfc771461019c578063baf7fa99146101a4576100ff565b806332e4b286116100d357806332e4b2861461015457806338013f021461015c578063715018a6146101645780638da5cb5b1461016c576100ff565b8062ae3bf814610104578063040141e5146101195780630542975c14610137578063074b2e431461013f575b600080fd5b6101176101123660046126a3565b610209565b005b61012161034d565b60405161012e9190612ba3565b60405180910390f35b610121610371565b610147610395565b60405161012e9190612fa8565b61014761039a565b6101216103a0565b6101176103c4565b610121610443565b6101876101823660046127cd565b610452565b60405161012e9190612cc6565b610121610562565b61012161057a565b6101b76101b2366004612ae7565b61059e565b60405161012e959493929190613006565b6101b76101d6366004612ae7565b6105e4565b6101216105ff565b6101176101f1366004612748565b610623565b6101176102043660046126a3565b610924565b6102116109da565b6000546001600160a01b039081169116146102475760405162461bcd60e51b815260040161023e90612e71565b60405180910390fd5b806001600160a01b031663a9059cbb61025e610443565b6040516370a0823160e01b81526001600160a01b038516906370a082319061028a903090600401612ba3565b60206040518083038186803b1580156102a257600080fd5b505afa1580156102b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102da9190612acf565b6040518363ffffffff1660e01b81526004016102f7929190612c5f565b602060405180830381600087803b15801561031157600080fd5b505af1158015610325573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610349919061295f565b5050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7f000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c581565b600981565b610bb881565b7f000000000000000000000000a50ba011c48153de246e5192c8f9258a2ba79ca981565b6103cc6109da565b6000546001600160a01b039081169116146103f95760405162461bcd60e51b815260040161023e90612e71565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b6000336001600160a01b037f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9161461049c5760405162461bcd60e51b815260040161023e90612d04565b6104a46124d1565b6104e384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109de92505050565b905061055181600001518c8c60008181106104fa57fe5b905060200201602081019061050f91906126a3565b8b8b600081811061051c57fe5b90506020020135846020015185604001518a8d8d600081811061053b57fe5b9050602002013588606001518960800151610a85565b5060019a9950505050505050505050565b7310f7fc1f91ba351f9c629c5947ad69bd03c05b9681565b7f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a981565b60008060008060606105ae61250f565b6105b988888b610e22565b8051602082015160408301516060840151608090940151929d919c509a509198509650945050505050565b60008060008060606105f461250f565b6105b988888b61130f565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b61062b61253e565b61063488611413565b905061063e61253e565b61064788611413565b90506000600186600281111561065957fe5b600281111561066457fe5b146106745781610120015161067b565b8161010001515b90506000816001600160a01b03166370a08231336040518263ffffffff1660e01b81526004016106ab9190612ba3565b60206040518083038186803b1580156106c357600080fd5b505afa1580156106d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106fb9190612acf565b905060008189111561070d578161070f565b885b90508a6001600160a01b03168c6001600160a01b0316146107ec57898982101561074a576107478a61074183856114be565b906114ff565b90505b60606107588e8e858b611541565b9050818160008151811061076857fe5b6020026020010151111561078e5760405162461bcd60e51b815260040161023e90612ea6565b6107c38e8860e0015133846000815181106107a557fe5b60200260200101518d8036038101906107be919061297b565b611743565b6107e48e8e836000815181106107d557fe5b6020026020010151868c61188f565b505050610808565b6108088c8660e0015133848b8036038101906107be919061297b565b61083d6001600160a01b038c167f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a96000611c23565b6108716001600160a01b038c167f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a983611c23565b60405163573ade8160e01b81526001600160a01b037f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9169063573ade81906108c3908e9085908d903390600401612c9b565b602060405180830381600087803b1580156108dd57600080fd5b505af11580156108f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109159190612acf565b50505050505050505050505050565b61092c6109da565b6000546001600160a01b039081169116146109595760405162461bcd60e51b815260040161023e90612e71565b6001600160a01b03811661097f5760405162461bcd60e51b815260040161023e90612d3b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6109e66124d1565b60008060008060008060008060008a806020019051810190610a0891906126bf565b9850985098509850985098509850985098506040518060a001604052808a6001600160a01b031681526020018981526020018881526020016040518060a001604052808981526020018881526020018760ff1681526020018681526020018581525081526020018215158152509950505050505050505050919050565b610a8d61253e565b610a968a611413565b9050610acd6001600160a01b038a167f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a96000611c23565b610b016001600160a01b038a167f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a98a611c23565b6040516370a0823160e01b81526000906001600160a01b038b16906370a0823190610b30903090600401612ba3565b60206040518083038186803b158015610b4857600080fd5b505afa158015610b5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b809190612acf565b60405163573ade8160e01b81529091506001600160a01b037f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9169063573ade8190610bd5908d908d908c908c90600401612c9b565b602060405180830381600087803b158015610bef57600080fd5b505af1158015610c03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c279190612acf565b506040516370a0823160e01b8152610caf906001600160a01b038c16906370a0823190610c58903090600401612ba3565b60206040518083038186803b158015610c7057600080fd5b505afa158015610c84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca89190612acf565b8290611d22565b9050896001600160a01b03168b6001600160a01b031614610d85578789821015610ce457610ce18a61074183856114be565b90505b6000610cf08388611d64565b90506060610d008e8e8489611541565b90508281600081518110610d1057fe5b60200260200101511115610d365760405162461bcd60e51b815260040161023e90612ea6565b610d5b8e8660e001518b84600081518110610d4d57fe5b60200260200101518b611743565b610d7c8e8e83600081518110610d6d57fe5b6020026020010151858a61188f565b50505050610da1565b60e0820151610da1908c9088610d9b858a611d64565b88611743565b610dd66001600160a01b038b167f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a96000611c23565b610e157f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a9610e048b88611d64565b6001600160a01b038d169190611c23565b5050505050505050505050565b610e2a61250f565b6000610e47610e406127106107418660096114be565b8490611d22565b6040805160028082526060808301845293945090916020830190803683370190505090508581600081518110610e7957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508481600181518110610ea757fe5b6001600160a01b0392909216602092830291909101820152604080516003808252608082019092526060928392839291820183803683370190505090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316896001600160a01b031614158015610f5857507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316886001600160a01b031614155b156110c4578881600081518110610f6b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110610fb957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600281518110610fe757fe5b6001600160a01b03928316602091820292909201015260405163d06ca61f60e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063d06ca61f906110459088908590600401612fb1565b60006040518083038186803b15801561105d57600080fd5b505afa92505050801561109257506040513d6000823e601f3d908101601f1916820160405261108f91908101906128ca565b60015b6110bc576040805160038082526080820190925290602082016060803683370190505091506110bf565b91505b6110e6565b6040805160038082526080820190925290602082016060803683370190505091505b60405163d06ca61f60e01b81526000906001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f906111379089908990600401612fb1565b60006040518083038186803b15801561114f57600080fd5b505afa92505050801561118457506040513d6000823e601f3d908101601f1916820160405261118191908101906128ca565b60015b6111c4576040805160028082526060820183529091602083019080368337019050509350826002815181106111b557fe5b6020026020010151905061122a565b809450846001815181106111d457fe5b6020026020010151846002815181106111e957fe5b602002602001015111611210578460018151811061120357fe5b6020026020010151611226565b8360028151811061121d57fe5b60200260200101515b9150505b60006112358b611d89565b905060006112428b611d89565b9050600061127761125785600a86900a6114be565b610741600a85900a6112718d670de0b6b3a76400006114be565b906114be565b90506040518060a0016040528085815260200182815260200161129b8f8e87611e05565b81526020016112ab8e8786611e05565b815260200185156112de57886001815181106112c357fe5b602002602001015186146112d757866112d9565b895b6112fc565b60408051600280825260608201835290916020830190803683375050505b90529d9c50505050505050505050505050565b61131761250f565b606080611325868686611e54565b91509150600061137f61135c61271061074160098760008151811061134657fe5b60200260200101516114be90919063ffffffff16565b8460008151811061136957fe5b6020026020010151611d6490919063ffffffff16565b9050600061138c88611d89565b9050600061139988611d89565b905060006113c86113ae85600a85900a6114be565b610741600a86900a6112718c670de0b6b3a76400006114be565b90506040518060a001604052808581526020018281526020016113ec8c8787611e05565b81526020016113fc8b8b86611e05565b815260200195909552509298975050505050505050565b61141b61253e565b6040516335ea6a7560e01b81526001600160a01b037f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a916906335ea6a7590611467908590600401612ba3565b6101806040518083038186803b15801561148057600080fd5b505afa158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b891906129d4565b92915050565b6000826114cd575060006114b8565b828202828482816114da57fe5b04146114f85760405162461bcd60e51b815260040161023e90612e30565b9392505050565b60006114f883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506121f0565b606080821561161a57604080516003808252608082019092529060208201606080368337019050509050858160008151811061157957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106115c757fe5b60200260200101906001600160a01b031690816001600160a01b03168152505084816002815181106115f557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611697565b6040805160028082526060820183529091602083019080368337019050509050858160008151811061164857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050848160018151811061167657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b6040516307c0329d60e21b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690631f00ca74906116e59087908590600401612fb1565b60006040518083038186803b1580156116fd57600080fd5b505afa158015611711573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261173991908101906128ca565b9695505050505050565b61174c81612227565b156117d057836001600160a01b031663d505accf8430846000015185602001518660400151876060015188608001516040518863ffffffff1660e01b815260040161179d9796959493929190612c1e565b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050505b6117e56001600160a01b03851684308561224c565b604051631a4ca37b60e21b81526001600160a01b037f0000000000000000000000007d2768de32b0b80b7a3454c06bdac94a69ddc7a916906369328dec9061183590889086903090600401612c78565b602060405180830381600087803b15801561184f57600080fd5b505af1158015611863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118879190612acf565b505050505050565b60008061189b87611d89565b905060006118a887611d89565b905060006118b589612273565b905060006118c289612273565b905060006119066118d7612710610bb8611d64565b6119006118e886600a89900a6114be565b6107416118f987600a8c900a6114be565b8d906114be565b90612312565b90508089106119275760405162461bcd60e51b815260040161023e90612ded565b61195c6001600160a01b038c167f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6000611c23565b6119906001600160a01b038c167f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8b611c23565b60608715611a68576040805160038082526080820190925290602082016060803683370190505090508b816000815181106119c757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611a1557fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508a81600281518110611a4357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050611ae5565b60408051600280825260608201835290916020830190803683370190505090508b81600081518110611a9657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508a81600181518110611ac457fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b604051634401edf760e11b81526060906001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690638803dbee90611b3c908d908f90879030904290600401612fca565b600060405180830381600087803b158015611b5657600080fd5b505af1158015611b6a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b9291908101906128ca565b90507fa078c4190abe07940190effc1846be0ccf03ad6007bc9e93f9697d0b460befbb8d8d83600081518110611bc457fe5b602002602001015184600186510381518110611bdc57fe5b6020026020010151604051611bf49493929190612bf5565b60405180910390a180600081518110611c0957fe5b602002602001015197505050505050505095945050505050565b801580611cab5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90611c599030908690600401612bb7565b60206040518083038186803b158015611c7157600080fd5b505afa158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca99190612acf565b155b611cc75760405162461bcd60e51b815260040161023e90612f1b565b611d1d8363095ea7b360e01b8484604051602401611ce6929190612c5f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612384565b505050565b60006114f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612469565b6000828201838110156114f85760405162461bcd60e51b815260040161023e90612d81565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611dc457600080fd5b505afa158015611dd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dfc9190612b28565b60ff1692915050565b600080611e257310f7fc1f91ba351f9c629c5947ad69bd03c05b96612273565b90506000611e3286612273565b9050611739670de0b6b3a764000061074184611271600a89900a838b886114be565b6040805160028082526060828101909352829182918160200160208202803683370190505090508581600081518110611e8957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508481600181518110611eb757fe5b6001600160a01b0392909216602092830291909101820152604080516003808252608082019092526060928392839291820183803683370190505090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316896001600160a01b031614158015611f6857507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316886001600160a01b031614155b156120d4578881600081518110611f7b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611fc957fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600281518110611ff757fe5b6001600160a01b0392831660209182029290920101526040516307c0329d60e21b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d90911690631f00ca7490612055908a908590600401612fb1565b60006040518083038186803b15801561206d57600080fd5b505afa9250505080156120a257506040513d6000823e601f3d908101601f1916820160405261209f91908101906128ca565b60015b6120cc576040805160038082526080820190925290602082016060803683370190505091506120cf565b91505b6120f6565b6040805160038082526080820190925290602082016060803683370190505091505b6040516307c0329d60e21b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690631f00ca7490612144908a908890600401612fb1565b60006040518083038186803b15801561215c57600080fd5b505afa92505050801561219157506040513d6000823e601f3d908101601f1916820160405261218e91908101906128ca565b60015b6121a25790945092506121e8915050565b809350836001815181106121b257fe5b6020026020010151836002815181106121c757fe5b6020026020010151116121db5783856121de565b82825b9650965050505050505b935093915050565b600081836122115760405162461bcd60e51b815260040161023e9190612cd1565b50600083858161221d57fe5b0495945050505050565b6000816040015160ff16826020015114801561224557506020820151155b1592915050565b61226d846323b872dd60e01b858585604051602401611ce693929190612bd1565b50505050565b60405163b3596f0760e01b81526000906001600160a01b037f000000000000000000000000a50ba011c48153de246e5192c8f9258a2ba79ca9169063b3596f07906122c2908590600401612ba3565b60206040518083038186803b1580156122da57600080fd5b505afa1580156122ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b89190612acf565b600082158061231f575081155b1561232c575060006114b8565b81611388198161233857fe5b0483111560405180604001604052806002815260200161068760f31b815250906123755760405162461bcd60e51b815260040161023e9190612cd1565b50506127109102611388010490565b612396826001600160a01b0316612495565b6123b25760405162461bcd60e51b815260040161023e90612f71565b60006060836001600160a01b0316836040516123ce9190612b87565b6000604051808303816000865af19150503d806000811461240b576040519150601f19603f3d011682016040523d82523d6000602084013e612410565b606091505b5091509150816124325760405162461bcd60e51b815260040161023e90612db8565b80511561226d578080602001905181019061244d919061295f565b61226d5760405162461bcd60e51b815260040161023e90612ed1565b6000818484111561248d5760405162461bcd60e51b815260040161023e9190612cd1565b505050900390565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906124c957508115155b949350505050565b6040518060a0016040528060006001600160a01b0316815260200160008152602001600081526020016125026125a9565b8152600060209091015290565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001606081525090565b6040518061018001604052806125526125d7565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082018190526101609091015290565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b6040518060200160405280600081525090565b80516114b8816130af565b60008083601f840112612606578182fd5b50813567ffffffffffffffff81111561261d578182fd5b602083019150836020808302850101111561263757600080fd5b9250929050565b60006020828403121561264f578081fd5b612659602061303c565b9151825250919050565b80516fffffffffffffffffffffffffffffffff811681146114b857600080fd5b805164ffffffffff811681146114b857600080fd5b80516114b8816130d5565b6000602082840312156126b4578081fd5b81356114f8816130af565b60008060008060008060008060006101208a8c0312156126dd578485fd5b89516126e8816130af565b8099505060208a0151975060408a0151965060608a0151955060808a0151945060a08a0151612716816130d5565b8094505060c08a0151925060e08a015191506101008a0151612737816130c7565b809150509295985092959850929598565b6000806000806000806000878903610160811215612764578182fd5b883561276f816130af565b9750602089013561277f816130af565b965060408901359550606089013594506080890135935060a0609f19820112156127a7578182fd5b5060a0880191506101408801356127bd816130c7565b8091505092959891949750929550565b600080600080600080600080600060a08a8c0312156127ea578283fd5b893567ffffffffffffffff80821115612801578485fd5b61280d8d838e016125f5565b909b50995060208c0135915080821115612825578485fd5b6128318d838e016125f5565b909950975060408c0135915080821115612849578485fd5b6128558d838e016125f5565b909750955060608c0135915061286a826130af565b90935060808b0135908082111561287f578384fd5b818c0191508c601f830112612892578384fd5b8135818111156128a0578485fd5b8d60208285010111156128b1578485fd5b6020830194508093505050509295985092959850929598565b600060208083850312156128dc578182fd5b825167ffffffffffffffff8111156128f2578283fd5b8301601f81018513612902578283fd5b805161291561291082613063565b61303c565b8181528381019083850185840285018601891015612931578687fd5b8694505b83851015612953578051835260019490940193918501918501612935565b50979650505050505050565b600060208284031215612970578081fd5b81516114f8816130c7565b600060a0828403121561298c578081fd5b61299660a061303c565b823581526020830135602082015260408301356129b2816130d5565b6040820152606083810135908201526080928301359281019290925250919050565b60006101808083850312156129e7578182fd5b6129f08161303c565b90506129fc848461263e565b8152612a0b8460208501612663565b6020820152612a1d8460408501612663565b6040820152612a2f8460608501612663565b6060820152612a418460808501612663565b6080820152612a538460a08501612663565b60a0820152612a658460c08501612683565b60c0820152612a778460e085016125ea565b60e0820152610100612a8b858286016125ea565b90820152610120612a9e858583016125ea565b90820152610140612ab1858583016125ea565b90820152610160612ac485858301612698565b908201529392505050565b600060208284031215612ae0578081fd5b5051919050565b600080600060608486031215612afb578081fd5b833592506020840135612b0d816130af565b91506040840135612b1d816130af565b809150509250925092565b600060208284031215612b39578081fd5b81516114f8816130d5565b6000815180845260208085019450808401835b83811015612b7c5781516001600160a01b031687529582019590820190600101612b57565b509495945050505050565b60008251612b99818460208701613083565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b901515815260200190565b6000602082528251806020840152612cf0816040850160208701613083565b601f01601f19169190910160400192915050565b6020808252601b908201527f43414c4c45525f4d5553545f42455f4c454e44494e475f504f4f4c0000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b60208082526023908201527f6d6178416d6f756e74546f5377617020657863656564206d617820736c69707060408201526261676560e81b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152700e6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b90815260200190565b6000838252604060208301526124c96040830184612b44565b600086825285602083015260a06040830152612fe960a0830186612b44565b6001600160a01b0394909416606083015250608001529392505050565b600086825285602083015284604083015283606083015260a0608083015261303160a0830184612b44565b979650505050505050565b60405181810167ffffffffffffffff8111828210171561305b57600080fd5b604052919050565b600067ffffffffffffffff821115613079578081fd5b5060209081020190565b60005b8381101561309e578181015183820152602001613086565b8381111561226d5750506000910152565b6001600160a01b03811681146130c457600080fd5b50565b80151581146130c457600080fd5b60ff811681146130c457600080fdfea26469706673582212204ce73a3161d672b9316458ff00ff51a9752c53a9e30d47f7b74cf10c0d809aa864736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c50000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : addressesProvider (address): 0xB53C1a33016B2DC2fF3653530bfF1848a515c8c5
Arg [1] : uniswapRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : wethAddress (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b53c1a33016b2dc2ff3653530bff1848a515c8c5
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
70220:9492:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69954:123;;;;;;:::i;:::-;;:::i;:::-;;53085:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3432:74;;;:::i;52697:60::-;;;:::i;:::-;;;;;;;:::i;52584:::-;;;:::i;53136:51::-;;;:::i;10897:138::-;;;:::i;10295:73::-;;;:::i;71837:671::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52793:89::-;;;:::i;3511:51::-;;;:::i;54194:507::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;55310:::-;;;;;;:::i;:::-;;:::i;53192:59::-;;;:::i;73355:2203::-;;;;;;:::i;:::-;;:::i;11180:230::-;;;;;;:::i;:::-;;:::i;69954:123::-;10499:12;:10;:12::i;:::-;10489:6;;-1:-1:-1;;;;;10489:6:0;;;:22;;;10481:67;;;;-1:-1:-1;;;10481:67:0;;;;;;;:::i;:::-;;;;;;;;;70016:5:::1;-1:-1:-1::0;;;;;70016:14:0::1;;70031:7;:5;:7::i;:::-;70040:30;::::0;-1:-1:-1;;;70040:30:0;;-1:-1:-1;;;;;70040:15:0;::::1;::::0;::::1;::::0;:30:::1;::::0;70064:4:::1;::::0;70040:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70016:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;69954:123:::0;:::o;53085:46::-;;;:::o;3432:74::-;;;:::o;52697:60::-;52756:1;52697:60;:::o;52584:::-;52640:4;52584:60;:::o;53136:51::-;;;:::o;10897:138::-;10499:12;:10;:12::i;:::-;10489:6;;-1:-1:-1;;;;;10489:6:0;;;:22;;;10481:67;;;;-1:-1:-1;;;10481:67:0;;;;;;;:::i;:::-;11000:1:::1;10984:6:::0;;10963:40:::1;::::0;-1:-1:-1;;;;;10984:6:0;;::::1;::::0;10963:40:::1;::::0;11000:1;;10963:40:::1;11027:1;11010:19:::0;;-1:-1:-1;;;;;;11010:19:0::1;::::0;;10897:138::o;10295:73::-;10333:7;10356:6;-1:-1:-1;;;;;10356:6:0;10295:73;:::o;71837:671::-;72046:4;72067:10;-1:-1:-1;;;;;72089:12:0;72067:35;;72059:75;;;;-1:-1:-1;;;72059:75:0;;;;;;;:::i;:::-;72143:32;;:::i;:::-;72178:21;72192:6;;72178:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72178:13:0;;-1:-1:-1;;;72178:21:0:i;:::-;72143:56;;72208:274;72230:13;:29;;;72268:6;;72275:1;72268:9;;;;;;;;;;;;;;;;;;;;:::i;:::-;72286:7;;72294:1;72286:10;;;;;;;;;;;;;72305:13;:30;;;72344:13;:22;;;72375:9;72393:8;;72402:1;72393:11;;;;;;;;;;;;;72413:13;:29;;;72451:13;:24;;;72208:13;:274::i;:::-;-1:-1:-1;72498:4:0;;71837:671;-1:-1:-1;;;;;;;;;;71837:671:0:o;52793:89::-;52840:42;52793:89;:::o;3511:51::-;;;:::o;54194:507::-;54354:7;54370;54386;54402;54418:16;54452:25;;:::i;:::-;54480:51;54499:9;54510:10;54522:8;54480:18;:51::i;:::-;54556:24;;54589:21;;;;54619:19;;;;54647:20;;;;54676:12;;;;;54556:24;;54589:21;;-1:-1:-1;54619:19:0;-1:-1:-1;54647:20:0;;-1:-1:-1;54676:12:0;-1:-1:-1;54194:507:0;-1:-1:-1;;;;;54194:507:0:o;55310:::-;55470:7;55486;55502;55518;55534:16;55568:25;;:::i;:::-;55596:51;55614:9;55625:10;55637:9;55596:17;:51::i;53192:59::-;;;:::o;73355:2203::-;73609:50;;:::i;:::-;73662:32;73678:15;73662;:32::i;:::-;73609:85;;73701:44;;:::i;:::-;73748:26;73764:9;73748:15;:26::i;:::-;73701:73;-1:-1:-1;73783:17:0;73854:33;73837:12;73810:40;;;;;;;;:77;;;;;;;;;:179;;73949:15;:40;;;73810:179;;;73899:15;:38;;;73810:179;73783:206;;73998:19;74027:9;-1:-1:-1;;;;;74020:27:0;;74048:10;74020:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73998:61;;74066:21;74109:11;74090:15;:30;;:62;;74141:11;74090:62;;;74123:15;74090:62;74066:86;;74184:9;-1:-1:-1;;;;;74165:28:0;:15;-1:-1:-1;;;;;74165:28:0;;74161:1068;;74234:16;74263:31;;;74259:139;;;74329:59;74372:15;74329:38;:19;74353:13;74329:23;:38::i;:::-;:42;;:59::i;:::-;74307:81;;74259:139;74478:24;74514:68;74528:15;74545:9;74556:13;74571:10;74514:13;:68::i;:::-;74478:104;;74613:19;74599:7;74607:1;74599:10;;;;;;;;;;;;;;:33;;74591:63;;;;-1:-1:-1;;;74591:63:0;;;;;;;:::i;:::-;74698:160;74720:15;74746:21;:35;;;74792:10;74813:7;74821:1;74813:10;;;;;;;;;;;;;;74834:15;74698:160;;;;;;;;;;:::i;:::-;:11;:160::i;:::-;74910:92;74936:15;74953:9;74964:7;74972:1;74964:10;;;;;;;;;;;;;;74976:13;74991:10;74910:25;:92::i;:::-;;74161:1068;;;;;75058:163;75080:15;75106:21;:35;;;75152:10;75173:13;75197:15;75058:163;;;;;;;;;;:::i;:::-;75346:55;-1:-1:-1;;;;;75346:29:0;;75384:12;75399:1;75346:29;:55::i;:::-;75408:67;-1:-1:-1;;;;;75408:29:0;;75446:12;75461:13;75408:29;:67::i;:::-;75482:70;;-1:-1:-1;;;75482:70:0;;-1:-1:-1;;;;;75482:12:0;:18;;;;:70;;75501:9;;75512:13;;75527:12;;75541:10;;75482:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;73355:2203;;;;;;;;;;;;:::o;11180:230::-;10499:12;:10;:12::i;:::-;10489:6;;-1:-1:-1;;;;;10489:6:0;;;:22;;;10481:67;;;;-1:-1:-1;;;10481:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11265:22:0;::::1;11257:73;;;;-1:-1:-1::0;;;11257:73:0::1;;;;;;;:::i;:::-;11363:6;::::0;;11342:38:::1;::::0;-1:-1:-1;;;;;11342:38:0;;::::1;::::0;11363:6;::::1;::::0;11342:38:::1;::::0;::::1;11387:6;:17:::0;;-1:-1:-1;;;;;;11387:17:0::1;-1:-1:-1::0;;;;;11387:17:0;;;::::1;::::0;;;::::1;::::0;;11180:230::o;8984:100::-;9068:10;8984:100;:::o;79054:655::-;79121:18;;:::i;:::-;79157:23;79189:24;79222:16;79247:20;79276:16;79301:7;79317:9;79335;79353:15;79406:6;79385:123;;;;;;;;;;;;:::i;:::-;79148:360;;;;;;;;;;;;;;;;;;79531:172;;;;;;;;79553:15;-1:-1:-1;;;;;79531:172:0;;;;;79579:16;79531:172;;;;79606:8;79531:172;;;;79625:48;;;;;;;;79641:12;79625:48;;;;79655:8;79625:48;;;;79665:1;79625:48;;;;;;79668:1;79625:48;;;;79671:1;79625:48;;;79531:172;;;;79684:10;79531:172;;;;;79517:186;;;;;;;;;;;79054:655;;;:::o;76154:2194::-;76440:50;;:::i;:::-;76493:32;76509:15;76493;:32::i;:::-;76440:85;-1:-1:-1;76648:55:0;-1:-1:-1;;;;;76648:29:0;;76686:12;76701:1;76648:29;:55::i;:::-;76710:60;-1:-1:-1;;;;;76710:29:0;;76748:12;76763:6;76710:29;:60::i;:::-;76800:42;;-1:-1:-1;;;76800:42:0;;76777:20;;-1:-1:-1;;;;;76800:27:0;;;;;:42;;76836:4;;76800:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76849:58;;-1:-1:-1;;;76849:58:0;;76777:65;;-1:-1:-1;;;;;;76849:12:0;:18;;;;:58;;76868:9;;76879:6;;76887:8;;76897:9;;76849:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;76946:42:0;;-1:-1:-1;;;76946:42:0;;76929:60;;-1:-1:-1;;;;;76946:27:0;;;;;:42;;76982:4;;76946:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76929:12;;:16;:60::i;:::-;76914:75;;77021:9;-1:-1:-1;;;;;77002:28:0;:15;-1:-1:-1;;;;;77002:28:0;;76998:1082;;77071:16;77100:21;;;77096:119;;;77156:49;77198:6;77156:37;:19;77180:12;77156:23;:37::i;:49::-;77134:71;;77096:119;77225:30;77258:25;:12;77275:7;77258:16;:25::i;:::-;77225:58;;77292:24;77328:77;77342:15;77359:9;77370:22;77394:10;77328:13;:77::i;:::-;77292:113;;77436:19;77422:7;77430:1;77422:10;;;;;;;;;;;;;;:33;;77414:63;;;;-1:-1:-1;;;77414:63:0;;;;;;;:::i;:::-;77521:159;77543:15;77569:21;:35;;;77615:9;77635:7;77643:1;77635:10;;;;;;;;;;;;;;77656:15;77521:11;:159::i;:::-;77741:101;77767:15;77784:9;77795:7;77803:1;77795:10;;;;;;;;;;;;;;77807:22;77831:10;77741:25;:101::i;:::-;;76998:1082;;;;;;77946:35;;;;77898:174;;77920:15;;77992:9;78012:25;:12;78029:7;78012:16;:25::i;:::-;78048:15;77898:11;:174::i;:::-;78207:55;-1:-1:-1;;;;;78207:29:0;;78245:12;78260:1;78207:29;:55::i;:::-;78269:73;78307:12;78322:19;:6;78333:7;78322:10;:19::i;:::-;-1:-1:-1;;;;;78269:29:0;;;:73;:29;:73::i;:::-;76154:2194;;;;;;;;;;;:::o;63521:2116::-;63649:17;;:::i;:::-;63707:21;63731:62;63744:48;63786:5;63744:37;:8;52756:1;63744:12;:37::i;:48::-;63731:8;;:12;:62::i;:::-;63832:16;;;63846:1;63832:16;;;63802:27;63832:16;;;;;63707:86;;-1:-1:-1;63832:16:0;;;;;;;;;;;;-1:-1:-1;63832:16:0;63802:46;;63871:9;63855:10;63866:1;63855:13;;;;;;;;;;;;;:25;-1:-1:-1;;;;;63855:25:0;;;-1:-1:-1;;;;;63855:25:0;;;;;63903:10;63887;63898:1;63887:13;;;;;;;;-1:-1:-1;;;;;63887:26:0;;;;:13;;;;;;;;;;:26;64037:16;;;64051:1;64037:16;;;;;;;;;63922:35;;;;;;64037:16;;;63922:35;;64037:16;;;;;-1:-1:-1;64037:16:0;64005:48;;64077:12;-1:-1:-1;;;;;64064:25:0;:9;-1:-1:-1;;;;;64064:25:0;;;:55;;;;;64107:12;-1:-1:-1;;;;;64093:26:0;:10;-1:-1:-1;;;;;64093:26:0;;;64064:55;64060:487;;;64148:9;64130:12;64143:1;64130:15;;;;;;;;;;;;;:27;-1:-1:-1;;;;;64130:27:0;;;-1:-1:-1;;;;;64130:27:0;;;;;64184:12;64166;64179:1;64166:15;;;;;;;;;;;;;:30;-1:-1:-1;;;;;64166:30:0;;;-1:-1:-1;;;;;64166:30:0;;;;;64223:10;64205:12;64218:1;64205:15;;;;;;;;-1:-1:-1;;;;;64205:28:0;;;:15;;;;;;;;;:28;64248:57;;-1:-1:-1;;;64248:57:0;;:14;:28;;;;;;:57;;64277:13;;64292:12;;64248:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64248:57:0;;;;;;;;;;;;:::i;:::-;;;64244:239;;64457:16;;;64471:1;64457:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64457:16:0;64439:34;;64244:239;;;64396:15;-1:-1:-1;64244:239:0;64060:487;;;64523:16;;;64537:1;64523:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64523:16:0;64505:34;;64060:487;64587:55;;-1:-1:-1;;;64587:55:0;;64555:21;;-1:-1:-1;;;;;64587:14:0;:28;;;;:55;;64616:13;;64631:10;;64587:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64587:55:0;;;;;;;;;;;;:::i;:::-;;;64583:404;;64920:16;;;64934:1;64920:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64920:16:0;64899:37;;64961:15;64977:1;64961:18;;;;;;;;;;;;;;64945:34;;64583:404;;;64728:13;64707:34;;64790:18;64809:1;64790:21;;;;;;;;;;;;;;64769:15;64785:1;64769:18;;;;;;;;;;;;;;:42;64768:107;;64854:18;64873:1;64854:21;;;;;;;;;;;;;;64768:107;;;64824:15;64840:1;64824:18;;;;;;;;;;;;;;64768:107;64752:123;;64643:240;64583:404;64995:25;65023:23;65036:9;65023:12;:23::i;:::-;64995:51;;65053:26;65082:24;65095:10;65082:12;:24::i;:::-;65053:53;-1:-1:-1;65115:21:0;65146:117;65214:40;:13;65232:2;:21;;;65214:17;:40::i;:::-;65146:53;65176:2;:22;;;65146:25;:13;65164:6;65146:17;:25::i;:::-;:29;;:53::i;:117::-;65115:148;;65286:345;;;;;;;;65307:13;65286:345;;;;65331:13;65286:345;;;;65355:53;65369:9;65380:8;65390:17;65355:13;:53::i;:::-;65286:345;;;;65419:60;65433:10;65445:13;65460:18;65419:13;:60::i;:::-;65286:345;;;;65491:18;;65490:132;;65550:18;65569:1;65550:21;;;;;;;;;;;;;;65533:13;:38;65532:90;;65610:12;65532:90;;;65586:10;65532:90;65490:132;;;65513:16;;;65527:1;65513:16;;;;;;;;;;;;;;;;;;-1:-1:-1;;;65490:132:0;65286:345;;65272:359;63521:2116;-1:-1:-1;;;;;;;;;;;;;63521:2116:0:o;66266:913::-;66394:17;;:::i;:::-;66421:24;66447:21;66479:54;66500:9;66511:10;66523:9;66479:20;:54::i;:::-;66420:113;;;;66569:21;66593:66;66608:50;66652:5;66608:39;52756:1;66608:7;66616:1;66608:10;;;;;;;;;;;;;;:14;;:39;;;;:::i;:50::-;66593:7;66601:1;66593:10;;;;;;;;;;;;;;:14;;:66;;;;:::i;:::-;66569:90;;66668:25;66696:23;66709:9;66696:12;:23::i;:::-;66668:51;;66726:26;66755:24;66768:10;66755:12;:24::i;:::-;66726:53;-1:-1:-1;66788:21:0;66819:113;66882:41;:13;66900:2;:22;;;66882:17;:41::i;:::-;66819:48;66845:2;:21;;;66819;:9;66833:6;66819:13;:21::i;:113::-;66788:144;;66955:218;;;;;;;;66976:13;66955:218;;;;67000:13;66955:218;;;;67024:58;67038:9;67049:13;67064:17;67024:13;:58::i;:::-;66955:218;;;;67093:56;67107:10;67119:9;67130:18;67093:13;:56::i;:::-;66955:218;;;;;;;;-1:-1:-1;66941:232:0;;66266:913;-1:-1:-1;;;;;;;;66266:913:0:o;60673:147::-;60736:28;;:::i;:::-;60780:34;;-1:-1:-1;;;60780:34:0;;-1:-1:-1;;;;;60780:12:0;:27;;;;:34;;60808:5;;60780:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60773:41;60673:147;-1:-1:-1;;60673:147:0:o;20973:431::-;21031:7;21260:6;21256:37;;-1:-1:-1;21284:1:0;21277:8;;21256:37;21313:5;;;21317:1;21313;:5;:1;21333:5;;;;;:10;21325:56;;;;-1:-1:-1;;;21325:56:0;;;;;;;:::i;:::-;21397:1;20973:431;-1:-1:-1;;;20973:431:0:o;21848:126::-;21906:7;21929:39;21933:1;21936;21929:39;;;;;;;;;;;;;;;;;:3;:39::i;69213:513::-;69359:16;69384:21;69418:10;69414:247;;;69446:16;;;69460:1;69446:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69446:16:0;69439:23;;69481:9;69471:4;69476:1;69471:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;69471:19:0;;;-1:-1:-1;;;;;69471:19:0;;;;;69509:12;69499:4;69504:1;69499:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;69499:22:0;;;-1:-1:-1;;;;;69499:22:0;;;;;69540:10;69530:4;69535:1;69530:7;;;;;;;;;;;;;:20;-1:-1:-1;;;;;69530:20:0;;;-1:-1:-1;;;;;69530:20:0;;;;;69414:247;;;69580:16;;;69594:1;69580:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69580:16:0;69573:23;;69615:9;69605:4;69610:1;69605:7;;;;;;;;;;;;;:19;-1:-1:-1;;;;;69605:19:0;;;-1:-1:-1;;;;;69605:19:0;;;;;69643:10;69633:4;69638:1;69633:7;;;;;;;;;;;;;:20;-1:-1:-1;;;;;69633:20:0;;;-1:-1:-1;;;;;69633:20:0;;;;;69414:247;69676:44;;-1:-1:-1;;;69676:44:0;;-1:-1:-1;;;;;69676:14:0;:27;;;;:44;;69704:9;;69715:4;;69676:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;69676:44:0;;;;;;;;;;;;:::i;:::-;69669:51;69213:513;-1:-1:-1;;;;;;69213:513:0:o;61146:671::-;61327:27;61338:15;61327:10;:27::i;:::-;61323:288;;;61382:13;-1:-1:-1;;;;;61365:38:0;;61414:4;61437;61453:15;:22;;;61486:15;:24;;;61521:15;:17;;;61549:15;:17;;;61577:15;:17;;;61365:238;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61323:288;61657:67;-1:-1:-1;;;;;61657:38:0;;61696:4;61710;61717:6;61657:38;:67::i;:::-;61758:53;;-1:-1:-1;;;61758:53:0;;-1:-1:-1;;;;;61758:12:0;:21;;;;:53;;61780:7;;61789:6;;61805:4;;61758:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61146:671;;;;;:::o;58341:1728::-;58539:7;58555:25;58583:29;58596:15;58583:12;:29::i;:::-;58555:57;;58619:23;58645:27;58658:13;58645:12;:27::i;:::-;58619:53;;58681:22;58706:26;58716:15;58706:9;:26::i;:::-;58681:51;;58739:20;58762:24;58772:13;58762:9;:24::i;:::-;58739:47;-1:-1:-1;58795:31:0;58836:206;58983:58;50835:3;52640:4;58983:36;:58::i;:::-;58836:125;58921:39;:14;58940:2;:19;;;58921:18;:39::i;:::-;58836:70;58866:39;:12;58883:2;:21;;;58866:16;:39::i;:::-;58836:15;;:29;:70::i;:125::-;:146;;:206::i;:::-;58795:247;;59077:23;59059:15;:41;59051:89;;;;-1:-1:-1;;;59051:89:0;;;;;;;:::i;:::-;59287:63;-1:-1:-1;;;;;59287:35:0;;59331:14;59348:1;59287:35;:63::i;:::-;59357:77;-1:-1:-1;;;;;59357:35:0;;59401:14;59418:15;59357:35;:77::i;:::-;59443:21;59475:10;59471:265;;;59503:16;;;59517:1;59503:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59503:16:0;59496:23;;59538:15;59528:4;59533:1;59528:7;;;;;;;;;;;;;:25;-1:-1:-1;;;;;59528:25:0;;;-1:-1:-1;;;;;59528:25:0;;;;;59572:12;59562:4;59567:1;59562:7;;;;;;;;;;;;;:22;-1:-1:-1;;;;;59562:22:0;;;-1:-1:-1;;;;;59562:22:0;;;;;59603:13;59593:4;59598:1;59593:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;59593:23:0;;;-1:-1:-1;;;;;59593:23:0;;;;;59471:265;;;59646:16;;;59660:1;59646:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59646:16:0;59639:23;;59681:15;59671:4;59676:1;59671:7;;;;;;;;;;;;;:25;-1:-1:-1;;;;;59671:25:0;;;-1:-1:-1;;;;;59671:25:0;;;;;59715:13;59705:4;59710:1;59705:7;;;;;;;;;;;;;:23;-1:-1:-1;;;;;59705:23:0;;;-1:-1:-1;;;;;59705:23:0;;;;;59471:265;59778:165;;-1:-1:-1;;;59778:165:0;;59744:24;;-1:-1:-1;;;;;59778:14:0;:39;;;;:165;;59828:15;;59854;;59880:4;;59903;;59919:15;;59778:165;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59778:165:0;;;;;;;;;;;;:::i;:::-;59744:199;;59957:80;59965:15;59982:13;59997:7;60005:1;59997:10;;;;;;;;;;;;;;60009:7;60034:1;60017:7;:14;:18;60009:27;;;;;;;;;;;;;;59957:80;;;;;;;;;:::i;:::-;;;;;;;;60053:7;60061:1;60053:10;;;;;;;;;;;;;;60046:17;;;;;;;;;58341:1728;;;;;;;:::o;14926:355::-;15046:10;;;15045:62;;-1:-1:-1;15062:39:0;;-1:-1:-1;;;15062:39:0;;-1:-1:-1;;;;;15062:15:0;;;;;:39;;15086:4;;15093:7;;15062:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;15045:62;15029:150;;;;-1:-1:-1;;;15029:150:0;;;;;;;:::i;:::-;15186:89;15205:5;15235:22;;;15259:7;15268:5;15212:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15212:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;15212:62:0;-1:-1:-1;;;;;;15212:62:0;;;;;;;;;;15186:18;:89::i;:::-;14926:355;;;:::o;20139:130::-;20197:7;20220:43;20224:1;20227;20220:43;;;;;;;;;;;;;;;;;:3;:43::i;19717:167::-;19775:7;19803:5;;;19823:6;;;;19815:46;;;;-1:-1:-1;;;19815:46:0;;;;;;;:::i;60446:121::-;60506:7;60544:5;-1:-1:-1;;;;;60529:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60522:39;;;60446:121;-1:-1:-1;;60446:121:0:o;62577:318::-;62694:7;62710:19;62732:22;52840:42;62732:9;:22::i;:::-;62710:44;;62761:20;62784:18;62794:7;62784:9;:18::i;:::-;62761:41;-1:-1:-1;62818:71:0;62882:6;62818:59;62865:11;62818:42;62847:2;:12;;;62818:59;:6;62761:41;62818:10;:24::i;67540:1312::-;67744:16;;;67758:1;67744:16;;;67671;67744;;;;;;67671;;;;67744;;;;;;;;;;;;-1:-1:-1;67744:16:0;67714:46;;67783:9;67767:10;67778:1;67767:13;;;;;;;;;;;;;:25;-1:-1:-1;;;;;67767:25:0;;;-1:-1:-1;;;;;67767:25:0;;;;;67815:10;67799;67810:1;67799:13;;;;;;;;-1:-1:-1;;;;;67799:26:0;;;;:13;;;;;;;;;;:26;67947:16;;;67961:1;67947:16;;;;;;;;;67834:35;;;;;;67947:16;;;67834:35;;67947:16;;;;;-1:-1:-1;67947:16:0;67915:48;;67989:12;-1:-1:-1;;;;;67976:25:0;:9;-1:-1:-1;;;;;67976:25:0;;;:55;;;;;68019:12;-1:-1:-1;;;;;68005:26:0;:10;-1:-1:-1;;;;;68005:26:0;;;67976:55;67972:482;;;68060:9;68042:12;68055:1;68042:15;;;;;;;;;;;;;:27;-1:-1:-1;;;;;68042:27:0;;;-1:-1:-1;;;;;68042:27:0;;;;;68096:12;68078;68091:1;68078:15;;;;;;;;;;;;;:30;-1:-1:-1;;;;;68078:30:0;;;-1:-1:-1;;;;;68078:30:0;;;;;68135:10;68117:12;68130:1;68117:15;;;;;;;;-1:-1:-1;;;;;68117:28:0;;;:15;;;;;;;;;:28;68160:52;;-1:-1:-1;;;68160:52:0;;:14;:27;;;;;;:52;;68188:9;;68199:12;;68160:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68160:52:0;;;;;;;;;;;;:::i;:::-;;;68156:234;;68364:16;;;68378:1;68364:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68364:16:0;68346:34;;68156:234;;;68303:15;-1:-1:-1;68156:234:0;67972:482;;;68430:16;;;68444:1;68430:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68430:16:0;68412:34;;67972:482;68466:50;;-1:-1:-1;;;68466:50:0;;-1:-1:-1;;;;;68466:14:0;:27;;;;:50;;68494:9;;68505:10;;68466:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68466:50:0;;;;;;;;;;;;:::i;:::-;;;68462:385;;68809:15;;-1:-1:-1;68826:12:0;-1:-1:-1;68801:38:0;;-1:-1:-1;;68801:38:0;68462:385;68602:13;68581:34;;68664:18;68683:1;68664:21;;;;;;;;;;;;;;68643:15;68659:1;68643:18;;;;;;;;;;;;;;:42;68642:135;;68746:18;68766:10;68642:135;;;68701:15;68718:12;68642:135;68626:151;;;;;;;;;67540:1312;;;;;;;:::o;22438:343::-;22544:7;22638:12;22631:5;22623:28;;;;-1:-1:-1;;;22623:28:0;;;;;;;;:::i;:::-;;22658:9;22674:1;22670;:5;;;;;;;22438:343;-1:-1:-1;;;;;22438:343:0:o;62121:200::-;62198:4;62266:9;:11;;;62258:20;;62235:9;:18;;;62227:51;:87;;;;-1:-1:-1;62290:18:0;;;;62282:32;62227:87;62225:90;;62121:200;-1:-1:-1;;62121:200:0:o;14697:223::-;14819:95;14838:5;14868:27;;;14897:4;14903:2;14907:5;14845:68;;;;;;;;;;:::i;14819:95::-;14697:223;;;;:::o;60227:113::-;60307:27;;-1:-1:-1;;;60307:27:0;;60284:7;;-1:-1:-1;;;;;60307:6:0;:20;;;;:27;;60328:5;;60307:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;51180:362::-;51258:7;51278:10;;;:29;;-1:-1:-1;51292:15:0;;51278:29;51274:60;;;-1:-1:-1;51325:1:0;51318:8;;51274:60;51404:10;-1:-1:-1;;51404:10:0;51367:47;;;;;51358:5;:56;;51423:35;;;;;;;;;;;;;-1:-1:-1;;;51423:35:0;;;51342:123;;;;;-1:-1:-1;;;51342:123:0;;;;;;;;:::i;:::-;-1:-1:-1;;50835:3:0;51482:18;;50906:21;51482:33;51481:55;;51180:362::o;15287:567::-;15371:27;15379:5;-1:-1:-1;;;;;15371:25:0;;:27::i;:::-;15363:71;;;;-1:-1:-1;;;15363:71:0;;;;;;;:::i;:::-;15500:12;15514:23;15549:5;-1:-1:-1;;;;;15541:19:0;15561:4;15541:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15499:67;;;;15581:7;15573:52;;;;-1:-1:-1;;;15573:52:0;;;;;;;:::i;:::-;15638:17;;:21;15634:215;;15775:10;15764:30;;;;;;;;;;;;:::i;:::-;15756:85;;;;-1:-1:-1;;;15756:85:0;;;;;;;:::i;20544:198::-;20650:7;20682:12;20674:6;;;;20666:29;;;;-1:-1:-1;;;20666:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;20714:5:0;;;20544:198::o;12062:597::-;12122:4;12569:20;;12413:66;12610:23;;;;;;:42;;-1:-1:-1;12637:15:0;;;12610:42;12602:51;12062:597;-1:-1:-1;;;;12062:597:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;142:134::-;220:13;;238:33;220:13;238:33;:::i;458:352::-;;;588:3;581:4;573:6;569:17;565:27;555:2;;-1:-1;;596:12;555:2;-1:-1;626:20;;666:18;655:30;;652:2;;;-1:-1;;688:12;652:2;732:4;724:6;720:17;708:29;;783:3;732:4;;767:6;763:17;724:6;749:32;;746:41;743:2;;;800:1;;790:12;743:2;548:262;;;;;:::o;4238:360::-;;4378:4;4366:9;4361:3;4357:19;4353:30;4350:2;;;-1:-1;;4386:12;4350:2;4414:20;4378:4;4414:20;:::i;:::-;7286:13;;4491:86;;-1:-1;4405:29;4344:254;-1:-1;4344:254::o;6930:134::-;7008:13;;37503:34;37492:46;;40722:35;;40712:2;;40771:1;;40761:12;7349:132;7426:13;;37829:12;37818:24;;40969:34;;40959:2;;41017:1;;41007:12;7621:130;7697:13;;7715:31;7697:13;7715:31;:::i;7758:241::-;;7862:2;7850:9;7841:7;7837:23;7833:32;7830:2;;;-1:-1;;7868:12;7830:2;85:6;72:20;97:33;124:5;97:33;:::i;8006:1363::-;;;;;;;;;;8260:3;8248:9;8239:7;8235:23;8231:33;8228:2;;;-1:-1;;8267:12;8228:2;375:6;369:13;387:41;422:5;387:41;:::i;:::-;8319:82;;;;8438:2;8492:9;8488:22;7286:13;8446:74;;8557:2;8611:9;8607:22;7286:13;8565:74;;8676:2;8730:9;8726:22;7286:13;8684:74;;8795:3;8850:9;8846:22;7286:13;8804:74;;8915:3;8968:9;8964:22;7697:13;7715:31;7740:5;7715:31;:::i;:::-;8924:72;;;;9033:3;9088:9;9084:22;2425:13;9042:74;;9153:3;9208:9;9204:22;2425:13;9162:74;;9273:3;9325:9;9321:22;2150:13;2168:30;2192:5;2168:30;:::i;:::-;9282:71;;;;8222:1147;;;;;;;;;;;:::o;9376:1055::-;;;;;;;;9600:9;9591:7;9587:23;9612:3;9587:23;9583:33;9580:2;;;-1:-1;;9619:12;9580:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;9671:63;-1:-1;9771:2;9810:22;;72:20;97:33;72:20;97:33;:::i;:::-;9779:63;-1:-1;9879:2;9918:22;;7138:20;;-1:-1;9987:2;10026:22;;7138:20;;-1:-1;10095:3;10135:22;;7138:20;;-1:-1;10204:3;-1:-1;;3161:16;;3157:26;3154:2;;;-1:-1;;3186:12;3154:2;;10204:3;10281:9;10277:22;10213:96;;10346:3;10387:9;10383:22;2008:20;2033:30;2057:5;2033:30;:::i;:::-;10355:60;;;;9574:857;;;;;;;;;;:::o;10438:1335::-;;;;;;;;;;10734:3;10722:9;10713:7;10709:23;10705:33;10702:2;;;-1:-1;;10741:12;10702:2;10799:17;10786:31;10837:18;;10829:6;10826:30;10823:2;;;-1:-1;;10859:12;10823:2;10897:80;10969:7;10960:6;10949:9;10945:22;10897:80;:::i;:::-;10879:98;;-1:-1;10879:98;-1:-1;11042:2;11027:18;;11014:32;;-1:-1;11055:30;;;11052:2;;;-1:-1;;11088:12;11052:2;11126:80;11198:7;11189:6;11178:9;11174:22;11126:80;:::i;:::-;11108:98;;-1:-1;11108:98;-1:-1;11271:2;11256:18;;11243:32;;-1:-1;11284:30;;;11281:2;;;-1:-1;;11317:12;11281:2;11355:80;11427:7;11418:6;11407:9;11403:22;11355:80;:::i;:::-;11337:98;;-1:-1;11337:98;-1:-1;11472:2;11511:22;;72:20;;-1:-1;97:33;72:20;97:33;:::i;:::-;11480:63;;-1:-1;11608:3;11593:19;;11580:33;;11622:30;;;11619:2;;;-1:-1;;11655:12;11619:2;11740:6;11729:9;11725:22;;;2616:3;2609:4;2601:6;2597:17;2593:27;2583:2;;-1:-1;;2624:12;2583:2;2667:6;2654:20;10837:18;2686:6;2683:30;2680:2;;;-1:-1;;2716:12;2680:2;2811:3;11042:2;2791:17;2752:6;2777:32;;2774:41;2771:2;;;-1:-1;;2818:12;2771:2;11042;2752:6;2748:17;11675:82;;;;;;;;10696:1077;;;;;;;;;;;:::o;11780:392::-;;11920:2;;11908:9;11899:7;11895:23;11891:32;11888:2;;;-1:-1;;11926:12;11888:2;11977:17;11971:24;12015:18;12007:6;12004:30;12001:2;;;-1:-1;;12037:12;12001:2;12124:22;;1335:4;1323:17;;1319:27;-1:-1;1309:2;;-1:-1;;1350:12;1309:2;1390:6;1384:13;1412:80;1427:64;1484:6;1427:64;:::i;:::-;1412:80;:::i;:::-;1520:21;;;1577:14;;;;1552:17;;;1666;;;1657:27;;;;1654:36;-1:-1;1651:2;;;-1:-1;;1693:12;1651:2;-1:-1;1719:10;;1713:217;1738:6;1735:1;1732:13;1713:217;;;7286:13;;1806:61;;1760:1;1753:9;;;;;1881:14;;;;1909;;1713:217;;;-1:-1;12057:99;11882:290;-1:-1;;;;;;;11882:290::o;12179:257::-;;12291:2;12279:9;12270:7;12266:23;12262:32;12259:2;;;-1:-1;;12297:12;12259:2;2156:6;2150:13;2168:30;2192:5;2168:30;:::i;12719:304::-;;12854:3;12842:9;12833:7;12829:23;12825:33;12822:2;;;-1:-1;;12861:12;12822:2;3439:20;12854:3;3439:20;:::i;:::-;7151:6;7138:20;3525:16;3518:75;3658:2;3716:9;3712:22;7138:20;3658:2;3677:5;3673:16;3666:75;3799:2;3855:9;3851:22;7553:20;7578:31;7603:5;7578:31;:::i;:::-;3799:2;3814:16;;3807:73;3938:2;3992:22;;;2277:20;3953:16;;;3946:75;4079:3;4134:22;;;2277:20;4095:16;;;4088:75;;;;-1:-1;3818:5;12816:207;-1:-1;12816:207::o;13030:320::-;;13173:3;;13161:9;13152:7;13148:23;13144:33;13141:2;;;-1:-1;;13180:12;13141:2;4806:22;13173:3;4806:22;:::i;:::-;4797:31;;4919:100;5015:3;4991:22;4919:100;:::i;:::-;4901:16;4894:126;5124:60;5180:3;5091:2;5160:9;5156:22;5124:60;:::i;:::-;5091:2;5110:5;5106:16;5099:86;5294:60;5350:3;5261:2;5330:9;5326:22;5294:60;:::i;:::-;5261:2;5280:5;5276:16;5269:86;5465:60;5521:3;5432:2;5501:9;5497:22;5465:60;:::i;:::-;5432:2;5451:5;5447:16;5440:86;5642:60;5698:3;5608;5678:9;5674:22;5642:60;:::i;:::-;5608:3;5628:5;5624:16;5617:86;5817:60;5873:3;5783;5853:9;5849:22;5817:60;:::i;:::-;5783:3;5803:5;5799:16;5792:86;5988:59;6043:3;5954;6023:9;6019:22;5988:59;:::i;:::-;5954:3;5974:5;5970:16;5963:85;6152:60;6208:3;6118;6188:9;6184:22;6152:60;:::i;:::-;6118:3;6138:5;6134:16;6127:86;6292:3;6328:60;6384:3;6292;6364:9;6360:22;6328:60;:::i;:::-;6308:18;;;6301:88;6470:3;6506:60;6562:3;6538:22;;;6506:60;:::i;:::-;6486:18;;;6479:88;6651:3;6687:60;6743:3;6719:22;;;6687:60;:::i;:::-;6667:18;;;6660:88;6807:3;6843:58;6897:3;6873:22;;;6843:58;:::i;:::-;6823:18;;;6816:86;6827:5;13135:215;-1:-1;;;13135:215::o;13357:263::-;;13472:2;13460:9;13451:7;13447:23;13443:32;13440:2;;;-1:-1;;13478:12;13440:2;-1:-1;7286:13;;13434:186;-1:-1;13434:186::o;13627:491::-;;;;13765:2;13753:9;13744:7;13740:23;13736:32;13733:2;;;-1:-1;;13771:12;13733:2;7151:6;7138:20;13823:63;;13923:2;13966:9;13962:22;72:20;97:33;124:5;97:33;:::i;:::-;13931:63;-1:-1;14031:2;14070:22;;72:20;97:33;72:20;97:33;:::i;:::-;14039:63;;;;13727:391;;;;;:::o;14125:259::-;;14238:2;14226:9;14217:7;14213:23;14209:32;14206:2;;;-1:-1;;14244:12;14206:2;7703:6;7697:13;7715:31;7740:5;7715:31;:::i;14983:690::-;;15176:5;36018:12;36562:6;36557:3;36550:19;36599:4;;36594:3;36590:14;15188:93;;36599:4;15352:5;35872:14;-1:-1;15391:260;15416:6;15413:1;15410:13;15391:260;;;15477:13;;-1:-1;;;;;37612:54;14783:37;;14545:14;;;;36405;;;;666:18;15431:9;15391:260;;;-1:-1;15657:10;;15107:566;-1:-1;;;;;15107:566::o;21567:271::-;;16072:5;36018:12;16183:52;16228:6;16223:3;16216:4;16209:5;16205:16;16183:52;:::i;:::-;16247:16;;;;;21701:137;-1:-1;;21701:137::o;21845:222::-;-1:-1;;;;;37612:54;;;;14783:37;;21972:2;21957:18;;21943:124::o;22319:333::-;-1:-1;;;;;37612:54;;;14783:37;;37612:54;;22638:2;22623:18;;14783:37;22474:2;22459:18;;22445:207::o;22659:444::-;-1:-1;;;;;37612:54;;;14783:37;;37612:54;;;;23006:2;22991:18;;14783:37;23089:2;23074:18;;15863:37;;;;22842:2;22827:18;;22813:290::o;23110:556::-;-1:-1;;;;;37612:54;;;14783:37;;37612:54;;;;23486:2;23471:18;;14783:37;23569:2;23554:18;;15863:37;23652:2;23637:18;;15863:37;;;;23321:3;23306:19;;23292:374::o;23673:884::-;-1:-1;;;;;37612:54;;;14783:37;;37612:54;;;;24129:2;24114:18;;14783:37;24212:2;24197:18;;15863:37;;;;24295:2;24280:18;;15863:37;;;;37925:4;37914:16;24374:3;24359:19;;21520:35;37623:42;24443:19;;15863:37;24542:3;24527:19;;15863:37;;;;23964:3;23949:19;;23935:622::o;24564:333::-;-1:-1;;;;;37612:54;;;;14783:37;;24883:2;24868:18;;15863:37;24719:2;24704:18;;24690:207::o;24904:444::-;-1:-1;;;;;37612:54;;;14783:37;;25251:2;25236:18;;15863:37;;;;37612:54;;;25334:2;25319:18;;14783:37;25087:2;25072:18;;25058:290::o;25355:556::-;-1:-1;;;;;37612:54;;;14783:37;;25731:2;25716:18;;15863:37;;;;25814:2;25799:18;;15863:37;;;;37612:54;;;25897:2;25882:18;;14783:37;25566:3;25551:19;;25537:374::o;26497:210::-;37213:13;;37206:21;15746:34;;26618:2;26603:18;;26589:118::o;27850:310::-;;27997:2;28018:17;28011:47;17172:5;36018:12;36562:6;27997:2;27986:9;27982:18;36550:19;17266:52;17311:6;36590:14;27986:9;36590:14;27997:2;17292:5;17288:16;17266:52;:::i;:::-;39984:7;39968:14;-1:-1;;39964:28;17330:39;;;;36590:14;17330:39;;27968:192;-1:-1;;27968:192::o;28167:416::-;28367:2;28381:47;;;17606:2;28352:18;;;36550:19;17642:29;36590:14;;;17622:50;17691:12;;;28338:245::o;28590:416::-;28790:2;28804:47;;;17942:2;28775:18;;;36550:19;17978:34;36590:14;;;17958:55;-1:-1;;;18033:12;;;18026:30;18075:12;;;28761:245::o;29013:416::-;29213:2;29227:47;;;18326:2;29198:18;;;36550:19;18362:29;36590:14;;;18342:50;18411:12;;;29184:245::o;29436:416::-;29636:2;29650:47;;;29621:18;;;36550:19;18698:34;36590:14;;;18678:55;18752:12;;;29607:245::o;29859:416::-;30059:2;30073:47;;;19003:2;30044:18;;;36550:19;19039:34;36590:14;;;19019:55;-1:-1;;;19094:12;;;19087:27;19133:12;;;30030:245::o;30282:416::-;30482:2;30496:47;;;19384:2;30467:18;;;36550:19;19420:34;36590:14;;;19400:55;-1:-1;;;19475:12;;;19468:25;19512:12;;;30453:245::o;30705:416::-;30905:2;30919:47;;;30890:18;;;36550:19;19799:34;36590:14;;;19779:55;19853:12;;;30876:245::o;31128:416::-;31328:2;31342:47;;;20104:2;31313:18;;;36550:19;-1:-1;;;36590:14;;;20120:40;20179:12;;;31299:245::o;31551:416::-;31751:2;31765:47;;;20430:2;31736:18;;;36550:19;20466:34;36590:14;;;20446:55;-1:-1;;;20521:12;;;20514:34;20567:12;;;31722:245::o;31974:416::-;32174:2;32188:47;;;20818:2;32159:18;;;36550:19;20854:34;36590:14;;;20834:55;-1:-1;;;20909:12;;;20902:46;20967:12;;;32145:245::o;32397:416::-;32597:2;32611:47;;;21218:2;32582:18;;;36550:19;21254:33;36590:14;;;21234:54;21307:12;;;32568:245::o;32820:222::-;15863:37;;;32947:2;32932:18;;32918:124::o;33049:481::-;;15893:5;15870:3;15863:37;33254:2;33372;33361:9;33357:18;33350:48;33412:108;33254:2;33243:9;33239:18;33506:6;33412:108;:::i;33537:816::-;;15893:5;15870:3;15863:37;15893:5;33991:2;33980:9;33976:18;15863:37;33826:3;34028:2;34017:9;34013:18;34006:48;34068:108;33826:3;33815:9;33811:19;34162:6;34068:108;:::i;:::-;-1:-1;;;;;37612:54;;;;34255:2;34240:18;;14783:37;-1:-1;34338:3;34323:19;15863:37;34060:116;33797:556;-1:-1;;;33797:556::o;34360:816::-;;15893:5;15870:3;15863:37;15893:5;34814:2;34803:9;34799:18;15863:37;15893:5;34897:2;34886:9;34882:18;15863:37;15893:5;34980:2;34969:9;34965:18;15863:37;34649:3;35017;35006:9;35002:19;34995:49;35058:108;34649:3;34638:9;34634:19;35152:6;35058:108;:::i;:::-;35050:116;34620:556;-1:-1;;;;;;;34620:556::o;35183:256::-;35245:2;35239:9;35271:17;;;35346:18;35331:34;;35367:22;;;35328:62;35325:2;;;35403:1;;35393:12;35325:2;35245;35412:22;35223:216;;-1:-1;35223:216::o;35446:304::-;;35605:18;35597:6;35594:30;35591:2;;;-1:-1;;35627:12;35591:2;-1:-1;35672:4;35660:17;;;35725:15;;35528:222::o;39624:268::-;39689:1;39696:101;39710:6;39707:1;39704:13;39696:101;;;39777:11;;;39771:18;39758:11;;;39751:39;39732:2;39725:10;39696:101;;;39812:6;39809:1;39806:13;39803:2;;;-1:-1;;39689:1;39859:16;;39852:27;39673:219::o;40005:117::-;-1:-1;;;;;37612:54;;40064:35;;40054:2;;40113:1;;40103:12;40054:2;40048:74;:::o;40269:111::-;40350:5;37213:13;37206:21;40328:5;40325:32;40315:2;;40371:1;;40361:12;41033:113;37925:4;41116:5;37914:16;41093:5;41090:33;41080:2;;41137:1;;41127:12
Swarm Source
ipfs://4ce73a3161d672b9316458ff00ff51a9752c53a9e30d47f7b74cf10c0d809aa8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1 | 2,000 | $2,000 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.