AAVE 是一個DeFi 去中心化貸款協議,人們可以使用多種加密資產作為抵押,向其申請貸款。目前能夠作為抵押資產的加密資產包括ETH、DAI、USDT、LINK 等十幾種。

作為一個貸款協議,系統本身運行健康與否很大程度上取決於使用該協議進行的各種貸款是否健康。當所有的借款人都有足夠的抵押品抵押時,整個系統擁有足夠的償還能力,系統是健康的;而一旦有借款人抵押不足時,整個系統就會增加風險,而一旦這樣的借款人過多,整個系統的風險將進一步擴大。因此系統中需要清算人這一角色。清算人對不太健康的借貸(健康係數<1)進行清算,並為此獲得抵押物總價值5%-15%的獎勵。該獎勵措施能夠鼓勵清算人及時清算不健康的貸款,從而保障整個系統的金融安全。

清算人參與清算有三種方式:

使用AAVE 應用程序中的清算模塊:https://app.aave.com/liquidations直接調用智能合約中的liquidationCall() 方法創建自己的自動化系統或者機器人來對貸款進行清算

鑑於方法一較為簡單,按照應用內提示進行操作即可,本文重點討論後兩種。其中方法三也使用到了二的方法,即調用了智能合約中的liquidationCall()。

觸發清算的先決條件

在調用liquidationCall() 方法時,我們需要知道幾個條件:

健康因素低於1的賬戶。只有健康因素低於1的賬戶才會被清算。其中健康因素的計算方式為:

其中:

- Collateral[i] in ETH: 折合成ETH 計算的抵押的資產i的值

- Liquidation Threshold[i]: 清算閾值,最大借出資產/總抵押資產

- Total Borrows in ETH: 折合成ETH 的借出的資產額度

- Total Fees in ETH: 折合成ETH 計算的所有費用

AAVE 採用的是Chainlink 的餵價機制。

公式可總結為:健康因子與抵押物總和成正比,與借出物總額成反比。抵押物越多,健康因子越大,借款人償付能力越強,該筆借貸越健康。反之借出物越多,健康因子分母越大,值越小,則表示借款人償付能力越低,該筆借貸越不健康。只有健康因子低於1的賬戶才會被清算。

有了低於1的健康因子就可以觸發清算條件。要清算某條具體的貸款,還需要知道該筆貸款的借款人地址、貸款金額和資產金額,確保自己有足夠的餘額幫助貸款人償還債務。

要被清算的賬戶

只有健康係數低於1的賬戶才會被清算。有多種方式可以獲到用戶的健康係數:

使用鏈上監控

i. 監控AAVE 協議發出的時間,並在本地保持用戶數據的最新狀態。每當用戶和AAVE 協議進行交互時(存款、還款、借用等),都會發出時間,這可以在鏈上監控到;

ii. 監控到用戶地址後,就可以使用該用戶的地址,在鏈上調用直接調用查詢接口即可查詢到getUserReserveData()。

使用項目方的API 進行查詢(稍有延遲)

項目方提供了查詢的API:https://protocol-api.aave.com/liquidations?get=proto

執行清算

查詢到要清算的賬戶後,我們就能計算可以清算的抵押物的數量。執行清算一般有兩種方法:

編寫一個智能合約,在智能合約中直接調用AAVE 中的liquidationCall() 執行清算使用Web3.js 等軟件包進行調用

此處以web3.js 為例:

// Import the ABIs,see:https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesimport DaiTokenABIfrom "./DAItoken.json"importLendingPoolAddressesProviderABI from"./LendingPoolAddressesProvider.json"importLendingPoolABI from "./LendingPool.json"// ... The rest ofyour code ...// Input variablesconstcollateralAddress = "THE_COLLATERAL_ASSET_ADDRESS"constdaiAmountInWei = web3.utils.toWei("1000","ether").toString()const daiAddress = "0x6B175474E89094C44Da98b954EedeAC495271d0F" // mainnet DAIconst user ="USER_ACCOUNT"constreceiveATokens = trueconstlpAddressProviderAddress = "0x24a42fD28C976A61Df5D00D0599C34c4f90748c8" //mainnetconst lpAddressProviderContract= new web3.eth.Contract(LendingPoolAddressesProviderABI,lpAddressProviderAddress)// Get the latestLendingPoolCore addressconst lpCoreAddress= await lpAddressProviderContract.methods.getLendingPoolCore( ).call().catch((e) => {throw Error(`Errorgetting lendingPool address: ${e.message}`)})// Approve theLendingPoolCore address with the DAI contractconst daiContract =new web3.eth.Contract( DAITokenABI, daiAddress)awaitdaiContract.methods.approve(lpCoreAddress,daiAmountInWei).send().catch((e) => {throw Error(`Errorapproving DAI allowance: ${e.message}`)})// Get the latestLendingPool contract addressconst lpAddress =await lpAddressProviderContract.methods.getLendingPool().call().catch((e) => {throw Error(`Errorgetting lendingPool address: ${e.message}`)})// Make the deposittransaction via LendingPool contractconst lpContract =new web3.eth.Contract(LendingPoolABI, lpAddress)awaitlpContract.methods.liquidationCall(collateralAddress,daiAddress,user,daiAmountInWei,receiveATokens,).send().catch((e) => {throw Error(`Errorliquidating user with error: ${e.message}`)})

(編輯註:此處代碼不完整,請查閱更多內容)

設置一個清算機器人

以上即為清算的邏輯,在設計清算機器人時,按照以下步驟即可:

清算前需要計算,確保機器人自己有足夠的資金能幫貸款人還清債務,也要計算能夠獲得足夠的資金作為報償;考慮清算最有利可圖的抵押品,不僅要考慮到貸款債務的金額,還需要把gas 的成本計算在內,以此判斷是否有足夠的獲利能力;確保機器人訪問的是最新版本的AAVE 協議;其他系統故障和資產安全等。

計算收益

獲取抵押品的詳細信息,例如抵押的用戶、清算獎勵比率等獲取抵押品的數量,並從預言機中獲取到抵押品當前的總價值

最大清算獎勵=抵押品總價值*清算獎勵比例計算交易需要的gas 費用最大獲利=最大清算獎勵減去gas 費用

清算獎勵比例根據幣種的不同而有所變化,一般來說,穩定幣清算獎勵相對較低,非穩定幣價格則更高。