深度剖析Qilin Protocol,如何将衍生品引入加密货币长尾资产
原文标题:《Dissecting the Qilin protocol》
原文来源:0xkowloon
原文翻译:0x33,律动BlockBeats
Qilin Protocol 是一种去中心化波动率协议。它的出现始于加密在线聊天平台Codex 上的一群网友。他们在 2020 年首次了解到 DeFi,并找到了将衍生品交易引入加密货币长尾资产的方法,由此诞生了 Qilin Protocol。
Qilin 本质上是一个衍生品交易协议,允许交易员使用杠杆。
其主要特性包括:
▪️ 提供高达 100 倍多头或空头杠杆。
▪️ 流动性提供者可以通过初始基金发行购买流动性份额代币 (LS 代币)。在需要更多流动性之前,流动性池是有上限的。押金是单面使用报价货币 (现金结算)。
▪️ 针对不同风险偏好的流动性提供者,LP 池分为 A 和 B 部分。
▪️ LS 代币是代表 LP 份额的 ERC-20 代币。
▪️ 交易员的多头/空头头寸也被通证化,因此他们的头寸也可交易。
▪️ Rebase 融资利率适用于当持仓规模超过 LP 的阈值时。融资利率被转移给 LP 以对冲流动性风险,直到该比率再次低于阈值。
▪️ 滑点是动态的,取决于持仓的大小。将滑移敏感指数应用于常数积式 x * y = k 计算,将费用转移给 LP 对冲流动性风险。
Tranches 层级
LS 代币可以属于 A 级 (ALP) 或 B 级 (BLP)。
A 级为风险偏好较低的 LP
它具有以下特点:
· 分享 15% LP 利润;
· 无上限限制;
· 未使用的流动性可被存入其他协议以产生收益;
· 当交易对有高未平仓头寸时,可以转换为 BLP。目的是回补未对冲的头寸。当未平仓头寸的规模下降时,这些 BLP 将返回到 A 级
B 级为风险偏好较高的 LP
它具有以下特点:
· 可分得 85% LP 利润;
· 100 万美元上限。考虑到 10% 的多头/空头仓位差,该上限可支撑 1900-2100 万美元的交易量;
· 持仓不同立场交易员头寸。
LS 代币的价格与 LP 的价值成正比。随着 LP 规模从协议活动中增长,代币持有者将有机会获利。
如果 LP 处于亏损状态,则可以折扣低价购买 LS 代币以激励更多的存款。
LS 代币价格= LP 值÷ LS 代币供应量
Rebase 资金率
通过每 8 小时检查多头和空头头寸的不平衡比例来计算偏差率。如果利率高于失衡阈值,则触发 rebase 资金利率,并将费用转移到 LP。
https://image.theblockbeats.com/upload/2021-07-04/913cff688d63eb03d340bb9260554e29f9550a56.png
滑点动态算法
滑动敏感指数衡量的是未平仓头寸对流动性的风险。指数越小,下滑幅度越大。这是因为指数将乘以常数 k, k 越小,流动性就越低。随着未对冲头寸规模的增长,需要出现更大的下滑,以缩小失衡。大量未对冲的头寸会导致资金损失。
https://image.theblockbeats.com/upload/2021-07-04/4e720db3ba7dacdf047875aa6173eded4f3a8205.png
代码库
Qilin 主要的入口点是 Fluidity.sol 和 Exchange.sol。LP 们可以通过 Fluidity.sol 提供流动性,并且在 FundToken.sol. 中铸造和销毁 LS 代币。交易者可以通过 Exchange.sol. 来建立或者关闭头寸。清算人可以通过 Liquidation.sol 完成平仓。
整个协议的数据存储在 Depot.sol 中,所有者可以在 SystemSetting.sol 中修改协议的配置。我们将查看 ETH-USDC 池的生命周期。
初始化一个资金
Fluidity #initialFunding 为了初始化一个流动性池,必须调用资金。它检查系统是否活跃,初始资金是否完整,LS 代币的总供应量在最大初始流动性资金范围内,然后向存储库添加流动性,将 LP 的 USDC 转移到池中并铸造 LS 代币。
在初始融资期间,USDC 和 LS 代币之间的汇率是 1:1。存储库地址通过 AddressResolver#importAddresses 导入流动性合约。
https://image.theblockbeats.com/upload/2021-07-04/a61ff6d352cebe2f87819fe7cd8b5af3f6aec2e5.png
一旦达到初始资金上限,就可以通过调用流动性 #closeInitialFunding 来关闭该基金。它将 Depot 中的_initialFundingCompleted 标志设置为 true。
https://image.theblockbeats.com/upload/2021-07-04/b39d7db40383c982d8e46ceff95389168391e62b.png
增加流动性
初始融资阶段结束后,LP 可以通过调用流动性 #fundLiquidity 来为流动性池提供资金。它的行为类似于 initialFunding,除了它要求融资期是完整的,而且汇率不再是 1:1。
https://image.theblockbeats.com/upload/2021-07-04/34b85a599cf16b6f7b1717a23db1e1a995c28d44.png
LS 代币的价格等于流动性池的 USDC 价值除以 LS 代币总供应量。
https://image.theblockbeats.com/upload/2021-07-04/a8d670f028dc0b17df36d5af7dc9b30eb15e645b.png
池中的新 USDC 值不能超过存储库中总仓位规模的保证金比率。
https://image.theblockbeats.com/upload/2021-07-04/a019b1a38be87ddd935e8c66d00df9ada7e6d5f9.png
建立杠杆多头头寸
交易者可以通过调用 Exchange#openPosition 来建立杠杆头寸。
杠杆水平必须在被允许水平范围内,而头寸规模必须大于最低保证金金额。
https://image.theblockbeats.com/upload/2021-07-04/3c8fd6a122db21dfbe7678d582c11a61b1a2901b.png
长线方向是 1 短线方向是 2。
https://image.theblockbeats.com/upload/2021-07-04/9cf61078fac3bb0f96931f9b3212397c473ba735.png
交易所从 ExchangeRate 合约中获得现货价格,然后将其用作持仓的开盘价。这个价格是可从预言机获取。
https://image.theblockbeats.com/upload/2021-07-04/0ffed0f01283a07b130dcbcbfdb0e874365c5e77.png
交易所在存储库开一个新仓位,保证金从交易员处转移到存储库,并计算交易员的份额和规模。
如果:
1 ETH = 2,500 USDC
保证金 = 5,000 USD
杠杆 = 100x
池中多头总杠杆=100,000,000 USDC
多头总份额=100
那么你的:
杠杆位置=500,000 USDC
净值=100,000,000 ÷ 100 = 1,000,000 (净值是每份额的杠杆头寸)
份额= 5,000 ÷ 1,000,000 = 0.005
大小= 5,000 ÷ 2,500 = 2
https://image.theblockbeats.com/upload/2021-07-04/fa178bbbaad4b2db5fa13c3b2e747bf2c12655b0.png
它将交易员的头寸添加到存储库的摘要中,并将一条新的头寸记录添加到存储库中。
https://image.theblockbeats.com/upload/2021-07-04/ba65d477e0fb54bfb84c9d858b8740b562cbb6fb.png
检查头寸清算状态
交易者的头寸状态可以通过呼叫清算 Liquidation#alertLiquidation 来检查。
它检索头寸的 PnL,然后在 (加利润/扣除损失) 和扣除服务费和保证金损失后,检查头寸的最低保证金比率是否保持不变。
如果系统有一个平仓费,那么就有一个服务费,这是交易员的杠杆头寸乘以平仓费百分比。
https://image.theblockbeats.com/upload/2021-07-04/796e2d983b06109b2a2e640735ffa9154624d97a.png
计算净利润
交易员的净利润可以通过调用 Depot#calNetProfit 来获取。如果现货价格高于多头头寸的未平仓价格,或者现货价格低于空头头寸的未平仓价格,交易者就获利了。净利润是杠杆头寸乘以价差除以公开价格。
https://image.theblockbeats.com/upload/2021-07-04/5069ac96ccbaff5a1c2fb36e6b49701119fd344c.png
如果当前 ETH 价格为 3000 USDC,则净利润为
https://image.theblockbeats.com/upload/2021-07-04/9203e35e910fc127cf9a07c7dc302af2924cf7da.png
计算利润损失
交易员的利润损失可以通过调用 Depot#calMarginLoss 来弥补。保证金损失不能超过交易员的杠杆头寸 (这意味着它可以是 0,但不可为负)。它等于交易员的杠杆头寸减去他的份额净值。
https://image.theblockbeats.com/upload/2021-07-04/9139a66449fb2c429f042a2625ed440ff65a146a.png
根据上述数据,利润损失将为
https://image.theblockbeats.com/upload/2021-07-04/a93461519d80fce1c2def726b5c03b4766ad3c58.png
比较保证金价值与保证金比率
如果保证金+利润/亏损大于服务费+保证金损失,则检查金额是否小于保证金的最小比例。否则,不进行检查,因为该头寸实际上已经被清算 (参见 Liquidation#alertBankruptedLiquidation)。
https://image.theblockbeats.com/upload/2021-07-04/44c2d70c40389ecc1df002ea36d347869c1cbc1f.png
增加现有多头头寸的利润率
如果一个交易员的保证金低于协议的保证金比率要求,他就需要补充保证金。否则,他将面临被清算的风险。这可以通过调用 Exchange#addDeposit 来实现。
额外的保证金必须超过系统的最低附加存储要求。
https://image.theblockbeats.com/upload/2021-07-04/eee8c31ade3663bbd24e09b83adf1543d158761b.png
一旦需求明确,它将额外的保证金转移到仓库,并更新仓库的摘要。
https://image.theblockbeats.com/upload/2021-07-04/7a98ce31b0745fa1c96eaf624c4b081b9f2c806d.png
平仓
拥有超过最小 LS 代币要求的 LP 有权通过调用 Liquidation#liquidate 来清算的头寸。
首先要检查的是 msg.sender 有足够的 LS 代币来享受此权利。
https://image.theblockbeats.com/upload/2021-07-04/d34ba590dcf26dbf71c33377447065e0e9c69f2c.png
随后合约将计算清算的服务费,利润损失和 PnL。公式与 Liquidation#alertLiquidation 相同。
https://image.theblockbeats.com/upload/2021-07-04/8146c5095052c31d5a41320092bb19459d73d8b1.png
利润 (+利润或-亏损) 必须包括服务费和利润损失。否则该头寸不能被清算 (必须通过调用 Liquidation#alertBankruptedLiquidation 清算)。
https://image.theblockbeats.com/upload/2021-07-04/bf66b37946aaa73e5584c219af88ab6e0e0cc785.png
最后的保证金在考虑了所有变量后必须低于最低保证金比率的要求,否则无法完成清算。
https://image.theblockbeats.com/upload/2021-07-04/1c6ccc7924b0c8b8eeca1cc518e3a7db724b8a07.png
清算奖励为扣除服务费和利润损失后的利润 (+利润或-亏损)
https://image.theblockbeats.com/upload/2021-07-04/81528657e77064af9ff8f3e109c94db7b7d2fc11.png
合约随后更新存储库摘要内容。
首先,它更新了流动性池。
· 这笔费用被添加到流动性池中。
· 如果头寸是盈利的,从流动性池中扣除利润。
· 如果头寸不赚钱,就把损失加到流动性池中。
· 从流动性池中扣除任何 (保证金损失-头寸保证金,最小为 0)。
https://image.theblockbeats.com/upload/2021-07-04/140a55200b39fe87bfd1459361f5bdf2b724af97.png
总保证金增加了 (保证金损失-头寸保证金)。
https://image.theblockbeats.com/upload/2021-07-04/aa5afb7e8272f014b57227567cf6a4078c44bde9.png
总杠杆头寸减少了该头寸的份额价值,这些份额被移除。
https://image.theblockbeats.com/upload/2021-07-04/2300c8a02d839a76992ffdeb31d975a4a9932646.png
总规模由持仓规模因为头寸开仓位置乘以剩余 rebase 利率 (考虑到持仓与平仓之间的资金利率变化) 而有所减少。
https://image.theblockbeats.com/upload/2021-07-04/2792bc315e439999e6a6c9cee14517c1e4825e02.png
最后,将清算报酬转移给清算人,并删除该头寸。
https://image.theblockbeats.com/upload/2021-07-04/8686ceadc981525e44c4601bc3d96f46449ab895.png
清算破产头寸
Liquidation#bankruptedLiquidate 没有太多特别的清算步骤,其清算操作类似于正常清算。关键的区别是
1. 保证金 (+利润或-亏损) 必须不足以弥补服务费和保证金损失。
2. 在该情况下,清算报酬被清算费用取代,因为该头寸无法产生报酬,报酬等于该头寸的保证金乘以清算费用的百分比。
https://image.theblockbeats.com/upload/2021-07-04/8b95d7c0babd852396bdb6e506f3d2a8cf75ff30.png
新池的流动性就是以当前池的流动性+/-保证金与保证金损失之差,再减去清算费。
https://image.theblockbeats.com/upload/2021-07-04/46bad3e585d1b4f53b9e1d4f38fca50e6f62a3e5.png
平仓多头头寸
交易者可以通过调用 Exchange#closePosition 来平仓。
它得到持仓的份额价值 (相同公式)、服务费 (相同公式) 和利润率损失 (杠杆头寸-份额价值)。
https://image.theblockbeats.com/upload/2021-07-04/0768da9de2386c3dadf0294dceb75cc08defac58.png
无论这个头寸是否盈利,它都不会清算。
https://image.theblockbeats.com/upload/2021-07-04/9cc12342452040625f8b8388379ee9a377d04812.png
转回给交易员的资产价值等同于保证金 (+利润或-损失) 减去费用和保证金损失。如果该值大于流动性池 (+保证金) 所能覆盖的范围,则将其设置为后一个值。
USDC 正在被转回给交易员。
它与清算基本相同,除了新的流动性池价值是流动性池价值加上费用 (+交易员损失或-交易员利润)。
Rebasing 多头池
rebase 每 8 小时发生一次,可以通过调用 Exchange#rebase 来完成。在这里只讨论关键逻辑。setting.rebaseInterval 时间周期必须已经运行。
通过重新计算 rebaseLeft(rebase 资金利率)交易所更新新的 rebase 时间和存储库的状态。
在存储库内,总利润,总杠杆头寸以及总份额被再 rebase 的资金利率扣除,以便将资金转移到流动性池。
总结
Qilin 在其衍生品交易协议中实现了对等池模型。它通过定期调整基准和应用滑点动态敏感性指数,积极试图保护其流动性提供者免受未对冲头寸的影响。 它还允许流动性提供者通过加入不同的 LP 部分来选择他们愿意承担的风险。它是现有衍生品协议的竞争产品。
原文链接