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
| Surface | Use |
|---|---|
POST /auth/guest/start + on-chain subscribe (free World Cup tier) | zero-cost onboarding — no credit card, no token purchase |
GET /api/fixtures/snapshot | fixture 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-validation | the Merkle proof bundle a settlement transaction carries |
GET /api/odds/snapshot | StablePrice consensus odds → market seed prices |
GET /api/{fixtures,odds}/validation | proof bundles for the fixture and odds primitives |
The trifecta — all three validation primitives, on-chain
| CPI | SettleKit instruction | What it anchors |
|---|---|---|
validate_stat_v2 | post_verdict / post_match_facts | the settlement truth: goals, corners, cards — single stats or binary sums |
validate_fixture | prove_fixture | the kickoff time — markets cannot open on a spoofed schedule |
validate_odds | prove_odds | seed-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.periodliving 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_v2CPI 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.