为Aave DeFi协议创建清算脚本

免责声明:这篇文章的内容仅供参考,不能视为投资建议。所有测试均在测试环境中进行,因此并不代表投资操作。创建的软件仅用于教育目的,并且可能包含错误,使用时需您自担风险。
简介
在这篇文章中,我们将了解Aave协议中贷款的清算过程,以及如何创建一个能够支付贷款的脚本。为此,我们将在测试环境中提供贷款并使其负债,以偿还部分债务。
Aave清算
Aave是一个DeFi去中心化贷款协议,您可以在各种加密资产中申请贷款,将其他资产作为抵押品。

在此协议中,使用“健康系数”指标衡量用户的健康状况,该指标显示用户相对于所请求贷款的抵押状态。该数据的计算如下:

如果您不喜欢数学,我们可以以更加图形化的方式查看它,就像是一个比例表一样,其中ETH抵押品的总和与所要求的贷款价格之间的清算保证金相平衡。

这样必须确保抵押部分比贷款部分重,以免使余额不平衡。
什么会导致平衡变得不平衡?
· 抵押品贬值:如果我们把一种失去价值的货币作为担保,它将使我们陷入债务。
· 本金升值:这可能有两个原因,一个是收取利息,导致本金升值。除此之外,货币对以太坊的价格可能会上涨,而且由于贷款以以以太坊计价,我们的本金价值可能会超过抵押品的价值。
当债务大于剩余的抵押物准备金时,用户的健康系数的值将降至1以下,此时清算人可以偿还部分债务,并从中扣除抵押品,并对其进行折价,这鼓励清算人采取以下行动:清算。
使用协议的实际案例
为了得到一个小于1的健康系数,我将在Aave testnet上申请一笔贷款,风险可能最高,使用的加密资产利息最高,这样我就能尽快负债。
我要做的第一件事是存入我将用作抵押品的加密资产,在这种情况下是ETH。

然后,我要申请一笔贷款,看看哪一个利息最高,我发现这是TUSD

因此,我申请贷款,但只用我已存入抵押品的50%。

这意味着,由于我存入的资金非常多,因此仍然保留了很高的健康系数。

为了不必长时间等待,我将增加我的风险,提取账户中剩余的所有可能的抵押品:

这让我加快负债

现在,您所要做的就是等待将健康系数降至1以下。
准备清算
虽然贷款利息使我的健康因数降低了1,但我们将创建脚本来进行付款。在Aave网页上有一个基本模型,以及该过程的概述,但是在我的测试中,启动事务时,我做了一些“还原”操作,这使我创建了一个集成测试,可以评估这些条件以了解脚本 是正确的。
要运行测试,我们需要以下输入数据:
const collateralAddress = “0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee” //Collateral address of the user that we want to liquidate
   const reserveAddress = “0xf80a32a835f79d7787e8a8ee5721d0feafd78108” //Reserve address that we are going to pay for ERC20 token
   const userLiquidated = “0xe4509F2ce63DED82e74e9e7E648c1A69e90cD2C4” //User that we are going to liquidate
   const purchaseAmount = 10 //Amount of the reserve that we are going to liquidate
· 我想在还清贷款时想要得到的抵押地址,在这种情况下,我想得到ETH,可以在这里找到这些地址。
· 储备金地址:我将要支付以清算债务的加密资产的地址是您的ERC20合约的地址。
· 我要清算的用户。
· 要清算的金额,以贷款令牌表示。
有了这些数据,将执行测试,该测试将直接调用Ropsten测试网的合约并验证条件是否满足,就像智能合约在调用LiquidationCall函数时所做的方式一样,但是当仅进行调用时,我们避免还原,我们知道错误的原因。实现它们的代码是:
it(‘should get the latest LendingPoolCore address’, async () => {
       lpCoreAddress = await getLpCoreAddress(lpAddressProviderContract)
       expect(lpCoreAddress).contains(‘0x’)
   });

   it(‘should Get the latest LendingPool contract address’, async () => {
       lpAddress = await getLendingPoolAddress(lpAddressProviderContract)
       expect(lpAddress).contains(‘0x’)
   });
   it(‘Should Get the lpContract’, async () => {
       lpContract = await new web3.eth.Contract(LendingPoolABI, lpAddress)
       expect(lpContract._address).contains(‘0x’)
   });
   it(‘Should Get the lpCoreContract’, async () => {
       lpCoreContract = await new web3.eth.Contract(LendingPoolCoreABI, lpCoreAddress)
       expect(lpCoreContract._address).contains(‘0x’)
   });
   it(‘Should have health factor below 1’, async () => {
       const userData = await getUserAccountData(lpContract, userLiquidated);
       expect(convertUnits(userData.healthFactor)).lessThan(1)
   })
   it(‘Should have collateral enabled’, async () => {
       const userReserveData = await getUserReserveData(lpContract, collateralAddress, userLiquidated);
       expect(userReserveData.usageAsCollateralEnabled).to.be.true
   })
   it(‘Should have collateral deposited’, async () => {
       const userCollateralBalance = await getUserUnderlyingAssetBalance(
           lpCoreContract,
           collateralAddress,
           userLiquidated);
       expect(Number(userCollateralBalance)).to.be.greaterThan(0)
   })
   it(‘Should have enough reseve borrowed’, async () => {
       const LIQUIDATION_CLOSE_FACTOR_PERCENT = 0.5
       const userBorrows = await getUserBorrowBalances(
           lpCoreContract,
           reserveAddress,
           userLiquidated);
       const userCompoundedBorrowBalance = convertUnits(userBorrows[1])
       expect(userCompoundedBorrowBalance * LIQUIDATION_CLOSE_FACTOR_PERCENT)
           .to.be.greaterThan(Number(purchaseAmount))
   })
如果我们现在尝试运行它们,请运行
npm test
由于不满足至少一个条件,它应该返回一个错误:

如我们所见,验证我帐户的健康因子小于1的测试失败,表明该交易将无法正确执行,如果不满足任何其他条件,则同样会发生。
还清部分贷款
过了一会儿,从贷款中扣除的利息使我的债务变得越来越多,而我的抵押品所承担的债务却越来越少,直到我的健康系数低于这一水平为止,现在清算人可以清算。
如果现在运行测试,我们将看到:

它告诉我们条件已经满足,所以我们运行应用程序,这样,现在是的,调用LiquidationCall函数并清算贷款的一部分
npm start
当执行交易时,我们看到贷款减少了我们调用该函数的金额,这可以由监视所有用户健康因素并以折价购买抵押品的任何清算人来完成清算。