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
- Connect a wallet on Taifoon devnet. Add chainId
36927, RPChttps://rpc.taifoon.dev. Fund it with a tiny amount of devnet ETH (~$0). - Register on-chain. Visit /solve/register. Click Register on-chain. Wallet pops, you pay the gas, the tx is recorded in
SolverRegistryV1. - Clone the reference solver.
git clone github.com/t3rn/taifoon-solver. - Configure RPCs + wallet. See
config/chain_wiring.jsonand the env vars below. - 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_APPROVEbypasses 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 selectedsolver.bid.lost— another solver wonorder.settled— cross-chain settlement confirmedorder.refunded— refund triggeredpayout.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.devis obsolete. The current flow writes toSolverRegistryV1on-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-solvercommita99a11a(V3FundsDeposited topic order). Pull latest if you forked before 2026-05-18.