Skip to main content
本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
自 2026-07 程式升級起,AMM v4 的 OpenBook / Serum 依賴已被移除。舊版 v1 的 SwapBaseIn / SwapBaseOutDepositWithdraw 指令保持原有帳戶配置以維持向後相容性:市場帳戶仍在原位置被接受,但不再被驗證或使用(不發出 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 後置條件
  • lp_supply = sqrt(init_coin_amount × init_pc_amount) − INIT_BURN,其中 INIT_BURN ≈ 100 LP 單位保留在流通外。
  • 未發佈 OpenBook 訂單(訂單簿網格已移除)。market_program / market 仍被傳遞但僅作為參考欄位儲存;coin_lot_size / pc_lot_size / min_size 初始化為 0
常見錯誤InvalidInput(小數點不匹配、未排序)、NotAllowed

Deposit

新增流動性。 參數
帳戶(簡化) 數學 — 標準按比例。使用池的有效準備金(金庫 + 帳上),SDK 計算產生給定 LP 數量的 coin/pc 對,並根據 max_* 檢查。如果任一邊超過上限,則以 ExceededSlippage 回復。

Withdraw

銷毀 LP,接收雙邊。 參數
帳戶 — 類似 Deposit,方向相反;lp_mint 對銷毀可寫,使用者 ATA 是接收者。帳戶配置不變(市場帳戶仍按位置傳遞,被忽略)。不再有任何從 OpenBook 結算的步驟 — 按比例數學直接使用金庫餘額。

SwapBaseIn

精確輸入交換。始終是AMM 路徑交換(不通過 OpenBook 配對路由)。
新程式碼請使用 V2 變體。 由於 AMM v4 的 OpenBook 依賴已被移除,V1 進入點(SwapBaseInSwapBaseOut)仍期望完整的 17 帳戶列表(或 18 個含可選的 target-orders 帳戶),但 OpenBook/市場帳戶現在按位置被接受並忽略 — 它們不被驗證且不發出 CPI。傳遞錯誤的帳戶數量仍會以 WrongAccountsNumber 回復,但市場帳戶內容不再被檢查。新的整合應使用 SwapBaseInV2 / SwapBaseOutV2,其採用更小的帳戶列表,代表當今的規範執行路徑。V1 形式在此記錄以供完整性和讀取現有鏈上交易。
參數
帳戶(簡化) 數學 — 見 products/amm-v4/math 前置條件
  • amm.status 允許交換(狀態位元遮罩的位 0 未設定)。
  • amm.state_data.pool_open_time <= now
  • amount_in > 0
  • user_source_token_account 持有至少 amount_in
後置條件
  • 使用者失去 amount_in 的源代幣,獲得 amount_out ≥ minimum_amount_out 的目標代幣。
  • need_take_pnl_* 按協議費用份額遞增。
  • 注意:state_data.swap_*_in_amount / swap_*_out_amount 分析計數器不再更新 — 其值已凍結。使用交易日誌進行交易量分析。
常見錯誤ExceededSlippageInvalidInputInvalidStatusNotAllowed(coin/pc mint 相同)。

SwapBaseOut

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

SwapBaseInV2 / SwapBaseOutV2

變體交換進入點(標籤 16 / 17),完全跳過 OpenBook 帳戶。數學與 V1 路徑相同,但帳戶列表縮小到僅 AMM 邊和使用者 — 8 個帳戶,且 amm_open_orders 未被傳遞 池準備金現在是金庫餘額(減去待處理 PnL),所以報價數學直接且與 v1 路徑相同。使用 V2 以節省計算並避免傳遞(現已忽略的)市場帳戶。Raydium 路由器在通過 AMM v4 路由時始終使用 V2 形式。 參數與 V1 形式相同(SwapBaseInV2amount_in / minimum_amount_outSwapBaseOutV2max_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_ordersamm_open_orders 之間的差距。隨著 OpenBook 依賴的移除,沒有任何東西需要啟動,該指令已消失。任何仍呼叫它的守護程式或整合必須移除該呼叫。

WithdrawPnl / TakePnl

累積協議費用的管理員清掃。 參數
  • WithdrawPnl 不接受參數;它讀取 need_take_pnl_* 並移動那些確切的數量。
破壞性變更(僅限管理員)。 帳戶列表從 17(+1 可選)下降到 10amm_open_orders 和所有六個市場帳戶被移除 — 無相容性解析。舊配置錯位(舊 #5 是 amm_open_orders,現在是 pool_coin_token_account)並以 InvalidCoinVault 等錯誤失敗。管理員工具必須更新。
帳戶(新 10 帳戶配置) 效果
  • pool_coin_token_account 轉移 need_take_pnl_coinpnl_coin_token_account
  • pc 相同。
  • need_take_pnl_coinneed_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)。所有訂單簿網格參數和 AmmOwnerLastOrderDistanceUpdateOpenOrder 被移除,SetParamsInstruction 結構體刪除了 new_pubkeylast_order_distance。管理員工具必須更新。

CreateConfigAccount / UpdateConfigAccount

程式級 AmmConfig PDA(種子 ["amm_config_account_seed"])的管理員管理,其持有 PnL 所有者、建立池費用和池建立標誌。
在 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_accountinitialize_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 欄已消失 — 沒有指令再觸及訂單簿。

接下來去哪裡

來源: