The health of the Aave Protocol is dependent on the 'health' of the collateralised positions within the protocol, also known as the 'health factor'. When the 'health factor' of an account's total loans is below 1, anyone can make a
Poolor L2Pool (in case of Arbitrum/Optimism) contract, pay back part of the debt owed and receive discounted collateral in return (also known as the liquidation bonus).
This incentivises third parties to participate in the health of the overall protocol, by acting in their own interest (to receive the discounted collateral) and as a result, ensure borrows are sufficiently collateralize.
There are multiple ways to participate in liquidations:
When making a
liquidationCall(), you must:
- Know the account (i.e. the ethreum address:
user) whose health factor is below 1.
- Know the valid debt amount and asset (i.e.
- If the HF is above
CLOSE_FACTOR_HF_THRESHOLD, then only a maximum of 50% (i.e.
DEFAULT_LIQUIDATION_CLOSE_FACTOR) of the debt can be liquidated per valid
- If the HF is below
CLOSE_FACTOR_HF_THRESHOLD, then 100% (i.e.
MAX_LIQUIDATION_CLOSE_FACTOR) of the debt can be liquidated in single valid
- You can set the
uint(-1)and the protocol will proceed with the highest possible liquidation allowed by the close factor.
- You must already have sufficient balance of the debt asset, which will be used by the
liquidationCallto pay back the debt. You can use
flashLoanfor liquidations 😉
- Know the collateral asset
collateralAssetyou closing, i.e. the asset that the user has
backingtheir outstanding loan that you will receive as a
- Whether you want to receive aTokens or the underlying asset after a successful
Only user accounts that have HF < 1 can be liquidated. There are multiple ways you can get the health factor:
- 1.To gather user account data from on-chain data, one way would be to monitor emitted events from the protocol and keep an up to date index of user data locally.
- 1.Events are emitted each time a user interacts with the protocol (supply, borrow, repay, withdraw etc.)
- 1.Similarly to the sections above you will need to gather user account data and keep an index of the user data locally.
- 2.SInce GraphQL does not provide real time calculated user data such as
healthFactor,you will need to compute this locally. The easiest way is to use the Aave-utilities sdk, which has methods to compute user summary data.
Once you have the account(s) to liquidate, you will need to calculate the amount of collateral that can be liquidated:
- 2.Max debt that be cleared by single liquidation call is given by the
CLOSE_FACTOR_HF_THRESHOLD < HF < 1) or
HF < CLOSE_FACTOR_HF_THRESHOLD)
debtToCover = (userStableDebt + userVariableDebt) * LiquidationCloseFactor
- 2.You can pass
MAX_UINT, as the
debtToCoverto liquidate the maximum amount allowed.
- 3.Max amount of collateral that can be liquidated to cover debt is given by the current liquidationBonus for the reserves that have
maxAmountOfCollateralToLiquidate = (debtAssetPrice * debtToCover * liquidationBonus)/ collateralPrice
One way to calculate the profitability is the following:
- 1.Store and retrieve each collateral's relevant details such as address, decimals used and liquidation bonus.
- 2.Get the user's collateral balance (aTokenBalance).
- 4.The maximum collateral bonus received on liquidation is given by the
maxAmountOfCollateralToLiquidate * (1 - liquidationBonus) * collateralAssetPriceEth
- 5.The maximum cost of your transaction will be you gas price multiplied by the amount of gas used. You should be able to get a good estimation of the gas amount used by calling
estimateGasvia your web3 provider.
- 6.Your approximate profit will be the value of the collateral bonus (4) minus the cost of your transaction (5).
The health factor is calculated from the user's total collateral, i.e. all reserves for which
usageAsCollateralis enabled, balance (in ETH) multiplied by the liquidation threshold percentage for all the user's outstanding assets, divided by the user's total borrow balance across all reserves (in ETH).
Liquidation bonuses for all the assets are evaluated and determined based on each asset's liquidity risk and updated via Aave Governance process.