Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
SparkEthereum_20240516
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.10; import { SparkPayloadEthereum, Ethereum } from 'src/SparkPayloadEthereum.sol'; /** * @title May 16, 2024 Spark Ethereum Proposal * @notice Update DAI IRM. * @author Phoenix Labs * Forum: https://forum.makerdao.com/t/stability-scope-parameter-changes-13-under-sta-article-3-3/24250 */ contract SparkEthereum_20240516 is SparkPayloadEthereum { // Per-second APY for DSR comes from: https://github.com/makerdao/spells-mainnet/blob/master/src/test/rates.sol // Formula for 8% target DSR APY (0.076961041230036903346080000) // bc -l <<< 'scale=27; (1.000000002440418608258400030 - 1) * 60 * 60 * 24 * 365' // Formula for 9% target APY (0.009216655128763325601840000 spread at current DSR): // bc -l <<< 'scale=27; (e( l(1.09)/(60 * 60 * 24 * 365) ) - 1) * 60 * 60 * 24 * 365 - 0.076961041230036903346080000' address internal constant DAI_IRM = 0x5ae77aE8ec1B0F9a741C80A4Cdb876e6b5B619b9; function _postExecute() internal override { LISTING_ENGINE.POOL_CONFIGURATOR().setReserveInterestRateStrategyAddress( Ethereum.DAI, DAI_IRM ); } }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.0; import './AaveV3PayloadBase.sol'; import { Ethereum } from 'spark-address-registry/src/Ethereum.sol'; import { IL2BridgeExecutor } from 'spark-gov-relay/interfaces/IL2BridgeExecutor.sol'; /** * @dev Base smart contract for Ethereum. * @author Phoenix Labs */ abstract contract SparkPayloadEthereum is AaveV3PayloadBase(IEngine(Ethereum.CONFIG_ENGINE)) { function getPoolContext() public pure override returns (IEngine.PoolContext memory) { return IEngine.PoolContext({networkName: 'Ethereum', networkAbbreviation: 'Eth'}); } function encodePayloadQueue(address _payload) internal pure returns (bytes memory) { address[] memory targets = new address[](1); uint256[] memory values = new uint256[](1); string[] memory signatures = new string[](1); bytes[] memory calldatas = new bytes[](1); bool[] memory withDelegatecalls = new bool[](1); targets[0] = _payload; values[0] = 0; signatures[0] = 'execute()'; calldatas[0] = ''; withDelegatecalls[0] = true; return abi.encodeCall(IL2BridgeExecutor.queue, ( targets, values, signatures, calldatas, withDelegatecalls )); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {Address} from './libraries/Address.sol'; import {IAaveV3ConfigEngine as IEngine} from './interfaces/IAaveV3ConfigEngine.sol'; import {IV3RateStrategyFactory as Rates} from './interfaces/IV3RateStrategyFactory.sol'; library EngineFlags { /// @dev magic value to be used as flag to keep unchanged any current configuration /// Strongly assumes that the value `type(uint256).max - 42` will never be used, which seems reasonable uint256 internal constant KEEP_CURRENT = type(uint256).max - 42; /// @dev value to be used as flag for bool value true uint256 internal constant ENABLED = 1; /// @dev value to be used as flag for bool value false uint256 internal constant DISABLED = 0; /// @dev converts flag ENABLED DISABLED to bool function toBool(uint256 flag) internal pure returns (bool) { require(flag == 0 || flag == 1, 'INVALID_CONVERSION_TO_BOOL'); return flag == 1; } /// @dev converts bool to ENABLED DISABLED flags function fromBool(bool isTrue) internal pure returns (uint256) { return isTrue ? ENABLED : DISABLED; } } /** * @dev Base smart contract for an Aave v3.0.1 configs update. * - Assumes this contract has the right permissions * - Connected to a IAaveV3ConfigEngine engine contact, which abstract the complexities of * interaction with the Aave protocol. * - At the moment covering: * - Listings of new assets on the pool. * - Updates of caps (supply cap, borrow cap). * - Updates of price feeds * - Updates of interest rate strategies. * - Updates of borrow parameters (flashloanable, stableRateModeEnabled, borrowableInIsolation, withSiloedBorrowing, reserveFactor) * - Updates of collateral parameters (ltv, liq threshold, liq bonus, liq protocol fee, debt ceiling) * @author BGD Labs */ abstract contract AaveV3PayloadBase { using Address for address; IEngine public immutable LISTING_ENGINE; constructor(IEngine engine) { LISTING_ENGINE = engine; } /// @dev to be overriden on the child if any extra logic is needed pre-listing function _preExecute() internal virtual {} /// @dev to be overriden on the child if any extra logic is needed post-listing function _postExecute() internal virtual {} function execute() external { _preExecute(); IEngine.Listing[] memory listings = newListings(); IEngine.ListingWithCustomImpl[] memory listingsCustom = newListingsCustom(); IEngine.CapsUpdate[] memory caps = capsUpdates(); IEngine.CollateralUpdate[] memory collaterals = collateralsUpdates(); IEngine.BorrowUpdate[] memory borrows = borrowsUpdates(); IEngine.PriceFeedUpdate[] memory priceFeeds = priceFeedsUpdates(); IEngine.RateStrategyUpdate[] memory rates = rateStrategiesUpdates(); if (listings.length != 0) { address(LISTING_ENGINE).functionDelegateCall( abi.encodeWithSelector(LISTING_ENGINE.listAssets.selector, getPoolContext(), listings) ); } if (listingsCustom.length != 0) { address(LISTING_ENGINE).functionDelegateCall( abi.encodeWithSelector( LISTING_ENGINE.listAssetsCustom.selector, getPoolContext(), listingsCustom ) ); } if (borrows.length != 0) { address(LISTING_ENGINE).functionDelegateCall( abi.encodeWithSelector(LISTING_ENGINE.updateBorrowSide.selector, borrows) ); } if (collaterals.length != 0) { address(LISTING_ENGINE).functionDelegateCall( abi.encodeWithSelector(LISTING_ENGINE.updateCollateralSide.selector, collaterals) ); } if (rates.length != 0) { address(LISTING_ENGINE).functionDelegateCall( abi.encodeWithSelector(LISTING_ENGINE.updateRateStrategies.selector, rates) ); } if (priceFeeds.length != 0) { address(LISTING_ENGINE).functionDelegateCall( abi.encodeWithSelector(LISTING_ENGINE.updatePriceFeeds.selector, priceFeeds) ); } if (caps.length != 0) { address(LISTING_ENGINE).functionDelegateCall( abi.encodeWithSelector(LISTING_ENGINE.updateCaps.selector, caps) ); } _postExecute(); } /** @dev Converts basis points to RAY units * e.g. 10_00 (10.00%) will return 100000000000000000000000000 */ function _bpsToRay(uint256 amount) internal pure returns (uint256) { return (amount * 1e27) / 10_000; } /// @dev to be defined in the child with a list of new assets to list function newListings() public view virtual returns (IEngine.Listing[] memory) {} /// @dev to be defined in the child with a list of new assets to list (with custom a/v/s tokens implementations) function newListingsCustom() public view virtual returns (IEngine.ListingWithCustomImpl[] memory) {} /// @dev to be defined in the child with a list of caps to update function capsUpdates() public view virtual returns (IEngine.CapsUpdate[] memory) {} /// @dev to be defined in the child with a list of collaterals' params to update function collateralsUpdates() public view virtual returns (IEngine.CollateralUpdate[] memory) {} /// @dev to be defined in the child with a list of borrows' params to update function borrowsUpdates() public view virtual returns (IEngine.BorrowUpdate[] memory) {} /// @dev to be defined in the child with a list of priceFeeds to update function priceFeedsUpdates() public view virtual returns (IEngine.PriceFeedUpdate[] memory) {} /// @dev to be defined in the child with a list of set of parameters of rate strategies function rateStrategiesUpdates() public view virtual returns (IEngine.RateStrategyUpdate[] memory) {} /// @dev the lack of support for immutable strings kinds of forces for this /// Besides that, it can actually be useful being able to change the naming, but remote function getPoolContext() public view virtual returns (IEngine.PoolContext memory); }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.13; library Ethereum { /******************************************************************************************************************/ /*** Token Addresses ***/ /******************************************************************************************************************/ address internal constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address internal constant GNO = 0x6810e776880C02933D47DB1b9fc05908e5386b96; address internal constant MKR = 0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2; address internal constant RETH = 0xae78736Cd615f374D3085123A210448E74Fc6393; address internal constant SDAI = 0x83F20F44975D03b1b09e64809B757c47f942BEeA; address internal constant SUSDE = 0x9D39A5DE30e57443BfF2A8307A4256c8797A3497; address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address internal constant USDE = 0x4c9EDD5852cd905f086C759E8383e09bff1E68B3; address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; address internal constant WBTC = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599; address internal constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address internal constant WSTETH = 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0; /******************************************************************************************************************/ /*** MakerDAO Addresses ***/ /******************************************************************************************************************/ address internal constant PAUSE_PROXY = 0xBE8E3e3618f7474F8cB1d074A26afFef007E98FB; address internal constant POT = 0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7; address internal constant VAT = 0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B; address internal constant CHIEF = 0x0a3f6849f78076aefaDf113F5BED87720274dDC0; /******************************************************************************************************************/ /*** SparkDAO Addresses ***/ /******************************************************************************************************************/ address internal constant SPARK_PROXY = 0x3300f198988e4C9C63F75dF86De36421f06af8c4; /******************************************************************************************************************/ /*** Morpho Addresses ***/ /******************************************************************************************************************/ address internal constant MORPHO_DEFAULT_IRM = 0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC; address internal constant MORPHO_SUSDE_ORACLE = 0x5D916980D5Ae1737a8330Bf24dF812b2911Aae25; address internal constant MORPHO_USDE_ORACLE = 0xaE4750d0813B5E37A51f7629beedd72AF1f9cA35; address internal constant MORPHO_VAULT_DAI_1 = 0x73e65DBD630f90604062f6E02fAb9138e713edD9; /******************************************************************************************************************/ /*** SparkLend - Core Protocol Addresses ***/ /******************************************************************************************************************/ address internal constant AAVE_ORACLE = 0x8105f69D9C41644c6A0803fDA7D03Aa70996cFD9; address internal constant ACL_MANAGER = 0xdA135Cd78A086025BcdC87B038a1C462032b510C; address internal constant DAI_TREASURY = 0x856900aa78e856a5df1a2665eE3a66b2487cD68f; address internal constant EMISSION_MANAGER = 0xf09e48dd4CA8e76F63a57ADd428bB06fee7932a4; address internal constant INCENTIVES = 0x4370D3b6C9588E02ce9D22e684387859c7Ff5b34; address internal constant POOL = 0xC13e21B648A5Ee794902342038FF3aDAB66BE987; address internal constant POOL_ADDRESSES_PROVIDER = 0x02C3eA4e34C0cBd694D2adFa2c690EECbC1793eE; address internal constant POOL_ADDRESSES_PROVIDER_REGISTRY = 0x03cFa0C4622FF84E50E75062683F44c9587e6Cc1; address internal constant POOL_CONFIGURATOR = 0x542DBa469bdE58FAeE189ffB60C6b49CE60E0738; address internal constant TREASURY = 0xb137E7d16564c81ae2b0C8ee6B55De81dd46ECe5; address internal constant TREASURY_CONTROLLER = 0x92eF091C5a1E01b3CE1ba0D0150C84412d818F7a; address internal constant WETH_GATEWAY = 0xBD7D6a9ad7865463DE44B05F04559f65e3B11704; /******************************************************************************************************************/ /*** SparkLend - Reserve Token Addresses ***/ /******************************************************************************************************************/ address internal constant DAI_ATOKEN = 0x4DEDf26112B3Ec8eC46e7E31EA5e123490B05B8B; address internal constant DAI_STABLE_DEBT_TOKEN = 0xfe2B7a7F4cC0Fb76f7Fc1C6518D586F1e4559176; address internal constant DAI_DEBT_TOKEN = 0xf705d2B7e92B3F38e6ae7afaDAA2fEE110fE5914; address internal constant GNO_ATOKEN = 0x7b481aCC9fDADDc9af2cBEA1Ff2342CB1733E50F; address internal constant GNO_STABLE_DEBT_TOKEN = 0xbf13910620722D4D4F8A03962894EB3335Bf4FaE; address internal constant GNO_DEBT_TOKEN = 0x57a2957651DA467fCD4104D749f2F3684784c25a; address internal constant RETH_ATOKEN = 0x9985dF20D7e9103ECBCeb16a84956434B6f06ae8; address internal constant RETH_STABLE_DEBT_TOKEN = 0xa9a4037295Ea3a168DC3F65fE69FdA524d52b3e1; address internal constant RETH_DEBT_TOKEN = 0xBa2C8F2eA5B56690bFb8b709438F049e5Dd76B96; address internal constant SDAI_ATOKEN = 0x78f897F0fE2d3B5690EbAe7f19862DEacedF10a7; address internal constant SDAI_STABLE_DEBT_TOKEN = 0xEc6C6aBEd4DC03299EFf82Ac8A0A83643d3cB335; address internal constant SDAI_DEBT_TOKEN = 0xaBc57081C04D921388240393ec4088Aa47c6832B; address internal constant USDC_ATOKEN = 0x377C3bd93f2a2984E1E7bE6A5C22c525eD4A4815; address internal constant USDC_STABLE_DEBT_TOKEN = 0x887Ac022983Ff083AEb623923789052A955C6798; address internal constant USDC_DEBT_TOKEN = 0x7B70D04099CB9cfb1Db7B6820baDAfB4C5C70A67; address internal constant USDT_ATOKEN = 0xe7dF13b8e3d6740fe17CBE928C7334243d86c92f; address internal constant USDT_STABLE_DEBT_TOKEN = 0x0Dae62F953Ceb2E969fB4dE85f3F9074fa920776; address internal constant USDT_DEBT_TOKEN = 0x529b6158d1D2992E3129F7C69E81a7c677dc3B12; address internal constant WBTC_ATOKEN = 0x4197ba364AE6698015AE5c1468f54087602715b2; address internal constant WBTC_STABLE_DEBT_TOKEN = 0x4b29e6cBeE62935CfC92efcB3839eD2c2F35C1d9; address internal constant WBTC_DEBT_TOKEN = 0xf6fEe3A8aC8040C3d6d81d9A4a168516Ec9B51D2; address internal constant WETH_ATOKEN = 0x59cD1C87501baa753d0B5B5Ab5D8416A45cD71DB; address internal constant WETH_STABLE_DEBT_TOKEN = 0x3c6b93D38ffA15ea995D1BC950d5D0Fa6b22bD05; address internal constant WETH_DEBT_TOKEN = 0x2e7576042566f8D6990e07A1B61Ad1efd86Ae70d; address internal constant WSTETH_ATOKEN = 0x12B54025C112Aa61fAce2CDB7118740875A566E9; address internal constant WSTETH_STABLE_DEBT_TOKEN = 0x9832D969a0c8662D98fFf334A4ba7FeE62b109C2; address internal constant WSTETH_DEBT_TOKEN = 0xd5c3E3B566a42A6110513Ac7670C1a86D76E13E6; /******************************************************************************************************************/ /*** SparkLend - Auxiliary Protocol Addresses ***/ /******************************************************************************************************************/ address internal constant CAP_AUTOMATOR = 0x2276f52afba7Cf2525fd0a050DF464AC8532d0ef; address internal constant FREEZER_MOM = 0x237e3985dD7E373F2ec878EC1Ac48A228Cf2e7a3; address internal constant KILL_SWITCH_ORACLE = 0x909A86f78e1cdEd68F9c2Fe2c9CD922c401abe82; /******************************************************************************************************************/ /*** SparkLend - Emergency Spells ***/ /******************************************************************************************************************/ address internal constant SPELL_FREEZE_ALL = 0x9e2890BF7f8D5568Cc9e5092E67Ba00C8dA3E97f; address internal constant SPELL_FREEZE_DAI = 0xa2039bef2c5803d66E4e68F9E23a942E350b938c; address internal constant SPELL_PAUSE_ALL = 0x425b0de240b4c2DC45979DB782A355D090Dc4d37; address internal constant SPELL_PAUSE_DAI = 0xCacB88e39112B56278db25b423441248cfF94241; address internal constant SPELL_REMOVE_MULTISIG = 0xE47AB4919F6F5459Dcbbfbe4264BD4630c0169A9; /******************************************************************************************************************/ /*** SparkLend - Implementation Addresses ***/ /******************************************************************************************************************/ address internal constant A_TOKEN_IMPL = 0x6175ddEc3B9b38c88157C10A01ed4A3fa8639cC6; address internal constant DAI_TREASURY_IMPL = 0xF1E57711Eb5F897b415de1aEFCB64d9BAe58D312; address internal constant INCENTIVES_IMPL = 0x0ee554F6A1f7a4Cb4f82D4C124DdC2AD3E37fde1; address internal constant POOL_CONFIGURATOR_IMPL = 0xF7b656C95420194b79687fc86D965FB51DA4799F; address internal constant POOL_IMPL = 0x5aE329203E00f76891094DcfedD5Aca082a50e1b; address internal constant STABLE_DEBT_TOKEN_IMPL = 0x026a5B6114431d8F3eF2fA0E1B2EDdDccA9c540E; address internal constant TREASURY_IMPL = 0xF1E57711Eb5F897b415de1aEFCB64d9BAe58D312; address internal constant VARIABLE_DEBT_TOKEN_IMPL = 0x86C71796CcDB31c3997F8Ec5C2E3dB3e9e40b985; /******************************************************************************************************************/ /*** SparkLend - Config Engine Addresses ***/ /******************************************************************************************************************/ address internal constant CONFIG_ENGINE = 0x3254F7cd0565aA67eEdC86c2fB608BE48d5cCd78; address internal constant PROXY_ADMIN = 0x883A82BDd3d07ae6ACfD151020faD350df25087e; address internal constant RATES_FACTORY = 0xfE57e187EF6285e90d7049e6a21571aa47cF11a2; address internal constant TRANSPARENT_PROXY_FACTORY = 0x777803CbDD89D5D5Bc1DdD2151B51b0B07F6bf37; /******************************************************************************************************************/ /*** SparkLend - Data Provider Addresses ***/ /******************************************************************************************************************/ address internal constant PROTOCOL_DATA_PROVIDER = 0xFc21d6d146E6086B8359705C8b28512a983db0cb; address internal constant UI_INCENTIVE_DATA_PROVIDER = 0xA7F8A757C4f7696c015B595F51B2901AC0121B18; address internal constant UI_POOL_DATA_PROVIDER = 0xF028c2F4b19898718fD0F77b9b881CbfdAa5e8Bb; address internal constant WALLET_BALANCE_PROVIDER = 0xd2AeF86F51F92E8e49F42454c287AE4879D1BeDc; /******************************************************************************************************************/ /*** SparkLend - Library Addresses ***/ /******************************************************************************************************************/ address internal constant BORROW_LOGIC = 0x4662C88C542F0954F8CccCDE4542eEc32d7E7e9a; address internal constant BRIDGE_LOGIC = 0x2C54924711E479E639032704146b865E12f0C6D1; address internal constant EMODE_LOGIC = 0x2Ad00613A66D71Ff2B0607fB3C4632C47a50DADe; address internal constant FLASH_LOAN_LOGIC = 0x7f44e1c1dE70059D7cc483378BEFeE2a030CE247; address internal constant LIQUIDATION_LOGIC = 0x6aEa92693C527bC2c7B3171C6f2598d67d619088; address internal constant POOL_LOGIC = 0x1761a0f74032963B6Ad0774C5EBF4586c0bD7604; address internal constant SUPPLY_LOGIC = 0x46256841e36b7557BB8e4c706beD38b17A9EB2c1; /******************************************************************************************************************/ /*** L2 Forwarders ***/ /******************************************************************************************************************/ address internal constant DSR_FORWARDER_OPTIMISM = 0x4042127DecC0cF7cc0966791abebf7F76294DeF3; address internal constant DSR_FORWARDER_BASE = 0x8Ed551D485701fe489c215E13E42F6fc59563e0e; /******************************************************************************************************************/ /*** Multisigs ***/ /******************************************************************************************************************/ address internal constant MULTISIG_FREEZER = 0x44efFc473e81632B12486866AA1678edbb7BEeC3; address internal constant MULTISIG_REWARDS = 0x8076807464DaC94Ac8Aa1f7aF31b58F73bD88A27; }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.10; import { IExecutorBase } from './IExecutorBase.sol'; /** * @title IL2BridgeExecutorBase * @author Aave * @notice Defines the basic interface for the L2BridgeExecutor abstract contract */ interface IL2BridgeExecutor is IExecutorBase { error UnauthorizedEthereumExecutor(); /** * @dev Emitted when the Ethereum Governance Executor is updated * @param oldEthereumGovernanceExecutor The address of the old EthereumGovernanceExecutor * @param newEthereumGovernanceExecutor The address of the new EthereumGovernanceExecutor **/ event EthereumGovernanceExecutorUpdate( address oldEthereumGovernanceExecutor, address newEthereumGovernanceExecutor ); /** * @notice Queue an ActionsSet * @dev If a signature is empty, calldata is used for the execution, calldata is appended to signature otherwise * @param targets Array of targets to be called by the actions set * @param values Array of values to pass in each call by the actions set * @param signatures Array of function signatures to encode in each call by the actions (can be empty) * @param calldatas Array of calldata to pass in each call by the actions set * @param withDelegatecalls Array of whether to delegatecall for each call of the actions set **/ function queue( address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, bool[] memory withDelegatecalls ) external; /** * @notice Update the address of the Ethereum Governance Executor * @param ethereumGovernanceExecutor The address of the new EthereumGovernanceExecutor **/ function updateEthereumGovernanceExecutor(address ethereumGovernanceExecutor) external; /** * @notice Returns the address of the Ethereum Governance Executor * @return The address of the EthereumGovernanceExecutor **/ function getEthereumGovernanceExecutor() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) // From commit https://github.com/OpenZeppelin/openzeppelin-contracts/commit/8b778fa20d6d76340c5fac1ed66c80273f05b95a pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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'); (bool success, ) = recipient.call{value: amount}(''); require(success, 'Address: unable to send value, recipient may have reverted'); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, 'Address: low-level call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, 'Address: low-level call with value failed'); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, 'Address: insufficient balance for call'); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, 'Address: low-level static call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, 'Address: low-level delegate call failed'); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), 'Address: call to non-contract'); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IPool} from 'sparklend-v1-core/contracts/interfaces/IPool.sol'; import {IPoolConfigurator} from 'sparklend-v1-core/contracts/interfaces/IPoolConfigurator.sol'; import {IAaveOracle} from 'sparklend-v1-core/contracts/interfaces/IAaveOracle.sol'; import {IV3RateStrategyFactory} from './IV3RateStrategyFactory.sol'; /// @dev Examples here assume the usage of the `AaveV3PayloadBase` base contracts /// contained in this same repository interface IAaveV3ConfigEngine { /** * @dev Required for naming of a/v/s tokens * Example (mock): * PoolContext({ * networkName: 'Polygon', * networkAbbreviation: 'Pol' * }) */ struct PoolContext { string networkName; string networkAbbreviation; } /** * @dev Example (mock): * Listing({ * asset: 0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9, * assetSymbol: 'AAVE', * priceFeed: 0x547a514d5e3769680Ce22B2361c10Ea13619e8a9, * rateStrategyParams: Rates.RateStrategyParams({ * optimalUsageRatio: _bpsToRay(80_00), * baseVariableBorrowRate: _bpsToRay(25), // 0.25% * variableRateSlope1: _bpsToRay(3_00), * variableRateSlope2: _bpsToRay(75_00), * stableRateSlope1: _bpsToRay(3_00), * stableRateSlope2: _bpsToRay(75_00), * baseStableRateOffset: _bpsToRay(2_00), * stableRateExcessOffset: _bpsToRay(3_00), * optimalStableToTotalDebtRatio: _bpsToRay(30_00) * }), * enabledToBorrow: EngineFlags.ENABLED, * flashloanable: EngineFlags.ENABLED, * stableRateModeEnabled: EngineFlags.DISABLED, * borrowableInIsolation: EngineFlags.ENABLED, * withSiloedBorrowing:, EngineFlags.DISABLED, * ltv: 70_50, // 70.5% * liqThreshold: 76_00, // 76% * liqBonus: 5_00, // 5% * reserveFactor: 10_00, // 10% * supplyCap: 100_000, // 100k AAVE * borrowCap: 60_000, // 60k AAVE * debtCeiling: 100_000, // 100k USD * liqProtocolFee: 10_00, // 10% * eModeCategory: 0, // No category * } */ struct Listing { address asset; string assetSymbol; address priceFeed; IV3RateStrategyFactory.RateStrategyParams rateStrategyParams; // Mandatory, no matter if enabled for borrowing or not uint256 enabledToBorrow; uint256 stableRateModeEnabled; // Only considered is enabledToBorrow == EngineFlags.ENABLED (true) uint256 borrowableInIsolation; // Only considered is enabledToBorrow == EngineFlags.ENABLED (true) uint256 withSiloedBorrowing; // Only considered if enabledToBorrow == EngineFlags.ENABLED (true) uint256 flashloanable; // Independent from enabled to borrow: an asset can be flashloanble and not enabled to borrow uint256 ltv; // Only considered if liqThreshold > 0 uint256 liqThreshold; // If `0`, the asset will not be enabled as collateral uint256 liqBonus; // Only considered if liqThreshold > 0 uint256 reserveFactor; // Only considered if enabledToBorrow == EngineFlags.ENABLED (true) uint256 supplyCap; // If passing any value distinct to EngineFlags.KEEP_CURRENT, always configured uint256 borrowCap; // If passing any value distinct to EngineFlags.KEEP_CURRENT, always configured uint256 debtCeiling; // Only considered if liqThreshold > 0 uint256 liqProtocolFee; // Only considered if liqThreshold > 0 uint8 eModeCategory; // If `O`, no eMode category will be set } struct TokenImplementations { address aToken; address vToken; address sToken; } struct ListingWithCustomImpl { Listing base; TokenImplementations implementations; } /** * @dev Example (mock): * CapsUpdate({ * asset: AaveV3EthereumAssets.AAVE_UNDERLYING, * supplyCap: 1_000_000, * borrowCap: EngineFlags.KEEP_CURRENT * } */ struct CapsUpdate { address asset; uint256 supplyCap; // Pass any value, of EngineFlags.KEEP_CURRENT to keep it as it is uint256 borrowCap; // Pass any value, of EngineFlags.KEEP_CURRENT to keep it as it is } /** * @dev Example (mock): * PriceFeedUpdate({ * asset: AaveV3EthereumAssets.AAVE_UNDERLYING, * priceFeed: 0x547a514d5e3769680Ce22B2361c10Ea13619e8a9 * }) */ struct PriceFeedUpdate { address asset; address priceFeed; } /** * @dev Example (mock): * CollateralUpdate({ * asset: AaveV3EthereumAssets.AAVE_UNDERLYING, * ltv: 60_00, * liqThreshold: 70_00, * liqBonus: EngineFlags.KEEP_CURRENT, * debtCeiling: EngineFlags.KEEP_CURRENT, * liqProtocolFee: 7_00, * eModeCategory: EngineFlags.KEEP_CURRENT * }) */ struct CollateralUpdate { address asset; uint256 ltv; uint256 liqThreshold; uint256 liqBonus; uint256 debtCeiling; uint256 liqProtocolFee; uint256 eModeCategory; } /** * @dev Example (mock): * BorrowUpdate({ * asset: AaveV3EthereumAssets.AAVE_UNDERLYING, * enabledToBorrow: EngineFlags.ENABLED, * flashloanable: EngineFlags.KEEP_CURRENT, * stableRateModeEnabled: EngineFlags.KEEP_CURRENT, * borrowableInIsolation: EngineFlags.KEEP_CURRENT, * withSiloedBorrowing: EngineFlags.KEEP_CURRENT, * reserveFactor: 15_00, // 15% * }) */ struct BorrowUpdate { address asset; uint256 enabledToBorrow; uint256 flashloanable; uint256 stableRateModeEnabled; uint256 borrowableInIsolation; uint256 withSiloedBorrowing; uint256 reserveFactor; } /** * @dev Example (mock): * RateStrategyUpdate({ * asset: AaveV3OptimismAssets.USDT_UNDERLYING, * params: Rates.RateStrategyParams({ * optimalUsageRatio: _bpsToRay(80_00), * baseVariableBorrowRate: EngineFlags.KEEP_CURRENT, * variableRateSlope1: EngineFlags.KEEP_CURRENT, * variableRateSlope2: _bpsToRay(75_00), * stableRateSlope1: EngineFlags.KEEP_CURRENT, * stableRateSlope2: _bpsToRay(75_00), * baseStableRateOffset: EngineFlags.KEEP_CURRENT, * stableRateExcessOffset: EngineFlags.KEEP_CURRENT, * optimalStableToTotalDebtRatio: EngineFlags.KEEP_CURRENT * }) * }) */ struct RateStrategyUpdate { address asset; IV3RateStrategyFactory.RateStrategyParams params; } /** * @notice Performs full listing of the assets, in the Aave pool configured in this engine instance * @param context `PoolContext` struct, effectively meta-data for naming of a/v/s tokens. * More information on the documentation of the struct. * @param listings `Listing[]` list of declarative configs for every aspect of the asset listings. * More information on the documentation of the struct. */ function listAssets(PoolContext memory context, Listing[] memory listings) external; /** * @notice Performs full listings of assets, in the Aave pool configured in this engine instance * @dev This function allows more customization, especifically enables to set custom implementations * for a/v/s tokens. * IMPORTANT. Use it only if understanding the internals of the Aave v3 protocol * @param context `PoolContext` struct, effectively meta-data for naming of a/v/s tokens. * More information on the documentation of the struct. * @param listings `ListingWithCustomImpl[]` list of declarative configs for every aspect of the asset listings. */ function listAssetsCustom( PoolContext memory context, ListingWithCustomImpl[] memory listings ) external; /** * @notice Performs an update of the caps (supply, borrow) of the assets, in the Aave pool configured in this engine instance * @param updates `CapsUpdate[]` list of declarative updates containing the new caps * More information on the documentation of the struct. */ function updateCaps(CapsUpdate[] memory updates) external; /** * @notice Performs an update on the rate strategy params of the assets, in the Aave pool configured in this engine instance * @dev The engine itself manages if a new rate strategy needs to be deployed or if an existing one can be re-used * @param updates `RateStrategyUpdate[]` list of declarative updates containing the new rate strategy params * More information on the documentation of the struct. */ function updateRateStrategies(RateStrategyUpdate[] memory updates) external; /** * @notice Performs an update of the collateral-related params of the assets, in the Aave pool configured in this engine instance * @param updates `CollateralUpdate[]` list of declarative updates containing the new parameters * More information on the documentation of the struct. */ function updateCollateralSide(CollateralUpdate[] memory updates) external; /** * @notice Performs an update of the price feed of the assets, in the Aave pool configured in this engine instance * @param updates `PriceFeedUpdate[]` list of declarative updates containing the new parameters * More information on the documentation of the struct. */ function updatePriceFeeds(PriceFeedUpdate[] memory updates) external; /** * @notice Performs an update of the borrow-related params of the assets, in the Aave pool configured in this engine instance * @param updates `BorrowUpdate[]` list of declarative updates containing the new parameters * More information on the documentation of the struct. */ function updateBorrowSide(BorrowUpdate[] memory updates) external; function RATE_STRATEGIES_FACTORY() external view returns (IV3RateStrategyFactory); function POOL() external view returns (IPool); function POOL_CONFIGURATOR() external view returns (IPoolConfigurator); function ORACLE() external view returns (IAaveOracle); function ATOKEN_IMPL() external view returns (address); function VTOKEN_IMPL() external view returns (address); function STOKEN_IMPL() external view returns (address); function REWARDS_CONTROLLER() external view returns (address); function COLLECTOR() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IPoolAddressesProvider} from 'sparklend-v1-core/contracts/interfaces/IPoolAddressesProvider.sol'; import {IDefaultInterestRateStrategy} from 'sparklend-v1-core/contracts/interfaces/IDefaultInterestRateStrategy.sol'; interface IV3RateStrategyFactory { event RateStrategyCreated( address indexed strategy, bytes32 indexed hashedParam, RateStrategyParams params ); /// @dev same parameters and the ones received on the constructor of DefaultReserveInterestRateStrategy /// in practise defining the strategy itself struct RateStrategyParams { uint256 optimalUsageRatio; uint256 baseVariableBorrowRate; uint256 variableRateSlope1; uint256 variableRateSlope2; uint256 stableRateSlope1; uint256 stableRateSlope2; uint256 baseStableRateOffset; uint256 stableRateExcessOffset; uint256 optimalStableToTotalDebtRatio; } /** * @notice Create new rate strategies from a list of parameters * @dev If a strategy with exactly the same `RateStrategyParams` already exists, no creation happens but * its address is returned * @param params `RateStrategyParams[]` list of parameters for multiple strategies * @return address[] list of strategies */ function createStrategies(RateStrategyParams[] memory params) external returns (address[] memory); /** * @notice Returns the identifier of a rate strategy from its parameters * @param params `RateStrategyParams` the parameters of the rate strategy * @return bytes32 the keccak256 hash generated from the `RateStrategyParams` parameters * to be used as identifier of the rate strategy on the factory */ function strategyHashFromParams(RateStrategyParams memory params) external pure returns (bytes32); /** * @notice Returns all the strategies registered in the factory * @return address[] list of strategies */ function getAllStrategies() external view returns (address[] memory); /** * @notice Returns the a strategy added, given its parameters. * @dev Only if the strategy is registered in the factory. * @param params `RateStrategyParams` the parameters of the rate strategy * @return address the address of the strategy */ function getStrategyByParams(RateStrategyParams memory params) external view returns (address); /** * @notice From an asset in the Aave v3 pool, returns exclusively its parameters * @param asset The address of the asset * @return RateStrategyParams The parameters or the strategy, or empty RateStrategyParams struct */ function getStrategyDataOfAsset(address asset) external view returns (RateStrategyParams memory); /** * @notice From a rate strategy address, returns its parameters * @param strategy The address of the rate strategy * @return RateStrategyParams Struct with the parameters of the strategy */ function getStrategyData( IDefaultInterestRateStrategy strategy ) external view returns (RateStrategyParams memory); function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.10; /** * @title IExecutorBase * @author Aave * @notice Defines the basic interface for the ExecutorBase abstract contract */ interface IExecutorBase { error InvalidInitParams(); error NotGuardian(); error OnlyCallableByThis(); error MinimumDelayTooLong(); error MaximumDelayTooShort(); error GracePeriodTooShort(); error DelayShorterThanMin(); error DelayLongerThanMax(); error OnlyQueuedActions(); error TimelockNotFinished(); error InvalidActionsSetId(); error EmptyTargets(); error InconsistentParamsLength(); error DuplicateAction(); error InsufficientBalance(); error FailedActionExecution(); /** * @notice This enum contains all possible actions set states */ enum ActionsSetState { Queued, Executed, Canceled, Expired } /** * @notice This struct contains the data needed to execute a specified set of actions * @param targets Array of targets to call * @param values Array of values to pass in each call * @param signatures Array of function signatures to encode in each call (can be empty) * @param calldatas Array of calldatas to pass in each call, appended to the signature at the same array index if not empty * @param withDelegateCalls Array of whether to delegatecall for each call * @param executionTime Timestamp starting from which the actions set can be executed * @param executed True if the actions set has been executed, false otherwise * @param canceled True if the actions set has been canceled, false otherwise */ struct ActionsSet { address[] targets; uint256[] values; string[] signatures; bytes[] calldatas; bool[] withDelegatecalls; uint256 executionTime; bool executed; bool canceled; } /** * @dev Emitted when an ActionsSet is queued * @param id Id of the ActionsSet * @param targets Array of targets to be called by the actions set * @param values Array of values to pass in each call by the actions set * @param signatures Array of function signatures to encode in each call by the actions set * @param calldatas Array of calldata to pass in each call by the actions set * @param withDelegatecalls Array of whether to delegatecall for each call of the actions set * @param executionTime The timestamp at which this actions set can be executed **/ event ActionsSetQueued( uint256 indexed id, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, bool[] withDelegatecalls, uint256 executionTime ); /** * @dev Emitted when an ActionsSet is successfully executed * @param id Id of the ActionsSet * @param initiatorExecution The address that triggered the ActionsSet execution * @param returnedData The returned data from the ActionsSet execution **/ event ActionsSetExecuted( uint256 indexed id, address indexed initiatorExecution, bytes[] returnedData ); /** * @dev Emitted when an ActionsSet is cancelled by the guardian * @param id Id of the ActionsSet **/ event ActionsSetCanceled(uint256 indexed id); /** * @dev Emitted when a new guardian is set * @param oldGuardian The address of the old guardian * @param newGuardian The address of the new guardian **/ event GuardianUpdate(address oldGuardian, address newGuardian); /** * @dev Emitted when the delay (between queueing and execution) is updated * @param oldDelay The value of the old delay * @param newDelay The value of the new delay **/ event DelayUpdate(uint256 oldDelay, uint256 newDelay); /** * @dev Emitted when the grace period (between executionTime and expiration) is updated * @param oldGracePeriod The value of the old grace period * @param newGracePeriod The value of the new grace period **/ event GracePeriodUpdate(uint256 oldGracePeriod, uint256 newGracePeriod); /** * @dev Emitted when the minimum delay (lower bound of delay) is updated * @param oldMinimumDelay The value of the old minimum delay * @param newMinimumDelay The value of the new minimum delay **/ event MinimumDelayUpdate(uint256 oldMinimumDelay, uint256 newMinimumDelay); /** * @dev Emitted when the maximum delay (upper bound of delay)is updated * @param oldMaximumDelay The value of the old maximum delay * @param newMaximumDelay The value of the new maximum delay **/ event MaximumDelayUpdate(uint256 oldMaximumDelay, uint256 newMaximumDelay); /** * @notice Execute the ActionsSet * @param actionsSetId The id of the ActionsSet to execute **/ function execute(uint256 actionsSetId) external payable; /** * @notice Cancel the ActionsSet * @param actionsSetId The id of the ActionsSet to cancel **/ function cancel(uint256 actionsSetId) external; /** * @notice Update guardian * @param guardian The address of the new guardian **/ function updateGuardian(address guardian) external; /** * @notice Update the delay, time between queueing and execution of ActionsSet * @dev It does not affect to actions set that are already queued * @param delay The value of the delay (in seconds) **/ function updateDelay(uint256 delay) external; /** * @notice Update the grace period, the period after the execution time during which an actions set can be executed * @param gracePeriod The value of the grace period (in seconds) **/ function updateGracePeriod(uint256 gracePeriod) external; /** * @notice Update the minimum allowed delay * @param minimumDelay The value of the minimum delay (in seconds) **/ function updateMinimumDelay(uint256 minimumDelay) external; /** * @notice Update the maximum allowed delay * @param maximumDelay The maximum delay (in seconds) **/ function updateMaximumDelay(uint256 maximumDelay) external; /** * @notice Allows to delegatecall a given target with an specific amount of value * @dev This function is external so it allows to specify a defined msg.value for the delegate call, reducing * the risk that a delegatecall gets executed with more value than intended * @return True if the delegate call was successful, false otherwise * @return The bytes returned by the delegate call **/ function executeDelegateCall(address target, bytes calldata data) external payable returns (bool, bytes memory); /** * @notice Allows to receive funds into the executor * @dev Useful for actionsSet that needs funds to gets executed */ function receiveFunds() external payable; /** * @notice Returns the delay (between queuing and execution) * @return The value of the delay (in seconds) **/ function getDelay() external view returns (uint256); /** * @notice Returns the grace period * @return The value of the grace period (in seconds) **/ function getGracePeriod() external view returns (uint256); /** * @notice Returns the minimum delay * @return The value of the minimum delay (in seconds) **/ function getMinimumDelay() external view returns (uint256); /** * @notice Returns the maximum delay * @return The value of the maximum delay (in seconds) **/ function getMaximumDelay() external view returns (uint256); /** * @notice Returns the address of the guardian * @return The address of the guardian **/ function getGuardian() external view returns (address); /** * @notice Returns the total number of actions sets of the executor * @return The number of actions sets **/ function getActionsSetCount() external view returns (uint256); /** * @notice Returns the data of an actions set * @param actionsSetId The id of the ActionsSet * @return The data of the ActionsSet **/ function getActionsSetById(uint256 actionsSetId) external view returns (ActionsSet memory); /** * @notice Returns the current state of an actions set * @param actionsSetId The id of the ActionsSet * @return The current state of theI ActionsSet **/ function getCurrentState(uint256 actionsSetId) external view returns (ActionsSetState); /** * @notice Returns whether an actions set (by actionHash) is queued * @dev actionHash = keccak256(abi.encode(target, value, signature, data, executionTime, withDelegatecall)) * @param actionHash hash of the action to be checked * @return True if the underlying action of actionHash is queued, false otherwise **/ function isActionQueued(bytes32 actionHash) external view returns (bool); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.0; import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; /** * @title IPool * @author Aave * @notice Defines the basic interface for an Aave Pool. */ interface IPool { /** * @dev Emitted on mintUnbacked() * @param reserve The address of the underlying asset of the reserve * @param user The address initiating the supply * @param onBehalfOf The beneficiary of the supplied assets, receiving the aTokens * @param amount The amount of supplied assets * @param referralCode The referral code used */ event MintUnbacked( address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, uint16 indexed referralCode ); /** * @dev Emitted on backUnbacked() * @param reserve The address of the underlying asset of the reserve * @param backer The address paying for the backing * @param amount The amount added as backing * @param fee The amount paid in fees */ event BackUnbacked(address indexed reserve, address indexed backer, uint256 amount, uint256 fee); /** * @dev Emitted on supply() * @param reserve The address of the underlying asset of the reserve * @param user The address initiating the supply * @param onBehalfOf The beneficiary of the supply, receiving the aTokens * @param amount The amount supplied * @param referralCode The referral code used */ event Supply( address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, uint16 indexed referralCode ); /** * @dev Emitted on withdraw() * @param reserve The address of the underlying asset being withdrawn * @param user The address initiating the withdrawal, owner of aTokens * @param to The 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 interestRateMode The rate mode: 1 for Stable, 2 for Variable * @param borrowRate The numeric rate at which the user has borrowed, expressed in ray * @param referralCode The referral code used */ event Borrow( address indexed reserve, address user, address indexed onBehalfOf, uint256 amount, DataTypes.InterestRateMode interestRateMode, uint256 borrowRate, uint16 indexed referralCode ); /** * @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 * @param useATokens True if the repayment is done using aTokens, `false` if done with underlying asset directly */ event Repay( address indexed reserve, address indexed user, address indexed repayer, uint256 amount, bool useATokens ); /** * @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 interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable */ event SwapBorrowRateMode( address indexed reserve, address indexed user, DataTypes.InterestRateMode interestRateMode ); /** * @dev Emitted on borrow(), repay() and liquidationCall() when using isolated assets * @param asset The address of the underlying asset of the reserve * @param totalDebt The total isolation mode debt for the reserve */ event IsolationModeTotalDebtUpdated(address indexed asset, uint256 totalDebt); /** * @dev Emitted when the user selects a certain asset category for eMode * @param user The address of the user * @param categoryId The category id */ event UserEModeSet(address indexed user, uint8 categoryId); /** * @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 interestRateMode The flashloan mode: 0 for regular flashloan, 1 for Stable debt, 2 for Variable debt * @param premium The fee flash borrowed * @param referralCode The referral code used */ event FlashLoan( address indexed target, address initiator, address indexed asset, uint256 amount, DataTypes.InterestRateMode interestRateMode, uint256 premium, uint16 indexed referralCode ); /** * @dev Emitted when a borrower is liquidated. * @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 liquidator * @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. * @param reserve The address of the underlying asset of the reserve * @param liquidityRate The next liquidity rate * @param stableBorrowRate The next stable borrow rate * @param variableBorrowRate The next variable borrow rate * @param liquidityIndex The next liquidity index * @param variableBorrowIndex The next variable borrow index */ event ReserveDataUpdated( address indexed reserve, uint256 liquidityRate, uint256 stableBorrowRate, uint256 variableBorrowRate, uint256 liquidityIndex, uint256 variableBorrowIndex ); /** * @dev Emitted when the protocol treasury receives minted aTokens from the accrued interest. * @param reserve The address of the reserve * @param amountMinted The amount minted to the treasury */ event MintedToTreasury(address indexed reserve, uint256 amountMinted); /** * @notice Mints an `amount` of aTokens to the `onBehalfOf` * @param asset The address of the underlying asset to mint * @param amount The amount to mint * @param onBehalfOf The address that will receive the aTokens * @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 mintUnbacked( address asset, uint256 amount, address onBehalfOf, uint16 referralCode ) external; /** * @notice Back the current unbacked underlying with `amount` and pay `fee`. * @param asset The address of the underlying asset to back * @param amount The amount to back * @param fee The amount paid in fees * @return The backed amount */ function backUnbacked(address asset, uint256 amount, uint256 fee) external returns (uint256); /** * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. * - E.g. User supplies 100 USDC and gets in return 100 aUSDC * @param asset The address of the underlying asset to supply * @param amount The amount to be supplied * @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 supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; /** * @notice Supply with transfer approval of asset to be supplied done via permit function * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 * @param asset The address of the underlying asset to supply * @param amount The amount to be supplied * @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 deadline The deadline timestamp that the permit is valid * @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 permitV The V parameter of ERC712 permit sig * @param permitR The R parameter of ERC712 permit sig * @param permitS The S parameter of ERC712 permit sig */ function supplyWithPermit( address asset, uint256 amount, address onBehalfOf, uint16 referralCode, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS ) external; /** * @notice 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 The 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); /** * @notice Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower * already supplied 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 The 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 The 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 interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable * @param onBehalfOf The 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 interestRateMode, address onBehalfOf ) external returns (uint256); /** * @notice Repay with transfer approval of asset to be repaid done via permit function * see: https://eips.ethereum.org/EIPS/eip-2612 and https://eips.ethereum.org/EIPS/eip-713 * @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 interestRateMode 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 * @param deadline The deadline timestamp that the permit is valid * @param permitV The V parameter of ERC712 permit sig * @param permitR The R parameter of ERC712 permit sig * @param permitS The S parameter of ERC712 permit sig * @return The final amount repaid */ function repayWithPermit( address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf, uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS ) external returns (uint256); /** * @notice Repays a borrowed `amount` on a specific reserve using the reserve aTokens, burning the * equivalent debt tokens * - E.g. User repays 100 USDC using 100 aUSDC, burning 100 variable/stable debt tokens * @dev Passing uint256.max as amount will clean up any residual aToken dust balance, if the user aToken * balance is not enough to cover the whole debt * @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 interestRateMode The interest rate mode at of the debt the user wants to repay: 1 for Stable, 2 for Variable * @return The final amount repaid */ function repayWithATokens( address asset, uint256 amount, uint256 interestRateMode ) external returns (uint256); /** * @notice Allows a borrower to swap his debt between stable and variable mode, or vice versa * @param asset The address of the underlying asset borrowed * @param interestRateMode The current interest rate mode of the position being swapped: 1 for Stable, 2 for Variable */ function swapBorrowRateMode(address asset, uint256 interestRateMode) external; /** * @notice 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 supply APY is below REBALANCE_UP_THRESHOLD * maxVariableBorrowRate, which means that too * much has been borrowed at a stable rate and suppliers 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; /** * @notice Allows suppliers to enable/disable a specific supplied asset as collateral * @param asset The address of the underlying asset supplied * @param useAsCollateral True if the user wants to use the supply as collateral, false otherwise */ function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external; /** * @notice 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; /** * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, * as long as the amount taken plus a fee is returned. * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept * into consideration. For further details please visit https://docs.aave.com/developers/ * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanReceiver interface * @param assets The addresses of the assets being flash-borrowed * @param amounts The amounts of the assets being flash-borrowed * @param interestRateModes 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 The 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 interestRateModes, address onBehalfOf, bytes calldata params, uint16 referralCode ) external; /** * @notice Allows smartcontracts to access the liquidity of the pool within one transaction, * as long as the amount taken plus a fee is returned. * @dev IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept * into consideration. For further details please visit https://docs.aave.com/developers/ * @param receiverAddress The address of the contract receiving the funds, implementing IFlashLoanSimpleReceiver interface * @param asset The address of the asset being flash-borrowed * @param amount The amount of the asset being flash-borrowed * @param params Variadic packed params to pass to the receiver as extra information * @param referralCode The 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 flashLoanSimple( address receiverAddress, address asset, uint256 amount, bytes calldata params, uint16 referralCode ) external; /** * @notice Returns the user account data across all the reserves * @param user The address of the user * @return totalCollateralBase The total collateral of the user in the base currency used by the price feed * @return totalDebtBase The total debt of the user in the base currency used by the price feed * @return availableBorrowsBase The borrowing power left of the user in the base currency used by the price feed * @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 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor ); /** * @notice Initializes a reserve, activating it, assigning an aToken and debt tokens and an * interest rate strategy * @dev Only callable by the PoolConfigurator contract * @param asset The address of the underlying asset of the reserve * @param aTokenAddress The address of the aToken that will be assigned to the reserve * @param stableDebtAddress The address of the StableDebtToken that will be assigned to the reserve * @param variableDebtAddress The address of the VariableDebtToken that will be assigned to the reserve * @param interestRateStrategyAddress The address of the interest rate strategy contract */ function initReserve( address asset, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress ) external; /** * @notice Drop a reserve * @dev Only callable by the PoolConfigurator contract * @param asset The address of the underlying asset of the reserve */ function dropReserve(address asset) external; /** * @notice Updates the address of the interest rate strategy contract * @dev Only callable by the PoolConfigurator contract * @param asset The address of the underlying asset of the reserve * @param rateStrategyAddress The address of the interest rate strategy contract */ function setReserveInterestRateStrategyAddress( address asset, address rateStrategyAddress ) external; /** * @notice Sets the configuration bitmap of the reserve as a whole * @dev Only callable by the PoolConfigurator contract * @param asset The address of the underlying asset of the reserve * @param configuration The new configuration bitmap */ function setConfiguration( address asset, DataTypes.ReserveConfigurationMap calldata configuration ) external; /** * @notice 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); /** * @notice 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); /** * @notice Returns the 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); /** * @notice Returns the normalized variable debt per unit of asset * @dev WARNING: This function is intended to be used primarily by the protocol itself to get a * "dynamic" variable index based on time, current stored index and virtual rate at the current * moment (approx. a borrower would get if opening a position). This means that is always used in * combination with variable debt supply/balances. * If using this function externally, consider that is possible to have an increasing normalized * variable debt that is not equivalent to how the variable debt index would be updated in storage * (e.g. only updates with non-zero variable debt supply) * @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); /** * @notice Returns the state and configuration of the reserve * @param asset The address of the underlying asset of the reserve * @return The state and configuration data of the reserve */ function getReserveData(address asset) external view returns (DataTypes.ReserveData memory); /** * @notice Validates and finalizes an aToken transfer * @dev Only callable by the overlying aToken of the `asset` * @param asset The address of the underlying asset of the aToken * @param from The user from which the aTokens are transferred * @param to The user receiving the aTokens * @param amount The amount being transferred/withdrawn * @param balanceFromBefore The aToken balance of the `from` user before the transfer * @param balanceToBefore The aToken balance of the `to` user before the transfer */ function finalizeTransfer( address asset, address from, address to, uint256 amount, uint256 balanceFromBefore, uint256 balanceToBefore ) external; /** * @notice Returns the list of the underlying assets of all the initialized reserves * @dev It does not include dropped reserves * @return The addresses of the underlying assets of the initialized reserves */ function getReservesList() external view returns (address[] memory); /** * @notice Returns the number of initialized reserves * @dev It includes dropped reserves * @return The count */ function getReservesCount() external view returns (uint256); /** * @notice Returns the address of the underlying asset of a reserve by the reserve id as stored in the DataTypes.ReserveData struct * @param id The id of the reserve as stored in the DataTypes.ReserveData struct * @return The address of the reserve associated with id */ function getReserveAddressById(uint16 id) external view returns (address); /** * @notice Returns the PoolAddressesProvider connected to this contract * @return The address of the PoolAddressesProvider */ function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); /** * @notice Updates the protocol fee on the bridging * @param bridgeProtocolFee The part of the premium sent to the protocol treasury */ function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external; /** * @notice Updates flash loan premiums. Flash loan premium consists of two parts: * - A part is sent to aToken holders as extra, one time accumulated interest * - A part is collected by the protocol treasury * @dev The total premium is calculated on the total borrowed amount * @dev The premium to protocol is calculated on the total premium, being a percentage of `flashLoanPremiumTotal` * @dev Only callable by the PoolConfigurator contract * @param flashLoanPremiumTotal The total premium, expressed in bps * @param flashLoanPremiumToProtocol The part of the premium sent to the protocol treasury, expressed in bps */ function updateFlashloanPremiums( uint128 flashLoanPremiumTotal, uint128 flashLoanPremiumToProtocol ) external; /** * @notice Configures a new category for the eMode. * @dev In eMode, the protocol allows very high borrowing power to borrow assets of the same category. * The category 0 is reserved as it's the default for volatile assets * @param id The id of the category * @param config The configuration of the category */ function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external; /** * @notice Returns the data of an eMode category * @param id The id of the category * @return The configuration data of the category */ function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory); /** * @notice Allows a user to use the protocol in eMode * @param categoryId The id of the category */ function setUserEMode(uint8 categoryId) external; /** * @notice Returns the eMode the user is using * @param user The address of the user * @return The eMode id */ function getUserEMode(address user) external view returns (uint256); /** * @notice Resets the isolation mode total debt of the given asset to zero * @dev It requires the given asset has zero debt ceiling * @param asset The address of the underlying asset to reset the isolationModeTotalDebt */ function resetIsolationModeTotalDebt(address asset) external; /** * @notice Returns the percentage of available liquidity that can be borrowed at once at stable rate * @return The percentage of available liquidity to borrow, expressed in bps */ function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256); /** * @notice Returns the total fee on flash loans * @return The total fee on flashloans */ function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); /** * @notice Returns the part of the bridge fees sent to protocol * @return The bridge fee sent to the protocol treasury */ function BRIDGE_PROTOCOL_FEE() external view returns (uint256); /** * @notice Returns the part of the flashloan fees sent to protocol * @return The flashloan fee sent to the protocol treasury */ function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128); /** * @notice Returns the maximum number of reserves supported to be listed in this Pool * @return The maximum number of reserves supported */ function MAX_NUMBER_RESERVES() external view returns (uint16); /** * @notice Mints the assets accrued through the reserve factor to the treasury in the form of aTokens * @param assets The list of reserves for which the minting needs to be executed */ function mintToTreasury(address[] calldata assets) external; /** * @notice Rescue and transfer tokens locked in this contract * @param token The address of the token * @param to The address of the recipient * @param amount The amount of token to transfer */ function rescueTokens(address token, address to, uint256 amount) external; /** * @notice Supplies an `amount` of underlying asset into the reserve, receiving in return overlying aTokens. * - E.g. User supplies 100 USDC and gets in return 100 aUSDC * @dev Deprecated: Use the `supply` function instead * @param asset The address of the underlying asset to supply * @param amount The amount to be supplied * @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; }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.0; import {ConfiguratorInputTypes} from '../protocol/libraries/types/ConfiguratorInputTypes.sol'; /** * @title IPoolConfigurator * @author Aave * @notice Defines the basic interface for a Pool configurator. */ interface IPoolConfigurator { /** * @dev Emitted when a reserve is initialized. * @param asset The address of the underlying asset of the reserve * @param aToken The address of the associated aToken contract * @param stableDebtToken The address of the associated stable rate debt token * @param variableDebtToken The address of the associated variable rate debt token * @param interestRateStrategyAddress The address of the interest rate strategy for the reserve */ event ReserveInitialized( address indexed asset, address indexed aToken, address stableDebtToken, address variableDebtToken, address interestRateStrategyAddress ); /** * @dev Emitted when borrowing is enabled or disabled on a reserve. * @param asset The address of the underlying asset of the reserve * @param enabled True if borrowing is enabled, false otherwise */ event ReserveBorrowing(address indexed asset, bool enabled); /** * @dev Emitted when flashloans are enabled or disabled on a reserve. * @param asset The address of the underlying asset of the reserve * @param enabled True if flashloans are enabled, false otherwise */ event ReserveFlashLoaning(address indexed asset, bool enabled); /** * @dev Emitted when the collateralization risk parameters for the specified asset are updated. * @param asset The address of the underlying asset of the reserve * @param ltv The loan to value of the asset when used as collateral * @param liquidationThreshold The threshold at which loans using this asset as collateral will be considered undercollateralized * @param liquidationBonus The bonus liquidators receive to liquidate this asset */ event CollateralConfigurationChanged( address indexed asset, uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus ); /** * @dev Emitted when stable rate borrowing is enabled or disabled on a reserve * @param asset The address of the underlying asset of the reserve * @param enabled True if stable rate borrowing is enabled, false otherwise */ event ReserveStableRateBorrowing(address indexed asset, bool enabled); /** * @dev Emitted when a reserve is activated or deactivated * @param asset The address of the underlying asset of the reserve * @param active True if reserve is active, false otherwise */ event ReserveActive(address indexed asset, bool active); /** * @dev Emitted when a reserve is frozen or unfrozen * @param asset The address of the underlying asset of the reserve * @param frozen True if reserve is frozen, false otherwise */ event ReserveFrozen(address indexed asset, bool frozen); /** * @dev Emitted when a reserve is paused or unpaused * @param asset The address of the underlying asset of the reserve * @param paused True if reserve is paused, false otherwise */ event ReservePaused(address indexed asset, bool paused); /** * @dev Emitted when a reserve is dropped. * @param asset The address of the underlying asset of the reserve */ event ReserveDropped(address indexed asset); /** * @dev Emitted when a reserve factor is updated. * @param asset The address of the underlying asset of the reserve * @param oldReserveFactor The old reserve factor, expressed in bps * @param newReserveFactor The new reserve factor, expressed in bps */ event ReserveFactorChanged( address indexed asset, uint256 oldReserveFactor, uint256 newReserveFactor ); /** * @dev Emitted when the borrow cap of a reserve is updated. * @param asset The address of the underlying asset of the reserve * @param oldBorrowCap The old borrow cap * @param newBorrowCap The new borrow cap */ event BorrowCapChanged(address indexed asset, uint256 oldBorrowCap, uint256 newBorrowCap); /** * @dev Emitted when the supply cap of a reserve is updated. * @param asset The address of the underlying asset of the reserve * @param oldSupplyCap The old supply cap * @param newSupplyCap The new supply cap */ event SupplyCapChanged(address indexed asset, uint256 oldSupplyCap, uint256 newSupplyCap); /** * @dev Emitted when the liquidation protocol fee of a reserve is updated. * @param asset The address of the underlying asset of the reserve * @param oldFee The old liquidation protocol fee, expressed in bps * @param newFee The new liquidation protocol fee, expressed in bps */ event LiquidationProtocolFeeChanged(address indexed asset, uint256 oldFee, uint256 newFee); /** * @dev Emitted when the unbacked mint cap of a reserve is updated. * @param asset The address of the underlying asset of the reserve * @param oldUnbackedMintCap The old unbacked mint cap * @param newUnbackedMintCap The new unbacked mint cap */ event UnbackedMintCapChanged( address indexed asset, uint256 oldUnbackedMintCap, uint256 newUnbackedMintCap ); /** * @dev Emitted when the category of an asset in eMode is changed. * @param asset The address of the underlying asset of the reserve * @param oldCategoryId The old eMode asset category * @param newCategoryId The new eMode asset category */ event EModeAssetCategoryChanged(address indexed asset, uint8 oldCategoryId, uint8 newCategoryId); /** * @dev Emitted when a new eMode category is added. * @param categoryId The new eMode category id * @param ltv The ltv for the asset category in eMode * @param liquidationThreshold The liquidationThreshold for the asset category in eMode * @param liquidationBonus The liquidationBonus for the asset category in eMode * @param oracle The optional address of the price oracle specific for this category * @param label A human readable identifier for the category */ event EModeCategoryAdded( uint8 indexed categoryId, uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus, address oracle, string label ); /** * @dev Emitted when a reserve interest strategy contract is updated. * @param asset The address of the underlying asset of the reserve * @param oldStrategy The address of the old interest strategy contract * @param newStrategy The address of the new interest strategy contract */ event ReserveInterestRateStrategyChanged( address indexed asset, address oldStrategy, address newStrategy ); /** * @dev Emitted when an aToken implementation is upgraded. * @param asset The address of the underlying asset of the reserve * @param proxy The aToken proxy address * @param implementation The new aToken implementation */ event ATokenUpgraded( address indexed asset, address indexed proxy, address indexed implementation ); /** * @dev Emitted when the implementation of a stable debt token is upgraded. * @param asset The address of the underlying asset of the reserve * @param proxy The stable debt token proxy address * @param implementation The new aToken implementation */ event StableDebtTokenUpgraded( address indexed asset, address indexed proxy, address indexed implementation ); /** * @dev Emitted when the implementation of a variable debt token is upgraded. * @param asset The address of the underlying asset of the reserve * @param proxy The variable debt token proxy address * @param implementation The new aToken implementation */ event VariableDebtTokenUpgraded( address indexed asset, address indexed proxy, address indexed implementation ); /** * @dev Emitted when the debt ceiling of an asset is set. * @param asset The address of the underlying asset of the reserve * @param oldDebtCeiling The old debt ceiling * @param newDebtCeiling The new debt ceiling */ event DebtCeilingChanged(address indexed asset, uint256 oldDebtCeiling, uint256 newDebtCeiling); /** * @dev Emitted when the the siloed borrowing state for an asset is changed. * @param asset The address of the underlying asset of the reserve * @param oldState The old siloed borrowing state * @param newState The new siloed borrowing state */ event SiloedBorrowingChanged(address indexed asset, bool oldState, bool newState); /** * @dev Emitted when the bridge protocol fee is updated. * @param oldBridgeProtocolFee The old protocol fee, expressed in bps * @param newBridgeProtocolFee The new protocol fee, expressed in bps */ event BridgeProtocolFeeUpdated(uint256 oldBridgeProtocolFee, uint256 newBridgeProtocolFee); /** * @dev Emitted when the total premium on flashloans is updated. * @param oldFlashloanPremiumTotal The old premium, expressed in bps * @param newFlashloanPremiumTotal The new premium, expressed in bps */ event FlashloanPremiumTotalUpdated( uint128 oldFlashloanPremiumTotal, uint128 newFlashloanPremiumTotal ); /** * @dev Emitted when the part of the premium that goes to protocol is updated. * @param oldFlashloanPremiumToProtocol The old premium, expressed in bps * @param newFlashloanPremiumToProtocol The new premium, expressed in bps */ event FlashloanPremiumToProtocolUpdated( uint128 oldFlashloanPremiumToProtocol, uint128 newFlashloanPremiumToProtocol ); /** * @dev Emitted when the reserve is set as borrowable/non borrowable in isolation mode. * @param asset The address of the underlying asset of the reserve * @param borrowable True if the reserve is borrowable in isolation, false otherwise */ event BorrowableInIsolationChanged(address asset, bool borrowable); /** * @notice Initializes multiple reserves. * @param input The array of initialization parameters */ function initReserves(ConfiguratorInputTypes.InitReserveInput[] calldata input) external; /** * @dev Updates the aToken implementation for the reserve. * @param input The aToken update parameters */ function updateAToken(ConfiguratorInputTypes.UpdateATokenInput calldata input) external; /** * @notice Updates the stable debt token implementation for the reserve. * @param input The stableDebtToken update parameters */ function updateStableDebtToken( ConfiguratorInputTypes.UpdateDebtTokenInput calldata input ) external; /** * @notice Updates the variable debt token implementation for the asset. * @param input The variableDebtToken update parameters */ function updateVariableDebtToken( ConfiguratorInputTypes.UpdateDebtTokenInput calldata input ) external; /** * @notice Configures borrowing on a reserve. * @dev Can only be disabled (set to false) if stable borrowing is disabled * @param asset The address of the underlying asset of the reserve * @param enabled True if borrowing needs to be enabled, false otherwise */ function setReserveBorrowing(address asset, bool enabled) external; /** * @notice Configures the reserve collateralization parameters. * @dev All the values are expressed in bps. A value of 10000, results in 100.00% * @dev The `liquidationBonus` is always above 100%. A value of 105% means the liquidator will receive a 5% bonus * @param asset The address of the underlying asset of the reserve * @param ltv The loan to value of the asset when used as collateral * @param liquidationThreshold The threshold at which loans using this asset as collateral will be considered undercollateralized * @param liquidationBonus The bonus liquidators receive to liquidate this asset */ function configureReserveAsCollateral( address asset, uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus ) external; /** * @notice Enable or disable stable rate borrowing on a reserve. * @dev Can only be enabled (set to true) if borrowing is enabled * @param asset The address of the underlying asset of the reserve * @param enabled True if stable rate borrowing needs to be enabled, false otherwise */ function setReserveStableRateBorrowing(address asset, bool enabled) external; /** * @notice Enable or disable flashloans on a reserve * @param asset The address of the underlying asset of the reserve * @param enabled True if flashloans need to be enabled, false otherwise */ function setReserveFlashLoaning(address asset, bool enabled) external; /** * @notice Activate or deactivate a reserve * @param asset The address of the underlying asset of the reserve * @param active True if the reserve needs to be active, false otherwise */ function setReserveActive(address asset, bool active) external; /** * @notice Freeze or unfreeze a reserve. A frozen reserve doesn't allow any new supply, borrow * or rate swap but allows repayments, liquidations, rate rebalances and withdrawals. * @param asset The address of the underlying asset of the reserve * @param freeze True if the reserve needs to be frozen, false otherwise */ function setReserveFreeze(address asset, bool freeze) external; /** * @notice Sets the borrowable in isolation flag for the reserve. * @dev When this flag is set to true, the asset will be borrowable against isolated collaterals and the * borrowed amount will be accumulated in the isolated collateral's total debt exposure * @dev Only assets of the same family (e.g. USD stablecoins) should be borrowable in isolation mode to keep * consistency in the debt ceiling calculations * @param asset The address of the underlying asset of the reserve * @param borrowable True if the asset should be borrowable in isolation, false otherwise */ function setBorrowableInIsolation(address asset, bool borrowable) external; /** * @notice Pauses a reserve. A paused reserve does not allow any interaction (supply, borrow, repay, * swap interest rate, liquidate, atoken transfers). * @param asset The address of the underlying asset of the reserve * @param paused True if pausing the reserve, false if unpausing */ function setReservePause(address asset, bool paused) external; /** * @notice Updates the reserve factor of a reserve. * @param asset The address of the underlying asset of the reserve * @param newReserveFactor The new reserve factor of the reserve */ function setReserveFactor(address asset, uint256 newReserveFactor) external; /** * @notice Sets the interest rate strategy of a reserve. * @param asset The address of the underlying asset of the reserve * @param newRateStrategyAddress The address of the new interest strategy contract */ function setReserveInterestRateStrategyAddress( address asset, address newRateStrategyAddress ) external; /** * @notice Pauses or unpauses all the protocol reserves. In the paused state all the protocol interactions * are suspended. * @param paused True if protocol needs to be paused, false otherwise */ function setPoolPause(bool paused) external; /** * @notice Updates the borrow cap of a reserve. * @param asset The address of the underlying asset of the reserve * @param newBorrowCap The new borrow cap of the reserve */ function setBorrowCap(address asset, uint256 newBorrowCap) external; /** * @notice Updates the supply cap of a reserve. * @param asset The address of the underlying asset of the reserve * @param newSupplyCap The new supply cap of the reserve */ function setSupplyCap(address asset, uint256 newSupplyCap) external; /** * @notice Updates the liquidation protocol fee of reserve. * @param asset The address of the underlying asset of the reserve * @param newFee The new liquidation protocol fee of the reserve, expressed in bps */ function setLiquidationProtocolFee(address asset, uint256 newFee) external; /** * @notice Updates the unbacked mint cap of reserve. * @param asset The address of the underlying asset of the reserve * @param newUnbackedMintCap The new unbacked mint cap of the reserve */ function setUnbackedMintCap(address asset, uint256 newUnbackedMintCap) external; /** * @notice Assign an efficiency mode (eMode) category to asset. * @param asset The address of the underlying asset of the reserve * @param newCategoryId The new category id of the asset */ function setAssetEModeCategory(address asset, uint8 newCategoryId) external; /** * @notice Adds a new efficiency mode (eMode) category. * @dev If zero is provided as oracle address, the default asset oracles will be used to compute the overall debt and * overcollateralization of the users using this category. * @dev The new ltv and liquidation threshold must be greater than the base * ltvs and liquidation thresholds of all assets within the eMode category * @param categoryId The id of the category to be configured * @param ltv The ltv associated with the category * @param liquidationThreshold The liquidation threshold associated with the category * @param liquidationBonus The liquidation bonus associated with the category * @param oracle The oracle associated with the category * @param label A label identifying the category */ function setEModeCategory( uint8 categoryId, uint16 ltv, uint16 liquidationThreshold, uint16 liquidationBonus, address oracle, string calldata label ) external; /** * @notice Drops a reserve entirely. * @param asset The address of the reserve to drop */ function dropReserve(address asset) external; /** * @notice Updates the bridge fee collected by the protocol reserves. * @param newBridgeProtocolFee The part of the fee sent to the protocol treasury, expressed in bps */ function updateBridgeProtocolFee(uint256 newBridgeProtocolFee) external; /** * @notice Updates the total flash loan premium. * Total flash loan premium consists of two parts: * - A part is sent to aToken holders as extra balance * - A part is collected by the protocol reserves * @dev Expressed in bps * @dev The premium is calculated on the total amount borrowed * @param newFlashloanPremiumTotal The total flashloan premium */ function updateFlashloanPremiumTotal(uint128 newFlashloanPremiumTotal) external; /** * @notice Updates the flash loan premium collected by protocol reserves * @dev Expressed in bps * @dev The premium to protocol is calculated on the total flashloan premium * @param newFlashloanPremiumToProtocol The part of the flashloan premium sent to the protocol treasury */ function updateFlashloanPremiumToProtocol(uint128 newFlashloanPremiumToProtocol) external; /** * @notice Sets the debt ceiling for an asset. * @param newDebtCeiling The new debt ceiling */ function setDebtCeiling(address asset, uint256 newDebtCeiling) external; /** * @notice Sets siloed borrowing for an asset * @param siloed The new siloed borrowing state */ function setSiloedBorrowing(address asset, bool siloed) external; }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.0; import {IPriceOracleGetter} from './IPriceOracleGetter.sol'; import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; /** * @title IAaveOracle * @author Aave * @notice Defines the basic interface for the Aave Oracle */ interface IAaveOracle is IPriceOracleGetter { /** * @dev Emitted after the base currency is set * @param baseCurrency The base currency of used for price quotes * @param baseCurrencyUnit The unit of the base currency */ event BaseCurrencySet(address indexed baseCurrency, uint256 baseCurrencyUnit); /** * @dev Emitted after the price source of an asset is updated * @param asset The address of the asset * @param source The price source of the asset */ event AssetSourceUpdated(address indexed asset, address indexed source); /** * @dev Emitted after the address of fallback oracle is updated * @param fallbackOracle The address of the fallback oracle */ event FallbackOracleUpdated(address indexed fallbackOracle); /** * @notice Returns the PoolAddressesProvider * @return The address of the PoolAddressesProvider contract */ function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); /** * @notice Sets or replaces price sources of assets * @param assets The addresses of the assets * @param sources The addresses of the price sources */ function setAssetSources(address[] calldata assets, address[] calldata sources) external; /** * @notice Sets the fallback oracle * @param fallbackOracle The address of the fallback oracle */ function setFallbackOracle(address fallbackOracle) external; /** * @notice Returns a list of prices from a list of assets addresses * @param assets The list of assets addresses * @return The prices of the given assets */ function getAssetsPrices(address[] calldata assets) external view returns (uint256[] memory); /** * @notice Returns the address of the source for an asset address * @param asset The address of the asset * @return The address of the source */ function getSourceOfAsset(address asset) external view returns (address); /** * @notice Returns the address of the fallback oracle * @return The address of the fallback oracle */ function getFallbackOracle() external view returns (address); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.0; /** * @title IPoolAddressesProvider * @author Aave * @notice Defines the basic interface for a Pool Addresses Provider. */ interface IPoolAddressesProvider { /** * @dev Emitted when the market identifier is updated. * @param oldMarketId The old id of the market * @param newMarketId The new id of the market */ event MarketIdSet(string indexed oldMarketId, string indexed newMarketId); /** * @dev Emitted when the pool is updated. * @param oldAddress The old address of the Pool * @param newAddress The new address of the Pool */ event PoolUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the pool configurator is updated. * @param oldAddress The old address of the PoolConfigurator * @param newAddress The new address of the PoolConfigurator */ event PoolConfiguratorUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the price oracle is updated. * @param oldAddress The old address of the PriceOracle * @param newAddress The new address of the PriceOracle */ event PriceOracleUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the ACL manager is updated. * @param oldAddress The old address of the ACLManager * @param newAddress The new address of the ACLManager */ event ACLManagerUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the ACL admin is updated. * @param oldAddress The old address of the ACLAdmin * @param newAddress The new address of the ACLAdmin */ event ACLAdminUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the price oracle sentinel is updated. * @param oldAddress The old address of the PriceOracleSentinel * @param newAddress The new address of the PriceOracleSentinel */ event PriceOracleSentinelUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the pool data provider is updated. * @param oldAddress The old address of the PoolDataProvider * @param newAddress The new address of the PoolDataProvider */ event PoolDataProviderUpdated(address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when a new proxy is created. * @param id The identifier of the proxy * @param proxyAddress The address of the created proxy contract * @param implementationAddress The address of the implementation contract */ event ProxyCreated( bytes32 indexed id, address indexed proxyAddress, address indexed implementationAddress ); /** * @dev Emitted when a new non-proxied contract address is registered. * @param id The identifier of the contract * @param oldAddress The address of the old contract * @param newAddress The address of the new contract */ event AddressSet(bytes32 indexed id, address indexed oldAddress, address indexed newAddress); /** * @dev Emitted when the implementation of the proxy registered with id is updated * @param id The identifier of the contract * @param proxyAddress The address of the proxy contract * @param oldImplementationAddress The address of the old implementation contract * @param newImplementationAddress The address of the new implementation contract */ event AddressSetAsProxy( bytes32 indexed id, address indexed proxyAddress, address oldImplementationAddress, address indexed newImplementationAddress ); /** * @notice Returns the id of the Aave market to which this contract points to. * @return The market id */ function getMarketId() external view returns (string memory); /** * @notice Associates an id with a specific PoolAddressesProvider. * @dev This can be used to create an onchain registry of PoolAddressesProviders to * identify and validate multiple Aave markets. * @param newMarketId The market id */ function setMarketId(string calldata newMarketId) external; /** * @notice Returns an address by its identifier. * @dev The returned address might be an EOA or a contract, potentially proxied * @dev It returns ZERO if there is no registered address with the given id * @param id The id * @return The address of the registered for the specified id */ function getAddress(bytes32 id) external view returns (address); /** * @notice General function to update the implementation of a proxy registered with * certain `id`. If there is no proxy registered, it will instantiate one and * set as implementation the `newImplementationAddress`. * @dev IMPORTANT Use this function carefully, only for ids that don't have an explicit * setter function, in order to avoid unexpected consequences * @param id The id * @param newImplementationAddress The address of the new implementation */ function setAddressAsProxy(bytes32 id, address newImplementationAddress) external; /** * @notice Sets an address for an id replacing the address saved in the addresses map. * @dev IMPORTANT Use this function carefully, as it will do a hard replacement * @param id The id * @param newAddress The address to set */ function setAddress(bytes32 id, address newAddress) external; /** * @notice Returns the address of the Pool proxy. * @return The Pool proxy address */ function getPool() external view returns (address); /** * @notice Updates the implementation of the Pool, or creates a proxy * setting the new `pool` implementation when the function is called for the first time. * @param newPoolImpl The new Pool implementation */ function setPoolImpl(address newPoolImpl) external; /** * @notice Returns the address of the PoolConfigurator proxy. * @return The PoolConfigurator proxy address */ function getPoolConfigurator() external view returns (address); /** * @notice Updates the implementation of the PoolConfigurator, or creates a proxy * setting the new `PoolConfigurator` implementation when the function is called for the first time. * @param newPoolConfiguratorImpl The new PoolConfigurator implementation */ function setPoolConfiguratorImpl(address newPoolConfiguratorImpl) external; /** * @notice Returns the address of the price oracle. * @return The address of the PriceOracle */ function getPriceOracle() external view returns (address); /** * @notice Updates the address of the price oracle. * @param newPriceOracle The address of the new PriceOracle */ function setPriceOracle(address newPriceOracle) external; /** * @notice Returns the address of the ACL manager. * @return The address of the ACLManager */ function getACLManager() external view returns (address); /** * @notice Updates the address of the ACL manager. * @param newAclManager The address of the new ACLManager */ function setACLManager(address newAclManager) external; /** * @notice Returns the address of the ACL admin. * @return The address of the ACL admin */ function getACLAdmin() external view returns (address); /** * @notice Updates the address of the ACL admin. * @param newAclAdmin The address of the new ACL admin */ function setACLAdmin(address newAclAdmin) external; /** * @notice Returns the address of the price oracle sentinel. * @return The address of the PriceOracleSentinel */ function getPriceOracleSentinel() external view returns (address); /** * @notice Updates the address of the price oracle sentinel. * @param newPriceOracleSentinel The address of the new PriceOracleSentinel */ function setPriceOracleSentinel(address newPriceOracleSentinel) external; /** * @notice Returns the address of the data provider. * @return The address of the DataProvider */ function getPoolDataProvider() external view returns (address); /** * @notice Updates the address of the data provider. * @param newDataProvider The address of the new DataProvider */ function setPoolDataProvider(address newDataProvider) external; }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.0; import {IReserveInterestRateStrategy} from './IReserveInterestRateStrategy.sol'; import {IPoolAddressesProvider} from './IPoolAddressesProvider.sol'; /** * @title IDefaultInterestRateStrategy * @author Aave * @notice Defines the basic interface of the DefaultReserveInterestRateStrategy */ interface IDefaultInterestRateStrategy is IReserveInterestRateStrategy { /** * @notice Returns the usage ratio at which the pool aims to obtain most competitive borrow rates. * @return The optimal usage ratio, expressed in ray. */ function OPTIMAL_USAGE_RATIO() external view returns (uint256); /** * @notice Returns the optimal stable to total debt ratio of the reserve. * @return The optimal stable to total debt ratio, expressed in ray. */ function OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO() external view returns (uint256); /** * @notice Returns the excess usage ratio above the optimal. * @dev It's always equal to 1-optimal usage ratio (added as constant for gas optimizations) * @return The max excess usage ratio, expressed in ray. */ function MAX_EXCESS_USAGE_RATIO() external view returns (uint256); /** * @notice Returns the excess stable debt ratio above the optimal. * @dev It's always equal to 1-optimal stable to total debt ratio (added as constant for gas optimizations) * @return The max excess stable to total debt ratio, expressed in ray. */ function MAX_EXCESS_STABLE_TO_TOTAL_DEBT_RATIO() external view returns (uint256); /** * @notice Returns the address of the PoolAddressesProvider * @return The address of the PoolAddressesProvider contract */ function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider); /** * @notice Returns the variable rate slope below optimal usage ratio * @dev It's the variable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO * @return The variable rate slope, expressed in ray */ function getVariableRateSlope1() external view returns (uint256); /** * @notice Returns the variable rate slope above optimal usage ratio * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO * @return The variable rate slope, expressed in ray */ function getVariableRateSlope2() external view returns (uint256); /** * @notice Returns the stable rate slope below optimal usage ratio * @dev It's the stable rate when usage ratio > 0 and <= OPTIMAL_USAGE_RATIO * @return The stable rate slope, expressed in ray */ function getStableRateSlope1() external view returns (uint256); /** * @notice Returns the stable rate slope above optimal usage ratio * @dev It's the variable rate when usage ratio > OPTIMAL_USAGE_RATIO * @return The stable rate slope, expressed in ray */ function getStableRateSlope2() external view returns (uint256); /** * @notice Returns the stable rate excess offset * @dev It's an additional premium applied to the stable when stable debt > OPTIMAL_STABLE_TO_TOTAL_DEBT_RATIO * @return The stable rate excess offset, expressed in ray */ function getStableRateExcessOffset() external view returns (uint256); /** * @notice Returns the base stable borrow rate * @return The base stable borrow rate, expressed in ray */ function getBaseStableBorrowRate() external view returns (uint256); /** * @notice Returns the base variable borrow rate * @return The base variable borrow rate, expressed in ray */ function getBaseVariableBorrowRate() external view returns (uint256); /** * @notice Returns the maximum variable borrow rate * @return The maximum variable borrow rate, expressed in ray */ function getMaxVariableBorrowRate() external view returns (uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; library DataTypes { struct ReserveData { //stores the reserve configuration ReserveConfigurationMap configuration; //the liquidity index. Expressed in ray uint128 liquidityIndex; //the current supply rate. Expressed in ray uint128 currentLiquidityRate; //variable borrow index. Expressed in ray uint128 variableBorrowIndex; //the current variable borrow rate. Expressed in ray uint128 currentVariableBorrowRate; //the current stable borrow rate. Expressed in ray uint128 currentStableBorrowRate; //timestamp of last update uint40 lastUpdateTimestamp; //the id of the reserve. Represents the position in the list of the active reserves uint16 id; //aToken address address aTokenAddress; //stableDebtToken address address stableDebtTokenAddress; //variableDebtToken address address variableDebtTokenAddress; //address of the interest rate strategy address interestRateStrategyAddress; //the current treasury balance, scaled uint128 accruedToTreasury; //the outstanding unbacked aTokens minted through the bridging feature uint128 unbacked; //the outstanding debt borrowed against this asset in isolation mode uint128 isolationModeTotalDebt; } 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: asset is paused //bit 61: borrowing in isolation mode is enabled //bit 62: siloed borrowing enabled //bit 63: flashloaning enabled //bit 64-79: reserve factor //bit 80-115 borrow cap in whole tokens, borrowCap == 0 => no cap //bit 116-151 supply cap in whole tokens, supplyCap == 0 => no cap //bit 152-167 liquidation protocol fee //bit 168-175 eMode category //bit 176-211 unbacked mint cap in whole tokens, unbackedMintCap == 0 => minting disabled //bit 212-251 debt ceiling for isolation mode with (ReserveConfiguration::DEBT_CEILING_DECIMALS) decimals //bit 252-255 unused uint256 data; } struct UserConfigurationMap { /** * @dev Bitmap of the users collaterals and borrows. It is divided in pairs of bits, one pair per asset. * The first bit indicates if an asset is used as collateral by the user, the second whether an * asset is borrowed by the user. */ uint256 data; } struct EModeCategory { // each eMode category has a custom ltv and liquidation threshold uint16 ltv; uint16 liquidationThreshold; uint16 liquidationBonus; // each eMode category may or may not have a custom oracle to override the individual assets price oracles address priceSource; string label; } enum InterestRateMode {NONE, STABLE, VARIABLE} struct ReserveCache { uint256 currScaledVariableDebt; uint256 nextScaledVariableDebt; uint256 currPrincipalStableDebt; uint256 currAvgStableBorrowRate; uint256 currTotalStableDebt; uint256 nextAvgStableBorrowRate; uint256 nextTotalStableDebt; uint256 currLiquidityIndex; uint256 nextLiquidityIndex; uint256 currVariableBorrowIndex; uint256 nextVariableBorrowIndex; uint256 currLiquidityRate; uint256 currVariableBorrowRate; uint256 reserveFactor; ReserveConfigurationMap reserveConfiguration; address aTokenAddress; address stableDebtTokenAddress; address variableDebtTokenAddress; uint40 reserveLastUpdateTimestamp; uint40 stableDebtLastUpdateTimestamp; } struct ExecuteLiquidationCallParams { uint256 reservesCount; uint256 debtToCover; address collateralAsset; address debtAsset; address user; bool receiveAToken; address priceOracle; uint8 userEModeCategory; address priceOracleSentinel; } struct ExecuteSupplyParams { address asset; uint256 amount; address onBehalfOf; uint16 referralCode; } struct ExecuteBorrowParams { address asset; address user; address onBehalfOf; uint256 amount; InterestRateMode interestRateMode; uint16 referralCode; bool releaseUnderlying; uint256 maxStableRateBorrowSizePercent; uint256 reservesCount; address oracle; uint8 userEModeCategory; address priceOracleSentinel; } struct ExecuteRepayParams { address asset; uint256 amount; InterestRateMode interestRateMode; address onBehalfOf; bool useATokens; } struct ExecuteWithdrawParams { address asset; uint256 amount; address to; uint256 reservesCount; address oracle; uint8 userEModeCategory; } struct ExecuteSetUserEModeParams { uint256 reservesCount; address oracle; uint8 categoryId; } struct FinalizeTransferParams { address asset; address from; address to; uint256 amount; uint256 balanceFromBefore; uint256 balanceToBefore; uint256 reservesCount; address oracle; uint8 fromEModeCategory; } struct FlashloanParams { address receiverAddress; address[] assets; uint256[] amounts; uint256[] interestRateModes; address onBehalfOf; bytes params; uint16 referralCode; uint256 flashLoanPremiumToProtocol; uint256 flashLoanPremiumTotal; uint256 maxStableRateBorrowSizePercent; uint256 reservesCount; address addressesProvider; address pool; uint8 userEModeCategory; bool isAuthorizedFlashBorrower; } struct FlashloanSimpleParams { address receiverAddress; address asset; uint256 amount; bytes params; uint16 referralCode; uint256 flashLoanPremiumToProtocol; uint256 flashLoanPremiumTotal; } struct FlashLoanRepaymentParams { uint256 amount; uint256 totalPremium; uint256 flashLoanPremiumToProtocol; address asset; address receiverAddress; uint16 referralCode; } struct CalculateUserAccountDataParams { UserConfigurationMap userConfig; uint256 reservesCount; address user; address oracle; uint8 userEModeCategory; } struct ValidateBorrowParams { ReserveCache reserveCache; UserConfigurationMap userConfig; address asset; address userAddress; uint256 amount; InterestRateMode interestRateMode; uint256 maxStableLoanPercent; uint256 reservesCount; address oracle; uint8 userEModeCategory; address priceOracleSentinel; bool isolationModeActive; address isolationModeCollateralAddress; uint256 isolationModeDebtCeiling; } struct ValidateLiquidationCallParams { ReserveCache debtReserveCache; uint256 totalDebt; uint256 healthFactor; address priceOracleSentinel; } struct CalculateInterestRatesParams { uint256 unbacked; uint256 liquidityAdded; uint256 liquidityTaken; uint256 totalStableDebt; uint256 totalVariableDebt; uint256 averageStableBorrowRate; uint256 reserveFactor; address reserve; address aToken; } struct InitReserveParams { address asset; address aTokenAddress; address stableDebtAddress; address variableDebtAddress; address interestRateStrategyAddress; uint16 reservesCount; uint16 maxNumberReserves; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; library ConfiguratorInputTypes { struct InitReserveInput { address aTokenImpl; address stableDebtTokenImpl; address variableDebtTokenImpl; uint8 underlyingAssetDecimals; address interestRateStrategyAddress; address underlyingAsset; address treasury; address incentivesController; string aTokenName; string aTokenSymbol; string variableDebtTokenName; string variableDebtTokenSymbol; string stableDebtTokenName; string stableDebtTokenSymbol; bytes params; } struct UpdateATokenInput { address asset; address treasury; address incentivesController; string name; string symbol; address implementation; bytes params; } struct UpdateDebtTokenInput { address asset; address incentivesController; string name; string symbol; address implementation; bytes params; } }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.0; /** * @title IPriceOracleGetter * @author Aave * @notice Interface for the Aave price oracle. */ interface IPriceOracleGetter { /** * @notice Returns the base currency address * @dev Address 0x0 is reserved for USD as base currency. * @return Returns the base currency address. */ function BASE_CURRENCY() external view returns (address); /** * @notice Returns the base currency unit * @dev 1 ether for ETH, 1e8 for USD. * @return Returns the base currency unit. */ function BASE_CURRENCY_UNIT() external view returns (uint256); /** * @notice Returns the asset price in the base currency * @param asset The address of the asset * @return The price of the asset */ function getAssetPrice(address asset) external view returns (uint256); }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity ^0.8.0; import {DataTypes} from '../protocol/libraries/types/DataTypes.sol'; /** * @title IReserveInterestRateStrategy * @author Aave * @notice Interface for the calculation of the interest rates */ interface IReserveInterestRateStrategy { /** * @notice Calculates the interest rates depending on the reserve's state and configurations * @param params The parameters needed to calculate interest rates * @return liquidityRate The liquidity rate expressed in rays * @return stableBorrowRate The stable borrow rate expressed in rays * @return variableBorrowRate The variable borrow rate expressed in rays */ function calculateInterestRates( DataTypes.CalculateInterestRatesParams memory params ) external view returns (uint256, uint256, uint256); }
{ "remappings": [ "@openzeppelin/contracts/=lib/metamorpho/lib/openzeppelin-contracts/contracts/", "aave-v3-core/=lib/sparklend-kill-switch/lib/aave-v3-core/", "aave-v3-periphery/=lib/aave-v3-periphery/contracts/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc20-helpers/=lib/erc20-helpers/src/", "erc4626-tests/=lib/metamorpho/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "metamorpho/=lib/metamorpho/src/", "morpho-blue/=lib/metamorpho/lib/morpho-blue/", "murky/=lib/metamorpho/lib/universal-rewards-distributor/lib/murky/src/", "openzeppelin-contracts/=lib/metamorpho/lib/openzeppelin-contracts/", "openzeppelin/=lib/metamorpho/lib/universal-rewards-distributor/lib/openzeppelin-contracts/contracts/", "spark-address-registry/=lib/spark-address-registry/", "spark-gov-relay/=lib/spark-gov-relay/src/", "sparklend-cap-automator/=lib/sparklend-cap-automator/src/", "sparklend-freezer/=lib/sparklend-freezer/src/", "sparklend-kill-switch/=lib/sparklend-kill-switch/src/", "sparklend-v1-core/=lib/sparklend-v1-core/", "universal-rewards-distributor/=lib/metamorpho/lib/universal-rewards-distributor/src/", "xchain-helpers/=lib/xchain-helpers/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"LISTING_ENGINE","outputs":[{"internalType":"contract IAaveV3ConfigEngine","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowsUpdates","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"enabledToBorrow","type":"uint256"},{"internalType":"uint256","name":"flashloanable","type":"uint256"},{"internalType":"uint256","name":"stableRateModeEnabled","type":"uint256"},{"internalType":"uint256","name":"borrowableInIsolation","type":"uint256"},{"internalType":"uint256","name":"withSiloedBorrowing","type":"uint256"},{"internalType":"uint256","name":"reserveFactor","type":"uint256"}],"internalType":"struct IAaveV3ConfigEngine.BorrowUpdate[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capsUpdates","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"}],"internalType":"struct IAaveV3ConfigEngine.CapsUpdate[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralsUpdates","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"ltv","type":"uint256"},{"internalType":"uint256","name":"liqThreshold","type":"uint256"},{"internalType":"uint256","name":"liqBonus","type":"uint256"},{"internalType":"uint256","name":"debtCeiling","type":"uint256"},{"internalType":"uint256","name":"liqProtocolFee","type":"uint256"},{"internalType":"uint256","name":"eModeCategory","type":"uint256"}],"internalType":"struct IAaveV3ConfigEngine.CollateralUpdate[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPoolContext","outputs":[{"components":[{"internalType":"string","name":"networkName","type":"string"},{"internalType":"string","name":"networkAbbreviation","type":"string"}],"internalType":"struct IAaveV3ConfigEngine.PoolContext","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"newListings","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"string","name":"assetSymbol","type":"string"},{"internalType":"address","name":"priceFeed","type":"address"},{"components":[{"internalType":"uint256","name":"optimalUsageRatio","type":"uint256"},{"internalType":"uint256","name":"baseVariableBorrowRate","type":"uint256"},{"internalType":"uint256","name":"variableRateSlope1","type":"uint256"},{"internalType":"uint256","name":"variableRateSlope2","type":"uint256"},{"internalType":"uint256","name":"stableRateSlope1","type":"uint256"},{"internalType":"uint256","name":"stableRateSlope2","type":"uint256"},{"internalType":"uint256","name":"baseStableRateOffset","type":"uint256"},{"internalType":"uint256","name":"stableRateExcessOffset","type":"uint256"},{"internalType":"uint256","name":"optimalStableToTotalDebtRatio","type":"uint256"}],"internalType":"struct IV3RateStrategyFactory.RateStrategyParams","name":"rateStrategyParams","type":"tuple"},{"internalType":"uint256","name":"enabledToBorrow","type":"uint256"},{"internalType":"uint256","name":"stableRateModeEnabled","type":"uint256"},{"internalType":"uint256","name":"borrowableInIsolation","type":"uint256"},{"internalType":"uint256","name":"withSiloedBorrowing","type":"uint256"},{"internalType":"uint256","name":"flashloanable","type":"uint256"},{"internalType":"uint256","name":"ltv","type":"uint256"},{"internalType":"uint256","name":"liqThreshold","type":"uint256"},{"internalType":"uint256","name":"liqBonus","type":"uint256"},{"internalType":"uint256","name":"reserveFactor","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"debtCeiling","type":"uint256"},{"internalType":"uint256","name":"liqProtocolFee","type":"uint256"},{"internalType":"uint8","name":"eModeCategory","type":"uint8"}],"internalType":"struct IAaveV3ConfigEngine.Listing[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newListingsCustom","outputs":[{"components":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"string","name":"assetSymbol","type":"string"},{"internalType":"address","name":"priceFeed","type":"address"},{"components":[{"internalType":"uint256","name":"optimalUsageRatio","type":"uint256"},{"internalType":"uint256","name":"baseVariableBorrowRate","type":"uint256"},{"internalType":"uint256","name":"variableRateSlope1","type":"uint256"},{"internalType":"uint256","name":"variableRateSlope2","type":"uint256"},{"internalType":"uint256","name":"stableRateSlope1","type":"uint256"},{"internalType":"uint256","name":"stableRateSlope2","type":"uint256"},{"internalType":"uint256","name":"baseStableRateOffset","type":"uint256"},{"internalType":"uint256","name":"stableRateExcessOffset","type":"uint256"},{"internalType":"uint256","name":"optimalStableToTotalDebtRatio","type":"uint256"}],"internalType":"struct IV3RateStrategyFactory.RateStrategyParams","name":"rateStrategyParams","type":"tuple"},{"internalType":"uint256","name":"enabledToBorrow","type":"uint256"},{"internalType":"uint256","name":"stableRateModeEnabled","type":"uint256"},{"internalType":"uint256","name":"borrowableInIsolation","type":"uint256"},{"internalType":"uint256","name":"withSiloedBorrowing","type":"uint256"},{"internalType":"uint256","name":"flashloanable","type":"uint256"},{"internalType":"uint256","name":"ltv","type":"uint256"},{"internalType":"uint256","name":"liqThreshold","type":"uint256"},{"internalType":"uint256","name":"liqBonus","type":"uint256"},{"internalType":"uint256","name":"reserveFactor","type":"uint256"},{"internalType":"uint256","name":"supplyCap","type":"uint256"},{"internalType":"uint256","name":"borrowCap","type":"uint256"},{"internalType":"uint256","name":"debtCeiling","type":"uint256"},{"internalType":"uint256","name":"liqProtocolFee","type":"uint256"},{"internalType":"uint8","name":"eModeCategory","type":"uint8"}],"internalType":"struct IAaveV3ConfigEngine.Listing","name":"base","type":"tuple"},{"components":[{"internalType":"address","name":"aToken","type":"address"},{"internalType":"address","name":"vToken","type":"address"},{"internalType":"address","name":"sToken","type":"address"}],"internalType":"struct IAaveV3ConfigEngine.TokenImplementations","name":"implementations","type":"tuple"}],"internalType":"struct IAaveV3ConfigEngine.ListingWithCustomImpl[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeedsUpdates","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"priceFeed","type":"address"}],"internalType":"struct IAaveV3ConfigEngine.PriceFeedUpdate[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateStrategiesUpdates","outputs":[{"components":[{"internalType":"address","name":"asset","type":"address"},{"components":[{"internalType":"uint256","name":"optimalUsageRatio","type":"uint256"},{"internalType":"uint256","name":"baseVariableBorrowRate","type":"uint256"},{"internalType":"uint256","name":"variableRateSlope1","type":"uint256"},{"internalType":"uint256","name":"variableRateSlope2","type":"uint256"},{"internalType":"uint256","name":"stableRateSlope1","type":"uint256"},{"internalType":"uint256","name":"stableRateSlope2","type":"uint256"},{"internalType":"uint256","name":"baseStableRateOffset","type":"uint256"},{"internalType":"uint256","name":"stableRateExcessOffset","type":"uint256"},{"internalType":"uint256","name":"optimalStableToTotalDebtRatio","type":"uint256"}],"internalType":"struct IV3RateStrategyFactory.RateStrategyParams","name":"params","type":"tuple"}],"internalType":"struct IAaveV3ConfigEngine.RateStrategyUpdate[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0604052348015600f57600080fd5b50733254f7cd0565aa67eedc86c2fb608be48d5ccd78608052608051610bbf6100506000396000818160a8015281816101e5015261039c0152610bbf6000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063b1af0d0d11610066578063b1af0d0d1461011e578063c0a255801461012d578063d0c38c271461013c578063fabe34631461014b578063fbb256f61461015a57600080fd5b80630a4aa3fa146100a35780631850edd8146100e75780632b179434146100f6578063614619541461010557806395a93cb11461010f575b600080fd5b6100ca7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b60606040516100de9190610619565b60606040516100de9190610667565b61010d61016f565b005b60606040516100de91906106a9565b60606040516100de919061070b565b60606040516100de9190610971565b60606040516100de9190610984565b60606040516100de9190610a63565b61016261030f565b6040516100de9190610aad565b606080518190819081908190819081901561020d5761020b633cb6502d60e01b61019761030f565b896040516024016101a9929190610ac0565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169061036e565b505b85511561023b576102396314d8093760e21b61022761030f565b886040516024016101a9929190610ae5565b505b825115610262576040516102609063bb06653560e01b906101a9908690602401610619565b505b8351156102895760405161028790636e17618760e11b906101a9908790602401610667565b505b8051156102b0576040516102ae906324f4c44560e01b906101a9908490602401610984565b505b8151156102d7576040516102d59063927c400360e01b906101a990859060240161070b565b505b8451156102fe576040516102fc906355caa16360e01b906101a99088906024016106a9565b505b61030661039a565b50505050505050565b60408051808201909152606080825260208201525060408051608081018252600881830190815267457468657265756d60c01b606083015281528151808301909252600382526208ae8d60eb1b60208381019190915281019190915290565b60606103938383604051806060016040528060278152602001610b63602791396104a7565b9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663587250846040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c9190610b0a565b604051631d2118f960e01b8152736b175474e89094c44da98b954eedeac495271d0f6004820152735ae77ae8ec1b0f9a741c80a4cdb876e6b5b619b960248201526001600160a01b039190911690631d2118f990604401600060405180830381600087803b15801561048d57600080fd5b505af11580156104a1573d6000803e3d6000fd5b50505050565b6060600080856001600160a01b0316856040516104c49190610b33565b600060405180830381855af49150503d80600081146104ff576040519150601f19603f3d011682016040523d82523d6000602084013e610504565b606091505b50915091506105158683838761051f565b9695505050505050565b6060831561059357825160000361058c576001600160a01b0385163b61058c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b508161059d565b61059d83836105a5565b949350505050565b8151156105b55781518083602001fd5b8060405162461bcd60e51b81526004016105839190610b4f565b80516001600160a01b031682526020808201519083015260408082015190830152606080820151908301526080808201519083015260a0818101519083015260c090810151910152565b6020808252825182820181905260009190848201906040850190845b8181101561065b576106488385516105cf565b9284019260e09290920191600101610635565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561065b576106968385516105cf565b9284019260e09290920191600101610683565b602080825282518282018190526000919060409081850190868401855b828110156106fe57815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016106c6565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156106fe57815180516001600160a01b0390811686529087015116868501529284019290850190600101610728565b60005b8381101561077557818101518382015260200161075d565b50506000910152565b6000815180845261079681602086016020860161075a565b601f01601f19169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b80516001600160a01b031682526000610340602083015181602086015261082d8286018261077e565b915050604083015161084a60408601826001600160a01b03169052565b50606083015161085d60608601826107aa565b5060808301516101808581019190915260a08401516101a08087019190915260c08501516101c08088019190915260e08601516101e080890191909152610100870151610200808a0191909152610120880151610220808b01919091526101408901516102408b01526101608901516102608b0152948801516102808a0152928701516102a0890152908601516102c08801528501516102e087015284015161030086015283015160ff8116610320860152509392505050565b60008282518085526020808601955060208260051b8401016020860160005b8481101561096457601f19868403018952610952838351610804565b98840198925090830190600101610936565b5090979650505050505050565b6020815260006103936020830184610917565b6020808252825182820181905260009190848201906040850190845b8181101561065b57835180516001600160a01b031684528501516109c6868501826107aa565b509284019261014092909201916001016109a0565b600082825180855260208086019550808260051b84010181860160005b8481101561096457601f19868403018952815160808151818652610a1e82870182610804565b9287015180516001600160a01b03908116888a01528189015181166040808a0191909152909101511660609096019590955250988401989250908301906001016109f8565b60208152600061039360208301846109db565b6000815160408452610a8b604085018261077e565b905060208301518482036020860152610aa4828261077e565b95945050505050565b6020815260006103936020830184610a76565b604081526000610ad36040830185610a76565b8281036020840152610aa48185610917565b604081526000610af86040830185610a76565b8281036020840152610aa481856109db565b600060208284031215610b1c57600080fd5b81516001600160a01b038116811461039357600080fd5b60008251610b4581846020870161075a565b9190910192915050565b602081526000610393602083018461077e56fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fb3dcdbc8eaf2ce9e682a70b844a7a9d007ea68902cf4277b53bc6982edc748364736f6c63430008190033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c8063b1af0d0d11610066578063b1af0d0d1461011e578063c0a255801461012d578063d0c38c271461013c578063fabe34631461014b578063fbb256f61461015a57600080fd5b80630a4aa3fa146100a35780631850edd8146100e75780632b179434146100f6578063614619541461010557806395a93cb11461010f575b600080fd5b6100ca7f0000000000000000000000003254f7cd0565aa67eedc86c2fb608be48d5ccd7881565b6040516001600160a01b0390911681526020015b60405180910390f35b60606040516100de9190610619565b60606040516100de9190610667565b61010d61016f565b005b60606040516100de91906106a9565b60606040516100de919061070b565b60606040516100de9190610971565b60606040516100de9190610984565b60606040516100de9190610a63565b61016261030f565b6040516100de9190610aad565b606080518190819081908190819081901561020d5761020b633cb6502d60e01b61019761030f565b896040516024016101a9929190610ac0565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526001600160a01b037f0000000000000000000000003254f7cd0565aa67eedc86c2fb608be48d5ccd78169061036e565b505b85511561023b576102396314d8093760e21b61022761030f565b886040516024016101a9929190610ae5565b505b825115610262576040516102609063bb06653560e01b906101a9908690602401610619565b505b8351156102895760405161028790636e17618760e11b906101a9908790602401610667565b505b8051156102b0576040516102ae906324f4c44560e01b906101a9908490602401610984565b505b8151156102d7576040516102d59063927c400360e01b906101a990859060240161070b565b505b8451156102fe576040516102fc906355caa16360e01b906101a99088906024016106a9565b505b61030661039a565b50505050505050565b60408051808201909152606080825260208201525060408051608081018252600881830190815267457468657265756d60c01b606083015281528151808301909252600382526208ae8d60eb1b60208381019190915281019190915290565b60606103938383604051806060016040528060278152602001610b63602791396104a7565b9392505050565b7f0000000000000000000000003254f7cd0565aa67eedc86c2fb608be48d5ccd786001600160a01b031663587250846040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c9190610b0a565b604051631d2118f960e01b8152736b175474e89094c44da98b954eedeac495271d0f6004820152735ae77ae8ec1b0f9a741c80a4cdb876e6b5b619b960248201526001600160a01b039190911690631d2118f990604401600060405180830381600087803b15801561048d57600080fd5b505af11580156104a1573d6000803e3d6000fd5b50505050565b6060600080856001600160a01b0316856040516104c49190610b33565b600060405180830381855af49150503d80600081146104ff576040519150601f19603f3d011682016040523d82523d6000602084013e610504565b606091505b50915091506105158683838761051f565b9695505050505050565b6060831561059357825160000361058c576001600160a01b0385163b61058c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b508161059d565b61059d83836105a5565b949350505050565b8151156105b55781518083602001fd5b8060405162461bcd60e51b81526004016105839190610b4f565b80516001600160a01b031682526020808201519083015260408082015190830152606080820151908301526080808201519083015260a0818101519083015260c090810151910152565b6020808252825182820181905260009190848201906040850190845b8181101561065b576106488385516105cf565b9284019260e09290920191600101610635565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561065b576106968385516105cf565b9284019260e09290920191600101610683565b602080825282518282018190526000919060409081850190868401855b828110156106fe57815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016106c6565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156106fe57815180516001600160a01b0390811686529087015116868501529284019290850190600101610728565b60005b8381101561077557818101518382015260200161075d565b50506000910152565b6000815180845261079681602086016020860161075a565b601f01601f19169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b80516001600160a01b031682526000610340602083015181602086015261082d8286018261077e565b915050604083015161084a60408601826001600160a01b03169052565b50606083015161085d60608601826107aa565b5060808301516101808581019190915260a08401516101a08087019190915260c08501516101c08088019190915260e08601516101e080890191909152610100870151610200808a0191909152610120880151610220808b01919091526101408901516102408b01526101608901516102608b0152948801516102808a0152928701516102a0890152908601516102c08801528501516102e087015284015161030086015283015160ff8116610320860152509392505050565b60008282518085526020808601955060208260051b8401016020860160005b8481101561096457601f19868403018952610952838351610804565b98840198925090830190600101610936565b5090979650505050505050565b6020815260006103936020830184610917565b6020808252825182820181905260009190848201906040850190845b8181101561065b57835180516001600160a01b031684528501516109c6868501826107aa565b509284019261014092909201916001016109a0565b600082825180855260208086019550808260051b84010181860160005b8481101561096457601f19868403018952815160808151818652610a1e82870182610804565b9287015180516001600160a01b03908116888a01528189015181166040808a0191909152909101511660609096019590955250988401989250908301906001016109f8565b60208152600061039360208301846109db565b6000815160408452610a8b604085018261077e565b905060208301518482036020860152610aa4828261077e565b95945050505050565b6020815260006103936020830184610a76565b604081526000610ad36040830185610a76565b8281036020840152610aa48185610917565b604081526000610af86040830185610a76565b8281036020840152610aa481856109db565b600060208284031215610b1c57600080fd5b81516001600160a01b038116811461039357600080fd5b60008251610b4581846020870161075a565b9190910192915050565b602081526000610393602083018461077e56fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fb3dcdbc8eaf2ce9e682a70b844a7a9d007ea68902cf4277b53bc6982edc748364736f6c63430008190033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.