Rocket Pool rETH 集成 第 4 章:Balancer 与 Aura 流动性
第二个实战项目:把 rETH 存进 Balancer 的 rETH/WETH 池做流动性提供者(LP),再把 LP 凭证(BPT)质押到 Aura 上,叠加赚取 BAL + AURA 激励。这一章讲清 Balancer 的池子机制、如何加入/退出,以及 Aura 为什么能增强收益。
目录
- 1. 为什么用 rETH 做 LP
- 2. Balancer 简介与 Vault 架构
- 3. rETH/WETH 是什么类型的池
- 4. 加入池子:joinPool 与 BPT
- 5. 案例:单边存入 rETH
- 6. Aura:在 Balancer 之上增强收益
- 7. 完整收益叠加
- 8. 退出流程
- 9. 本章小结
- 10. 动手练习
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. 本章小结
- rETH 做 LP 可在质押收益之上叠加交易费 + BAL + AURA 激励,且 rETH/WETH 高相关、无常损失小。
- Balancer 用中央 Vault 保管所有池资产,交互需指定
poolId。 - rETH/WETH 是 ComposableStablePool,用 rate provider 读 rETH 公允汇率,避免升值套利损耗。
joinPool得到 BPT(LP 凭证);单边存入有少量失衡成本。- Aura 集中 BPT/veBAL 给用户提供接近最大的 BAL boost,并额外发 AURA,总 APR 更高。
- 退出: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);
}
思路:
setUp:给合约deal一些 rETH(或用 WETH 在 DEX 换成 rETH)。- 加入 Balancer:构造
JoinPoolRequest(单边存 rETH,joinKind = EXACT_TOKENS_IN_FOR_BPT_OUT),调vault.joinPool(rethWethPoolId, this, this, req)。断言收到 BPT > 0。 - 质押到 Aura:approve BPT 给 Aura,调
aura.deposit(pid, bptAmount, true)(pid 是 rETH/WETH 池在 Aura 的编号)。断言拿到 Aura 的质押凭证。 - 退出:
aura.withdrawAndUnwrap(amount, true)取回 BPT 并领奖 →vault.exitPool换回 rETH。 - 断言整个往返后 rETH 余额大体回来(减去滑点/费),并领到了一些 BAL/AURA。
运行
forge test --evm-version cancun --fork-url $FORK_URL \
--match-path test/RethBalancerAura.t.sol -vvv
下一章(第 5 章 rETH NAV)讲:如何在链上正确计算 rETH 的净值(NAV),区分公允汇率与市场价,避免预言机被操纵。