## Pacifica 集成指引（Node/TypeScript）

本文件总结了在本项目中成功打通 Pacifica REST 下单/撤单/全撤 与订单簿的方式、要点与排错建议。快速回归与更完整的用例请参考 `docs/pacifica/TESTS.md`。

### 关键要点（务必遵守）

- 签名实现必须严格按官方“签名实现”流程：构造 { timestamp, expiry_window, type, data }，递归按键名排序，生成紧凑 JSON，再用 Ed25519 对字节串签名；最终请求体将签名头与“原始业务字段”平铺，而不是包裹在 data 中。
  - 参考文档：签名实现 https://docs.pacifica.fi/api-documentation/api/signing/implementation
- 下单与撤单“签名仅覆盖业务字段”，不能包含 `account` 或 `agent_wallet` 等请求体外层字段。
- 交易对符号：Pacifica 订单簿与下单要求基础符号，如 `BTC`。若你使用 `BTC-USD` 或 `BTCUSDT`，请在发起请求前归一化为 `BTC`。
- `client_order_id` 需要 UUID（v4）。
- 市价单必须带 `slippage_percent`（如 "0.5"），可使用 IOC。
- 撤单签名字段：`symbol + (order_id 或 client_order_id)`。
- 全撤签名字段：`all_symbols`、`exclude_reduce_only`、可选 `symbol`（当 all_symbols=false 时必需）。
- 批量接口不对整个 batch 体签名，而是对内部每个 Create/Cancel 动作分别签名。

### 主要 REST 端点（已对齐）

- 订单簿：`GET /api/v1/book?symbol=BTC`（成功）
  - 文档：https://docs.pacifica.fi/api-documentation/api/rest-api/markets/get-orderbook
- 市价单：`POST /api/v1/orders/create_market`（成功）
  - 文档：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/create-market-order
- 限价单：`POST /api/v1/orders/create`（成功）
  - 文档：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/create-limit-order
- 撤单：`POST /api/v1/orders/cancel`（成功）
  - 文档：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/cancel-order
- 全撤：`POST /api/v1/orders/cancel_all`（成功）
  - 文档：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/cancel-all-orders
- 批量：`POST /api/v1/orders/batch`（已支持每动作单独签名）
  - 文档：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/batch-order

### 环境变量（最小集合）

- `PACIFICA_ACCOUNT`：主账户公钥（Base58）。必须与私钥派生一致。
- `PACIFICA_ACCOUNT_PRIVATE_KEY`：主账户私钥（Base58 或 64/32 字节 JSON 数组）。
- 可选：`PACIFICA_USE_AGENT=1`、`PACIFICA_AGENT_WALLET`、`PACIFICA_AGENT_PRIVATE_KEY` 用于代理钱包下单（需先绑定）。
- 调试：`PACIFICA_DEBUG=1` 打印签名数据与最终请求体（签名值只打印前缀）。

### 成功请求示例（简化）

- 订单簿（公开）

```bash
curl 'https://api.pacifica.fi/api/v1/book?symbol=BTC'
```

- 市价单（IOC）签名覆盖字段：symbol, amount, side, reduce_only, client_order_id, slippage_percent

```typescript
const res = await ex.placeOrder({
  symbol: 'BTC',
  side: 'BUY',
  type: 'MARKET',
  quantity: '0.001',
  tif: 'IOC',
})
```

- 限价单（GTC）签名覆盖字段：symbol, price, amount, side, tif, reduce_only, client_order_id

```typescript
const res = await ex.placeOrder({
  symbol: 'BTC',
  side: 'SELL',
  type: 'LIMIT',
  quantity: '0.001',
  price: '112200',
  tif: 'GTC',
})
```

- 撤单（优先用 order_id；如无则用 client_order_id）

```typescript
await ex.cancelOrder('BTC', '281317418')
```

- 全撤（按符号）

```typescript
await ex.cancelAll('BTC')
```

- 批量（每个动作单独签名后打包）

```json
{
  "actions": [
    {
      "type": "Create",
      "data": {
        /* 已签名的 create_order 体 */
      }
    },
    {
      "type": "Cancel",
      "data": {
        /* 已签名的 cancel_order 体 */
      }
    }
  ]
}
```

### 常见错误与定位

- 400 Verification failed
  - 检查 `PACIFICA_ACCOUNT` 与 `PACIFICA_ACCOUNT_PRIVATE_KEY` 是否一致（用私钥派生的公钥需等于 account）。
  - 检查签名数据集是否仅包含“业务字段”，字段名/大小写与文档一致；`client_order_id` 必须是 UUID。
  - `symbol` 必须是基础符号（如 `BTC`）。
- 500 Internal server error（下单）
  - 常见因 `symbol` 不规范或 `client_order_id` 非 UUID；或价格/精度不合法（限价）。
- 403 openOrders
  - 受保护/受限端点（可能为 CDN/鉴权策略）；不影响下单/撤单功能验证。

### 当前实现要点（本项目）

- `PacificaClient`：Ed25519 签名、固定端点、可选代理钱包；Header 级签名已对敏感 POST 关闭（仅用 body 签名）。
- `PacificaAdapter`：
  - `symbols()`/`depth()`：使用公开端点；`depth()` 支持符号归一化。
  - `placeOrder()`：市价单自动补 `slippage_percent='0.5'`；所有下单/撤单均归一化 symbol 为基础符号。
  - `cancelOrder()`：签名字段仅 `symbol + (order_id|client_order_id)`。
  - `cancelAll()`：签名 `cancel_all_orders` 的数据字段，再与 `account` 平铺。
  - `batch()`：逐动作单签名，然后统一提交。
  - `setPositionTpSl()`：使用 `/api/v1/positions/tpsl`，统一规范化符号并按 `set_position_tpsl` 规则签名。

### 参考文档

- 签名实现：https://docs.pacifica.fi/api-documentation/api/signing/implementation
- Get orderbook：https://docs.pacifica.fi/api-documentation/api/rest-api/markets/get-orderbook
- Create market order：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/create-market-order
- Create limit order：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/create-limit-order
- Cancel order：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/cancel-order
- Cancel all orders：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/cancel-all-orders
- Batch order：https://docs.pacifica.fi/api-documentation/api/rest-api/orders/batch-order
