前置介绍
AAVE 由下面的仓库组成。
- core 核心库
- deploy 部署库
- periphery 周边库
本文解读 core 部分的逻辑。
合约结构
合约下面按照来逐个分析
- interfaces 接口
IPool.sol
xxx.sol
xxx.sol
IPool.sol
# mint 指定金额的aToken给某地址
function mintUnbacked (address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external;
function backUnbacked (address asset, uint256 amount, uint256 fee) external returns (uint256);
# 存: 用户提供 100 USDC 并获得 100 aUSDC 回报
function supply (address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external;
function deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external;
# 取: 用户有100 aUSDC,调用withdraw()并收到100 USDC,燃烧这100 aUSDC
function withdraw (address asset, uint256 amount, address to) external returns (uint256);
# 借: 拥有抵押品,成为借款人,借入金额(interestRateMode)
function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external;
# 还: 偿还借入的“金额”,销毁所拥有的等值债务代币
function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) external returns (uint256);
# 还: 通过AToken
function repayWithATokens(address asset, uint256 amount, uint256 interestRateMode) external returns (uint256);
# 授权存
function supplyWithPermit(address asset,uint256 amount,address onBehalfOf,uint16 referralCode,
uint256 deadline,uint8 permitV,bytes32 permitR,bytes32 permitS) external;
# 授权还
function repayWithPermit(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf,
uint256 deadline, uint8 permitV, bytes32 permitR, bytes32 permitS) external returns (uint256);
function flashLoan(address receiverAddress, address[] calldata assets, uint256[] calldata amounts,
uint256[] calldata interestRateModes, address onBehalfOf, bytes calldata params,
uint16 referralCode) external;
function flashLoanSimple(address receiverAddress, address asset, uint256 amount, bytes calldata params,
uint16 referralCode) external;
function swapBorrowRateMode(address asset, uint256 interestRateMode) external;
function rebalanceStableBorrowRate(address asset, address user) external;
function setUserUseReserveAsCollateral(address asset, bool useAsCollateral) external;
function liquidationCall(address collateralAsset, address debtAsset, address user, uint256 debtToCover, bool receiveAToken) external;
function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor );
function initReserve(address asset, address aTokenAddress, address stableDebtAddress, address variableDebtAddress, address interestRateStrategyAddress) external;
function dropReserve(address asset) external;
function setReserveInterestRateStrategyAddress(address asset, address rateStrategyAddress) external;
function setConfiguration(address asset, DataTypes.ReserveConfigurationMap calldata configuration) external;
function getConfiguration(address asset) external view returns (DataTypes.ReserveConfigurationMap memory);
function getUserConfiguration(address user) external view returns (DataTypes.UserConfigurationMap memory);
function getReserveNormalizedIncome(address asset) external view returns (uint256);
function getReserveNormalizedVariableDebt(address asset) external view returns (uint256);
function getReserveData(address asset) external view returns (DataTypes.ReserveData memory);
function finalizeTransfer(address asset, address from, address to, uint256 amount, uint256 balanceFromBefore,uint256 balanceToBefore) external;
function getReservesList() external view returns (address[] memory);
function getReserveAddressById(uint16 id) external view returns (address);
function ADDRESSES_PROVIDER() external view returns (IPoolAddressesProvider);
function updateBridgeProtocolFee(uint256 bridgeProtocolFee) external;
function updateFlashloanPremiums(uint128 flashLoanPremiumTotal, uint128 flashLoanPremiumToProtocol) external;
function configureEModeCategory(uint8 id, DataTypes.EModeCategory memory config) external;
function getEModeCategoryData(uint8 id) external view returns (DataTypes.EModeCategory memory);
function setUserEMode(uint8 categoryId) external;
function getUserEMode(address user) external view returns (uint256);
function resetIsolationModeTotalDebt(address asset) external;
function MAX_STABLE_RATE_BORROW_SIZE_PERCENT() external view returns (uint256);
function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128);
function BRIDGE_PROTOCOL_FEE() external view returns (uint256);
function FLASHLOAN_PREMIUM_TO_PROTOCOL() external view returns (uint128);
function MAX_NUMBER_RESERVES() external view returns (uint16);
function mintToTreasury(address[] calldata assets) external;
function rescueTokens(address token, address to, uint256 amount) external;
1)核心方法
4)辅助方法
5)管理方法
6)合约事件
XXX.sol
1)只读方法
2)构造函数 (部署时候需要的配置)
3)核心方法
4)辅助方法
5)管理方法
6)合约事件
参考
- https://learnblockchain.cn/article/4397
- https://zhuanlan.zhihu.com/p/429822776
- https://s3cunda.github.io/2022/03/13/AAVE%E8%B0%83%E7%A0%94%E6%8A%A5%E5%91%8A.html#v3
- https://docs.aave.com/developers/getting-started/v3-overview
- https://docs.aave.com/faq/liquidations
- https://github.com/aave/aave-v3-core/blob/master/techpaper/Aave_V3_Technical_Paper.pdf
- https://docs.aave.com/developers/v/1.0/developing-on-aave/the-protocol
- https://docs.aave.com/risk/
- https://foresightnews.pro/article/detail/1059
- https://mirror.xyz/0x4339eA909BF03E7328AC14c75aF0940c082EA994/p1UxvRfJ_cTy-fZcEi66-AkEsb8jifZ9hNz5RUVptvU
- https://www.bimama.com/news/14311.html