- Submit the message validation proof.
- Finalize the order on the resource lock.
Oracle Validation
How you relay a proof depends on the order’s oracle system. Follow the instructions for that system in Oracle Systems.Finalizing Orders
Once you see theOutputProven event, the output has been validated and you can call finalise.
finalise ABI depends on the settler: InputSettlerCompact requires signatures, InputSettlerEscrow does not.
For InputSettlerCompact, submit the StandardOrder, the attached signatures as bytes.concat(sponsor, allocator), the timestamps of the fills (which you can read from the OutputFilled event), and the solver’s identifier. If there are multiple outputs, always index lists by their position in the order. Then call finalise. The flow is the same for InputSettlerEscrow, except that you provide no signatures.
If an order contains multiple outputs and two solvers filled different outputs, then the solver of the first output is the canonical solver.
Signature Finalise
The solver must be the caller offinalise, as they can redirect the funds and modify the optional callback. For some solvers this is not possible — for example, when the solver identifier is set to a pool. In that case, use finaliseWithSignature with an EIP-712 AllowOpen signature:
finalise with the signed destination and, if one is present, the signed call.
Callback
Some solvers may use callbacks for configuring received funds. Thecall parameter of finalise[WithSignature] forwards the provided payload to destination via orderFinalised:
orderFinalised call must not fail.
For a same-chain intent, orderFinalised runs after the inputs are paid to destination but before the output proofs are validated. This allows solvers to collect intent inputs before filling the intents in an atomic transaction.
Settling on Solana
The standard Solana path validates any cross-chain proofs, then callsfinalise on input_settler_escrow. Proof loading and validation may require multiple transactions.
An order opened on Solana always has exactly one output — open rejects larger orders on transaction size. A same-chain order that also meets the input-first requirements can instead use input-first settlement.
Build solve_params from the output’s OutputFilledEvent, using the event’s exact solver and timestamp. Pass the corresponding LocalAttestation (same-chain) or Polymer-created Attestation (remote) in remaining_accounts, followed by its rent-refund slot.
Finalization accounts and checks
solver— you, the transaction signer (the output-0 solver)destinationand its token account — where the escrowed inputs go; because you choose it at finalization time, the canonical solver must be the callersponsor— the account that paid foropen(read it fromorder_context.sponsor); receives the rent refund, or you do if the sponsor is an executable accountorder_contextand its escrow ATA — derived from theorder_idlocal_consumer— the escrow’s["local_consumer"]PDA (BZfvceVEFY1SYswSRepgfDCbMXTtWfTwwsRXKcTCBVx8), followed by theintents_protocolprogramremaining_accounts— the attestation, then its rent-refund slot:[attestation, rent_refund]. Passing only the attestation fails withWrongAttestationCount.
- Same-chain output (
output.chain_idequals the Solana chain id): pass the fill’sLocalAttestation. No oracle is involved. Under LI.FI’s canonical encoding the escrow does not consume this attestation, so the rent-refund slot is ignored — pass any existing read-only account, such as the system program. - Cross-chain output: run the oracle flow so the input-side oracle creates an
AttestationPDA, then pass that. The rent-refund slot is ignored here too. See Oracle Validation above and Attestations for the account model.
[attestation, rent_refund]. The full account list is in the input_settler_escrow IDL, and every remaining_accounts layout is in the Solana IDL bundle.
Input-first Solana settlement
Use this route for a single-output Solana → Solana escrow order with emptycallback_data, a limit or exclusive-limit context, and the output-settler state PDA in all three identity fields.
The transaction releases the input before delivering the output. Your intermediate instructions can convert that input into the required output.
The transaction carries these top-level instructions, in this order:
finalise_with_prefill scans the Instructions sysvar for exactly one matching compact fill later in the transaction. It verifies the reconstructed order and fill accounts before releasing the escrow.
If the fill or an intermediate instruction fails, the entire transaction rolls back.
“Compact” here describes the smaller instruction payload, not The Compact. Solana still has one input settler — the escrow — and no resource locks.
Build the compact fill
Pass theorder_id and six order fields: nonce, expires, fill_deadline, input amount, output amount, and pricing context. The programs reconstruct the remaining fields:
Use an empty context for a limit order. For an exclusive limit, use
0xe0 || exclusive_for || start_time. Use the compact shorthand only when your signing key is the order’s exclusive_for value.
See Input-first settlement errors for failure codes and common fixes.
The full verification model is in Solana programs.
Solana Refunds
Two permissionless refund paths return the escrow to the user, and both permanently close the order:- From
expiresonward, anyone can callrefund(order). - Earlier, once
fill_deadlinepasses and one output is proven not filled, anyone can callrefund_on_non_fill(order, output_index)— no need to wait for expiry. It takes the escrow’slocal_consumerPDA andremaining_accounts = [attestation, rent_refund], likefinalise. For a Solana output, the not-filled proof (attest_not_filled) can only be created within 48 hours afterfill_deadline. If the window is missed, the order refunds atexpires.

