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

# Payment Requirements

> 服务端定义的支付条件

## 类型

```ts theme={null}
interface PaymentRequirements {
  scheme: "exact";
  network: string;
  maxAmountRequired: string;
  resource: string;
  description: string;
  mimeType: string;
  payTo: string;
  maxTimeoutSeconds: number;
  asset: string;
  paymentType?: "eip3009" | "permit" | "permit2";
  outputSchema?: Record<string, unknown>;
  extra?: Record<string, unknown>;
}
```

## 字段要点

* `scheme`：固定 `"exact"`
* `network`：kebab-case 网络名（如 `bsc`, `base-sepolia`）
* `maxAmountRequired`：最大支付额（wei）
* `payTo`：商家地址（EIP-7702）
* `asset`：Token 合约地址
* `maxTimeoutSeconds`：签名有效期（防重放）

## 示例

```json theme={null}
{
  "scheme": "exact",
  "network": "bsc",
  "maxAmountRequired": "1000000",
  "resource": "https://api.example.com/premium",
  "description": "Premium API access",
  "mimeType": "application/json",
  "payTo": "0xSeller",
  "maxTimeoutSeconds": 600,
  "asset": "0xUSDC",
  "paymentType": "permit"
}
```

## Zod Schema

```ts theme={null}
import { z } from "zod";

export const PaymentRequirementsSchema = z.object({
  scheme: z.literal("exact"),
  network: z.string(), // 例如 "bsc", "bsc-testnet", "base-sepolia"
  maxAmountRequired: z.string().refine(
    (v) => Number.isInteger(Number(v)) && Number(v) >= 0
  ),
  resource: z.string().url(),
  description: z.string(),
  mimeType: z.string(),
  outputSchema: z.record(z.any()).optional(),
  payTo: z.string(), // EVM 0x... 或 SVM 地址
  maxTimeoutSeconds: z.number().int().positive(),
  asset: z.string(), // Token 地址（EVM/SVM）
  paymentType: z.enum(["eip3009", "permit", "permit2"]).optional(),
  extra: z.record(z.any()).optional(),
});
```

## 支持的网络

```ts theme={null}
type Network =
  | "bsc" | "bsc-testnet"
  | "ethereum" | "sepolia"
  | "base" | "base-sepolia"
  | "polygon" | "arbitrum" | "optimism";
```

## 验证规则要点

* scheme 必须为 `"exact"`
* network 必须与客户端/链配置一致
* `BigInt(payment.value) <= BigInt(maxAmountRequired)`
* `resource` 为有效 URL，且与受保护资源一致
* `payTo` 与商家收款地址一致（建议 EIP-7702）
* 超时：`deadline/validBefore <= now + maxTimeoutSeconds`
* 若指定 `paymentType`，客户端必须使用该类型

## 常见场景

* 固定价 API：启动时创建并缓存 requirements，复用以降低开销
* 动态定价：按请求上下文计算 `maxAmountRequired/description`
* 多 Token 选项：返回多个 `accepts` 供客户端选择（见 402）

## 结合 402 的用法

```json theme={null}
{
  "x402Version": 1,
  "accepts": [
    { "scheme": "exact", "network": "bsc", "asset": "0xUSDC", "maxAmountRequired": "1000000", "description": "Pay with USDC", "mimeType": "application/json", "payTo": "0xSeller", "maxTimeoutSeconds": 600 },
    { "scheme": "exact", "network": "bsc", "asset": "0xDAI", "maxAmountRequired": "1000000000000000000", "description": "Pay with DAI", "mimeType": "application/json", "payTo": "0xSeller", "maxTimeoutSeconds": 600 }
  ]
}
```
