Meme Atlas AZ · pump-bonding-curve-fields

pump.fun 是什麼:bonding curve 帳戶的欄位、complete 旗標與遷移到 PumpSwap

pump.fun 讓新幣一建立就能在一條 bonding curve 上買賣;每枚幣對應一個曲線帳戶,裡面有虛擬與真實儲備和一個 complete 旗標,賣完之後流動性遷移到 PumpSwap。本文照官方程式文件逐欄讀。

發布
更新
編輯責任
Meme Atlas AZ

在 Solana 上打開一枚剛建立的迷因幣,介面常會顯示一條「bonding curve 進度」。這個百分比的來源,是 Pump 程式替這枚幣開的一個鏈上帳戶,帳戶裡只有幾個數字和一個布林值。

本文照 pump.fun 在 GitHub 公開的程式文件(倉庫 pump-fun/pump-public-docs,讀取時最後一次提交在 2026-10-08),把這個帳戶逐欄讀一遍,再讀它「賣完」之後發生的事。引號內的英文是文件原文,中文說明為本文轉述;標明「本文換算」的數字是我們拿文件裡的值自己算的。

pump.fun 是什麼:一個建幣程式加一條曲線

文件對 Pump 程式的第一句說明是:"Pump program allows creating SPL coins that are instantly tradeable on a bonding curve without having to seed liquidity." 建幣的人不必先準備一筆流動性,幣一建立就能交易,買賣的對手是程式裡的曲線。

接著兩句交代了終點:"When the coin hits a certain market cap the liquidity from the bonding curve is migrated to PumpSwap (an AMM on Solana). The LP tokens received from the PumpSwap pool are then burnt."

定價方式也只有一句:"The bonding curve formula is based on Uniswap V2 and uses synthetic x and y reserves to ensure that there is liquidity for the coin." 也就是沿用恆定乘積的算法,但兩邊的儲備裡有一部分是程式設定的虛擬值。

文件列出的程式地址是 `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P`,主網與 Devnet 相同。核對地址的做法見本站合約地址怎麼核對。

每枚幣一個曲線帳戶:五個數字和一個旗標

文件寫,每枚幣都有一個對應的 bonding curve 帳戶,地址由 `["bonding-curve", mint]` 這組種子推導。帳戶的基本欄位是:

  • `virtual_token_reserves`、`virtual_sol_reserves`:定價用的虛擬儲備。
  • `real_token_reserves`、`real_sol_reserves`:曲線裡實際還有的代幣與 SOL。
  • `token_total_supply`:這枚幣的總供應。
  • `complete`:曲線是否已經賣完。

四個儲備欄位怎麼動,文件分買與賣各寫一條。買入時,"`virtual_sol_reserves` and `real_sol_reverses` increase with the same lamports amount according to the bonding curve formula",兩個代幣儲備則減少同樣的數量(原文把 reserves 拼成 reverses,照錄)。賣出時方向相反。虛擬與真實永遠一起動、動同樣多,差別只在起點不同。

後續升級又在帳戶尾端加了幾個欄位,包括 `creator`、`quote_mint`、`is_holder_reward` 等。文件提醒,升級前寫入的帳戶比較短,缺少的尾端欄位要讀成 `0`、`false` 或 `Pubkey::default()`。讀舊幣的曲線帳戶時,看到長度不同不代表資料壞了。

把起始值換成看得懂的數(本文換算)

每枚新幣的曲線,起始值取自程式唯一的 `Global` 帳戶。文件貼出的那份 `Global` 內容是:

  • `initial_virtual_token_reserves`:1073000000000000
  • `initial_virtual_sol_reserves`:30000000000
  • `initial_real_token_reserves`:793100000000000
  • `token_total_supply`:1000000000000000

這些是最小單位。建幣指令 `create_v2` 的帳戶表寫新的 mint 帳戶 "initialized with `decimals = 6`";Solana 官方術語表寫 lamport 是 "A fractional native token with the value of 0.000000001 sol"。據此換算(本文換算):

  • 總供應是 10 億枚。
  • 曲線上的真實代幣儲備起始為 7.931 億枚,占總供應的 79.31%。
  • 兩者相差 2.069 億枚,占 20.69%。倉庫的 README 在講最後一筆買單時,把這部分稱為 "the tokens that would have gone into the PumpSwap pool"。
  • 虛擬 SOL 儲備起始為 30 SOL,虛擬代幣儲備起始為 10.73 億枚。按恆定乘積的邊際價格,也就是虛擬 SOL 除以虛擬代幣,起始價格約為每枚 0.000000028 SOL。

要留意這是文件貼出的那一份 `Global`。文件同時寫明 `set_params` 指令 "allows updating all the `Global` account fields",所以起始參數以鏈上當下的 `Global` 帳戶為準。另外,`quote_mint` 欄位說明幣也可以不和 SOL 配對,那種幣的儲備單位要另外看。

`Global` 帳戶裡還有一個 `authority` 欄位,文件的說明是 "the authority which can update the global configuration"。換句話說,上面這些起始參數有一個能修改它們的地址。讀 `Global` 的時候把 `authority` 一併記下來,日後發現參數和文件不一樣,才知道該去查哪個地址送出的交易。

曲線賣完時大概是什麼狀態(本文換算)

既然公式沿用 Uniswap V2,就可以拿上面那組起始值,推算曲線賣完時的樣子。以下全是本文換算,沒有計入手續費,也假設起始參數就是文件貼出的那一組。

恆定乘積的意思是,虛擬 SOL 與虛擬代幣相乘的結果在買賣前後維持不變。起始時是 30 乘以 10.73 億。真實代幣儲備賣到 0,代表虛擬代幣儲備少了 7.931 億枚,剩 2.799 億枚;乘積不變,虛擬 SOL 儲備就要升到約 115.01 SOL。

  • 虛擬 SOL 從 30 升到約 115.01,多出來的約 85.01 SOL,就是買家一路付進曲線的真實 SOL。
  • 此時的邊際價格約為每枚 0.00000041 SOL,大約是起始價格的 14.7 倍。

這組數字有兩個用處。一是核對:一條 `complete` 為 `true` 的 SOL 配對曲線,`real_sol_reserves` 若和這個量級差很遠,先回頭確認起始參數是不是改過、這枚幣是不是用別的資產配對。二是理解價格:從第一筆到最後一筆,曲線上的價格差了十幾倍,早買與晚買拿到的成本完全不同,這是公式本身決定的。

買賣指令裡的兩個上下限

文件列的指令說明,順帶解釋了介面上「滑點」設定落在哪裡。

買入指令的說明是:"`buy(user, associated_user, mint, amount, max_sol_cost)` allows a `user` to buy the exact `amount` of coins from the bonding curve of the given `mint`, using at most `max_sol_cost` lamports." 指定的是要買到的代幣數量,以及最多願意付多少。

賣出指令是對稱的:"`sell(user, associated_user, mint, amount, min_sol_output)` allows a `user` to sell the exact `amount` of coins to the bonding curve of the given `mint`, receiving at least `min_sol_output` lamports." 指定賣出的數量,以及最少要收到多少。

建幣指令 `create` 還有一個容易看錯的地方。文件說 `user` 和 `creator` 通常是同一個地址,但也可以不同,例子是 "free coin creation" 流程:"the first coin buyer also creates the coin on-chain"。這種情況下,送出建幣交易的是第一個買家,`creator` 才是原始建立者,而且 `creator` 不必是這筆交易的簽署者。研究紀錄若要寫「誰建立了這枚幣」,要讀的是曲線帳戶的 `creator` 欄位,建幣交易的簽署者可能是另一個人。

介面上的「進度」從哪裡算

我們讀的這幾份文件裡,曲線帳戶沒有名為 progress 的欄位。能拿來算進度的是 `real_token_reserves`:它從起始值一路降到 0。本文的算法是:

已賣出比例 = 1 − `real_token_reserves` ÷ 起始的 `real_token_reserves`

舉一個假設的讀數:`real_token_reserves` 為 396550000000000,剛好是起始值的一半,已賣出比例就是 50%。各家介面顯示的百分比怎麼定義,以該介面自己的說明為準;要自己核對,就回到這個欄位。

complete:曲線賣完的那一刻

`complete` 起始是 `false`。文件寫它變成 `true` 的時點:"It is set to `true` at the end of a `buy` instruction, when `real_token_reserves == 0`, so there are no more real tokens left in the bonding curve."

賣完之後、遷移之前,曲線是停住的。README 寫,越過上限的那筆買單之後,"no buys or sells are possible on the curve until the migration happens"。在這段時間讀到的價格,是曲線停住時的最後狀態。

遷移到 PumpSwap:誰都能觸發

遷移由 `migrate` 指令完成。文件的說明是它 "allows any `user` to migrate the liquidity of a completed bonding curve of the given `mint` to PumpSwap AMM",條件是 `complete == true` 且 `real_token_reserves == 0`。文件還說這個指令是冪等的,對已經遷移過的曲線再執行一次不會有任何效果。

舊資料裡常見「畢業到 Raydium」的說法。文件對此的記載在 `withdraw` 指令:它是 "a now-disabled instruction",以前由指定的權限地址把完成的曲線流動性提出、從鏈下伺服器遷到 Raydium。現行文件寫的目的地是 PumpSwap。

PumpSwap 自己的文件開頭寫它是 "a constant-product AMM",程式地址為 `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA`。有兩個細節對研究紀錄有用:

  • 池的 index。池的地址由 `["pool", index, creator, baseMint, quoteMint]` 推導,文件寫經由 Pump 程式 `migrate` 建立的池,index 為 0。同一份文件也寫 `create_pool` 的 index 讓同一個 creator 能替同一組幣對建多個池。所以同一枚幣可以有不只一個 PumpSwap 池,要分清哪一個是遷移產生的。
  • LP 的供應。Pump 程式文件說遷移拿到的 LP 代幣會被銷毀。而池帳戶裡的 `lp_supply`,文件定義為 "the total supply of the `lp_mint` without burns and lock-ups",並舉例說有人存入後自行銷毀 LP,"the `Pool::lp_supply` will still reflect the original supply"。要核對 LP 是否已銷毀,得去讀 `lp_mint` 本身在鏈上的供應,`lp_supply` 這一欄不會告訴你。

池子深度怎麼讀,見本站DEX 流動性深度。

研究紀錄要留哪幾格

  • mint 地址、所屬代幣程式與 decimals。`create_v2` 的帳戶表寫新 mint 用的是 Token-2022 程式,建立時的 `mint_authority` 是 Pump 程式的一個 PDA;之後的權限狀態要直接讀 mint 帳戶,讀法見合約權限狀態怎麼讀。
  • 曲線帳戶地址、讀取的時間、`complete`、`real_token_reserves`、`quote_mint`。
  • 若已遷移:PumpSwap 池地址、池的 index、`lp_mint` 在鏈上的供應。
  • 手續費不要抄舊數字。費率寫在 `Global` 帳戶與倉庫裡的 fee program 文件,以讀取當下為準。
  • 文件版本:倉庫的提交日期。這個倉庫更新頻繁,README 開頭就是一串新增指令的公告。

少了讀取時間,這一格就無法和別人的讀數比對;曲線上的數字每一筆交易都在變。

本文只談資料怎麼讀,不評價 pump.fun、PumpSwap 或任何一枚代幣,也不構成買賣建議。

內容來源