跳转到主要内容
订单服务器向意图发行者提供报价。这些基于求解器提供的可用库存。求解器可以定期将其库存作为路由推送到订单服务器,而不是响应每个报价请求。
// POST /quotes/submit

interface Body {
  quotes: Quote[]
}

interface Quote {
    expiry: number;
    fromChainId: string;
    fromAsset: string;
    fromDecimals: number;
    toChainId: string;
    toAsset: string;
    toDecimals: number;
    ranges: QuoteRange[];
    maxToAmount?: bigint;
    exclusiveFor: string;
}

interface QuoteRange {
    minAmount: string;
    maxAmount: string;
    quote: string;
}
提供报价时,需要记住一些重要注意事项:
  • expiry 是用户侧报价到期时间,而不是求解器侧到期时间。如果用户请求 30 秒的意图,则仅返回在 30 秒后到期的报价。
  • fromDecimalstoDecimals 未经验证,仅用于将报价作为实际汇率在资产之间转换。
  • maxToAmount 仅在求解器不想一次报价其全部库存时才需要提供。在单个报价中,这是发出的最大分配。如果未提供,将使用 max(quoteRange.maxAmount)。
  • ranges 是求解器如何填充资产的描述列表。报价应排除系统成本(例如,填充、证明、完成的 gas),但包括求解器特定的开销,例如交易通过智能钱包时。
以下代码块提供了从 Optimism 到 Arbitrum 的 USDC 报价示例。
{
  "quotes": [{
    "expiry": 1757673110,
    "fromChainId": "10",
    "toChainId": "42161",
    "fromAsset": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
    "toAsset": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
    "fromDecimals": "6",
    "toDecimals": "6",
    "ranges": [
      {
        "minAmount": "10",
        "maxAmount": "100",
        "quote": "0.95",
      },
      {
        "minAmount": "100",
        "maxAmount": "10000",
        "quote": "0.995",
      },
      {
        "minAmount": "10000",
        "maxAmount": "50000",
        "quote": "0.99",
      }
    ]
  }]
}
您可以通过发送新报价来覆盖旧报价为了避免求解器发送短期报价,订单服务器将在收到新报价时覆盖现有报价。这允许您拥有长期报价,并仅在市场演变时更新它们。如果您发送到期时间在过去的报价,它仍将覆盖旧报价并立即到期。
通过以这种方式广播报价,求解器可以:
  • 有效地传达其在多个链和代币对之间的可用流动性。
  • 设置自己的定价和费用结构。
  • 定义他们愿意处理的交易规模限制。
  • 随着市场条件的变化更新其报价。
订单服务器使用广播的报价来匹配用户请求,而无需实时查询求解器,从而实现更快的响应和更少的开销。 将报价提交到 /quotes/submit

链和资产支持

订单服务器使用报价来确定支持的链和资产。这允许求解器通过为新链和资产生成报价来简单地添加对它们的支持。

信任组件

LI.FI 意图是一个基于四个组件的模块化系统:输出结算器、输出预言机、输入预言机和输入结算器。这些组件的交互方式可能存在差异。因此,订单服务器了解求解器支持哪些组件很重要。
// POST /quotes/trustComponents

interface Body {
  trustedComponents: Component[]
}

interface Component {
    address: string;
    chainId: string;
    forInput: bool;
    forOutput: bool;
    role: "settler" | "oracle"
}
某些地址可能既可用作输入组件又可用作输出组件,因此必须明确提供兼容性所在。一些常见观察:
  • 某些预言机根据源链有不同的获取证明方式。如果预言机的 forInput 为 true,则意味着求解器知道如何交付证明。如果预言机的 forOutput 为 true,则意味着求解器知道如何生成证明。对于没有 inputOracle 的预言机(例如 Polymer),使用其 outputOracle 作为描述符。
  • 输入结算器和输出结算器不是相同的合约类型。在大多数情况下,仅设置 forInput 或仅设置 forOutput
将来可能会添加更多角色。

身份验证

虽然订阅订单服务器的 WebSocket 事件不需要身份验证,但使用订单服务器的 API 服务需要身份验证。求解器身份验证将求解器的 api 请求链接到其链上执行,允许订单服务器分配信誉分数。 API 密钥可在 LI.FI 求解器 UI 上找到。使用 API 密钥,求解器可以:
  • 推送报价:使用 /quotes/submit 端点向订单服务器提交库存报价
  • 注册账户:将已填充的意图与您的求解器关联允许订单服务器跟踪您的表现。这是获得分配给您的求解器的独家订单的关键。
API 密钥应在 x-api-key 标头中提供。

注册账户

要注册求解器账户,求解器需要签署消息以证明所有权,然后将配对提交到订单服务器。
// POST /solver-api/account/register

interface Registration {
  "address": string,
  "message": string,
  "signature": string
}
每个地址只能注册到一个 API 密钥一次,但是,一个 API 密钥可以注册多个地址。
以下是一个示例注册请求:
curl -X POST "https://order.li.fi/solver-api/account/register" \
  -H "Content-Type: application/json" \
  -H "x-api-key: sk_your_api_key_here" \
  -d '{
    "address": "0x1234567890123456789012345678901234567890",
    "message": "Hello, world!",
    "signature": "0x1234567890abcdef..."
  }'
I