> ## 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.

# 路由账户

> AMM 路由程序中账户如何按跳转传递：每个中间代币的用户 ATA，以及路由每个环节的各池账户块。

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

  [查看英文版 →](/products/routing/accounts)
</Info>

## 账户布局：用户 ATA 贯穿始终

所有启用的交换变体都通过**用户控制的 ATA**路由中间代币。用户拥有输入 ATA、每个中间 ATA 和最终输出 ATA。活跃表面上没有共享的或路由器拥有的中间代币账户。

属性：

* 用户为每个中间代币拥有一个 ATA。
* 用户在账户列表中提供每个 ATA。
* 每个中间 ATA 必须已存在于链上（对 wSOL 使用 `CreateSyncNative` 初始化，或通过 SPL 关联代币账户程序初始化其他 mint，在路由之前）。
* 路由器在每次跳转时从一个 ATA 转出，进入下一个池的金库。
* 每个中间 ATA 在每条路由结束时的余额与开始时相同——路由消耗前一跳产生的任何内容。

路由 `USDC → SOL → STEP` 的示例流：

```
Accounts list:
  [
    USDC_input_ata (user, signer),
    SOL_intermediate_ata (user),
    STEP_output_ata (user),
    token_program,

    amm_program_1, *amm1_accounts,    // hop 1: USDC → SOL
    amm_program_2, *amm2_accounts,    // hop 2: SOL → STEP
  ]

Hop 1: USDC_input_ata → AMM1 → SOL_intermediate_ata
Hop 2: SOL_intermediate_ata → AMM2 → STEP_output_ata
```

## 按跳转的账户布局

每次跳转的账户连续传递。路由器通过读取每次跳转块中的第一个账户（程序 ID）来识别子程序，然后分派到正确的处理程序。

对于每次跳转，路由器期望账户分组为：

```
[
  program_id,         // Identifies which pool program (AMM v4, CPMM, CLMM, Stable)
  *child_accounts,    // All accounts required by that pool's swap instruction
]
```

子账户因池类型而异：

### AMM v4 跳转

大约 18 个账户：池、权限账户、金库、mint、OpenBook 市场账户（为向后兼容而保留在账户列表中，尽管 AMM v4 的 OpenBook 集成不再活跃）、代币程序。详见 [`products/amm-v4/accounts`](/zh/products/amm-v4/accounts)。

### CPMM 跳转

大约 11–13 个账户：池状态、权限账户、金库（2 个）、mint（2 个）、代币程序、系统程序、关联代币程序。详见 [`products/cpmm/accounts`](/zh/products/cpmm/accounts)。

### CLMM 跳转

大约 15+ 个账户：池、tick 数组、金库、mint、观察状态、签名者、代币程序。详见 [`products/clmm/accounts`](/zh/products/clmm/accounts)。

### Stable 跳转

类似于 AMM v4。详见 [`products/stable/accounts`](/zh/products/stable/accounts)。

## 代币流和 ATA 所有权

* 调用者使用 `user_input_ata` 签名。
* 调用者**必须拥有**所有输入、中间和输出 ATA。如果任何中间 ATA 的所有者不是签名者，路由器将拒绝交易。
* 调用者的 `user_input_ata` 余额必须足以满足第一跳的输入（tag 0 / 8 的 `amount_in`，或 tag 1 / 9 的 `maximum_amount_in`）。
* 每个中间 ATA 必须已存在于链上。如果不存在，提前创建——通常通过 [SPL 关联代币账户程序](https://spl.solana.com/associated-token-account)，或对 wSOL ATA 使用 `CreateSyncNative`（tag 5）。

## CreateSyncNative 指令

如果你需要通过 wrapped SOL 路由，且不想手动创建和同步 wSOL ATA，请使用 [`CreateSyncNative`](/zh/products/routing/instructions#createsyncnative-tag-5)（tag 5）：

```
CreateSyncNative(amount)
```

这会在调用者的钱包下创建 wSOL ATA，通过系统程序将 `amount` 的 SOL 转入，并在一条指令中同步它。对于在路由前初始化新的 wSOL ATA 很有用。

## CloseTokenAccount 指令

路由完成后，你可能想关闭任何中间 ATA——最常见的是 wSOL ATA——以回收租金。使用 [`CloseTokenAccount`](/zh/products/routing/instructions#closetokenaccount-tag-6)（tag 6）：

```
CloseTokenAccount
```

代币账户在关闭前必须有零代币余额；路由器不会自动清空它。

## 下一步

* [`products/routing/instructions`](/zh/products/routing/instructions) — 每条指令的参数形状和账户列表顺序。
* [`products/routing/code-demos`](/zh/products/routing/code-demos) — 用 TypeScript 构建路由。
* [`reference/program-addresses`](/zh/reference/program-addresses) — 子程序 ID。
