Description:
Multi-signature wallet contract requiring multiple confirmations for transaction execution.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"src/deployments/projects/aave-v3-batched/batches/AaveV3HelpersBatchOne.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
import {AaveV3HelpersProcedureOne} from '../../../contracts/procedures/AaveV3HelpersProcedureOne.sol';
import '../../../interfaces/IMarketReportTypes.sol';
contract AaveV3HelpersBatchOne is AaveV3HelpersProcedureOne {
ConfigEngineReport internal _report;
constructor(
address poolProxy,
address poolConfiguratorProxy,
address defaultInterestRateStrategy,
address aaveOracle,
address rewardsController,
address collector,
address aTokenImpl,
address vTokenImpl
) {
_report = _deployConfigEngine(
poolProxy,
poolConfiguratorProxy,
defaultInterestRateStrategy,
aaveOracle,
rewardsController,
collector,
aTokenImpl,
vTokenImpl
);
}
function getConfigEngineReport() external view returns (ConfigEngineReport memory) {
return _report;
}
}
"
},
"src/deployments/contracts/procedures/AaveV3HelpersProcedureOne.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
import {Create2Utils} from '../utilities/Create2Utils.sol';
import {ConfigEngineReport} from '../../interfaces/IMarketReportTypes.sol';
import {AaveV3ConfigEngine, IAaveV3ConfigEngine, CapsEngine, BorrowEngine, CollateralEngine, RateEngine, PriceFeedEngine, EModeEngine, ListingEngine} from '../../../contracts/extensions/v3-config-engine/AaveV3ConfigEngine.sol';
import {IPool} from '../../../contracts/interfaces/IPool.sol';
import {IPoolConfigurator} from '../../../contracts/interfaces/IPoolConfigurator.sol';
import {IAaveOracle} from '../../../contracts/interfaces/IAaveOracle.sol';
contract AaveV3HelpersProcedureOne {
function _deployConfigEngine(
address pool,
address poolConfigurator,
address defaultInterestRateStrategy,
address aaveOracle,
address rewardsController,
address collector,
address aTokenImpl,
address vTokenImpl
) internal returns (ConfigEngineReport memory configEngineReport) {
IAaveV3ConfigEngine.EngineLibraries memory engineLibraries = IAaveV3ConfigEngine
.EngineLibraries({
listingEngine: Create2Utils._create2Deploy('v1', type(ListingEngine).creationCode),
eModeEngine: Create2Utils._create2Deploy('v1', type(EModeEngine).creationCode),
borrowEngine: Create2Utils._create2Deploy('v1', type(BorrowEngine).creationCode),
collateralEngine: Create2Utils._create2Deploy('v1', type(CollateralEngine).creationCode),
priceFeedEngine: Create2Utils._create2Deploy('v1', type(PriceFeedEngine).creationCode),
rateEngine: Create2Utils._create2Deploy('v1', type(RateEngine).creationCode),
capsEngine: Create2Utils._create2Deploy('v1', type(CapsEngine).creationCode)
});
IAaveV3ConfigEngine.EngineConstants memory engineConstants = IAaveV3ConfigEngine
.EngineConstants({
pool: IPool(pool),
poolConfigurator: IPoolConfigurator(poolConfigurator),
defaultInterestRateStrategy: defaultInterestRateStrategy,
oracle: IAaveOracle(aaveOracle),
rewardsController: rewardsController,
collector: collector
});
configEngineReport.listingEngine = engineLibraries.listingEngine;
configEngineReport.eModeEngine = engineLibraries.eModeEngine;
configEngineReport.borrowEngine = engineLibraries.borrowEngine;
configEngineReport.collateralEngine = engineLibraries.collateralEngine;
configEngineReport.priceFeedEngine = engineLibraries.priceFeedEngine;
configEngineReport.rateEngine = engineLibraries.rateEngine;
configEngineReport.capsEngine = engineLibraries.capsEngine;
configEngineReport.configEngine = address(
new AaveV3ConfigEngine(aTokenImpl, vTokenImpl, engineConstants, engineLibraries)
);
return configEngineReport;
}
}
"
},
"src/deployments/interfaces/IMarketReportTypes.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import '../../contracts/interfaces/IPoolAddressesProvider.sol';
import '../../contracts/interfaces/IPoolAddressesProviderRegistry.sol';
import '../../contracts/interfaces/IPool.sol';
import '../../contracts/interfaces/IPoolConfigurator.sol';
import '../../contracts/interfaces/IAaveOracle.sol';
import '../../contracts/interfaces/IAToken.sol';
import '../../contracts/interfaces/IVariableDebtToken.sol';
import '../../contracts/interfaces/IACLManager.sol';
import '../../contracts/interfaces/IDefaultInterestRateStrategyV2.sol';
import '../../contracts/helpers/AaveProtocolDataProvider.sol';
import '../../contracts/helpers/UiPoolDataProviderV3.sol';
import '../../contracts/helpers/UiIncentiveDataProviderV3.sol';
import '../../contracts/rewards/interfaces/IEmissionManager.sol';
import '../../contracts/rewards/interfaces/IRewardsController.sol';
import '../../contracts/helpers/WalletBalanceProvider.sol';
import '../../contracts/extensions/paraswap-adapters/ParaSwapLiquiditySwapAdapter.sol';
import '../../contracts/extensions/paraswap-adapters/ParaSwapRepayAdapter.sol';
import '../../contracts/extensions/paraswap-adapters/ParaSwapWithdrawSwapAdapter.sol';
import '../../contracts/helpers/interfaces/IWrappedTokenGatewayV3.sol';
import '../../contracts/helpers/L2Encoder.sol';
import {ICollector} from '../../contracts/treasury/ICollector.sol';
import {IRevenueSplitter} from '../../contracts/treasury/IRevenueSplitter.sol';
import {IRwaATokenManager} from '../../contracts/interfaces/IRwaATokenManager.sol';
struct ContractsReport {
IPoolAddressesProviderRegistry poolAddressesProviderRegistry;
IPoolAddressesProvider poolAddressesProvider;
IPool poolProxy;
IPool poolImplementation;
IPoolConfigurator poolConfiguratorProxy;
IPoolConfigurator poolConfiguratorImplementation;
AaveProtocolDataProvider protocolDataProvider;
IAaveOracle aaveOracle;
IACLManager aclManager;
ICollector treasury;
IDefaultInterestRateStrategyV2 defaultInterestRateStrategy;
ICollector treasuryImplementation;
IWrappedTokenGatewayV3 wrappedTokenGateway;
WalletBalanceProvider walletBalanceProvider;
UiIncentiveDataProviderV3 uiIncentiveDataProvider;
UiPoolDataProviderV3 uiPoolDataProvider;
ParaSwapLiquiditySwapAdapter paraSwapLiquiditySwapAdapter;
ParaSwapRepayAdapter paraSwapRepayAdapter;
ParaSwapWithdrawSwapAdapter paraSwapWithdrawSwapAdapter;
L2Encoder l2Encoder;
IAToken aToken;
IVariableDebtToken variableDebtToken;
IEmissionManager emissionManager;
IRewardsController rewardsControllerImplementation;
IRewardsController rewardsControllerProxy;
IRevenueSplitter revenueSplitter;
IRwaATokenManager rwaATokenManager;
}
struct MarketReport {
address poolAddressesProviderRegistry;
address poolAddressesProvider;
address poolProxy;
address poolImplementation;
address poolConfiguratorProxy;
address poolConfiguratorImplementation;
address protocolDataProvider;
address aaveOracle;
address defaultInterestRateStrategy;
address priceOracleSentinel;
address aclManager;
address treasury;
address treasuryImplementation;
address wrappedTokenGateway;
address walletBalanceProvider;
address uiIncentiveDataProvider;
address uiPoolDataProvider;
address paraSwapLiquiditySwapAdapter;
address paraSwapRepayAdapter;
address paraSwapWithdrawSwapAdapter;
address l2Encoder;
address aToken;
address rwaAToken;
address variableDebtToken;
address emissionManager;
address rewardsControllerImplementation;
address rewardsControllerProxy;
address configEngine;
address transparentProxyFactory;
address staticATokenFactoryImplementation;
address staticATokenFactoryProxy;
address staticATokenImplementation;
address revenueSplitter;
address dustBin;
address emptyImplementation;
address rwaATokenManager;
}
struct LibrariesReport {
address borrowLogic;
address bridgeLogic;
address configuratorLogic;
address eModeLogic;
address flashLoanLogic;
address liquidationLogic;
address poolLogic;
address supplyLogic;
}
struct Roles {
address marketOwner;
address poolAdmin;
address emergencyAdmin;
address rwaATokenManagerAdmin;
// array of additional roles to be granted, where the i-th element represents the
// abi.encode result of the bytes32 role and the address of the account to be granted
bytes[] additionalRoles;
}
struct MarketConfig {
address networkBaseTokenPriceInUsdProxyAggregator;
address marketReferenceCurrencyPriceInUsdProxyAggregator;
string marketId;
uint8 oracleDecimals;
address paraswapAugustusRegistry;
address l2SequencerUptimeFeed;
uint256 l2PriceOracleSentinelGracePeriod;
uint256 providerId;
bytes32 salt;
address wrappedNativeToken;
uint128 flashLoanPremiumTotal;
uint128 flashLoanPremiumToProtocol;
address incentivesProxy;
address treasury; // let empty for deployment of collector, otherwise reuse treasury address
address treasuryPartner; // let empty for single treasury, or add treasury partner for revenue split between two organizations.
uint16 treasurySplitPercent; // ignored if treasuryPartner is empty, otherwise the split percent for the first treasury (recipientA, values between 00_01 and 100_00)
}
struct DeployFlags {
bool l2;
}
struct PoolReport {
address poolImplementation;
address poolConfiguratorImplementation;
}
struct MiscReport {
address priceOracleSentinel;
address defaultInterestRateStrategy;
address rwaATokenManager;
}
struct ConfigEngineReport {
address configEngine;
address listingEngine;
address eModeEngine;
address borrowEngine;
address collateralEngine;
address priceFeedEngine;
address rateEngine;
address capsEngine;
}
struct StaticATokenReport {
address transparentProxyFactory;
address staticATokenImplementation;
address staticATokenFactoryImplementation;
address staticATokenFactoryProxy;
}
struct InitialReport {
address poolAddressesProvider;
address poolAddressesProviderRegistry;
}
struct SetupReport {
address poolProxy;
address poolConfiguratorProxy;
address rewardsControllerProxy;
address aclManager;
}
struct PeripheryReport {
address aaveOracle;
address treasury;
address treasuryImplementation;
address emissionManager;
address rewardsControllerImplementation;
address revenueSplitter;
address emptyImplementation;
address dustBin;
}
struct ParaswapReport {
address paraSwapLiquiditySwapAdapter;
address paraSwapRepayAdapter;
address paraSwapWithdrawSwapAdapter;
}
struct SetupMarketParams {
address poolImplementation;
address poolConfiguratorImplementation;
address protocolDataProvider;
address aaveOracle;
address rewardsControllerImplementation;
address priceOracleSentinel;
address rwaATokenManager;
}
"
},
"src/deployments/contracts/utilities/Create2Utils.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
library Create2Utils {
// https://github.com/safe-global/safe-singleton-factory
address public constant CREATE2_FACTORY = 0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7;
function _create2Deploy(bytes32 salt, bytes memory bytecode) internal returns (address) {
if (isContractDeployed(CREATE2_FACTORY) == false) {
revert('MISSING_CREATE2_FACTORY');
}
address computed = computeCreate2Address(salt, bytecode);
if (isContractDeployed(computed)) {
return computed;
} else {
bytes memory creationBytecode = abi.encodePacked(salt, bytecode);
bytes memory returnData;
(, returnData) = CREATE2_FACTORY.call(creationBytecode);
address deployedAt = address(uint160(bytes20(returnData)));
require(deployedAt == computed, 'failure at create2 address derivation');
return deployedAt;
}
}
function isContractDeployed(address _addr) internal view returns (bool isContract) {
return (_addr.code.length > 0);
}
function computeCreate2Address(
bytes32 salt,
bytes32 initcodeHash
) internal pure returns (address) {
return
addressFromLast20Bytes(
keccak256(abi.encodePacked(bytes1(0xff), CREATE2_FACTORY, salt, initcodeHash))
);
}
function computeCreate2Address(
bytes32 salt,
bytes memory bytecode
) internal pure returns (address) {
return computeCreate2Address(salt, keccak256(abi.encodePacked(bytecode)));
}
function addressFromLast20Bytes(bytes32 bytesValue) internal pure returns (address) {
return address(uint160(uint256(bytesValue)));
}
}
"
},
"src/contracts/extensions/v3-config-engine/AaveV3ConfigEngine.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.18;
import {Address} from 'openzeppelin-contracts/contracts/utils/Address.sol';
import {CapsEngine} from './libraries/CapsEngine.sol';
import {BorrowEngine} from './libraries/BorrowEngine.sol';
import {CollateralEngine} from './libraries/CollateralEngine.sol';
import {RateEngine} from './libraries/RateEngine.sol';
import {PriceFeedEngine} from './libraries/PriceFeedEngine.sol';
import {EModeEngine} from './libraries/EModeEngine.sol';
import {ListingEngine} from './libraries/ListingEngine.sol';
import './IAaveV3ConfigEngine.sol';
/**
* @dev Helper smart contract abstracting the complexity of changing configurations on Aave v3, simplifying
* - !!!IMPORTANT!!! This engine MUST BE STATELESS always, as in practise is a library to be used via DELEGATECALL
* listing flow and parameters updates.
* - It is planned to be used via delegatecall, by any contract having appropriate permissions to
* do a listing, or any other granular config
* Assumptions:
* - Only one RewardsController for all assets
* - Only one Collector for all assets
* @author BGD Labs
*/
contract AaveV3ConfigEngine is IAaveV3ConfigEngine {
using Address for address;
IPool public immutable POOL;
IPoolConfigurator public immutable POOL_CONFIGURATOR;
IAaveOracle public immutable ORACLE;
address public immutable ATOKEN_IMPL;
address public immutable VTOKEN_IMPL;
address public immutable REWARDS_CONTROLLER;
address public immutable COLLECTOR;
address public immutable DEFAULT_INTEREST_RATE_STRATEGY;
address public immutable BORROW_ENGINE;
address public immutable CAPS_ENGINE;
address public immutable COLLATERAL_ENGINE;
address public immutable EMODE_ENGINE;
address public immutable LISTING_ENGINE;
address public immutable PRICE_FEED_ENGINE;
address public immutable RATE_ENGINE;
/**
* @dev Constructor.
* @param aTokenImpl The address of default aToken implementation.
* @param vTokenImpl The address of default variable debt token implementation.
* @param engineConstants The struct containing all the engine constants.
* @param engineLibraries The struct containing the addresses of stateless libraries containing the engine logic.
*/
constructor(
address aTokenImpl,
address vTokenImpl,
EngineConstants memory engineConstants,
EngineLibraries memory engineLibraries
) {
require(
address(engineConstants.pool) != address(0) &&
address(engineConstants.poolConfigurator) != address(0) &&
address(engineConstants.oracle) != address(0) &&
engineConstants.rewardsController != address(0) &&
engineConstants.collector != address(0) &&
engineConstants.defaultInterestRateStrategy != address(0),
'ONLY_NONZERO_ENGINE_CONSTANTS'
);
require(aTokenImpl != address(0) && vTokenImpl != address(0), 'ONLY_NONZERO_TOKEN_IMPLS');
require(
engineLibraries.borrowEngine != address(0) &&
engineLibraries.capsEngine != address(0) &&
engineLibraries.listingEngine != address(0) &&
engineLibraries.priceFeedEngine != address(0) &&
engineLibraries.rateEngine != address(0),
'ONLY_NONZERO_ENGINE_LIBRARIES'
);
ATOKEN_IMPL = aTokenImpl;
VTOKEN_IMPL = vTokenImpl;
POOL = engineConstants.pool;
POOL_CONFIGURATOR = engineConstants.poolConfigurator;
ORACLE = engineConstants.oracle;
REWARDS_CONTROLLER = engineConstants.rewardsController;
COLLECTOR = engineConstants.collector;
DEFAULT_INTEREST_RATE_STRATEGY = engineConstants.defaultInterestRateStrategy;
BORROW_ENGINE = engineLibraries.borrowEngine;
CAPS_ENGINE = engineLibraries.capsEngine;
COLLATERAL_ENGINE = engineLibraries.collateralEngine;
EMODE_ENGINE = engineLibraries.eModeEngine;
LISTING_ENGINE = engineLibraries.listingEngine;
PRICE_FEED_ENGINE = engineLibraries.priceFeedEngine;
RATE_ENGINE = engineLibraries.rateEngine;
}
/// @inheritdoc IAaveV3ConfigEngine
function listAssets(PoolContext calldata context, Listing[] calldata listings) external {
require(listings.length != 0, 'AT_LEAST_ONE_ASSET_REQUIRED');
ListingWithCustomImpl[] memory customListings = new ListingWithCustomImpl[](listings.length);
for (uint256 i = 0; i < listings.length; i++) {
customListings[i] = ListingWithCustomImpl({
base: listings[i],
implementations: TokenImplementations({aToken: ATOKEN_IMPL, vToken: VTOKEN_IMPL})
});
}
listAssetsCustom(context, customListings);
}
/// @inheritdoc IAaveV3ConfigEngine
function listAssetsCustom(
PoolContext calldata context,
ListingWithCustomImpl[] memory listings
) public {
LISTING_ENGINE.functionDelegateCall(
abi.encodeWithSelector(
ListingEngine.executeCustomAssetListing.selector,
context,
_getEngineConstants(),
_getEngineLibraries(),
listings
)
);
}
/// @inheritdoc IAaveV3ConfigEngine
function updateCaps(CapsUpdate[] calldata updates) external {
CAPS_ENGINE.functionDelegateCall(
abi.encodeWithSelector(CapsEngine.executeCapsUpdate.selector, _getEngineConstants(), updates)
);
}
/// @inheritdoc IAaveV3ConfigEngine
function updatePriceFeeds(PriceFeedUpdate[] calldata updates) external {
PRICE_FEED_ENGINE.functionDelegateCall(
abi.encodeWithSelector(
PriceFeedEngine.executePriceFeedsUpdate.selector,
_getEngineConstants(),
updates
)
);
}
/// @inheritdoc IAaveV3ConfigEngine
function updateCollateralSide(CollateralUpdate[] calldata updates) external {
COLLATERAL_ENGINE.functionDelegateCall(
abi.encodeWithSelector(
CollateralEngine.executeCollateralSide.selector,
_getEngineConstants(),
updates
)
);
}
/// @inheritdoc IAaveV3ConfigEngine
function updateBorrowSide(BorrowUpdate[] calldata updates) external {
BORROW_ENGINE.functionDelegateCall(
abi.encodeWithSelector(
BorrowEngine.executeBorrowSide.selector,
_getEngineConstants(),
updates
)
);
}
/// @inheritdoc IAaveV3ConfigEngine
function updateRateStrategies(RateStrategyUpdate[] calldata updates) external {
RATE_ENGINE.functionDelegateCall(
abi.encodeWithSelector(
RateEngine.executeRateStrategiesUpdate.selector,
_getEngineConstants(),
updates
)
);
}
/// @inheritdoc IAaveV3ConfigEngine
function updateEModeCategories(EModeCategoryUpdate[] calldata updates) external {
EMODE_ENGINE.functionDelegateCall(
abi.encodeWithSelector(
EModeEngine.executeEModeCategoriesUpdate.selector,
_getEngineConstants(),
updates
)
);
}
/// @inheritdoc IAaveV3ConfigEngine
function updateAssetsEMode(AssetEModeUpdate[] calldata updates) external {
EMODE_ENGINE.functionDelegateCall(
abi.encodeWithSelector(
EModeEngine.executeAssetsEModeUpdate.selector,
_getEngineConstants(),
updates
)
);
}
function _getEngineLibraries() internal view returns (EngineLibraries memory) {
return
EngineLibraries({
listingEngine: LISTING_ENGINE,
eModeEngine: EMODE_ENGINE,
borrowEngine: BORROW_ENGINE,
collateralEngine: COLLATERAL_ENGINE,
priceFeedEngine: PRICE_FEED_ENGINE,
rateEngine: RATE_ENGINE,
capsEngine: CAPS_ENGINE
});
}
function _getEngineConstants() internal view returns (EngineConstants memory) {
return
EngineConstants({
pool: POOL,
poolConfigurator: POOL_CONFIGURATOR,
defaultInterestRateStrategy: DEFAULT_INTEREST_RATE_STRATEGY,
oracle: ORACLE,
rewardsController: REWARDS_CONTROLLER,
collector: COLLECTOR
});
}
}
"
},
"src/contracts/interfaces/IPool.sol": {
"content": "// SPDX-License-Identifier: MIT
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: 2 for Variable, 1 is deprecated (changed on v3.2.0)
* @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 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 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 (Deprecated on v3.2.0), 2 for Variable
* @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 @note deprecated on v3.2.0
* @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 deficit of a reserve is covered.
* @param reserve The address of the underlying asset of the reserve
* @param caller The caller that triggered the DeficitCovered event
* @param amountCovered The amount of deficit covered
*/
event DeficitCovered(address indexed reserve, address caller, uint256 amountCovered);
/**
* @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);
/**
* @dev Emitted when deficit is realized on a liquidation.
* @param user The user address where the bad debt will be burned
* @param debtAsset The address of the underlying borrowed asset to be burned
* @param amountCreated The amount of deficit created
*/
event DeficitCreated(address indexed user, address indexed debtAsset, uint256 amountCreated);
/**
* @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 VariableDebtToken
* - E.g. User borrows 100 USDC passing as `onBehalfOf` his own address, receiving the 100 USDC in his wallet
* and 100 variable debt tokens
* @param asset The address of the underlying asset to borrow
* @param amount The amount to be borrowed
* @param interestRateMode 2 for Variable, 1 is deprecated on v3.2.0
* @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 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 2 for Variable, 1 is deprecated on v3.2.0
* @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 2 for Variable, 1 is deprecated on v3.2.0
* @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 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 DEPRECATED in v3.2.0
* @return The final amount repaid
*/
function repayWithATokens(
address asset,
uint256 amount,
uint256 interestRateMode
) external returns (uint256);
/**
* @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 -> Deprecated on v3.2.0
* 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 2 on `modes`
* @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 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 variableDebtAddress,
address interestRateStrategyAddress
) external;
/**
* @notice Drop a reserve
* @dev Only callable by the PoolConfigurator contract
* @dev Does not reset eMode flags, which must be considered when reusing the same reserve id for a different reserve.
* @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 Accumulates interest to all indexes of the reserve
* @dev Only callable by the PoolConfigurator contract
* @dev To be used when required by the configurator, for example when updating interest rates strategy data
* @param asset The address of the underlying asset of the reserve
*/
function syncIndexesState(address asset) external;
/**
* @notice Updates interest rates on the reserve data
* @dev Only callable by the PoolConfigurator contract
* @dev To be used when required by the configurator, for example when updating interest rates strategy data
* @param asset The address of the underlying asset of the reserve
*/
function syncRatesState(address asset) 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.ReserveDataLegacy memory);
/**
* @notice Returns the virtual underlying balance of the reserve
* @param asset The address of the underlying asset of the reserve
* @return The reserve virtual underlying balance
*/
function getVirtualUnderlyingBalance(address asset) external view returns (uint128);
/**
* @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 or alters an existing collateral configuration of an 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.EModeCategoryBaseConfiguration memory config
) external;
/**
* @notice Replaces the current eMode collateralBitmap.
* @param id The id of the category
* @param collateralBitmap The collateralBitmap of the category
*/
function configureEModeCategoryCollateralBitmap(uint8 id, uint128 collateralBitmap) external;
/**
* @notice Replaces the current eMode borrowableBitmap.
* @param id The id of the category
* @param borrowableBitmap The borrowableBitmap of the category
*/
function configureEModeCategoryBorrowableBitmap(uint8 id, uint128 borrowableBitmap) external;
/**
* @notice Returns the data of an eMode category
* @dev DEPRECATED use independent getters instead
* @param id The id of the category
* @return The configuration data of the category
*/
function getEModeCategoryData(
uint8 id
) external view returns (DataTypes.EModeCategoryLegacy memory);
/**
* @notice Returns the label of an eMode category
* @param id The id of the category
* @return The label of the category
*/
function getEModeCategoryLabel(uint8 id) external view returns (string memory);
/**
* @notice Returns the collateral config of an eMode category
* @param id The id of the category
* @return The ltv,lt,lb of the category
*/
function getEModeCategoryCollateralConfig(
uint8 id
) external view returns (DataTypes.CollateralConfig memory);
/**
* @notice Returns the collateralBitmap of an eMode category
* @param id The id of the category
* @return The collateralBitmap of the category
*/
function getEModeCategoryCollateralBitmap(uint8 id) external view returns (uint128);
/**
* @notice Returns the borrowableBitmap of an eMode category
* @param id The id of the category
* @return The borrowableBitmap of the category
*/
function getEModeCategoryBorrowableBitmap(uint8 id) external view returns (uint128);
/**
* @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 Sets the liquidation grace period of the given asset
* @dev To enable a liquidation grace period, a timestamp in the future should be set,
* To disable a liquidation grace period, any timestamp in the past works, like 0
* @param asset The address of the underlying asset to set the liquidationGracePeriod
* @param until Timestamp when the liquidation grace period will end
**/
function setLiquidationGracePeriod(address asset, uint40 until) external;
/**
* @notice Returns the liquidation grace period of the given asset
* @param asset The address of the underlying asset
* @return Timestamp when the liquidation grace period will end
**/
function getLiquidationGracePeriod(address asset) external view returns (uint40);
/**
* @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;
/**
* @notice It covers the deficit of a specified reserve by burning:
* - the equivalent aToken `amount` for assets with virtual accounting enabled
* - the equivalent `amount` of underlying for assets with virtual accounting disabled (e.g. GHO)
* @dev The deficit of a reserve can occur due to situations where borrowed assets are not repaid, leading to bad debt.
* @param asset The address of the underlying asset to cover the deficit.
* @param amount The amount to be covered, in aToken or underlying on non-virtual accounted assets
*/
function eliminateReserveDeficit(address asset, uint256 amount) external;
/**
* @notice Returns the current deficit of a reserve.
* @param asset The address of the underlying asset of the reserve
* @return The current deficit of the reserve
*/
function getReserveDeficit(address asset) external view returns (uint256);
/**
* @notice Returns the aToken address of a reserve.
* @param asset The address of the underlying asset of the reserve
* @return The address of the aToken
*/
function getReserveAToken(address asset) external view returns (address);
/**
* @notice Returns the variableDebtToken address of a reserve.
* @param asset The address of the underlying asset of the reserve
* @return The address of the variableDebtToken
*/
function getReserveVariableDebtToken(address asset) external view returns (address);
/**
* @notice Gets the address of the external FlashLoanLogic
*/
function getFlashLoanLogic() external view returns (address);
/**
* @notice Gets the address of the external BorrowLogic
*/
function getBorrowLogic() external view returns (address);
/**
* @notice Gets the address of the external BridgeLogic
*/
function getBridgeLogic() external view returns (address);
/**
* @notice Gets the address of the external EModeLogic
*/
function getEModeLogic() external view returns (address);
/**
* @notice Gets the address of the external LiquidationLogic
*/
function getLiquidationLogic() external view returns (address);
/**
* @notice Gets the address of the external PoolLogic
*/
function getPoolLogic() external view returns (address);
/**
* @notice Gets the address of the external SupplyLogic
*/
function getSupplyLogic() external view returns (address);
}
"
},
"src/contracts/interfaces/IPoolConfigurator.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ConfiguratorInputTypes} from '../protocol/libraries/types/ConfiguratorInputTypes.sol';
import {IDefaultInterestRateStrategyV2} from './IDefaultInterestRateStrategyV2.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, DEPRECATED in v3.2.0
* @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 ltv is set for the frozen asset.
* @param asset The address of the underlying asset of the reserve
* @param ltv The loan to value of the asset when used as collateral
*/
event PendingLtvChanged(address indexed asset, uint256 ltv);
/**
* @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 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 liquidation grace period is updated.
* @param asset The address of the underlying asset of the reserve
* @param gracePeriodUntil Timestamp until when liquidations will not be allowed post-unpause
*/
event LiquidationGracePeriodChanged(address indexed asset, uint40 gracePeriodUntil);
/**
* @dev Emitted when the liquidation grace period is disabled.
* @param asset The address of the underlying asset of the reserve
*/
event LiquidationGracePeriodDisabled(address indexed asset);
/**
* @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 an collateral configuration of an asset in an eMode is changed.
* @param asset The address of the underlying asset of the reserve
* @param categoryId The eMode category
* @param collateral True if the asset is enabled as collateral in the eMode, false otherwise.
*/
event AssetCollateralInEModeChanged(address index
Submitted on: 2025-10-31 10:54:09
Comments
Log in to comment.
No comments yet.