ILendingPool
Also available on Github.
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.8.11;
pragma abicoder v2;
import {ILendingPoolAddressesProvider} from './ILendingPoolAddressesProvider.sol';
import {DataTypes} from '../protocol/libraries/types/DataTypes.sol';
interface ILendingPool {
/**
* @dev Emitted on deposit()
* @param reserve The address of the underlying asset of the reserve
* @param user The address initiating the deposit
* @param onBehalfOf The beneficiary of the deposit, receiving the vTokens
* @param amount The amount deposited
**/
event Deposit(
address indexed reserve,
address user,
address indexed onBehalfOf,
uint256 amount,
uint16 indexed referral
);
/**
* @dev Emitted on withdraw()
* @param reserve The address of the underlyng asset being withdrawn
* @param user The address initiating the withdrawal, owner of vTokens
* @param to Address that will receive the underlying
* @param amount The amount to be withdrawn
**/
event Withdraw(address indexed reserve, address indexed user, address indexed to, uint256 amount);
event DepositNFT(
address indexed vault,
address user,
address indexed onBehalfOf,
uint256[] tokenIds,
uint256[] amounts,
uint16 indexed referral
);
event WithdrawNFT(
address indexed vault,
address indexed user,
address indexed to,
uint256[] tokenIds,
uint256[] amounts
);
/**
* @dev Emitted on nftFlashLoan()
* @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 tokenIds The token IDs for each NFT being flash borrowed
* @param amounts The amounts for each NFT being flash borrowed
* @param premium The fee flash borrowed
**/
event NFTFlashLoan(
address indexed target,
address indexed initiator,
address indexed asset,
uint256[] tokenIds,
uint256[] amounts,
uint256 premium,
uint16 referralCode
);
/**
* @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 amount The amount borrowed out
* @param borrowRateMode The rate mode: 1 for Stable, 2 for Variable
* @param borrowRate The numeric rate at which the user has borrowed
**/
event Borrow(
address indexed reserve,
address user,
address indexed onBehalfOf,
uint256 amount,
uint256 borrowRateMode,
uint256 borrowRate,
uint16 indexed referral
);
/**
* @dev Emitted on repay()
* @param reserve The address of the underlying asset of the reserve
* @param user The beneficiary of the repayment, getting his debt reduced
* @param amount The amount repaid
**/
event Repay(
address indexed reserve,
address indexed user,
address indexed repayer,
uint256 amount
);
/**
* @dev Emitted when a reserve is disabled as collateral for an user
* @param reserve The address of the reserve
* @param user The address of the user
**/
event ReserveUsedAsCollateralDisabled(address indexed reserve, address indexed user);
/**
* @dev Emitted when a reserve is enabled as collateral for an user
* @param reserve The address of the reserve
* @param user The address of the user
**/
event ReserveUsedAsCollateralEnabled(address indexed reserve, address indexed user);
/**
* @dev Emitted on setUserUseNFTVaultAsCollateral()
* @param nftVault The address of the underlying asset of the vault
* @param user The address of the user enabling the usage as collateral
**/
event NFTVaultUsedAsCollateralEnabled(address indexed nftVault, address indexed user);
/**
* @dev Emitted on setUserUseNFTVaultAsCollateral()
* @param nftVault The address of the underlying asset of the vault
* @param user The address of the user enabling the usage as collateral
**/
event NFTVaultUsedAsCollateralDisabled(address indexed nftVault, address indexed user);
/**
* @dev Emitted when the pause is triggered.
*/
event Paused();
/**
* @dev Emitted when the pause is lifted.
*/
event Unpaused();
/**
* @dev Emitted when the state of a reserve is updated. NOTE: This event is actually declared
* in the ReserveLogic library and emitted in the updateInterestRates() function. Since the function is internal,
* the event will actually be fired by the LendingPool contract. The event is therefore replicated here so it
* gets added to the LendingPool ABI
* @param reserve The address of the underlying asset of the reserve
* @param liquidityRate The new liquidity rate
* @param stableBorrowRate The new stable borrow rate
* @param variableBorrowRate The new variable borrow rate
* @param liquidityIndex The new liquidity index
* @param variableBorrowIndex The new variable borrow index
**/
event ReserveDataUpdated(
address indexed reserve,
uint256 liquidityRate,
uint256 stableBorrowRate,
uint256 variableBorrowRate,
uint256 liquidityIndex,
uint256 variableBorrowIndex
);
/**
* @dev Deposits an `amount` of underlying asset into the reserve, receiving in return overlying vTokens.
* - E.g. User deposits 100 USDC and gets in return 100 aUSDC
* @param amount The amount to be deposited
* @param onBehalfOf The address that will receive the vTokens, same as msg.sender if the user
* wants to receive them on his own wallet, or a different address if the beneficiary of vTokens
* is a different wallet
**/
function deposit(
address asset,
uint256 amount,
address onBehalfOf,
uint16 referralCode
) external;
/**
* @dev Withdraws an `amount` of underlying asset from the reserve, burning the equivalent vTokens owned
* E.g. User has 100 aUSDC, calls withdraw() and receives 100 USDC, burning the 100 aUSDC
* @param amount The underlying amount to be withdrawn
* - Send the value type(uint256).max in order to withdraw the whole vToken balance
* @param to Address that will receive the underlying, same as msg.sender if the user
* wants to receive it on his own wallet, or a different address if the beneficiary is a
* different wallet
* @return The final amount withdrawn
**/
function withdraw(
address asset,
uint256 amount,
address to
) external returns (uint256);
/**
* @dev Deposits an `amounts[i]` of underlying `tokenIds[i]` into the NFT reserve, receiving in return overlying nTokens.
* @param tokenIds The tokenIds of the NFTs to be deposited
* @param amounts For ERC1155 only: The amounts of NFTs to be deposited
* @param onBehalfOf The address that will receive the nTokens, same as msg.sender if the user
* wants to receive them on his own wallet, or a different address if the beneficiary of nTokens
* is a different wallet
**/
function depositNFT(
address nft,
uint256[] calldata tokenIds,
uint256[] calldata amounts,
address onBehalfOf,
uint16 referralCode
) external;
/**
* @dev Deposits an `amounts[i]` of underlying `tokenIds[i]` into the NFT reserve, receiving in return overlying nTokens.
* @param tokenIds The tokenIds of the NFTs to be deposited
* @param amounts For ERC1155 only: The amounts of NFTs to be deposited
* @param onBehalfOf The address that will receive the nTokens, same as msg.sender if the user
* wants to receive them on his own wallet, or a different address if the beneficiary of nTokens
* is a different wallet
**/
function depositAndLockNFT(
address nft,
uint256[] calldata tokenIds,
uint256[] calldata amounts,
address onBehalfOf,
uint16 lockType,
uint16 referralCode
) external;
/**
* @dev Withdraws an `amounts[i]` of nTokens with `tokenIds[i]` from the reserve, burning the equivalent nTokens owned
* @param tokenIds The tokenIds of the NFTs to be withdraw
* @param amounts For ERC1155 only: The amounts of NFTs to be withdrawn
* - Send the value type(uint256).max in order to withdraw the whole ERC1155 tokenId balance
* @param to Address that will receive the underlying, same as msg.sender if the user
* wants to receive it on his own wallet, or a different address if the beneficiary is a
* different wallet
* @return The final amount withdrawn.
- the `returnedValue[i]` equals the amount of `tokenIds[i]` that has been withdrawn.
**/
function withdrawNFT(
address nft,
uint256[] calldata tokenIds,
uint256[] calldata amounts,
address to
) external returns (uint256[] memory);
/**
* @dev Allows users to borrow a specific `amount` of the reserve underlying asset, provided that the borrower
* already deposited enough collateral.
* @param amount The amount to be borrowed
**/
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
* @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`
* @return The final amount repaid
**/
function repay(
address asset,
uint256 amount,
uint256 rateMode,
address onBehalfOf
) external returns (uint256);
function nftLiquidationCall(
address collateralAsset,
address debtAsset,
address user,
uint256[] memory tokenIds,
uint256[] memory amounts,
bool receiveNToken
) external;
/**
* @dev Allows smartcontracts to access the nft vault of the pool within one transaction,
* as long as the amount taken plus a fee is returned.
* IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept into consideration.
* For further details please visit https://developers.aave.com
* @param receiverAddress The address of the contract receiving the funds, implementing the INFTFlashLoanReceiver interface
* @param asset The addresses of the assets being flash-borrowed
* @param tokenIds The tokenIds of the NFTs being flash-borrowed
* @param amounts For ERC1155 only: The amounts of NFTs being flash-borrowed
* @param params Variadic packed params to pass to the receiver as extra information
**/
function nftFlashLoan(
address receiverAddress,
address asset,
uint256[] calldata tokenIds,
uint256[] calldata amounts,
bytes calldata params,
uint16 referralCode
) external;
/**
* @dev Returns the user account data across all the reserves
* @param user The address of the user
* @return totalCollateralETH the total collateral in ETH of the user
* @return totalDebtETH the total debt in ETH of the user
* @return availableBorrowsETH the borrowing power left of the user
* @return currentLiquidationThreshold the liquidation threshold of the user
* @return ltv the loan to value of the user
* @return healthFactor the current health factor of the user
**/
function getUserAccountData(address user)
external
view
returns (
uint256 totalCollateralETH,
uint256 totalDebtETH,
uint256 availableBorrowsETH,
uint256 currentLiquidationThreshold,
uint256 ltv,
uint256 healthFactor
);
function initReserve(
address reserve,
address vTokenAddress,
address stableDebtAddress,
address variableDebtAddress,
address interestRateStrategyAddress
) external;
function initNFTVault(
address vault,
address nTokenAddress,
address nftEligibility
) external;
function setReserveInterestRateStrategyAddress(address reserve, address rateStrategyAddress)
external;
function setConfiguration(address reserve, uint256 configuration) external;
function setNFTVaultConfiguration(address reserve, uint256 configuration) external;
function setNFTVaultActionExpiration(address nftValue, uint40 expiration) external;
function setNFTVaultEligibility(address nftValue, address eligibility) external;
/**
* @dev Returns the configuration of the reserve
* @param asset The address of the underlying asset of the reserve
* @return The configuration of the reserve
**/
function getConfiguration(address asset)
external
view
returns (DataTypes.ReserveConfigurationMap memory);
/**
* @dev Returns the configuration of the NFT reserve
* @param asset The address of the underlying asset of the reserve
* @return The configuration of the reserve
**/
function getNFTVaultConfiguration(address asset)
external
view
returns (DataTypes.NFTVaultConfigurationMap memory);
/**
* @dev Returns the configuration of the user across all the reserves
* @param user The user address
* @return The configuration of the user
**/
function getUserConfiguration(address user)
external
view
returns (DataTypes.UserConfigurationMap memory);
/**
* @dev Returns the normalized income normalized income of the reserve
* @param asset The address of the underlying asset of the reserve
* @return The reserve's normalized income
*/
function getReserveNormalizedIncome(address asset) external view returns (uint256);
/**
* @dev Returns the normalized variable debt per unit of asset
* @param asset The address of the underlying asset of the reserve
* @return The reserve normalized variable debt
*/
function getReserveNormalizedVariableDebt(address asset) external view returns (uint256);
/**
* @dev Returns the state and configuration of the reserve
* @param asset The address of the underlying asset of the reserve
* @return The state of the reserve
**/
function getReserveData(address asset) external view returns (DataTypes.ReserveData memory);
/**
* @dev Returns the state and configuration of the NFT reserve
* @param asset The address of the underlying NFT of the reserve
* @return The state of the reserve
**/
function getNFTVaultData(address asset) external view returns (DataTypes.NFTVaultData memory);
function finalizeTransfer(
address asset,
address from,
address to,
uint256 amount,
uint256 balanceFromAfter,
uint256 balanceToBefore
) external;
function finalizeNFTSingleTransfer(
address asset,
address from,
address to,
uint256 tokenId,
uint256 amount,
uint256 balanceFromAfter,
uint256 balanceToBefore
) external;
function finalizeNFTBatchTransfer(
address asset,
address from,
address to,
uint256[] calldata tokenIds,
uint256[] calldata amounts,
uint256 balanceFromAfter,
uint256 balanceToBefore
) external;
function getReservesList() external view returns (address[] memory);
function getNFTVaultsList() external view returns (address[] memory);
function getAddressesProvider() external view returns (ILendingPoolAddressesProvider);
function setPause(bool val) external;
function paused() external view returns (bool);
}
// SPDX-License-Identifier: agpl-3.0
pragma solidity 0.8.11;
library DataTypes {
// refer to the whitepaper, section 1.1 basic concepts for a formal description of these properties.
struct ReserveData {
//stores the reserve configuration
ReserveConfigurationMap configuration;
//the liquidity index. Expressed in ray
uint128 liquidityIndex;
//variable borrow index. Expressed in ray
uint128 variableBorrowIndex;
//the current supply rate. Expressed in ray
uint128 currentLiquidityRate;
//the current variable borrow rate. Expressed in ray
uint128 currentVariableBorrowRate;
//the current stable borrow rate. Expressed in ray
uint128 currentStableBorrowRate;
uint40 lastUpdateTimestamp;
//tokens addresses
address vTokenAddress;
address stableDebtTokenAddress;
address variableDebtTokenAddress;
//address of the interest rate strategy
address interestRateStrategyAddress;
//the id of the reserve. Represents the position in the list of the active reserves
uint8 id;
}
struct NFTVaultData {
NFTVaultConfigurationMap configuration;
address nTokenAddress;
address nftEligibility;
uint32 id;
uint40 expiration;
}
struct ReserveConfigurationMap {
//bit 0-15: LTV
//bit 16-31: Liq. threshold
//bit 32-47: Liq. bonus
//bit 48-55: Decimals
//bit 56: Reserve is active
//bit 57: reserve is frozen
//bit 58: borrowing is enabled
//bit 59: stable rate borrowing enabled
//bit 60-63: reserved
//bit 64-79: reserve factor
uint256 data;
}
struct NFTVaultConfigurationMap {
//bit 0-15: LTV
//bit 16-31: Liq. thresold
//bit 32-47: Liq. bonus
//bit 48-55: reserved
//bit 56: Vault is active
//bit 57: Vault is frozen
uint256 data;
}
struct UserConfigurationMap {
uint256 data;
uint256 nData;
}
struct PoolReservesData {
uint256 count;
mapping(address => ReserveData) data;
mapping(uint256 => address) list;
}
struct PoolNFTVaultsData {
uint256 count;
mapping(address => NFTVaultData) data;
mapping(uint256 => address) list;
}
struct TimeLock {
uint40 expiration;
uint16 lockType;
}
enum InterestRateMode {NONE, STABLE, VARIABLE}
}
Last updated