跳转到主要内容
LI.FI SDK 提供请求路由和报价以及执行它们的功能。本指南将引导您完成使用 getRoutesgetQuote 函数发出请求的过程。

如何请求路由

要开始使用,这里有一个简单的示例,说明如何请求路由以在 Arbitrum 上桥接和交换 10 USDC 到 Optimism 上的最大 DAI 金额。
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;
当您请求路由时,您会收到一个路由对象数组,其中包含确定交换或桥接转账采取哪条路由的基本信息。在此阶段,不包括交易数据,必须单独请求。阅读更多执行路由/报价 此外,如果您只想接收我们的智能路由 API 可以提供的一个最佳选项,最好使用 getQuote 请求报价。

路由请求参数

getRoutes 函数需要一个 RoutesRequest 对象,该对象指定所需的_任意到任意_转账,并包含计算最有效路由所需的所有信息。

参数

以下是 RoutesRequest 接口的参数及其描述:
参数类型必需描述
fromChainIdnumber源链的 ID(例如,以太坊主网是 1)。
fromTokenAddressstring源链上代币的合约地址。确保此地址对应于指定的 fromChainId
fromAmountstring要从源链转移的金额,以代币的最小单位指定(例如,ETH 为 wei)。
fromAddressstring正在转移代币的地址。
toChainIdnumber目标链的 ID(例如,Optimism 是 10)。
toTokenAddressstring目标链上代币的合约地址。确保此地址对应于指定的 toChainId
toAddressstring交易完成后代币将在目标链上发送到的地址。
fromAmountForGasstringLI.Fuel 的一部分。允许在目标链上接收部分桥接代币作为 gas。以代币的最小单位指定。
optionsRouteOptions自定义路由的其他选项。这由 RouteOptions 接口定义(详见下文,参见路由选项)。

路由选项

RouteOptions 接口允许进一步自定义路由请求。以下是 RouteOptions 接口的参数及其描述:
参数类型必需描述
integratorstring集成商的标识符,通常是 dApp 或公司名称。理想情况下,这应该在配置 SDK 时指定,但也可以在请求期间修改
feenumber集成商费用百分比(例如,0.03 代表 3% 的费用)。这需要集成商经过验证。
maxPriceImpactnumber隐藏价格影响大于或等于此值的路由。(例如,0.3 代表 30%)
orderstringCHEAPEST - 此排序选项优先考虑具有最高估计回报金额的路由。重视资本效率而不考虑速度和路由复杂性的用户应选择最便宜的路由。FASTEST - 此排序选项优先考虑估计执行时间最短的路由。重视速度并希望尽快完成交易的用户应选择最快的路由。
slippagenumber滑点容忍度,以十进制比例表示(例如,0.005 代表 0.5%)。
referrerstring推荐人的钱包地址,用于跟踪目的。
allowSwitchChainboolean指定是否返回需要链切换的路由(2 步路由)。
allowDestinationCallboolean指定是否启用目标调用。
bridgesAllowDenyPrefer用于指定桥接器首选项的 AllowDenyPrefer 对象。
exchangesAllowDenyPrefer用于指定交易所首选项的 AllowDenyPrefer 对象。
timingTiming用于指定时间策略首选项的 Timing 对象。

允许/拒绝/首选

AllowDenyPrefer 接口用于指定桥接器或交易所的首选项。使用 allow 选项,您可以允许工具,并且只有这些工具将用于查找最佳路由。在 deny 中指定的工具将被列入黑名单。 您可以在列表:链、桥接器、DEX 聚合器、求解器中找到所有可用的键,或从 API 获取可用选项。参见链和工具 以下是 AllowDenyPrefer 接口的参数:
参数类型必需描述
allowstring[]允许的桥接器或交易所列表(默认:全部)。
denystring[]拒绝的桥接器或交易所列表(默认:无)。
preferstring[]首选的桥接器或交易所列表(例如,[‘1inch’] 表示如果可用则首选 1inch)。

时间

Timing 接口允许您指定路由执行时间的首选项。这可以帮助根据时间策略优化请求的性能。 Timing 接口的参数:
参数类型必需描述
swapStepTimingStrategiesTimingStrategy[]专门用于路由中每个交换步骤的时间策略数组。这允许您在执行单个交换步骤期间定义时间控制的自定义策略。
routeTimingStrategiesTimingStrategy[]应用于整个路由的时间策略数组。这使您能够设置路由整体计时方式的首选项,从而可能提高执行效率和可靠性。

时间策略

这可以帮助根据特定条件优化请求的时间。
参数类型必需描述
strategystring策略类型,必须设置为 ‘minWaitTime’。这表示应用的时间策略基于最小等待时间。
minWaitTimeMsnumber返回任何结果之前的最小等待时间(以毫秒为单位)。此值确保请求等待指定的持续时间以允许获得更准确的结果。
startingExpectedResultsnumber在最小等待时间过后应返回的预期结果的初始数量。这有助于管理用户对请求结果的期望。
reduceEveryMsnumber随着等待时间的推移,预期结果减少的间隔(以毫秒为单位)。此参数允许根据经过的时间动态调整预期结果。
您可以实现自定义时间策略来改善用户体验并通过控制路由执行的时间来优化应用程序的性能。

请求报价

当您请求报价时,我们的智能路由 API 提供最佳可用选项。报价包括启动交换或桥接转账所需的所有必要信息和交易数据。 这里有一个简单的示例,说明如何请求报价以在 Arbitrum 上桥接和交换 10 USDC 到 Optimism 上的最大 DAI 金额。
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 对象。RoutesRequestQuoteRequest 有一些相似之处和细微差别,下面您可以找到 QuoteRequest 接口参数的描述。
参数类型必需描述
fromChainnumber源链的 ID(例如,以太坊主网是 1)。
fromTokenstring源链上代币的合约地址。确保此地址对应于指定的 fromChain
fromAmountstring要从源链转移的金额,以代币的最小单位指定(例如,ETH 为 wei)。
fromAddressstring正在转移代币的地址。
toChainnumber目标链的 ID(例如,Optimism 是 10)。
toTokenstring目标链上代币的合约地址。确保此地址对应于指定的 toChain
toAddressstring交易完成后代币将在目标链上发送到的地址。
fromAmountForGasstringLI.Fuel 的一部分。允许在目标链上接收部分桥接代币作为 gas。以代币的最小单位指定。

其他报价参数

除了上述参数外,路由选项部分列出的所有参数在使用 getQuote 时也可用,除了 allowSwitchChain,它仅用于控制路由请求中的链切换。 此外,用于指定允许、拒绝或首选某些桥接器和交易所的选项的参数具有稍微不同的名称:
  • allowBridges (string[], 可选)
  • denyBridges (string[], 可选)
  • preferBridges (string[], 可选)
  • allowExchanges (string[], 可选)
  • denyExchanges (string[], 可选)
  • preferExchanges (string[], 可选)
此外,您可以使用 swapStepTimingStrategies 参数为交换步骤指定时间策略
  • swapStepTimingStrategies (string[], 可选) 指定交换步骤的时间策略。此参数允许您定义请求应等待结果的时间并管理预期结果。格式为:
minWaitTime-${minWaitTimeMs}-${startingExpectedResults}-${reduceEveryMs}

请求合约调用报价

除了请求一般报价外,LI.FI SDK 还提供请求目标合约调用报价的功能。 阅读更多 TX 批处理(又名”Zaps”) 这里有一个简单的示例,说明如何请求报价以桥接并使用 Optimism 的 ETH 在 Base 链上购买 OpenSea 市场上成本为 0.0000085 ETH 的 NFT。此示例的调用数据是使用 OpenSea Seaport SDK 获得的。
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:
        '0xe7acab24000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000029dacdf7ccadf4ee67c923b4c22255a4b2494ed700000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000064000000000000000000000000090884b5bd9f774ed96f941be2fb95d56a029c99c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066757dd300000000000000000000000000000000000000000000000000000000669d0a580000000000000000000000000000000000000000000000000000000000000000360c6ebe0000000000000000000000000000000000000000ad0303de3e1093e50000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000029f25e8a71e52e795e5016edf7c9e02a08c519b40000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006ff0cbadd00000000000000000000000000000000000000000000000000000006ff0cbadd0000000000000000000000000090884b5bd9f774ed96f941be2fb95d56a029c99c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003179fcad000000000000000000000000000000000000000000000000000000003179fcad000000000000000000000000000000a26b00c1f0df003000390027140000faa7190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008a88c37e000000000000000000000000000000000000000000000000000000008a88c37e000000000000000000000000009323bb21a4c6122f60713e4a1e38e7b94a40ce2900000000000000000000000000000000000000000000000000000000000000e3b5b41791fe051471fa3c2da1325a8147c833ad9a6609ffc07a37e2603de3111b262911aaf25ed6d131dd531574cf54d4ea61b479f2b5aaa2dff7c210a3d4e203000000f37ec094486e9092b82287d7ae66fbf8cd6148233c70813583e3264383afbd0484b80500070135f54edd2918ddd4260c840f8a6957160766a4e4ef941517f2a0ab3077a2ac6478f0ad7fad9b821766df11ca3fdb16a8e95782faaed6e0395df2f416651ac87a5c1edec0a36ad42555083e57cff59f4ad98617a48a3664b2f19d46f4db85e95271c747d03194b5cfdcfc86bb0b08fb2bc4936d6f75be03ab498d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
      toContractGasLimit: '210000',
    },
  ],
};

const contractCallQuote = await getContractCallsQuote(contractCallsQuoteRequest);

合约调用报价请求参数

getContractCallsQuote 函数需要一个 ContractCallsQuoteRequest 对象,该对象包含请求目标合约调用报价所需的所有信息。 合约调用报价请求可以被视为报价请求的扩展,除了下面提到的参数外,其他报价参数部分列出的所有参数(如 integratorfeeslippage 等)在使用 getContractCallsQuote 时也可用。
参数类型必需描述
合约调用对象数组。
参数类型必需描述
fromAmountstring要发送到合约的代币金额。此金额独立于任何先前桥接或存入的代币。
fromTokenAddressstring要发送到合约的代币地址。例如,ETH 质押交易需要 ETH。
toContractAddressstring目标链上要交互的合约地址。
toContractCallDatastring要发送到合约以在目标链上进行交互的调用数据。
toContractGasLimitstring合约调用所需的估计 gas。不正确的值可能导致交互失败。
toApprovalAddressstring如果与合约地址不同,则批准代币转移的地址。
contractOutputsTokenstring合约将输出的代币地址(如果适用)(例如,质押 ETH 产生 stETH)。

RouteQuote 之间的区别

尽管 RouteQuote 术语在为您提供进行交换或桥接转账的最佳选项的同一领域中,但您需要注意一些差异。 LI.FI 中的 Route 表示可能包括_多个步骤_的详细转账计划。每个步骤对应一个单独的交易,例如交换代币或在链之间桥接资金。这些步骤必须按特定顺序执行,因为每个步骤都依赖于前一个步骤的输出。Route 为涉及多个操作的复杂转账提供了详细的路径。 相比之下,Quote 是一个_单步_交易。它包含一次性执行转账所需的所有必要信息,无需任何额外步骤。Quotes 用于更简单的交易,其中单个操作(例如代币交换或跨链转账)就足够了。因此,虽然 Routes 可能涉及多个步骤来完成转账,但 Quote 始终仅代表一个步骤。
I