收益代币化协议:Pendle 如何实现

Pendle 是一种模块化的收益代币化协议,它将 yield-bearing 资产拆分为本金代币(PT)和收益代币(YT),用户可以在 AMM 池中交易这两种代币。PT代表本金,到期时可赎回,YT代表收益,可以随时兑换为基础收益。该协议通过SY标准化了不同DeFi协议的收益代币,实现了收益交易、风险管理和复杂的固定收益交易策略,并包含AMM、预言机、路由等模块。

简介

Pendle 是一个模块化的收益代币化协议,允许用户将其收益代币化并在二级市场进行操作。Pendle 的主要思想是将计息资产分为两部分:“本金”和“收益”,其中本金部分锁定在协议中直到到期日,而收益部分可以随时自由转换为基础收益。 本金和收益两部分都被代币化,并且可以在协议为每种类型的收益创建的 AMM 池中进行交易,例如质押奖励(例如:stETH)、借贷协议中的供应奖励(例如:cToken)、激励奖励(CRV+CVX)和其他形式的收益。 这种方法可以实现各种有趣的策略,允许用户不仅交易计息资产,还交易“估计收益”,出售递减的收益并购买递增的收益。这些市场的一个重要特征是本金资产的低风险,所有风险都仅限于收益方面。

让我们来探讨一下这是如何运作的。

更高级别的概述

Pendle 上的每个计息策略(例如,向借贷协议提供资产)都有自己的一组两个代币:

  • 本金代币 (PT),代表投入该策略的资产本金金额。
  • 收益代币 (YT),代表所选策略产生的收益。

在所有情况下,PT_amount = YT_amount。另一个重要的不变式是 SY_value = PT_value + YT_value,突出表明 PT 和 YT 代币代表了底层资产的互补部分。随着市场接近到期日(此时 PT 代币变得完全可赎回,而 YT 代币停止接收收益),PT 代币的价值增加,而 YT 代币的价值减少。这在代码这里 here这里 here 进行了演示,表明 PT 和 YT 利率取决于 market.expiry - blockTime。

PT 和 YT 代币提供了与本金和收益部分交互的灵活方式,通过利用几乎所有现代 DeFi 项目的代币进行收益代币化,从而支持单一 YT 的多种奖励代币。当用户将计息资产(例如 stETH、cUSDT、yvUSDC)存入 Pendle 时,他们会收到等量的 PT 和 YT 代币,然后可以独立交易。由于 DeFi 项目的 APY 是动态的,因此这种机制可以为 YT 代币创建一个独特的市场,该市场基于收益估算而不是简单的代币价格运作。

DeFi 协议中不同类型的收益需要不同的方法。一些协议使用可重新设定的代币,例如 stETH(来自 Lido)或 aTokens(来自 Aave),另一些协议依赖于外部利率,例如 cTokens(来自 Compound)或 wstETH(来自 Lido)。有些协议具有由用户活动驱动的可变行为,例如 CRV/CVX(来自 Curve/Convex),而另一些协议则从外部收益策略中获取代币,例如 yvUSDC(来自 Yearn)。在这些不同的情况下实施 PT 和 YT 需要一个统一的收益代币化标准,该标准在 Pendle 的标准化收益 whitepaper 中进行了概述。该标准允许像 stETH、cDAI 和 yvUSDC 这样的代币被包装成 SY-stETH、SY-cDAI 和 SY-yvUSDC 代币,并在 Pendle 协议中进行标准化操作。

当创建一个新的 SY(标准化收益)实例时,Pendle 会启动一个 AMM,该 AMM 可以交易相应市场的 PT 和 YT 代币,从而使收益从一开始就可以进行交易。让我们用一个例子来说明这一点:

• Alice 将 100 SY 代币化,并收到 100 PT + 100 YT。

• Alice 在市场上将她的 100 YT 出售给 Bob。

• Bob 现在持有 100 YT,而 Alice 保留 100 PT。

ᅠ◦ 该系统总共持有 100 PT 和 100 YT。

• Bob 通过市场“赎回”他的 YT 以获得 SY:

ᅠ◦ 市场使用其可用的 PT 来匹配 Bob 的 YT。

ᅠ◦ 该对 (PT + YT) 被赎回为 SY。

ᅠ◦ Bob 收到 SY(减去费用)。

ᅠ◦ PT + YT 的总供应量减少相同的数量。

AMM 确保任何赎回的 YT 都与系统中等量的 PT 相匹配,从而保持全局供应不变。

总而言之,尽管用户可以单独交易 PT 和 YT 代币,但该协议确保代币销毁始终保持两者之间的平衡。

让我们检查一下这是如何实现的。

MarketFactory

让我们从在 PendleMarketFactoryV3.sol 中创建一个新市场开始。每个市场的核心是 PT 代币,它被 utilized 作为市场的主要 “identifier”(映射中的 PT 键)。

当创建一个新的 SY 实例时,遇到的一个关键参数是 scalarRoot。此参数在“塑造”市场行为方面起着重要作用,影响价格影响和套利效率等因素。底层概念是,在未来日期承诺的资产今天的价值较低,从而产生折扣,该折扣定义了 PT 价格(相对于 YT 价格)。scalarRoot 决定价格曲线是更陡峭还是更平坦,具体取决于到期日之前的 time,并用于 PT 代币汇率 calculations

随着到期日的临近,_getRateScalar() 会增加,这意味着在市场的“早期”阶段,价格影响较小,允许更大的 PT 交易。随着到期日的临近,价格敏感性增加,鼓励做市商将市场重新平衡到接近公允价值。这种机制确保 PT 价格逐步与其到期时的赎回价值对齐,所有这些都不依赖于外部预言机或手动调整。

另一个重要的参数 initialAnchor 代表 initial 汇率。它决定了市场池中 PT 和底层代币的初始分配。initialAnchor 和 scalarRoot 共同塑造价格曲线,该曲线在到期时收敛于底层代币的实际价值。

这条曲线支撑着 Pendle 的主要用例:以市场决定的利率交易今天的未来收益。

此外,PendleMarketFactoryV3 包括两个与治理相关的 functions,用于设置国库费用和地址,并定义一个特殊的 overriddenFee,该 overriddenFee 在需要时 supersedes 标准市场费用。

Pendle 代币

如前所述,所有 Pendle 逻辑都围绕 SY 代币及其衍生物:PT 和 YT 代币。有关包装计息代币的有用信息可以在 Pendle 提出的 EIP-5115 中找到。

让我们从 PT 和 PendlePrincipalToken 合约开始,该合约相对简单。它由代币工厂创建,包括一个 isExpired 检查(针对到期日),并且只能与相应的 YT 代币同步地销毁或铸造 only

另一方面,PendleYieldToken (YT) 则复杂得多。它包含使用 SY 代币 mintburn PT+YT 代币的同步对 (PY) 的函数。这些函数是许多 Pendle 操作不可或缺的一部分,因为用户只需要 YT 或 PT 代币的任何操作都涉及铸造或销毁 SY 代币,接收“同步”数量的 PT 和 YT 代币,然后利用这对代币的所需部分。

此外,代表收益的 YT 代币包含用于利息累积的函数。它具有 _pyIndexCurrent() 函数,该函数返回当前汇率。此函数广泛用于基于当前应计收益计算 PT 和 YT 代币数量的计算中。此索引的一个关键用途是根据给定的 PT 和 YT 代币(在代码中组合为“PY”)确定目标 SY 数量,反之亦然(示例可在这里 here这里 here 找到)。在这些函数中,该索引充当 SY 和 PT(或 YT)代币之间的交换 rate

让我们考虑一个涉及 Pendle 中收益累积的示例场景:

  • Alice 将 1000 USDC 存入 Aave,收到 1000 aUSDC,并在 Pendle 中将它们包装成 1000 SY-aUSDC。
  • Alice 使用 mintPY() 从她的 SY-aUSDC 中铸造 PT+YT 代币,并收到与当前索引对应的等量 PT 和 YT 代币(例如,1000 PT 和 1000 YT)。
  • Alice 等待她的 aUSDC 产生收益;例如,1000 aUSDC 变为 1020 aUSDC。
  • pyIndex 增加,因此 now 赎回 PT 和 YT 代币会导致更多的 SY-aUSDC 代币。
  • Alice 将她的 1000 PT + 1000 YT 代币赎回为 1020 SY-aUSDC。

此示例描述了最简单的情况。在任何中间时刻,Alice 都可以独立在 Pendle 的 AMM 中交易 PT 和 YT 代币,然后在稍后“组合”PT 和 YT 代币以将其 aUSDC 赎回为 SY 代币。她可以专注于 YT 代币,假设收益会增加,或者专注于 PT 代币,假设收益率可能会下降。或者,她可以简单地投机 PT 和 YT 代币。

现在,让我们继续讨论 Pendle 市场。

市场

Pendle 市场位于 PendleMarketV3.sol 合约中。此合约充当 ERC20 PENDLE-LPT token,代表用户在市场中的份额。市场使用 three 个代币运行,这些代币在部署期间 configured 为不可变的:SY、PT 和 YT 代币。代币的总供应量在 MarketStorage 结构中跟踪。如前所述,收益曲线参数和 PT 代币到期日最初 set

首先,我们需要高亮显示 mint()burn() 函数,这些函数充当市场代币之间交换的流动性提供机制。在这种情况下,流动性提供者可以从这些交换中赚取费用。

现在,让我们看一下最重要的函数:swapExactPtForSyswapSyForExactPt。这些函数允许用户将 SY 代币交换为 PT 代币,反之亦然。回想一下,SY 代币由 PT 和 YT 代币组成,这意味着 SY 代币的持有者同时拥有“固定利率”部分 (PT)(到期时保证一定数量的底层代币)和“收益”部分 (YT)。这些 SY↔PT 转换允许用户从“固定”的保证头寸转移到利润更高但风险更高的“收益”头寸。

例如:Alice 从一个 6 个月的市场中拥有 1,000 个 USDC 本金代币 (PT),该市场在 3 个月后到期。她认为利率将大幅上升,与市场上可用的可变收益相比,她的固定利率头寸的吸引力会降低。为了适应,她将她的 PT 代币交换为 SY 代币(同时拥有 PT 和 YT),并开始以 prevailing market rate 累积收益。

另一个例子:如果 Alice 担心她的 stETH 持有量可能会下降,并且持有 SY-stETH 代币,她可以出售她的 YT 代币并购买 PT 代币。此操作使她在到期时获得更可预测的结果,锁定固定回报率,而不是暴露于可变收益。

还有涉及多个具有相同底层计息资产的市场的有趣案例。请参阅此屏幕截图:

在上图中,具有不同到期日的三个市场都有自己的 YT 代币,这些代币接收相同的底层收益。担心收益率的用户可以通过在一个市场购买 YT 代币并在另一个市场出售 YT 代币(使用转换为底层代币)来利用这一点。例如,如果他们认为短期利率下降的速度快于长期利率,他们可能会在“短期”市场购买 YT 代币,并在“长期”市场出售 YT 代币。 “长期”市场中的 YT 代币将不太受这些利率变化的影响。此功能提供以前仅在传统金融中可用的复杂的固定收益交易策略。

在后面的部分中,当我们讨论用户场景时,我们将进一步探讨 swapExactPtForSy() 和 swapSyForExactPt() 函数。这四种代币(底层代币、SY、PT、YT)的组合支持各种潜在的应用,我们无法在本文中完全涵盖。

现在,让我们继续讨论路由器,它结合了市场和所有参与代币,并描述了一些示例场景。

路由器(Router)

路由器充当用户与协议交互的入口点。它被组织为多个 Action[...] contracts,其中包含各种类型的逻辑。虽然查看这些合约中的所有函数对于本文来说可能太过了,但检查一个特定的用户场景并跟踪所涉及的函数是有用的。所以...

想象一下,由于即将到来的协议变更,Alice 预计 stETH 收益会大幅增加。她决定获取 YT 代币以利用这种潜在的优势。

她首先使用 swapExactTokenForYt() 函数,批准一定数量的 WETH 并提供市场地址、代币输入详细信息(WETH、金额等)、最小 YT 输出(以考虑滑点)和其他参数(其中一些将在后面描述)。首先,该函数 checks 是否可以使用近似值 — 一种我们稍后将讨论的优化方式。Alice mints SY 代币,将底层代币 into 包装成它们的 “SY” 版本。

下一步涉及使用 _swapExactSyForYt() 函数 swapping 这些 SY 代币以换取 YT 代币,该函数在内部非常复杂。在此交换(SY 到 YT 代币)期间,Pendle 首先尝试填写限价单,尽管这与 Alice 的情况无关(我们不打算讨论限价单,因为它会分散我们对主要机制的注意力)。

然后,Alice calculates 她将通过 approxSwapExactSyForYtV2() 函数收到的 YT 代币数量,该函数尤其值得注意。此函数使用数值近似来计算通过交换指定数量的 SY 代币应产生的最佳 YT 代币数量。

优化在这里 here 发挥作用。如果智能合约使用迭代算法进行近似、优化或搜索,则用户可以通过提供建议的算法起始值从外部(例如,从链下 dApp)来帮助它。这些提示可以加速计算过程。此技术并不新鲜,如 Liquity V2 ( article) 中 getAppoxHint() 函数的链接列表所示。在这种情况下,用户提供的 ApproxParams 帮助计算最佳 YT 代币数量。

_[NOTE] 这种“用户提供的提示”方法并非完全万无一失,如果其他交易在计算期间更改合约状态,则可能变得无效,从而导致 gas 效率低下,甚至导致恶意攻击。在 Pendle 中,这通过池中的不平衡保护来缓解,这可以防止代币汇率的突然变化。_

如果未提供外部 approx 参数,则该函数 uses 当前市场的最小值/最大值。

接下来,该函数开始一个 loop,估算需要涉及多少 PT 才能有效地将精确的 SY 输入转换为 YT 代币。因为 PT 和 YT 代币必须以相等的数量铸造,但具有不同的价格,所以近似算法确定 optimal 在可接受的误差范围内,需要多少 PT 才能最大限度地提高给定 SY 输入的 YT 输出。这确定了需要多少 SY 代币才能达到目标 YT 数量。

最后,是时候 redeem SY 代币,仅提取 YT 代币,因为 Alice 只需要她已支付的 YT 代币。这里出现了一个有趣的方面: receiver 是 YT 代币合约(不是 receiver)。这可以通过交换期间的以下操作顺序来解释:

  • 从一些初始 SY (PT + YT) 开始。
  • “闪贷”需要达到目标 YT 数量的 PT 代币。
  • 使用从市场借来的 PT 代币购买额外的 SY 代币。
  • 合并初始和“部分借用”的 SY 代币。
  • 从此组合 SY 数量中铸造 PT + YT 代币。
  • 使用 PT 代币偿还闪贷。
  • 保留 YT 代币作为最终输出。

虽然该过程看起来很复杂,但结果很简单:Alice 最终获得了使用底层资产获得的 YT 代币(可在 AMM 中进行交易)。对于反向交换,可以使用 swapExactYtForToken() 函数将 YT 代币交换为其他资产。

Pendle 路由器还包括用于涉及 PT 代币的交换的类似函数:swapExactTokenForPt(), swapExactSyForPt(), swapExactPtForToken(), 和 swapExactPtForSy()。所有这些函数都依赖于 SY 代币作为中间资产。

AMM

接下来,让我们探索 Pendle 的 AMM,它促进 SY、PT 和 YT 代币的交易。AMM 在特定的市场内运行,而定义各种操作后 AMM 的源状态和目标状态的数学逻辑位于 MarketMathCore 库合约中。

如前所述,Pendle 的 AMM 支持提供流动性。让我们简要地看一下 addLiquidityCore() 和 [removeLiquidityCore()](https://github.com/pendle-finance/pendle-core-v2-public/blob/761033bcc36ecfdb3c523458d7f[PendlePYOracleLib](https://github.com/pendle-finance/pendle-core-v2-public/blob/761033bcc36ecfdb3c523458d7f66aeabb01c3ab/contracts/oracles/PtYtLpOracle/PendlePYOracleLib.sol#L9) 库为 PT 和 YT token 提供价格预言机。这些预言机同时使用 SY 和 PT 指数。

有趣的是,这里有一种“棘轮”式的机制。如果底层资产遭受损失(由黑客攻击、罚没等引起),SY 指数会下降。但是,PT 持有者必须受到保护,免受这些损失,方式是为他们的 PT token 获得公平数量的 SY token。为了实现这一点,PY 指数被设计为永远不会降低,充当一种“棘轮”机制。当 SY 指数下降时,PT 指数会“冻结”并保持不变,直到 SY 指数恢复并“赶上”。一旦发生这种情况,两个指数将继续一起增加:

因此,返回的 PY(PT 和 YT)指数被选择为 SY 和 PY 指数的最大值。在所有返回 PT 和 YT token 汇率的函数中,存在一些条件,如这个,它调整汇率计算以考虑 SY 指数和 PY 指数之间的差异。此外,根据 Pendle 不变量 SY_value = PT_value + YT_value,任何损失都由 YT 持有者“吸收”。在此期间,YT 持有者不会收到任何收益,并且 YT token 价格甚至可能变为负数。

Pendle 还有其 LP token 的预言机 (PendleLpOracleLib),它也依赖于 SY 和 PY 指数。这些预言机使用相同的汇率调整来确定 LP token 的价值。

这种机制为 PT 赎回价值建立了基于底层 token 的“底价”。PT token 始终可以用可预测数量的底层 SY token 赎回。但是,重要的是要注意,如果出现问题,SY token 在基础资产中的价值可能会波动。

实现细节

Pendle 采用了许多值得一提的有趣的机制。其中之一是在 MarketPreCompute 结构中“缓存”基本的市场信息。在函数中,计算所需的当前市场值(例如 rateScalarrateAnchor)一次,然后重复使用。这对于执行迭代的函数至关重要,例如 approxSwapExactSyForYtV2(),它在每次迭代中都需要这些值。

另一个值得注意的特性是 PendleMarketV3 中的 skim() 函数,它将任何多余的 PT 和 SY token 转移到 treasury。这使得该协议能够处理由于舍入误差、直接转账到池中的错误、黑客攻击等导致出现“未入账”token 的情况。

此外,还有 overriddenFee,它可以由特定的路由器设置,以覆盖市场费用。此功能可以通过合作协议鼓励集成,或者供有资格获得降低费用的高交易量路由器使用。

最后,Pendle 包括一个与治理和激励措施相关的重要的组件 gauge。这涉及 vePENDLE token,它不在此协议审查的范围之内。

结论

Pendle 协议是现代 DeFi 解决方案的一个很好的例子。它能够将多个 DeFi 协议的本金和收益部分 token 化为单独的资产,这使得用户可以在不同的时间段内交易他们对协议性能的期望和关注。这为收益 token 化开辟了范围广泛的用例,包括全新的策略。

Pendle 包含几个值得研究的令人印象深刻的功能:

  • 使能够与各种产生收益的资产兼容的统一标准 (SY)。
  • 在同一底层资产的多个市场中交易长期和短期收益的能力。
  • 将时间敏感性和不平衡敏感性相结合的复杂 AMM,专为收益交易而设计。
  • 保护协议免受底层资产的操纵、不平衡和波动影响的预言机和汇率。
  • 具有用于特定路由器的覆盖费用的灵活费用系统。
  • 用于流动性激励的综合 gauge 系统。

所有这些创新都将 Pendle 定位为一个“新浪潮”项目,其中链上资产可以与传统金融工具的复杂性相媲美,甚至超越。

感谢你的阅读,下篇文章再见!

  • MixBytes 是谁?

MixBytes 是一支由专家区块链审计师和安全研究人员组成的团队,专门为兼容 EVM 和基于 Substrate 的项目提供全面的智能合约审计和技术咨询服务。在 X 上加入我们,以了解最新的行业趋势和见解。

  • 原文链接: mixbytes.io/blog/yield-t...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
mixbytes
mixbytes
Empowering Web3 businesses to build hack-resistant projects.