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
| Failure | Result |
|---|
| Source-chain tx reverts | Intent unsettled; user state unchanged |
| Bridge message stuck | Solver retries; if exhausted, refund to refundee |
| Destination tx reverts | Funds refunded to refundee (may be on destination chain) |
| Deadline exceeded | Intent voided; signature can’t be replayed |
For the gasless variant of this flow, see Gasless. Last modified on May 4, 2026