> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 2026-07-22 — AMM v4：移除 OpenBook / Serum 依赖

> AMM v4 移除了其休眠的 OpenBook/Serum 依赖、CPI 和做市指令：v1 Swap/Deposit/Withdraw 保持兼容，WithdrawPnl 和 SetParams 是硬破坏性变更，多个指令不再可调用。

<Info>
  **本页内容由 AI 自动翻译，所有内容以英文版本为准。**

  [查看英文版 →](/reference/changelog/2026-07-22-amm-v4-openbook-removal)
</Info>

<Info>
  文档更新日志条目。所有更新的索引见 [`reference/changelog`](/zh/reference/changelog)。协议的历史时间线见 [`introduction/history-and-milestones`](/zh/introduction/history-and-milestones)。
</Info>

AMM v4 **很久以前就停止了向 OpenBook（原 Serum）共享流动性**；混合订单簿做市路径已经休眠多年。此次升级是清理工作：它**从程序中移除了 Serum 依赖、所有订单簿 CPI 和已废弃的做市指令**，使 AMM v4 成为纯常数乘积（`x·y=k`）AMM。它**不会**改变任何实时交易行为——没有遗留的 OpenBook 订单需要停止下单。

## 集成者速览

* **Swap / Deposit / Withdraw 继续工作，无需更改。** 使用旧账户布局构建的交易仍然执行——被移除的 Serum/市场账户被简单忽略（无验证、无 CPI）。`SwapBaseIn` / `SwapBaseOut` 仍然需要 **17 个（+1 可选）** 账户；`Deposit` 和 `Withdraw` 布局不变。你**不需要**发布客户端更新来保持现有流程运行。
* **迁移到 V2 swap 入口点。** `SwapBaseInV2` / `SwapBaseOutV2` 不包含市场账户和 `amm_open_orders`（共 8 个账户），因此交易更小、成本更低。路由器/聚合器应该通过 V2 路由。
* **`WithdrawPnl` 是硬破坏性变更（仅限管理员）。** 它从 **17 个（+1 可选）→ 10 个** 账户，**无兼容性解析**；旧布局错位（旧的 #5 是 `amm_open_orders`）并导致验证失败。管理员工具必须更新。
* **`SetParams` 是硬破坏性变更（仅限管理员）。** 账户缩减为 `[amm, admin]`，`param` 枚举被**重新编号**（`Fees` 9 → 2，`SetOpenTime` 11 → 3）；`AmmOwner`、`LastOrderDistance`、`UpdateOpenOrder` 和网格参数被移除。
* **多个指令不再可调用。** `Initialize`、`PreInitialize`、`MonitorStep`、`MigrateToOpenBook`、`WithdrawSrm`、`SimulateInfo` 和 `AdminCancelOrders` 现在会回滚。使用 `Initialize2` 创建池。
* **链上账户布局字节稳定，错误代码不变。** `AmmInfo` / `StateData` 保持其布局（旧 OpenBook 字段保留但已弃用/冻结）；`AmmError` 编号保留，仅在末尾追加新的 `NotAllowed`。

## 为什么这很重要（对交易者、LP 和集成者）

* **交易者**看不到 swap 行为或定价的变化——常数乘积曲线不变。V2 布局 swap 的成本更低，因为它们携带的账户少约 8 个。
* **LP** 保持相同的存取经济学。流动性长期以来完全位于池金库中，因此池价值完全在链上；此升级仅删除了陈旧的市场管道。
* **集成者**获得更小、更简单的交易和直接从金库读取的报价模型。现有集成不会中断（除了管理员 `WithdrawPnl` / `SetParams`），但 v1-swap 兼容性垫片是临时的——可以随时迁移到 V2。

## 指令级变更

### 仍可调用，布局不变（向后兼容）

`Initialize2`、`Deposit`、`Withdraw`、`SwapBaseIn`、`SwapBaseOut`、`CreateConfigAccount` 和 `UpdateConfigAccount` 保持其现有账户列表。在 `SwapBaseIn` / `SwapBaseOut`、`Deposit` 和 `Withdraw` 上，OpenBook/市场账户仍然按位置接受，但**不再被验证或使用**——不发出 CPI，池储备仅从金库计算。账户**数量**仍然必须匹配，因此现有交易继续不变地执行。

### `SwapBaseInV2` / `SwapBaseOutV2` — 推荐路径

完全省略市场账户和 `amm_open_orders`（8 个账户；标签 16 / 17）。报价数学与 v1 相同。新集成和路由器应使用 V2。

### `WithdrawPnl` — 17 个（+1 可选）→ 10 个账户（⚠️ 硬破坏，无兼容性路径）

`amm_open_orders` 和所有六个市场账户被移除。新的固定 10 账户、仅限管理员的布局**没有**兼容性解析；旧布局错位并导致诸如 `InvalidCoinVault` 的错误。

### `SetParams` — 缩减为 `[amm, admin]`（⚠️ 硬破坏）+ 重新编号的参数

权限、开放订单、目标订单、金库和所有市场账户被移除。`param` 枚举被重新编号和精简：

| 参数            | 旧值 | 新值    |
| ------------- | -- | ----- |
| `Status`      | 0  | 0     |
| `State`       | 1  | 1     |
| `Fees`        | 9  | **2** |
| `SetOpenTime` | 11 | **3** |

所有订单簿网格参数（`OrderNum`、`Depth`、`AmountWave`、`MinPriceMultiplier`、`MaxPriceMultiplier`、`MinSize`、`VolMaxCutRatio`、`InitOrderDepth`、`SetSwitchTime`、`ClearOpenTime`、`Seperate`）加上 `AmmOwner`、`LastOrderDistance` 和 `UpdateOpenOrder` 被移除。`SetParamsInstruction` 结构体删除了 `new_pubkey` 和 `last_order_distance`。

### 不再可调用（运行时回滚；构建器已移除）

| 指令                  | 标签 | 替代品              |
| ------------------- | -- | ---------------- |
| `Initialize`        | 0  | `Initialize2`    |
| `MonitorStep`       | 2  | 无（订单簿 crank，已停用） |
| `MigrateToOpenBook` | 5  | 无                |
| `WithdrawSrm`       | 8  | 无（SRM 费用折扣，已停用）  |
| `PreInitialize`     | 10 | `Initialize2`    |
| `SimulateInfo`      | 12 | 链下 / SDK 报价      |
| `AdminCancelOrders` | 13 | 无                |

## 储备 / 状态变更

* **池资产公式。** 总池资产现在为 `金库余额 − 待处理 PnL（need_take_pnl）`；OpenBook 开放订单项——实际上已经为零——被删除。报价代码可以直接从金库余额读取。
* **已弃用的状态字段。** `StateData.total_pnl_pc`、`total_pnl_coin`、`orderbook_to_init_time`、`swap_coin_in_amount`、`swap_pc_out_amount`、`swap_acc_pc_fee`、`swap_pc_in_amount`、`swap_coin_out_amount` 和 `swap_acc_coin_fee` 为了布局兼容性而保留，但**不再更新**。依赖 `swap_*` 交易量计数器的消费者应切换到交易日志。
* **`AmmInfo` 初始化。** `coin_lot_size`、`pc_lot_size` 和 `min_size` 现在初始化为 `0`。
* **移除的依赖和 CPI。** `serum_dex` crate 从 `Cargo.toml` 中删除；所有 Serum DEX CPI（`invoke_dex_new_order_v3`、`invoke_dex_cancel_order_v2`、`invoke_dex_settle_funds`、`invoke_dex_init_open_orders`、…）从 `invokers.rs` 中移除。移除的数据结构：`LastOrderDistance`、`SimulateParams`、`RunCrankData`、`GetPoolData`、`GetSwapBaseInData`、`GetSwapBaseOutData`。
