Rocket Pool rETH 集成 第4章 Balancer 与 Aura 流动性

把 rETH 存进 Balancer rETH/WETH 池做 LP,再质押到 Aura 赚取叠加激励:池子类型、加入/退出、BPT、Aura 收益增强机制。

6 分钟阅读
Rocket Pool rETH 集成 第4章 Balancer 与 Aura 流动性

Rocket Pool rETH 集成 第 4 章:Balancer 与 Aura 流动性

第二个实战项目:把 rETH 存进 Balancer 的 rETH/WETH 池做流动性提供者(LP),再把 LP 凭证(BPT)质押到 Aura 上,叠加赚取 BAL + AURA 激励。这一章讲清 Balancer 的池子机制、如何加入/退出,以及 Aura 为什么能增强收益。


目录


1. 为什么用 rETH 做 LP

rETH 本身就有质押收益。把它和 WETH 配对做 LP,可以在质押收益之上再叠加交易手续费 + 协议激励

总收益 = rETH 质押收益(汇率上升)
       + Balancer 池交易手续费
       + BAL 代币激励
       + AURA 代币激励(通过 Aura 再质押)

而且 rETH/WETH 是高度相关资产(rETH 价格紧贴 ETH),无常损失很小——这让它成为很受欢迎的”低风险增强收益”LP 策略。


2. Balancer 简介与 Vault 架构

Balancer 是一个支持多种池子类型的 AMM。它和 Uniswap 最大的架构区别是:

所有池子的资产都存在一个中央合约 Vault,单个池子只定义”数学逻辑”,不自己保管资产。

  • 你和 Balancer 交互的主入口是 Vault(地址 0xBA12222222228d8Ba445958a75a0704d566BF2C8)。
  • 加入/退出池子、swap 都通过 Vault 调用,并指定 poolId
  • 这种设计让多池资金集中、swap 可高效路由(一笔 Vault 调用穿过多个池)。

3. rETH/WETH 是什么类型的池

rETH/WETH 池是 Balancer 的 ComposableStablePool(可组合稳定池)

  • 稳定池(StablePool):和 Curve V1 类似,用 amplification 参数让”高度相关资产”在 1:1 附近低滑点交易。rETH 和 WETH 价格接近(差一个汇率),适合稳定池。
  • 可组合(Composable):池子的 LP 代币(BPT)本身也被纳入池子,支持更灵活的单边进出和”BPT 作为其它池资产”的嵌套。
  • 它会感知 rETH 的汇率(通过 rate provider),把 rETH 按公允汇率折算,使池子真正以”ETH 价值”为锚定,而不是简单 1:1。

关键认知:Balancer 稳定池用 rate provider 读取 rETH 的公允汇率,所以池子不会因为 rETH 自然升值而产生套利损耗——升值被汇率吸收了。


4. 加入池子:joinPool 与 BPT

加入池子通过 Vault 的 joinPool

vault.joinPool(
    poolId,            // rETH/WETH 池的 ID
    sender,            // 出资人
    recipient,         // 接收 BPT 的地址
    JoinPoolRequest({
        assets: [rETH, BPT, WETH],   // 注意可组合池里 BPT 也在资产数组中
        maxAmountsIn: [...],
        userData: encode(joinKind, amountsIn, minBptOut),
        fromInternalBalance: false
    })
);

加入后你得到 BPT(Balancer Pool Token)——Balancer 的 LP 凭证,类似 Uniswap 的 LP token。BPT 代表你在池子里的份额。

userData 里的 joinKind 决定加入方式:按比例加、单边加(EXACT_TOKENS_IN_FOR_BPT_OUT)等。


5. 案例:单边存入 rETH

假设你只有 rETH,想加入 rETH/WETH 池:

joinKind = EXACT_TOKENS_IN_FOR_BPT_OUT
amountsIn = [100 rETH, 0 BPT, 0 WETH]   // 只存 rETH
minBptOut = 滑点保护下限
  • 因为是稳定池且单边存入,会有少量价格冲击/失衡费(类似 Curve 的失衡费,第 5 章 Curve V1 讲过)。
  • 你拿回对应的 BPT 数量,代表你的份额。
  • 之后池子的交易手续费 + rETH 升值都会让你的 BPT 缓慢增值。

单边存入方便但有失衡成本;按当前比例双边存入成本最低。和前面 Curve/Uniswap 的 LP 逻辑一脉相承。


6. Aura:在 Balancer 之上增强收益

直接在 Balancer 做 LP 只能拿到交易费 + 基础 BAL 激励。Aura 是建在 Balancer 之上的收益增强层(类似 Convex 之于 Curve):

你 → 把 BPT 质押到 Aura
Aura → 帮你把 BPT 锁进 Balancer 的 gauge,并用它积累的 veBAL 提升 BAL 激励倍数
你额外获得:更高的 BAL + 额外的 AURA 代币奖励

为什么 Aura 能增强收益?

  • Balancer 的 BAL 激励有一个”boost”机制:锁定 BAL(veBAL)越多,激励倍数越高(最高 2.5 倍)。
  • 个人很难积累足够 veBAL 拿满 boost。Aura 集中所有用户的 BPT,用它庞大的 veBAL 给每个人都提供接近最大的 boost
  • 代价:Aura 抽取一点管理费,并发放 AURA 代币作为额外激励。

结果:通过 Aura 质押,通常比直接在 Balancer 拿到更高的总 APR


7. 完整收益叠加

把 rETH 一路用到底的收益结构:

存 ETH/WETH 买 rETH         → 赚 ① 质押收益(汇率↑)
把 rETH 存进 Balancer 池     → 赚 ② 交易手续费
                            → 赚 ③ BAL 基础激励
把 BPT 质押到 Aura           → ③ 被 boost 放大 + 赚 ④ AURA 激励

四层收益叠加,且因 rETH/WETH 高相关、无常损失小,是 DeFi 里经典的”乐高叠收益”案例。当然,每多一层就多一层智能合约风险。


8. 退出流程

退出是加入的逆过程:

1. 从 Aura 取回 BPT(unstake),同时领取累积的 BAL/AURA 奖励
2. 用 Vault.exitPool 把 BPT 换回 rETH(和/或 WETH)
3. 需要的话,把 rETH 换回 WETH/ETH

exitPool 同样通过 Vault,用 userData 指定退出方式(单边出 / 按比例出)。


9. 本章小结

  1. rETH 做 LP 可在质押收益之上叠加交易费 + BAL + AURA 激励,且 rETH/WETH 高相关、无常损失小。
  2. Balancer 用中央 Vault 保管所有池资产,交互需指定 poolId
  3. rETH/WETH 是 ComposableStablePool,用 rate provider 读 rETH 公允汇率,避免升值套利损耗。
  4. joinPool 得到 BPT(LP 凭证);单边存入有少量失衡成本。
  5. Aura 集中 BPT/veBAL 给用户提供接近最大的 BAL boost,并额外发 AURA,总 APR 更高。
  6. 退出:Aura unstake(领奖)→ exitPool 换回代币。

10. 动手练习

对应课程的 Balancer/Aura 项目:把 rETH 存进 Balancer 池并质押到 Aura。

练习:rETH → Balancer BPT → Aura

主网分叉,Balancer Vault = 0xBA12222222228d8Ba445958a75a0704d566BF2C8

interface IBalancerVault {
    function joinPool(bytes32 poolId, address sender, address recipient, JoinPoolRequest memory request) external payable;
    function exitPool(bytes32 poolId, address sender, address payable recipient, ExitPoolRequest memory request) external;
}
interface IAuraDeposit {
    function deposit(uint256 pid, uint256 amount, bool stake) external returns (bool);
    function withdrawAndUnwrap(uint256 amount, bool claim) external returns (bool);
}

思路:

  1. setUp:给合约 deal 一些 rETH(或用 WETH 在 DEX 换成 rETH)。
  2. 加入 Balancer:构造 JoinPoolRequest(单边存 rETH,joinKind = EXACT_TOKENS_IN_FOR_BPT_OUT),调 vault.joinPool(rethWethPoolId, this, this, req)。断言收到 BPT > 0。
  3. 质押到 Aura:approve BPT 给 Aura,调 aura.deposit(pid, bptAmount, true)(pid 是 rETH/WETH 池在 Aura 的编号)。断言拿到 Aura 的质押凭证。
  4. 退出aura.withdrawAndUnwrap(amount, true) 取回 BPT 并领奖 → vault.exitPool 换回 rETH。
  5. 断言整个往返后 rETH 余额大体回来(减去滑点/费),并领到了一些 BAL/AURA。

运行

forge test --evm-version cancun --fork-url $FORK_URL \
  --match-path test/RethBalancerAura.t.sol -vvv

下一章(第 5 章 rETH NAV)讲:如何在链上正确计算 rETH 的净值(NAV),区分公允汇率与市场价,避免预言机被操纵。

💬 评论