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

# 交易 API 概览

> Solana 的服务器端交换交易构建器

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

  [查看英文版 →](/api-reference/route-api-v2/overview)
</Info>

## 什么是交易 API？

Raydium 交易 API（Route V2）是一种服务器端服务，可以构建序列化的 Solana 交换交易，而无需客户端维护 RPC 连接或集成整个 Raydium SDK。这大大简化了以下场景的集成：

* 无法运行本地 RPC 客户端的 Web 前端
* 资源受限的移动应用
* 无界面交易机器人
* 聚合器和钱包提供商

你无需在客户端执行复杂的池路由和交易构造逻辑，而是从我们的 API 请求交换报价和交易构建，然后使用任何 Solana RPC 对结果进行签名和广播。

## 工作流概览

交易 API 将流程分为两个阶段：

### 1. 计算阶段：获取报价

调用 `/compute/swap-base-in` 或 `/compute/swap-base-out` 根据当前池状态接收预期的交换输出（或所需输入）。此端点是**只读的**，不需要任何签名：

```bash theme={null}
GET /compute/swap-base-in?inputMint=EPjF...&outputMint=So111...&amount=1000000&slippageBps=50&txVersion=V0
```

响应包括：

* 预期输出金额
* 路由细目（使用了哪些池和流动性来源）
* 价格影响

### 2. 交易阶段：构建并签名

获得计算响应后，将其（连同钱包和配置）传递给 `/transaction/swap-base-in` 或 `/transaction/swap-base-out`：

```bash theme={null}
POST /transaction/swap-base-in
Content-Type: application/json

{
  "wallet": "YourWalletAddress",
  "swapResponse": { ...response from /compute/swap-base-in },
  "txVersion": "V0",
  "computeUnitPriceMicroLamports": "1000",
  "wrapSol": false,
  "unwrapSol": false,
  "inputAccount": "TokenAccount1...",
  "outputAccount": "TokenAccount2..."
}
```

响应包含：

* 一个 Base64 编码的版本化交易，已准备好签名
* 地址查找表地址（仅当 txVersion=V0 时）

你的客户端随后：

1. 解码交易
2. 使用用户的密钥对进行签名
3. 通过任何 Solana RPC 广播
4. 等待确认

## 计算端点

### `GET /compute/swap-base-in`

**用例**：用户指定输入金额，我们计算输出。

**必需查询参数**：

* `inputMint` – 你要发送的代币的铸币地址
* `outputMint` – 你想要的代币的铸币地址
* `amount` – 输入金额（最小单位 lamports）
* `slippageBps` – 最大可接受滑点（基点，0–10000）
* `txVersion` – `V0` 或 `LEGACY`

**可选**：

* `referrerBps` – 如果你有推荐人权限，收取为推荐人费用的输出基点数

### `GET /compute/swap-base-out`

**用例**：用户指定所需输出，我们计算所需输入。

**必需查询参数**：

* `inputMint`、`outputMint`、`amount`（所需输出）、`slippageBps`、`txVersion`

**注意**：Base-out 暂不支持推荐人基点（尚未实现）。

## 交易端点

### `POST /transaction/swap-base-in`

为固定输入金额构建交易。

**必需请求体**：

* `wallet` – 你的签名钱包地址
* `swapResponse` – 完整的计算响应对象
* `txVersion` – 交易版本
* `computeUnitPriceMicroLamports` – 优先费（微 lamports）

**可选**：

* `wrapSol` – 如果为 true，为输入包装原生 SOL
* `unwrapSol` – 如果为 true，在输出中将 WSOL 解包为 SOL
* `inputAccount` – 输入的代币账户（如不包装 SOL 则必需）
* `outputAccount` – 输出的代币账户
* `nonceInfo` – 离线签名用的持久 nonce
* `jitoInfo` – Jito MEV 保护捆绑参数
* `referrerWallet` – 推荐人钱包用于费用收集

### `POST /transaction/swap-base-out`

为固定输出金额构建交易。

**与 base-in 的参数相同**，除了：

* `referrerInfo` 字段目前已注释（尚未实现）

## 响应信封

所有端点都返回标准信封：

```json theme={null}
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "success": true,
  "version": "V1",
  "data": { ... }
}
```

出错时，`success` 为 `false`，`msg` 包含错误代码（例如 `REQ_WALLET_ERROR`、`REQ_SLIPPAGE_BPS_ERROR`）。

## 交易响应结构

成功的交易响应如下：

```json theme={null}
{
  "id": "...",
  "success": true,
  "version": "V1",
  "data": {
    "transaction": "AgABB...",  // Base64 编码的交易
    "addressLookupTableAddresses": ["Address1...", "Address2..."]  // 仅 V0
  }
}
```

## 集成示例

以下是伪代码中的典型流程：

```typescript theme={null}
// 1. 获取报价
const quote = await fetch(
  'https://transaction-v1.raydium.io/compute/swap-base-in?' +
  'inputMint=EPjF...&outputMint=So111...&amount=1000000&slippageBps=50&txVersion=V0'
).then(r => r.json());

// 2. 验证报价
if (!quote.success) {
  throw new Error(quote.msg);
}

// 3. 构建交易
const tx = await fetch(
  'https://transaction-v1.raydium.io/transaction/swap-base-in',
  {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      wallet: userWalletAddress,
      swapResponse: quote,
      txVersion: 'V0',
      computeUnitPriceMicroLamports: '1000',
      inputAccount: userInputTokenAccount,
      outputAccount: userOutputTokenAccount,
    }),
  }
).then(r => r.json());

// 4. 解码并签名
const transaction = VersionedTransaction.deserialize(
  Buffer.from(tx.data.transaction, 'base64')
);
transaction.sign([userKeypair]);

// 5. 通过 RPC 发送
const rpc = new Connection('https://api.mainnet-beta.solana.com');
const sig = await rpc.sendTransaction(transaction);
await rpc.confirmTransaction(sig);
```

## 关键参数说明

### `txVersion`

* **V0**：现代 Solana 交易，带地址查找表（ALT）。序列化大小更小，费用更低。
* **LEGACY**：ALT 前的交易格式。较大，但适用于所有 RPC 端点。

尽可能选择 **V0**；如果你的 RPC 或钱包不支持 ALT，则回退到 **LEGACY**。

### `computeUnitPriceMicroLamports`

优先费用以加快区块包含。设置为 `0` 表示无优先费用，或设置为更高的值（例如 `1000`）以在拥堵的网络中竞争。单位为每计算单位的微 lamports。

### `slippageBps`

最大滑点容限（基点）。`100` = 1%，`50` = 0.5%。

* 对于大多数稳定的交换，使用较低值（例如 25–50 bps）
* 对于波动或低流动性的交易对，增加滑点

### `wrapSol` 和 `unwrapSol`

* **wrapSol**：如果为 `true`，API 会将你的原生 SOL 包装为 WSOL。不需要 `inputAccount`。
* **unwrapSol**：如果为 `true`，API 会在输出中将 WSOL 解包回原生 SOL。不需要 `outputAccount`。

如果两者都为 `false`，你必须提供显式的代币账户。

## 网络端点

| 网络 | Mainnet                     | Devnet                             |
| -- | --------------------------- | ---------------------------------- |
| 主机 | `transaction-v1.raydium.io` | `transaction-v1-devnet.raydium.io` |
| 协议 | HTTPS                       | HTTPS                              |

## 错误代码

常见错误信息：

| 代码                        | 含义                        |
| ------------------------- | ------------------------- |
| `REQ_SLIPPAGE_BPS_ERROR`  | 滑点无效或超出范围                 |
| `REQ_INPUT_MINT_ERROR`    | 输入铸币地址无效                  |
| `REQ_OUTPUT_MINT_ERROR`   | 输出铸币地址无效                  |
| `REQ_AMOUNT_ERROR`        | 金额不是有效数字                  |
| `REQ_TX_VERSION_ERROR`    | txVersion 必须是 V0 或 LEGACY |
| `REQ_WALLET_ERROR`        | 钱包地址无效                    |
| `REQ_INPUT_ACCOUT_ERROR`  | 输入代币账户缺失或无效               |
| `REQ_OUTPUT_ACCOUT_ERROR` | 输出代币账户缺失或无效               |
| `UNKNOWN_ERROR`           | 服务器端错误；检查你的请求参数           |

## 另见

* [OpenAPI 规范](/zh/api-reference/openapi/route-api-v2.yaml)
* [聚合器集成指南](/zh/integration-guides/aggregator)
