清算
本指南将逐步介绍如何在 金星 协议上执行清算。清算是指从抵押不足的账户中扣押抵押品以偿还未偿债务。本指南主要面向旨在自动化清算流程的开发者或机器人。
账户流动性计算
金星 协议使用两种计算方法来确定账户流动性:抵押因子 (CF) 和清算阈值 (LT)。
抵押因子 (CF)
抵押因子是指可用于偿还贷款的资金百分比。核心池中的 Comptroller.getAccountLiquidity 和独立池中的 Comptroller.getBorrowingPower 会返回账户的流动性。它们使用 Resilient Oracle 来检索资产价值和市场抵押因子,从而确定可用于抵押的资金百分比。仅依靠 getBorrowingPower 不足以识别独立池中需要清算的账户。
清算阈值 (LT)
清算阈值 (LT) 表示账户抵押不足,触发清算的临界点。在核心池中,LT 与抵押因子相同。在独立池中,可以使用 Comptroller.getAccountLiquidity 获取 LT。
清算人通常使用外部监控系统或其他策略来准确识别抵押不足的账户。
通过结合这些函数获取的信息,可以准确识别适合清算的抵押不足账户。
最低可清算抵押品
Comptroller.minLiquidatableCollateral 变量表示常规(非批量)清算所需的最低抵押品金额(以美元计)。抵押品低于此阈值的账户可能不符合非批量清算的条件。该值以美元为单位(小数点后 18 位)。
查找抵押不足的账户
执行清算的第一步是识别抵押不足的账户。以下是查找抵押不足账户的建议方法:
创建账户余额记录:为了高效地识别抵押不足的账户,清算人可以通过索引市场事件来维护账户和余额的链下映射,从而检测新的仓位并更新现有仓位:
Mint:代币铸造时触发的事件。Redeem:代币赎回时触发的事件。Borrow:基础资产借入时触发的事件。RepayBorrow:借款偿还时触发的事件。通过监听这些事件,清算人可以跟踪仓位变化并相应地更新用户余额。
建议使用子图来索引这些事件。
获取账户余额:使用 PoolLens(核心池上的 VenusLens)提供的
vTokenBalancesAll函数来检索与账户关联的多个 vToken 的供应量和借款余额。此函数接受一个 vToken 数组和账户地址作为参数。获取底层资产价格:使用 PoolLens(核心池上的 VenusLens)提供的
vTokenUnderlyingPriceAll函数来获取多个 vToken 的底层资产价格。此函数接受一个 vToken 数组作为参数。计算流动性缺口:利用步骤 2 中获得的供应量和借款余额,以及步骤 3 中获得的底层资产价格,计算每个账户的流动性缺口。这可以通过计算余额和价格的标量积,并将其与 LT 值进行比较来实现。
通过这种方法,您可以根据 CF 和 LT 的计算结果有效地识别抵押不足的账户。
请注意,上述函数由 PoolLens 提供,可能需要集成到您的清算机器人中。此外,请务必关注 Venus Protocol 的任何变更或更新,这些变更或更新可能会影响查找抵押不足账户的过程。
执行清算
一旦识别出抵押不足的账户,即可使用 liquidateBorrow、liquidateAccount 或 healAccount 函数启动清算流程。liquidateBorrow 由相关的 vToken 合约(核心池上的清算人合约)提供,而 liquidateAccount 和 healAccount 由 Comptroller 提供。以下是相关步骤概述:
请注意,healAccount 是清算机制的扩展,用于处理坏账并用协议收入/费用进行抵消。另一方面,liquidateAccount 允许在单个交易中批量清算。在这两种情况下,总抵押品都必须低于阈值 Comptroller.minLiquidatableCollateral。这两个函数仅在独立池中可用。对于核心池,由“清算人”合约提供的 liquidateBorrow 函数是执行清算的唯一可用机制。
计算清算金额:确定待偿还的债务金额和待扣押的抵押品。这通常通过检查借款人的债务余额、市场抵押品系数以及任何折扣或清算激励措施来计算。
执行清算时,可以根据账户的抵押品、最低可清算抵押品和偿付能力调用三种不同的清算类型:
抵押品 >
minLiquidatableCollateral-->liquidateBorrow():在相关的 vToken 合约上调用liquidateBorrow函数。此函数需要几个参数,包括借款人的地址、清算人的地址、待偿还的债务金额和待扣押的抵押品。请参阅 vToken 合约文档,了解该函数所需参数的具体细节。
抵押品金额小于最小可清算抵押品金额且账户有偿付能力 -->
liquidateAccount():此函数清算借款人的所有借款。
抵押品 < 最低可清算抵押品且账户无偿付能力 -->
healAccount()函数:此函数将从借款人处扣押所有剩余抵押品,要求发起清算的人员(msg.sender)偿还借款人现有债务,并将任何剩余债务视为坏账。发送方必须偿还一定比例的债务,计算公式为抵押品 / (借款 * 清算激励)
处理清算结果:调用
liquidateBorrow函数后,监控交易是否成功,并处理任何由此产生的事件或错误。清算成功后,被扣押的抵押品将转移至清算人的地址,并从借款人的账户中偿还债务。
请注意,清算过程涉及复杂的计算,需要对 Venus 协议有深入的了解。在将清算机器人部署到生产环境之前,务必对其进行彻底的测试和验证。此外,请密切关注 Venus 协议的任何变更或更新,这些变更或更新可能会影响清算过程。
强制清算
通常情况下,账户只有在抵押不足的情况下才有资格被清算,如前几节所述。但如果某个市场或市场中的某个账户启用了“强制清算”功能,则情况有所不同。在这种情况下,即使账户的健康度大于 1(即账户抵押充足),该市场中的借款头寸也可能被清算。此外,关闭因子检查将被忽略,允许在一次交易中清算 100% 的债务。
此功能基于 Compound V2 的实现此处。Compound V2 允许在抵押因子为零、储备因子为 100% 且借款暂停时对市场进行“强制清算”。Venus 定义了一个功能标志来启用/禁用“强制清算”,该标志可直接通过 VIP 配置,而非基于其他参数。Compound 社区在此帖中讨论了此功能。
在 Venus 中,强制清算可以针对整个市场启用(市场中的所有借款头寸都将被强制清算),也可以针对市场中的单个账户启用(仅特定账户的借款可以在市场中被强制清算)。
要检查整个市场是否启用强制清算,可以调用资金池的 Comptroller 合约中的 Comptroller.isForcedLiquidationEnabled(address vToken) 函数,并传入市场地址。要检查市场中单个账户是否启用强制清算,可以使用 Comptroller.isForcedLiquidationEnabledForUser(address borrower, address vToken) 函数,并将账户地址和市场地址作为参数传入。
强制优先清算 VAI 债务
此功能已禁用。清算人需要修改其代码库,以便在存在 VAI 债务时考虑强制清算顺序。在主要清算人确认已修改代码后,我们将提出 VIP 请求以启用此功能。
在前文中,清算是对所有账户进行的,不考虑具体的 VAI 债务金额。forceVAILiquidate 功能通过强制清算 VAI 债务超过 minLiquidatableVAI 的借款人来增强清算流程。强制清算 VAI 债务有助于协议更好地管理风险,并防止因 VAI 债务过度累积而造成的潜在损失。
对于有未偿 VAI 债务的借款人,强制清算 VAI 首先会进行检查,以确保只有符合条件的账户才会被清算,然后再启动清算流程。
检查
检查 Comptroller 中 VAI 清算是否未暂停。
forceVAILiquidate 标志是否设置为 true。
验证借款人的 VAI 债务是否大于可清算 VAI 的最低金额(初始值为 1,000 VAI)。
如果以上条件均满足,则协议会检查当前用于清算的 vToken 是否为 VAI,否则清算失败。
自动收益分配
在核心池中,清算收益以 vToken 的形式转移至清算人合约。在清算交易期间,清算人合约将尝试用 vToken 兑换协议在清算激励中所占的份额,以换取相应的底层代币。如果兑换成功,底层代币将被发送至 ProtocolShareReserve 合约。但是,如果兑换失败,底层代币将被添加到待赎回列表中,清算人合约将在后续的清算交易中再次尝试赎回这些待赎回的代币。
分配扣押金额
扣押的抵押品将在清算人和 ProtocolShareReserve 合约之间进行分配:
清算人份额:
清算人将获得指定份额的抵押品作为激励。
ProtocolShareReserve合约份额:
剩余的抵押品将发送至
ProtocolShareReserve合约。
转换(如适用):
BNB:
如果扣押的抵押品是 BNB,则在发送至
ProtocolShareReserve合约之前,会将其转换为 Wrapped BNB (wBNB)。其他 VToken:
对于其他 VToken,其底层代币将被赎回并转移至
ProtocolShareReserve合约。
赎回处理
清算人合约会尝试以底层代币的形式赎回协议在 VToken 清算激励中所占的份额:
赎回成功:
如果赎回成功,则底层代币将被发送至
ProtocolShareReserve合约。
赎回失败:
如果由于流动性不足或其他原因导致赎回失败,则代表待赎回的 VToken 将被添加到列表中以供后续处理。
待赎回管理
后续清算交易将利用待赎回列表:在每次清算期间,清算人合约会尝试将待赎回的 VToken 兑换为其底层代币,并将这些底层代币发送到 ProtocolShareReserve 合约。
Last updated