SettleKit docs

TxLINE integration

The feeds, the proofs, and all three validation primitives on-chain.

SettleKit is built against TxLINE — TxODDS's cryptographically verifiable sports-data layer, anchored on Solana.

What we consume

SurfaceUse
POST /auth/guest/start + on-chain subscribe (free World Cup tier)zero-cost onboarding — no credit card, no token purchase
GET /api/fixtures/snapshotfixture metadata (names, kickoffs)
GET /api/scores/{snapshot,updates,stream}live match state; the keeper's settle trigger and the app's live scoreboard
GET /api/scores/stat-validationthe Merkle proof bundle a settlement transaction carries
GET /api/odds/snapshotStablePrice consensus odds → market seed prices
GET /api/{fixtures,odds}/validationproof bundles for the fixture and odds primitives

The trifecta — all three validation primitives, on-chain

CPISettleKit instructionWhat it anchors
validate_stat_v2post_verdict / post_match_factsthe settlement truth: goals, corners, cards — single stats or binary sums
validate_fixtureprove_fixturethe kickoff time — markets cannot open on a spoofed schedule
validate_oddsprove_oddsseed-price provenance — the opening odds a market quotes are provable

Each CPI's boolean is read from get_return_data with program-id and shape checks, and the roots account is re-derived on-chain from the batch timestamp (spoof-proof).

Design notes we learned the hard way

  • ScoreStat.period living inside the authenticated leaf is what makes the full-time gate unspoofable — a mid-match proof carries the wrong period and fails.
  • Score batches land every ~5 minutes; one validate_stat_v2 CPI costs ≈ 296k CU, so the engine verifies once per fixture and settles many markets from the fact sheet.
  • The devnet World Cup odds feed is intermittent; seeding falls back to sane defaults and picks up real consensus whenever a whole-match snapshot appears.