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

# 请求路线/报价

> 在执行任何交换或桥接之前，您需要从我们的智能路由API请求最佳路径。

LI.FI SDK 提供了请求路由和报价的功能，以及执行它们的功能。本指南将指导您如何使用 `getRoutes` 和 `getQuote` 函数发出请求的过程。

## 如何请求路由

首先，这里有一个简单的示例，展示了如何请求路由以在 Arbitrum 上桥接和交换 10 USDC 至 Optimism 上的最大数量的 DAI。

```typescript theme={"system"}
import { getRoutes } from '@lifi/sdk';

const routesRequest: RoutesRequest = {
  fromChainId: 42161, // Arbitrum
  toChainId: 10, // Optimism
  fromTokenAddress: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', // USDC on Arbitrum
  toTokenAddress: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1', // DAI on Optimism
  fromAmount: '10000000', // 10 USDC
};

const result = await getRoutes(routesRequest);
const routes = result.routes;
```

当您请求路由时，您会收到一个路由对象数组，其中包含决定采取哪条路由进行交换或桥接转账的基本信息。在此阶段，不包括交易数据，必须单独请求。阅读更多 [执行路由/报价](/sdk/execute-routes)。

此外，如果您希望仅接收我们的智能路由 API 可提供的最佳选项，那么使用 `getQuote` 请求报价可能更好。

## 路由请求参数

`getRoutes` 函数期望一个 `RoutesRequest` 对象，该对象指定了一个所需的 *任意到任意* 转账，并包含计算最有效路由所需的所有信息。

### 参数

以下是 `RoutesRequest` 接口的参数及其描述：

| 参数                 | 类型           | 必需 | 描述                                                |
| ------------------ | ------------ | -- | ------------------------------------------------- |
| `fromChainId`      | number       | 是  | 源链的 ID（例如，Ethereum 主网是 1）。                        |
| `fromTokenAddress` | string       | 是  | 源链上代币的合约地址。确保此地址与指定的 `fromChainId` 相对应。           |
| `fromAmount`       | string       | 是  | 从源链转移的金额，以代币的最小单位指定（例如，ETH 的 wei）。                |
| `fromAddress`      | string       | 否  | 代币正在从其转移的地址。                                      |
| `toChainId`        | number       | 是  | 目的链的 ID（例如，Optimism 是 10）。                        |
| `toTokenAddress`   | string       | 是  | 目的链上代币的合约地址。确保此地址与指定的 `toChainId` 相对应。            |
| `toAddress`        | string       | 否  | 交易完成后，代币将发送到目的链上的地址。                              |
| `fromAmountForGas` | string       | 否  | LI.Fuel 的一部分。允许在目的链上接收一部分作为 gas 的桥接代币。以代币的最小单位指定。 |
| `options`          | RouteOptions | 否  | 自定义路由的附加选项。由 RouteOptions 接口定义（详见下文，见路由选项）。       |

## 路由选项

`RouteOptions` 接口允许进一步自定义路由请求。以下是 `RouteOptions` 接口的参数及其描述：

| 参数                     | 类型              | 必需 | 描述                                                                                                                             |
| ---------------------- | --------------- | -- | ------------------------------------------------------------------------------------------------------------------------------ |
| `integrator`           | string          | 否  | 集成者的标识符，通常是 dApp 或公司名称。理想情况下，应在配置 SDK 时指定，但也可以在请求期间修改                                                                          |
| `fee`                  | number          | 否  | 集成者费用百分比（例如，0.03 代表 3% 的费用）。这要求集成者经过验证。                                                                                        |
| `maxPriceImpact`       | number          | 否  | 隐藏价格影响大于或等于此值的路由。（例如，0.3 代表 30%）                                                                                               |
| `order`                | string          | 否  | `CHEAPEST` - 此排序选项优先考虑估计回报金额最高的路由。重视资本效率而不介意速度和路由复杂性的用户应选择最便宜的路由。`FASTEST` - 此排序选项优先考虑估计执行时间最短的路由。重视速度并希望他们的交易尽快完成的用户应选择最快的路由。 |
| `slippage`             | number          | 否  | 滑点容忍度，以小数比例表示（例如，0.005 代表 0.5%）。                                                                                               |
| `referrer`             | string          | 否  | 推荐人的钱包地址，用于跟踪目的。                                                                                                               |
| `allowSwitchChain`     | boolean         | 否  | 指定是否返回需要链切换（2 步路由）的路由。                                                                                                         |
| `allowDestinationCall` | boolean         | 否  | 指定是否启用目的地调用。                                                                                                                   |
| `bridges`              | AllowDenyPrefer | 否  | 一个 `AllowDenyPrefer` 对象，用于指定桥接的偏好。                                                                                             |
| `exchanges`            | AllowDenyPrefer | 否  | 一个 `AllowDenyPrefer` 对象，用于指定交换的偏好。                                                                                             |
| `timing`               | Timing          | 否  | 一个 Timing 对象，用于指定时间策略的偏好。                                                                                                      |

## 允许/拒绝/偏好

`AllowDenyPrefer` 接口用于指定桥接或交换的偏好。使用 `allow` 选项，您可以允许工具，并且只有这些工具将被用来找到最佳路由。在 `deny` 中指定的工具将被列入黑名单。

您可以在 [列表：链、桥接、DEX 聚合器、解算器](https://docs.li.fi/list-chains-bridges-dex-aggregators-solvers) 中找到所有可用的键，或从 API 获取可用选项。见 [链和工具](https://docs.li.fi/integrate-li.fi-sdk/chains-and-tools)。

以下是 `AllowDenyPrefer` 接口的参数：

| 参数       | 类型        | 必需 | 描述                                       |
| -------- | --------- | -- | ---------------------------------------- |
| `allow`  | string\[] | 否  | 允许的桥接或交换列表（默认：全部）。                       |
| `deny`   | string\[] | 否  | 拒绝的桥接或交换列表（默认：无）。                        |
| `prefer` | string\[] | 否  | 偏好的桥接或交换列表（例如，\['1inch'] 如果可用则偏好 1inch）。 |

## 时间

`Timing` 接口允许您根据时间策略指定路由执行的偏好。这可以帮助优化您的请求性能，基于时间策略。

`Timing` 接口的参数：

| 参数                         | 类型                | 必需 | 描述                                                |
| -------------------------- | ----------------- | -- | ------------------------------------------------- |
| `swapStepTimingStrategies` | TimingStrategy\[] | 否  | 一个针对路由中每个交换步骤的时间策略数组。这允许您为执行个别交换步骤期间的时间控制定义自定义策略。 |
| `routeTimingStrategies`    | TimingStrategy\[] | 否  | 适用于整个路由的时间策略数组。这使您能够设置有关如何整体计时路由的偏好，可能提高执行效率和可靠性。 |

## 时间策略

这可以帮助基于特定条件优化请求的时间。

| 参数                        | 类型     | 必需 | 描述                                              |
| ------------------------- | ------ | -- | ----------------------------------------------- |
| `strategy`                | string |    | 策略类型，必须设置为 'minWaitTime'。这表明应用的时间策略基于最小等待时间。    |
| `minWaitTimeMs`           | number |    | 在返回任何结果之前的最小等待时间（毫秒）。此值确保请求等待指定的持续时间，以允许更准确的结果。 |
| `startingExpectedResults` | number |    | 最小等待时间过后应返回的初始预期结果数量。这有助于管理用户对请求结果的期望。          |
| `reduceEveryMs`           | number |    | 随着等待时间的进展，预期结果减少的间隔（毫秒）。此参数允许基于经过的时间动态调整预期结果。   |

<Note>
  您可以实现[自定义时间策略](https://docs.li.fi/li.fi-api/li.fi-api/requesting-a-quote/optimizing-quote-response-timing)以改善用户体验并优化您的应用程序的性能，通过控制路由执行的时间。
</Note>

## 请求报价

当您请求报价时，我们的智能路由 API 提供最佳可用选项。报价包括启动交换或桥接转账所需的所有必要信息和交易数据。

这里有一个简单的示例，展示了如何请求报价以在 Arbitrum 上桥接和交换 10 USDC 至 Optimism 上的最大数量的 DAI。

```typescript theme={"system"}
import { getQuote } from '@lifi/sdk';

const quoteRequest: QuoteRequest = {
  fromChain: 42161, // Arbitrum
  toChain: 10, // Optimism
  fromToken: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', // USDC on Arbitrum
  toToken: '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1', // DAI on Optimism
  fromAmount: '10000000', // 10 USDC
  // 代币正在从其转移的地址。
  fromAddress: '0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0', 
};

const quote = await getQuote(quoteRequest);
```

## 报价请求参数

`getQuotes` 函数期望一个 `QuoteRequest` 对象。`RoutesRequest` 和 `QuoteRequest` 有一些相似之处和细微差别，下面，您可以找到 `QuoteRequest` 接口参数的描述。

| 参数                 | 类型     | 必需 | 描述                                                |
| ------------------ | ------ | -- | ------------------------------------------------- |
| `fromChain`        | number | 是  | 源链的 ID（例如，Ethereum 主网是 1）。                        |
| `fromToken`        | string | 是  | 源链上代币的合约地址。确保此地址与指定的 `fromChain` 相对应。             |
| `fromAmount`       | string | 是  | 从源链转移的金额，以代币的最小单位指定（例如，ETH 的 wei）。                |
| `fromAddress`      | string | 是  | 代币正在从其转移的地址。                                      |
| `toChain`          | number | 是  | 目的链的 ID（例如，Optimism 是 10）。                        |
| `toToken`          | string | 是  | 目的链上代币的合约地址。确保此地址与指定的 `toChain` 相对应。              |
| `toAddress`        | string | 否  | 交易完成后，代币将发送到目的链上的地址。                              |
| `fromAmountForGas` | string | 否  | LI.Fuel 的一部分。允许在目的链上接收一部分作为 gas 的桥接代币。以代币的最小单位指定。 |

### 其他报价参数

除了上述参数外，[路由选项](##route-options) 部分中列出的所有参数在使用 `getQuote` 时也可用，除了 `allowSwitchChain`，它专门用于控制路由请求中的链切换。

此外，指定允许、拒绝或偏好某些桥接和交换的选项的参数名称略有不同：

* `allowBridges` (string\[], 可选)

* `denyBridges` (string\[], 可选)

* `preferBridges` (string\[], 可选)

* `allowExchanges` (string\[], 可选)

* `denyExchanges` (string\[], 可选)

* `preferExchanges` (string\[], 可选)

此外，您可以使用 `swapStepTimingStrategies` 参数为交换步骤指定[时间策略](https://docs.li.fi/li.fi-api/li.fi-api/requesting-a-quote/optimizing-quote-response-timing#parameters-overview)：

* **`swapStepTimingStrategies`** (string\[], 可选) 指定交换步骤的时间策略。此参数允许您定义请求应等待结果的时间长短，并管理预期结果。格式为：

```typescript theme={"system"}
minWaitTime-${minWaitTimeMs}-${startingExpectedResults}-${reduceEveryMs}
```

## 请求合约调用报价

除了请求常规报价外，LI.FI SDK 还提供了请求目的地合约调用报价的功能。

在 [Composer 文档](/composer/overview) 中阅读更多。有关 SDK 特定的 Composer 集成，请参见 [SDK Composer 集成指南](/composer/guides/sdk-integration)。

这里有一个简单的示例，展示了如何请求报价以桥接和使用来自 Optimism 的 ETH 在 Base 链上购买 OpenSea 市场上成本为 0.0000085 ETH 的 NFT。此示例中的调用数据是使用 OpenSea Seaport SDK 获得的。

```typescript theme={"system"}
import { getContractCallsQuote } from '@lifi/sdk';

const contractCallsQuoteRequest = {
  fromAddress: '0x552008c0f6870c2f77e5cC1d2eb9bdff03e30Ea0',
  fromChain: 10,
  fromToken: '0x0000000000000000000000000000000000000000',
  toAmount: '8500000000000',
  toChain: 8453,
  toToken: '0x0000000000000000000000000000000000000000',
  contractCalls: [
    {
      fromAmount: '8500000000000',
      fromTokenAddress: '0x0000000000000000000000000000000000000000',
      toContractAddress: '0x0000000000000068F116a894984e2DB1123eB395',
      toContractCallData:
        '0xe7acab24000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029dacdf7ccadf4ee67c923b4c22255a4b2494ed700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000
```
