- 提交消息验证证明。
- 在资源锁上完结订单。
Oracle 验证
如何转发证明取决于该订单使用的预言机系统。请遵循预言机系统中对应系统的说明。完结订单
一旦看到OutputProven 事件,输出即已被验证,此时可以调用 finalise。
finalise 的 ABI 取决于所使用的结算器:InputSettlerCompact 需要签名,InputSettlerEscrow 不需要。
对于 InputSettlerCompact,请提交 StandardOrder、以 bytes.concat(sponsor, allocator) 形式附加的签名、填充的时间戳(可从 OutputFilled 事件中读取)以及求解器的标识符。如果存在多个输出,请始终按其在订单中的位置对列表进行索引。然后调用 finalise。InputSettlerEscrow 的流程相同,只是您不需要提供签名。
如果一个订单包含多个输出,且两个求解器填充了不同的输出,那么第一个输出的求解器就是规范求解器。
签名完结
求解器必须是finalise 的调用者,因为他们可以重定向资金并修改可选的回调。对某些求解器而言这是不可能的——例如当求解器标识符被设置为一个资金池时。在这种情况下,可以使用 finaliseWithSignature 配合一个 EIP-712 AllowOpen 签名:
finalise。
回调
某些求解器可能会使用回调来配置接收到的资金。finalise[WithSignature] 的 call 参数通过 orderFinalised 将提供的负载转发到 destination:
orderFinalised 调用不能失败。
对于同链意图,orderFinalised 在输入被支付给 destination 之后、但在输出证明被验证之前执行。这允许求解器在填充意图之前,在一笔原子交易中收集意图输入。
在 Solana 上结算
标准的 Solana 路径会先验证任何跨链证明,然后在input_settler_escrow 上调用 finalise。证明的加载和验证可能需要多笔交易。
在 Solana 上开启的订单始终只有一个输出——open 会因交易大小而拒绝更大的订单。同时满足先释放输入条件的同链订单,可以改用先释放输入的结算。
根据该输出的 OutputFilledEvent 构建 solve_params,使用事件中确切的 solver 和 timestamp。在 remaining_accounts 中传入对应的 LocalAttestation(同链)或由 Polymer 创建的 Attestation(远程),其后紧跟它的租金退还槽位。
完结所需的账户与检查
solver—— 你自己,即交易签名者(输出 0 的求解器)destination及其代币账户 —— 托管的输入资金的去向;由于你在完结时才选择该地址,因此调用者必须是规范求解器sponsor—— 支付了open费用的账户(从order_context.sponsor读取);将收到租金退款,若赞助者是可执行账户则改由你收到order_context及其托管 ATA —— 由order_id派生local_consumer—— 托管程序的["local_consumer"]PDA(BZfvceVEFY1SYswSRepgfDCbMXTtWfTwwsRXKcTCBVx8),其后是intents_protocol程序remaining_accounts—— 先是认证,然后是它的租金退还槽位:[attestation, rent_refund]。只传入认证会以WrongAttestationCount失败。
- 同链输出(
output.chain_id等于 Solana 链 id):传入该次填充的LocalAttestation。不涉及任何预言机。在 LI.FI 的规范编码下,托管程序不会消费该认证,因此租金退还槽位会被忽略——传入任意已存在的只读账户即可,例如 system program。 - 跨链输出:先走预言机流程,让输入侧预言机创建一个
AttestationPDA,然后传入该 PDA。这里的租金退还槽位同样会被忽略。参见上文的 Oracle 验证以及认证中的账户模型。
[attestation, rent_refund]。完整的账户列表见 input_settler_escrow 的 IDL,所有 remaining_accounts 布局见 Solana IDL 包。
先释放输入的 Solana 结算
此路径适用于单输出的 Solana → Solana Escrow 订单,条件是callback_data 为空、context 为限价或独占限价类型,且输出结算器的状态 PDA 出现在全部三个身份字段中。
该交易会在交付输出之前先释放输入。你的中间指令可以把这笔输入转换成所需的输出。
该交易按以下顺序携带这些顶层指令:
finalise_with_prefill 会扫描 Instructions sysvar,寻找该交易后续部分中恰好一个匹配的紧凑填充(compact fill)。它会在释放托管资金之前,验证重建出的订单和填充账户。
如果该填充或某个中间指令失败,整笔交易都会回滚。
这里的”紧凑(Compact)“指的是更小的指令负载,而非 The Compact。Solana 上仍然只有一种输入结算器——Escrow,没有资源锁。
构建紧凑填充
传入order_id 以及六个订单字段:nonce、expires、fill_deadline、输入金额、输出金额和定价 context。其余字段由程序重建:
对限价订单使用空 context。对独占限价订单,使用
0xe0 || exclusive_for || start_time。只有当你的签名密钥就是该订单的 exclusive_for 值时,才能使用简写形式。
失败代码和常见修复方法见 先释放输入结算的错误。
完整的验证模型见 Solana 程序。
Solana 退款
有两条无需许可的退款路径可以将托管资金退还给用户,并且两者都会永久关闭该订单:- 从
expires起,任何人都可以调用refund(order)。 - 更早的时候,一旦
fill_deadline已过且某个输出被证明未被填充,任何人都可以调用refund_on_non_fill(order, output_index)——无需等到过期。与finalise一样,它需要托管程序的local_consumerPDA,以及remaining_accounts = [attestation, rent_refund]。对于 Solana 输出,未填充证明(attest_not_filled)只能在fill_deadline之后 48 小时内创建;如果错过该窗口,订单将在expires时退款。

