三个价,以及为什么它们不能互换
这条链上的每样东西同时有三个价。大多数时候它们一致,这正是搞混它们代价高昂的原因:按错的那个计价的仓位看着安全,实际上 悄悄地不安全。
| 它是什么 | 它用来干什么 | |
|---|---|---|
| 预言机价 | Chainlink 股票喂价 ÷ USDG 喂价 | NAV、份额净值、偏离闸门、收费 |
| 池价 | 池子自己的 sqrtPriceX96 | 执行检查,以及我们实际持有多少股 |
| 场内标记价 | 永续场自己的价 | 对冲在哪成交、清算按哪算 |
LP 仓位没有固定股数:它的构成是池子 tick 的函数。所以「我们持有多少股」必须从池子读,而窄区间会让它极度敏感——某次实盘 样本里,0.37% 的价差让持仓变了 29%。按预言机给对冲计价看着安全,实际会悄悄对冲不足:目标和仓位彼此一致,而两者都和现实 不一致,于是没有任何断路器会触发。
Chainlink 在 Robinhood Chain 上
这里只部署了 Chainlink 一家预言机。Data Feeds、Data Streams 和 CCIP 都在,我们用 Data Feeds。
- 股票喂价叫
RHNVDA / USD,不是NVDA / USD,而且它的答案里已经包含了 token 的uiMultiplier()。再乘一次 乘数就会把每一次公司行动重复计算一遍。 - 喂价是 24/5。夜间很少更新,整个周末完全停更并保持最后一个值。
latestRoundData()照样返回它,所以updatedAt是 唯一的判据。 - 每个股票 token 有
oraclePaused(),公司行动处理期间置位:乘数变更时喂价冻在最后一个好值上。这里所有东西遇到它都 失败关闭。 - 这条链没有 L2 Sequencer Uptime Feed,所以 Chainlink 那套 L2 标准过期闸门建不起来。我们只有
updatedAt。
喂价过期并不构成关于池子的证据,而且光看时间长短分不清「按计划收盘」和「预言机挂了」。所以交易日历在链上、并且先看它, 时间长短只是兜底,不是主判据。
池子这一侧
- 股票的 USDG 池是 Uniswap V3 池,tick 区间必须落在池子的 tick spacing 上。要 ±1%,在 0.3% 档拿到的是 ±1.3%,在 1% 档是 ±3%;费收益与宽度成反比,所以按「你要的区间」而不是「你拿到的区间」做模拟,会把费高估约 30% 和 3 倍。
- USDG 在有些池子里是 token0,有些池子里是 token1。 假定一种顺序会算出一个接近零的流动性数字,而且不报错,读起来就是 「份额 0%,不值得进」——正好相反。
- 集中流动性池上的 V3 TWAP,是在一本可以被买空的盘口上取 tick 均值。这就是为什么给借贷债务计价的 mark 要钳制,以及为什么 StockLend 把池价当作「买回来的成本」而不是当作「价格」。
- Uniswap V4 池没有 observation ring:预言机搬进了 hook。V4 池只能由采样它的东西、或者它自己的 hook 来出 TWAP。
周末
从周五收盘到周日重开,喂价停住而 token 照常交易。两者之间的差就是周末溢价——StockLend 让借款人卖进的就是它, $HEDGE 国库供应股票收费赚的也是它。同样,对着一个冻结的喂价报出来的「溢价」或「折价」本身不是信号:它测的有一半 是喂价停了这件事。