Skip to main content
A Fuse intent is settled by a solver. Here’s what that means in practice.

The lifecycle

1. User signs intent
   └─ EIP-712 typed data, bound to deadline + nonce + fee/swap hashes
2. Intent posted to relay
   └─ POST /v1/bundle (signature + intent body)
3. Solver picks intent
   └─ Solver verifies signature, simulates the bundle, locks fee
4. Solver submits source-chain tx
   └─ Source: ERC20 pull (Permit2/permit), swap, bridge-emit
5. Cross-chain message in flight
   └─ Bridge relayer (Across/Mayan/CCTP/...) carries the message
6. Solver submits destination-chain tx
   └─ Destination: receive, swap (if any), final action (LP/deposit/transfer)
7. Status updated
   └─ getZapTxnStatus() returns step-level status until "completed"

Atomicity

Within a chain, steps in a bundle execute atomically — if one reverts, the bundle reverts. Across chains, atomicity is bounded by the bridge: the source side commits, then the destination side runs. If the destination side fails, funds are refunded to the refundee you specified at quote time.

Solver economics

  • Solvers earn the spread between user-facing output and best on-chain output.
  • Fees are bound at intent-signature time via executorFeesHash — solvers cannot raise their take after the fact.
  • Intents have a deadline; expired intents are unwinnable.

Tracking

const status = await dzap.getZapTxnStatus({
  txId: '...',           // Returned at quote time
});

// status.steps[i] => { protocol, status, txHash, ... }
For step-by-step UI updates, render status.steps.

Failure modes

FailureResult
Source-chain tx revertsIntent unsettled; user state unchanged
Bridge message stuckSolver retries; if exhausted, refund to refundee
Destination tx revertsFunds refunded to refundee (may be on destination chain)
Deadline exceededIntent voided; signature can’t be replayed
For the gasless variant of this flow, see Gasless.
Last modified on May 4, 2026