Docs · Solvers

Run a solver. Fill intents. Get paid.

A solver watches the Genome stream, races other solvers to fill intents, and posts proofs back to the t3rn settlement contracts. The reference solver is open-source Rust, MIT licensed. Registration is permissionless and on-chain.

1 · The 5-minute path

  1. Connect a wallet on Taifoon devnet. Add chainId 36927, RPC https://rpc.taifoon.dev. Fund it with a tiny amount of devnet ETH (~$0).
  2. Register on-chain. Visit /solve/register. Click Register on-chain. Wallet pops, you pay the gas, the tx is recorded in SolverRegistryV1.
  3. Clone the reference solver. git clone github.com/t3rn/taifoon-solver.
  4. Configure RPCs + wallet. See config/chain_wiring.json and the env vars below.
  5. Run the solver. cargo run --release --bin solver-main. The solver subscribes to the Genome stream and starts evaluating intents against your strategy.

2 · SolverRegistryV1 — what it does, what it doesn't

The on-chain registry is a single bit + timestamp per address. isRegistered(addr) is the only thing other protocols need to gate API tokens or fill rights on.

  • Address (Taifoon devnet): 0x91b6a2abd429ef728270148f08eb04e4ec315f77
  • No owner / no admin. Reputation, banning, and economic policy live off-chain.
  • Idempotent. Re-registering is a silent no-op; the timestamp stays at first-seen.
  • No unregister path. Off-chain ban lists override on-chain registration.

Full integration guide for protocols consuming the registry: taifoon-solver/docs/B2B_SOLVER_REGISTRATION.md.

3 · Configure RPCs, wallets, signing

The reference solver separates concerns across three keys:

  • Registry key — the EOA that called register(). Your on-chain identity.
  • Solver fill key — the EOA that signs fills on destination chains. Hot wallet, low balance, easy to rotate.
  • Signer-deployer enclave (optional) — if you're running infra on the t3rn stack, the enclave handles deploys but never the fill path. ARC_SIGNER_AUTO_APPROVE bypasses the Telegram approval gate on the fill path when set.

RPC choice matters. Across V3 scanning and Genome inclusion proofs are timing-sensitive — use a paid RPC (Alchemy, BlockPI, Quicknode) for the destination chains you fill on. Public RPCs throttle log queries above ~5k blocks.

4 · The Genome stream + bid path

Subscribe via SSE:

GET /api/solver/stream
Accept: text/event-stream
Authorization: Bearer <your-solver-token>

// Each event:
data: {"kind":"order","id":"T:1714/order:0xabc","asset":"ETH",
       "amount":"1.25","from":"ethereum","to":"base","minFill":"1.24"}

The bid window is 800ms by default. Submit a bid via POST /api/solver/bid before the window closes. Winning bid = highest fill amount ≥ minFill that also passes on-chain verification.

Full API reference: /solve/api.

5 · Monitoring fills + payouts

arc's fill-monitor scans 10 source chains and writes every settled fill to a SQLite ledger. Query your fills via GET /v1/fills?solver=<addr>. Earnings show up under GET /api/solver/payouts once settlement confirms.

Webhooks let you avoid polling. Register an HTTPS endpoint via the solver API to receive:

  • solver.bid.won — your bid was selected
  • solver.bid.lost — another solver won
  • order.settled — cross-chain settlement confirmed
  • order.refunded — refund triggered
  • payout.confirmed — earnings transferred to your executor wallet

Every webhook delivery includes X-T3rn-Signature (HMAC-SHA256 over the raw body). Verify it before processing.

6 · Common failure modes

  • "Failed to fetch" on register — the legacy off-chain register endpoint at api.taifoon.dev is obsolete. The current flow writes to SolverRegistryV1 on-chain via wagmi. Re-register via the portal.
  • Bid rejected with "min fill not met" — your fill amount fell below the intent's minFill. The stream emits minFill in the event; never bid below it.
  • Across V3 scanner missing events — confirmed and fixed in taifoon-solver commit a99a11a (V3FundsDeposited topic order). Pull latest if you forked before 2026-05-18.