Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
自 2026-07 程式升級起,AMM v4 的 OpenBook / Serum 依賴已被移除。舊版 v1 的 SwapBaseIn / SwapBaseOut、Deposit 和 Withdraw 指令保持原有帳戶配置以維持向後相容性:市場帳戶仍在原位置被接受,但不再被驗證或使用(不發出 CPI)。新的整合應使用 V2 交換進入點,其完全省略市場帳戶。多個指令已被移除並現在會回復 — 見變更日誌條目。下方帳戶列表使用 Raydium SDK 的欄位名稱;底層 IDL 有時使用 serum_* 前綴。2026-09 程式升級新增一個管理員指令 WithdrawExcessLamports(標籤 18),並從 CreateConfigAccount 移除租金系統變數。交易者或 LP 呼叫的所有內容保持不變。見2026-09-09 變更日誌條目。

指令清單

SDK 僅為面向使用者的指令公開建構器。維護指令通常由 Raydium 守護程式呼叫。 已移除 / 不再可呼叫(其用戶端建構器已刪除):Initialize(標籤 0,使用 Initialize2)、MonitorStep(2)、MigrateToOpenBook(5)、WithdrawSrm(8)、PreInitialize(10,使用 Initialize2)、SimulateInfo(12)、AdminCancelOrders(13)。 攜帶這些標籤之一的交易會失敗;程式永遠不會執行該指令。將所有七個視為已消失,而非作為要處理的錯誤路徑。

Initialize2

啟動綁定到現有 OpenBook 市場的新 AMM v4 池。 參數
帳戶(可寫 W、簽署者 S)
兩種可接受的佈局。 上面的 19 個帳戶列表是建議的一種。為了向後相容,程式也會讀取 一個 21 個帳戶的舊版佈局,它在位置 7 插入一個被忽略的 amm_open_orders,在位置 16 插入 一個被忽略的 market_program — 這正是倉庫內 initialize2 指令建構器目前仍發出的內容。 任何其他長度都會按舊版佈局的位置解析並失敗。
後置條件
  • 鑄給建立者的 LP = sqrt(init_coin_amount × init_pc_amount) − 10^coin_mint.decimals。LP 的小數位等於 coin_mint.decimals,因此被減去的數量剛好是一整個 LP 代幣;它從未被鑄造,永久退出流通。如果 sqrt(...) 低於該值,指令會以 InitLpAmountTooLess 還原。
  • AmmInfo.lp_amount 儲存完整的 sqrt(...),而不是已鑄造的數量 — 因此 lp_mint.supply 永久比 amm.lp_amount 少一整個 LP 代幣。所有按比例的數學都使用 amm.lp_amount。
  • 未發佈 OpenBook 訂單(訂單簿網格已移除)。AmmInfo.market 記錄在插槽 15 傳入的帳戶,但 AmmInfo.open_orders 和 AmmInfo.market_program 都被寫為 Pubkey::default(),而 coin_lot_size / pc_lot_size / min_size 初始化為 0。在舊版的 21 個帳戶佈局上,額外的 amm_open_orders 和 market_program 帳戶會被讀取並丟棄。
常見錯誤 — InvalidCoinMint(coin 和 pc 鑄幣相同)、InvalidConfigAccount(錯誤的 amm_config PDA)、InvalidFee(錯誤的建池費用目標)、InvalidProgramAddress(錯誤的 amm_authority 或錯誤的 nonce)、RepeatCreateAmm(此市場已存在流動性池)、InitLpAmountTooLess、InvalidSupply(任一初始數量為 0,或 LP 鑄幣已有供應量)、AlreadyInUse。

Deposit

新增流動性。 參數
帳戶(簡化)
可接受的帳戶數量是 11、14 或 15 — 沒有其他。 舊版佈局是 14 個帳戶(或 15 個, 最後附加一個被忽略的帳戶):與上面相同的列表,但在位置 4 插入一個被忽略的 amm_open_orders,在位置 9 插入一個被忽略的 market,並在位置 14 附加一個被忽略的 market_event_queue。任何其他數量都會以 WrongAccountsNumber 還原。
數學 — 標準按比例。使用池的有效準備金(金庫 + 帳上),SDK 計算產生給定 LP 數量的 coin/pc 對,並根據 max_* 檢查。如果任一邊超過上限,則以 ExceededSlippage 回復。

Withdraw

銷毀 LP,接收雙邊。 參數
帳戶 — 建議的 11 帳戶佈局
Withdraw 不是反向的 Deposit。 可接受的帳戶數量是 11,或 20 到 23。舊版的 20 帳戶佈局把使用者的 LP 帳戶放在兩個接收 ATA 之前,並穿插五個被忽略的市場帳戶: token_program, amm(W), amm_authority, amm_open_orders(W), amm_target_orders(W), lp_mint(W), pool_coin_token_account(W), pool_pc_token_account(W), market_program, market(W), market_coin_vault(W), market_pc_vault(W), market_vault_signer, user_lp_token_account(W), user_coin_token_account(W), user_pc_token_account(W), user_owner(S), market_event_queue(W), market_bids(W), market_asks(W)。 22 和 23 帳戶的形式在位置 8 之後插入兩個被忽略的填充帳戶。任何其他數量都會以 WrongAccountsNumber 還原。
不再有任何從 OpenBook 結算的步驟 — 按比例的數學直接使用金庫餘額。

SwapBaseIn

精確輸入交換。始終是AMM 路徑交換(不通過 OpenBook 配對路由)。
新程式碼請使用 V2 變體。 由於 AMM v4 的 OpenBook 依賴已被移除,V1 進入點(SwapBaseIn、SwapBaseOut)仍期望完整的 17 帳戶列表(或 18 個含可選的 target-orders 帳戶),但 OpenBook/市場帳戶現在按位置被接受並忽略 — 它們不被驗證且不發出 CPI。傳遞錯誤的帳戶數量仍會以 WrongAccountsNumber 回復,但市場帳戶內容不再被檢查。新的整合應使用 SwapBaseInV2 / SwapBaseOutV2,其採用更小的帳戶列表,代表當今的規範執行路徑。V1 形式在此記錄以供完整性和讀取現有鏈上交易。
參數
帳戶(簡化) 數學 — 見 products/amm-v4/math。 前置條件
  • AmmStatus::from_u64(amm.status).swap_permission() 為真 — 也就是說,status 是 1(Initialized)、6(SwapOnly)或 7(WaitingTrade)。status 是列舉值,不是位元遮罩;見 products/amm-v4/accounts。
  • amm.state_data.pool_open_time <= now。
  • amount_in > 0。
  • user_source_token_account 持有至少 amount_in。
後置條件
  • 使用者失去 amount_in 的源代幣,獲得 amount_out ≥ minimum_amount_out 的目標代幣。
  • 交換費用留在金庫中,提高不變式 k。交換不會觸及 need_take_pnl_* 計數器 — 協議 PnL 會在下一次 Deposit、Withdraw 或 WithdrawPnl 時根據 k 的差值重新計算(Processor::calc_take_pnl)。
  • 注意:state_data.swap_*_in_amount / swap_*_out_amount 分析計數器不再更新 — 其值已凍結。使用交易日誌進行交易量分析。
常見錯誤 — ExceededSlippage、InvalidInput、InvalidStatus、NotAllowed(coin/pc mint 相同)。

SwapBaseOut

精確輸出,SwapBaseIn 的反向。帳戶相同。 參數

SwapBaseInV2 / SwapBaseOutV2

變體交換進入點(標籤 16 / 17),完全跳過 OpenBook 帳戶。數學與 V1 路徑相同,但帳戶列表縮小到僅 AMM 邊和使用者 — 8 個帳戶,且 amm_open_orders 未被傳遞: 池準備金現在是金庫餘額(減去待處理 PnL),所以報價數學直接且與 v1 路徑相同。使用 V2 以節省計算並避免傳遞(現已忽略的)市場帳戶。Raydium 路由器在通過 AMM v4 路由時始終使用 V2 形式。 參數與 V1 形式相同(SwapBaseInV2 的 amount_in / minimum_amount_out;SwapBaseOutV2 的 max_amount_in / amount_out)。

MonitorStep 和其他已移除的指令

已移除 — 不再可呼叫。 自 2026-07 升級起,MonitorStep(標籤 2)已從程式移除,若被呼叫現在會回復(unimplemented!)。其用戶端建構器也已刪除。同樣適用於 MigrateToOpenBook(5)、WithdrawSrm(8)、SimulateInfo(12)、AdminCancelOrders(13)以及舊版 Initialize(0)/ PreInitialize(10)池建立進入點 — 改用 Initialize2。
歷史上,MonitorStep 會啟動池的 OpenBook 互動:它結算已填充的訂單(通過 OpenBook CPI 將收益從市場金庫移至池金庫)、取消陳舊訂單,並發佈新訂單以縮小 target_orders 和 amm_open_orders 之間的差距。隨著 OpenBook 依賴的移除,沒有任何東西需要啟動,該指令已消失。任何仍呼叫它的守護程式或整合必須移除該呼叫。

WithdrawPnl / TakePnl

累積協議費用的管理員清掃。 參數
  • WithdrawPnl 不接受參數;它讀取 need_take_pnl_* 並移動那些確切的數量。
破壞性變更(僅限管理員)。 帳戶列表從 17(+1 可選)下降到 10 — amm_open_orders 和所有六個市場帳戶被移除 — 無相容性解析。舊配置錯位(舊 #5 是 amm_open_orders,現在是 pool_coin_token_account)並以 InvalidCoinVault 等錯誤失敗。管理員工具必須更新。
帳戶(新 10 帳戶配置) 效果
  • 從 pool_coin_token_account 轉移 need_take_pnl_coin 到 pnl_coin_token_account。
  • pc 相同。
  • 將 need_take_pnl_coin 和 need_take_pnl_pc 歸零。
  • 邏輯變更:如果金庫餘額不足以覆蓋累積 PnL,指令直接返回 TakePnlError(它不再操縱訂單簿狀態)。
由於累積 PnL 已從不變量中排除,準備金無變化。

SetParams

管理員參數變更,由 Raydium 多簽呼叫。參數是 param: u8 標籤 + 負載。
破壞性變更(僅限管理員)。 帳戶列表被減少到僅 [amm (W), admin (S)](權限、open-orders、target-orders、金庫和所有市場帳戶被移除)。param 列舉被重新編號和修剪:Status = 0、State = 1、Fees = 2(曾為 9)、SetOpenTime = 3(曾為 11)。所有訂單簿網格參數和 AmmOwner、LastOrderDistance、UpdateOpenOrder 被移除,SetParamsInstruction 結構體刪除了 new_pubkey 和 last_order_distance。管理員工具必須更新。

CreateConfigAccount / UpdateConfigAccount

程式級 AmmConfig PDA(種子 ["amm_config_account_seed"])的管理員管理。該帳戶恰好持有三個有意義的欄位 — pnl_owner、cancel_owner 和 create_pool_fee — 加上兩個保留的填充區域;沒有池建立標誌。UpdateConfigAccount 以 param = 0 設定 pnl_owner,以 param = 1 設定 cancel_owner,以 param = 2 設定 create_pool_fee。
在 2026-09 中變更,向後相容。 CreateConfigAccount 不再讀取租金系統變數。其帳戶列表現在是 4 個帳戶,從 5 個下降:程式從 Rent::get() 讀取租金參數,而不是反序列化傳入的系統變數帳戶 — 這是 Solana 3.0 依賴升級使其自然的做法。被移除的帳戶是列表中的最後一個,處理器通過 next_account_info 按位置讀取其帳戶,無長度檢查。因此,仍傳遞舊 5 帳戶列表的現有管理員工具保持工作:尾部租金帳戶根本不被讀取。在方便時更新它,不是緊急的。UpdateConfigAccount 不變。
Initialize2 在位置 3 保持租金系統變數,並仍使用它:程式停止在其上呼叫 Rent::from_account_info,但它仍被轉發到建立池金庫和 LP mint 的 spl_token::initialize_account 和 initialize_mint CPI。不要從帳戶列表中刪除它。

WithdrawExcessLamports

從程式控制的帳戶清掃坐在租金豁免最低額上方的 lamport。在 2026-09 升級中新增,以恢復 SIMD-0437 租金減少在每個步驟之前建立的帳戶上留下的過度資金。 它僅移動超額。代幣餘額、帳戶資料、所有者和池狀態保持不變,指令在已在最低額的帳戶上是無操作 — 所以重複發火和在每個推出步驟後再次發火是安全的。 參數 — 無。負載是單個標籤位元組 18。 帳戶 每個源帳戶的處理方式 程式根據源帳戶的 owner 分派: 常見錯誤 — InvalidSignAccount(錯誤簽署者)、InvalidSplTokenProgram(槽 3 中的錯誤程式)、InvalidProgramAddress(錯誤 amm_authority)、LamportsCalculateError(自訂程式碼 60;wSOL 往返未淨為零)和來自程式擁有路徑的 InsufficientFunds,當帳戶持有少於其自身租金最低額時。 無 SDK 建構器。 @raydium-io/raydium-sdk-v2 不提供此指令的建構器,raydium-sdk-V2-demo 儲存庫也不提供 — 這是管理員路徑。手動編碼,就像 solana-fundamentals/rent-and-reclaimable-rent 中的錢包邊清掃對代幣程式指令所做的那樣。

狀態變更矩陣

OpenBook 欄已消失 — 沒有指令再觸及訂單簿。

接下來去哪裡

來源: