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

# 快速开始

> 使用 LI.FI Intents API 请求报价、在链上开启托管订单，并追踪其直至完成。

本快速开始将带你使用 **标准托管流程** 完成一次完整的跨链 USDC 转账（Base → Arbitrum），这是大多数集成的推荐路径。完成后，你将已经请求了报价、授权了代币、在链上开启了订单，并将其追踪至结算。

如果你需要 **无 gas 的链下订单提交** 或正在基于资源锁进行构建，请改为参见 [Compact 订单](/lifi-intents/intents-api/compact-orders)指南。

由于托管流程需要链上交易，整个流程使用 TypeScript 配合 [viem](https://viem.sh/)。你需要一个连接到 Base 的 public client，以及一个持有 USDC 的账户（钱包）。

<Note>
  无需 API 密钥。所有集成方端点均开放且无速率限制。详见[身份验证](/lifi-intents/authentication)。
</Note>

***

## 前置条件

托管流程涉及链上交易（授权代币和调用托管合约以锁定资金）。我们使用 [viem](https://viem.sh/) 与 Base 网络交互，但任何与 EVM 兼容的库（ethers.js、web3.js 等）的用法都相同。

```bash theme={"system"}
npm install viem
```

```ts TypeScript theme={"system"}
import { createPublicClient, createWalletClient, http, type Hex } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';
import { base } from 'viem/chains';

const account = privateKeyToAccount('YOUR_PRIVATE_KEY' as Hex);
const publicClient = createPublicClient({ chain: base, transport: http('https://mainnet.base.org') });
const walletClient = createWalletClient({ account, chain: base, transport: http('https://mainnet.base.org') });
```

下面的代码使用了来自[系统架构](/lifi-intents/architecture/overview#smart-contracts)参考的合约地址。这些地址在所有受支持的 **EVM** 链上都相同。

***

## 托管流程

标准托管集成是一个 4 步过程：请求报价、授权代币、在链上开启订单，并将其追踪至结算。

<Note>
  Intents API 使用[可互操作地址（EIP-7930）](https://eips.ethereum.org/EIPS/eip-7930)。有关编码细节，请参见[请求报价](/lifi-intents/intents-api/request-quote)。
</Note>

<Steps>
  <Step title="请求报价">
    使用用户的输入和目标输出调用 `POST /quote/request`。此示例从 Base 向 Arbitrum 发送 10 USDC。

    ```ts TypeScript theme={"system"}
    const userAddress = account.address;
    const userAddressRaw = userAddress.slice(2); // Remove 0x prefix

    const response = await fetch('https://order.li.fi/quote/request', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        user: `0x0001000002210514${userAddressRaw}`,
        intent: {
          intentType: 'oif-swap',
          inputs: [{
            user: `0x0001000002210514${userAddressRaw}`,
            asset: '0x0001000002210514833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',  // USDC on Base
            amount: '10000000',  // 10 USDC (6 decimals)
          }],
          outputs: [{
            receiver: `0x0001000002A4B114${userAddressRaw}`,
            asset: '0x0001000002A4B114af88d065e77c8cC2239327C5EDb3A432268e5831',  // USDC on Arbitrum
            amount: null,
          }],
          swapType: 'exact-input',
        },
        supportedTypes: ['oif-escrow-v0'],
      }),
    });

    const { quotes } = await response.json();
    const bestQuote = quotes[0];
    console.log('Output amount:', bestQuote.preview.outputs[0].amount);
    ```

    可互操作地址前缀编码了链。`0x00010000022105` 是 Base（8453），`0x0001000002A4B1` 是 Arbitrum（42161）。详见[可互操作地址编码](/lifi-intents/intents-api/request-quote#interoperable-address-encoding)。

    响应包含一个按最优价格排序的报价数组。最优报价位于索引 0。在后续步骤中构造订单时，请使用最优报价中的 `preview.outputs[0].amount`。
  </Step>

  <Step title="授权代币">
    在开启托管之前，`InputSettlerEscrow` 合约需要获得转移你代币的许可。请在 Base 上授权 USDC。

    ```ts TypeScript theme={"system"}
    import { erc20Abi } from 'viem';

    const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
    const INPUT_SETTLER_ESCROW = '0x000025c3226C00B2Cdc200005a1600509f4e00C0';

    const currentAllowance = await publicClient.readContract({
      address: USDC_BASE,
      abi: erc20Abi,
      functionName: 'allowance',
      args: [userAddress, INPUT_SETTLER_ESCROW],
    });

    if (currentAllowance < 10000000n) {
      const approveHash = await walletClient.writeContract({
        address: USDC_BASE,
        abi: erc20Abi,
        functionName: 'approve',
        args: [INPUT_SETTLER_ESCROW, 10000000n],
      });
      await publicClient.waitForTransactionReceipt({ hash: approveHash });
      console.log('Approval confirmed');
    }
    ```

    <Note>
      你也可以使用 [Permit2](https://github.com/Uniswap/permit2) 进行无 gas 授权。托管支持通过 Permit2 签名进行注册。详见[输入结算](/lifi-intents/architecture/input-settlement)。
    </Note>
  </Step>

  <Step title="构造并在链上开启订单">
    从报价响应构建一个 `StandardOrder`，并在 `InputSettlerEscrow` 合约上调用 `open()`。这会锁定你的代币，并将意图广播给解算器。

    ```ts TypeScript theme={"system"}
    import {
      encodeAbiParameters,
      hexToBigInt,
      pad,
      parseAbi,
      parseAbiParameters,
      type Address,
    } from 'viem';

    const POLYMER_ORACLE: Address = '0x0000003E06000007A224AeE90052fA6bb46d43C9';
    const OUTPUT_SETTLER: Address = '0x0000000000eC36B683C2E6AC89e9A75989C22a2e';
    const USDC_ARBITRUM: Address = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831';

    const outputAmount = bestQuote.preview.outputs[0].amount;

    const order = {
      user: userAddress,
      nonce: BigInt(Date.now()),
      originChainId: 8453n,
      expires: Math.floor(Date.now() / 1000) + 3600,        // 1 hour
      fillDeadline: Math.floor(Date.now() / 1000) + 1800,   // 30 minutes
      inputOracle: POLYMER_ORACLE,
      inputs: [
        [hexToBigInt(USDC_BASE), 10000000n]                 // [tokenId (address as uint256), amount]
      ] as [bigint, bigint][],
      outputs: [{
        oracle: pad(POLYMER_ORACLE, { size: 32 }),
        settler: pad(OUTPUT_SETTLER, { size: 32 }),
        chainId: 42161n,                                     // Arbitrum
        token: pad(USDC_ARBITRUM, { size: 32 }),
        amount: BigInt(outputAmount),
        recipient: pad(userAddress, { size: 32 }),
        call: '0x' as const,                                 // No callback
        context: '0x' as const,                              // Limit order (no auction)
      }],
    };

    const encodedOrder = encodeAbiParameters(
      parseAbiParameters(
        '(address user, uint256 nonce, uint256 originChainId, uint32 expires, uint32 fillDeadline, address inputOracle, uint256[2][] inputs, (bytes32 oracle, bytes32 settler, uint256 chainId, bytes32 token, uint256 amount, bytes32 recipient, bytes call, bytes context)[] outputs)',
      ),
      [order],
    );

    const openHash = await walletClient.writeContract({
      address: INPUT_SETTLER_ESCROW,
      abi: parseAbi(['function open(bytes calldata order) external']),
      functionName: 'open',
      args: [encodedOrder],
    });
    const receipt = await publicClient.waitForTransactionReceipt({ hash: openHash });
    console.log('Order opened! Tx:', receipt.transactionHash);

    const orderId = receipt.logs[0]?.topics[1];
    if (!orderId) throw new Error('Open event not found in receipt logs');
    console.log('Order ID:', orderId);
    ```

    `open()` 调用会将你的代币转入托管，并发出一个 `Open` 事件。解算器和订单服务器会自动检测该事件。无需单独的提交步骤。

    <Warning>
      将 `fillDeadline` 设置得远早于 `expires`。解算器必须在 `fillDeadline` 之前交付；`expires` 是最终截止时间，超过该时间后，如果订单未被履行，你可以申请退款。
    </Warning>
  </Step>

  <Step title="追踪订单">
    轮询 `GET /orders/status` 直到订单达到终态。使用来自 `Open` 事件的 `onChainOrderId`。

    ```ts TypeScript theme={"system"}
    const trackOrder = async (onChainOrderId: string) => {
      let status: string;
      do {
        const res = await fetch(
          `https://order.li.fi/orders/status?onChainOrderId=${onChainOrderId}`
        );
        const data = await res.json();
        status = data.meta.orderStatus;
        console.log(`Status: ${status}`);

        if (status !== 'Settled' && status !== 'Expired') {
          await new Promise(r => setTimeout(r, 3000));
        }
      } while (status !== 'Settled' && status !== 'Expired');

      return status;
    };

    await trackOrder(orderId);
    ```

    | 状态          | 含义                    |
    | ----------- | --------------------- |
    | `Open`      | 订单已在链上注册，代币已锁定于托管中    |
    | `Signed`    | 订单已签名，可供解算器接手         |
    | `Delivered` | 解算器已在目标链上交付资产         |
    | `Settled`   | 证明已验证，锁定资金已释放给解算器。完成。 |

    一旦为 `Settled`，用户就已在 Arbitrum 上收到 USDC，解算器也已从托管中获得报酬。
  </Step>
</Steps>

***

## 刚刚发生了什么

1. **请求了报价。** 订单服务器根据你的输入/输出对，从其解算器网络返回了定价。
2. **授权了代币。** 托管合约获得了转移你 USDC 的授权。
3. **开启了订单。** 代币被锁定于托管中，意图通过 `Open` 事件广播给解算器。
4. **解算器完成交付。** 一个解算器通过在 Arbitrum 上交付 USDC 履行了订单。
5. **结算完成。** 预言机验证了交付，托管将锁定资金释放给解算器。

***

## 后续步骤

<CardGroup cols={2}>
  <Card title="API 概览" icon="code" href="/lifi-intents/intents-api/api-overview">
    完整的端点参考、基础 URL 和身份验证
  </Card>

  <Card title="请求报价" icon="bolt" href="/lifi-intents/intents-api/request-quote">
    exact-input、exact-output 和独占报价细节
  </Card>

  <Card title="Compact 订单" icon="bolt" href="/lifi-intents/intents-api/compact-orders">
    通过 The Compact 进行链下无 gas 订单提交
  </Card>

  <Card title="追踪订单状态" icon="signal" href="/lifi-intents/intents-api/track-status">
    链上事件和订单服务器状态轮询
  </Card>
</CardGroup>
