錢包顯示你有 12.4 顆 wstETH。行情站說 wstETH 現在 1.21 ETH。你按計算機,得到 15.004 顆 ETH。
然後你去賣,實際到手 14.87 顆。中間那 0.13 顆去哪了?
因為質押憑證同時存在兩個價格:協議合約裡記的「我欠你多少 ETH」,和市場上「現在有人肯用多少 ETH 跟你換」。前者由協議記帳決定,只會隨獎勵往上走;後者由當下的買賣雙方決定,會上下跳。你算出來的和你拿到的不一樣,多半就是拿了前者去預測後者。
兩個價格分別是誰定的
合約匯率是協議自己的帳本。它記的是「這張憑證對應多少質押部位」,數字來自驗證者的實際餘額與獎勵,由協議的預言機定期更新。它不看市場,不管今天有沒有人在賣。它是你走贖回那條路時,協議會按照的比例。
市場價是成交價。它反映的是「現在想立刻換手,要付多少代價」。買賣雙方誰急誰就吃虧,所以它會偏離合約匯率,有時偏低(折價)有時偏高(溢價)。
| 合約匯率 | 市場成交價 | |
|---|---|---|
| 誰決定 | 協議記帳與預言機 | 當下的買賣雙方 |
| 會不會下跌 | 正常情況只往上,出現罰沒或虧損才會降 | 隨時會上下跳 |
| 你走哪條路用到它 | 排隊贖回 | 直接賣出 |
| 哪裡查 | 協議官方頁面、區塊瀏覽器讀合約 | 行情站、交易所、兌換池報價 |
| 兩者差多少叫什麼 | 市場低於合約 = 折價;高於 = 溢價 | |
stETH 特別容易搞混
因為 stETH 的合約匯率大致就是 1,數量會自己長。所以你看到「stETH 0.998」的時候,那 0.2% 就是折價,很直覺。
wstETH 和 rETH 就不是這樣了。它們的數量不動,合約匯率會持續上升,所以價格天生就大於 1。你看到 wstETH 賣 1.21,那是折價還是溢價?要看當下合約匯率是多少——匯率 1.22 就是折價,匯率 1.20 就是溢價。光看 1.21 這個數字什麼都判斷不了。
判斷有沒有價差,永遠是拿市場價去比當下的合約匯率,不是比 1。wstETH 的價格「比 ETH 高很多」只是匯率累積的結果,不代表賺了;它的美元價往下掉,也可能只是 ETH 本身在跌,和脫鉤無關。
賣 wstETH 實際到手比算的少,差額去哪了
分開來看通常是三層,而且三層的性質不一樣。
- 合約匯率和市場價的價差。這是「立刻換手」的代價,市場緊張時會放大。三層裡哪一層最大,要看你的金額和賣在哪裡。
- 滑價。你這筆單子本身把價格推壞了。金額越大這層越明顯,冷門的交易對上尤其嚴重。
- 手續費。兌換池抽一層、交易所抽一層,再加上鏈上手續費。
行情站顯示的價格是第一層的參考,後面兩層它管不到。所以「行情站的價格 × 數量」永遠只是上限,不是你會拿到的數字。真要知道能拿多少,去你要賣的那個地方把金額輸進去,看它顯示的「預計收到」。
只看一個比值:市場價除以合約匯率
真正要看的只有一個數字:市場價除以合約匯率。這個比值接近 1 就是正常,明顯小於 1 就是折價,大於 1 就是溢價。它把單位消掉了,所以不管是 stETH、wstETH 還是 rETH,都用同一把尺量。
算出來之後才決定要不要做事。比值 0.995 而佇列只要幾天,直接賣就好,那 0.5% 不值得等;比值 0.97 而佇列也不長,就值得認真考慮走贖回。站內有個換算工具就是幫你做這個除法,順便把等待折成年化。
另外,判斷的時候別看行情站上的美元價。憑證的美元價同時混進了 ETH 本身的漲跌,看了只會讓你分心。這類資產的一切判斷都應該用 ETH 當單位,美元價留給最後真的要換成現金的時候再看。
stETH 市場價什麼時候會和合約匯率差很多
平常它們幾乎貼在一起,貼到你以為只有一個價格。會分開的時候通常有這幾種:
- 退出佇列突然變長。願意立刻接手的人要求更多補償,市場價往下掉,而合約匯率照常往上走。
- 市場急跌。槓桿部位被清算,抵押品被倒出來換 ETH,短時間內把成交價打下去。
- 某個池子被大單吃掉一側。報價暫時失衡。
- 有人急著建立質押部位。這種時候反而會溢價,因為買現貨憑證比自己去排進場佇列快。
前三種是折價,最後一種是溢價。
真正要警覺的是第五種:查不出原因的深度折價。那通常表示市場知道一些你不知道的事,這時候該做的是先問為什麼,不是先算能賺多少。折價的成因另外寫了一篇。
三個查價格的地方,各有各的毛病
知道要比什麼之後,下一個問題是去哪裡看。三種來源都能用,但它們各自會在不同的地方騙你。
行情站
最方便,也最容易誤導。行情站顯示的通常是多個交易場所的加權平均,而你實際只會在其中一個地方成交。冷門時段各家報價差距可能不小,平均值看起來很漂亮,你去賣的時候未必拿得到。
另外行情站上的憑證價格幾乎都以美元計。要用 ETH 當單位的話,你得自己拿它除以同一時刻的 ETH 美元價,兩個數字的抓取時間若差幾分鐘,結果就會有誤差。市場平靜時無所謂,劇烈波動時這個誤差可能比你要判斷的折價還大。
鏈上兌換池
最誠實的一種,因為它給的直接就是「你這筆金額實際換得到多少」,滑價已經算進去了。缺點是它只代表那一個池子的狀況,別的地方可能更好。
用它的時候記得把金額填成你真正要交易的數量,不要填 1 顆看報價然後乘上去。池子的報價是非線性的,1 顆和 500 顆的單價不會一樣,這正是它比行情站有用的地方。
合約本身
用區塊瀏覽器直接讀合約上的匯率函式,拿到的是協議記帳的真值,沒有任何中介。這個數字不會騙你,但它也不是你能賣到的價格——它只是你走贖回那條路時的基準。
比較穩的分工是:合約讀基準、兌換池看實價、行情站只用來快速掃一眼有沒有異常。三個各司其職,混著用就會得出奇怪的結論。
特別注意換算單位的陷阱。有些介面把 wstETH 的價格用 stETH 計、有些用 ETH 計、有些用美元計。三種數字長得很像,差別卻不小。看到一個價格先確認它的分母是什麼,再決定要不要拿它做判斷。
照著做一次:把 wstETH 的合約匯率讀出來
「去合約讀」聽起來像工程師的工作,實際上是四個點擊的事,不用連錢包,也不會花到一毛錢。以 wstETH 為例走一次,其他憑證的做法一樣,只是換合約和換函式名。
- 找到正確的合約位址。wstETH 在以太坊主網上是
0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0,這個位址列在 Lido 官方的部署合約清單上。務必從官方清單複製,不要在區塊瀏覽器裡搜代幣名稱然後隨便點一個——同名的仿冒代幣到處都是,這是這四步裡唯一會出事的一步。 - 切到 Contract 分頁底下的 Read Contract。你會看到一排編號的唯讀函式,按字母排序。
- 展開
stEthPerToken。依 Lido 的合約文件,它回傳「1 顆 wstETH 對應多少 stETH」。不用填任何參數,展開就直接顯示當下的值。 - 把小數點移回去。回傳的是 18 位小數的整數,例如
1210000000000000000代表 1.21。這個 1.21 就是你要的合約匯率,拿它去除市場價就得到本文前面那個比值。
同一份清單上還有兩個很容易拿錯的函式:tokensPerStEth() 是反過來的比例(1 顆 stETH 值多少 wstETH),getStETHByWstETH() 要你先填數量、再回傳那個數量換得到多少 stETH。只是要判斷有沒有折價的話,stEthPerToken 一個就夠了。
stETH 本身不用這麼麻煩:它的設計就是讓合約匯率貼著 1、讓數量自己長,所以你在行情站上看到的 0.998 已經可以直接當比值用。rETH 是另一個合約,讀它的 getExchangeRate(),回傳的是 1 顆 rETH 背後有多少 ETH(同樣是 18 位小數的整數)。
Read Contract 分頁動不到你的錢。那上面全是查詢,不發交易、不用簽名、不用連錢包,看錯了也沒有後果。真正會動錢的是隔壁的 Write Contract 分頁——那個除非你清楚自己在做什麼,否則不要碰。
常見問題
合約匯率會下跌嗎?
正常情況不會,它只隨著質押獎勵往上走。會下降的情形是協議端出現損失,例如驗證者被罰沒。所以看到合約匯率下降,那不是市場問題,是協議本身出了事,值得停下來查原因。
讀合約需要連錢包嗎?會不會有風險?
不需要,也沒有風險。Read Contract 分頁上的函式都是唯讀查詢,不發交易也不要簽名。唯一要小心的是合約位址要從協議官方文件複製,別在瀏覽器裡搜代幣名稱亂點,仿冒代幣很多。