FIELD REPORT

TxODDS / TxLINE — the integration debrief.

What worked building against the real product, the field notes that cost real hours, and what we'd ask TxLINE to ship or publish next. Everything below came out of our own integration run — nothing here is invented or simulated.

01

What worked

EXHIBIT A

The verifier is the real product

The deployed on-chain verifier is the real thing — we CPI'd validateStatV2 on Solana mainnet against the live daily root and got a byte-exact true for a Merkle proof fetched over the free API minutes earlier. It worked the first time our payload was right.

EXHIBIT B

Proof latency at the whistle

At the World Cup Final's final whistle: finalisation event to a fetchable V2 stat-validation proof, in under a minute — free tier, no rate limits. We attested the Final on mainnet 4 minutes after the whistle.

EXHIBIT C

The daily-root PDA scheme is clean

Epoch-day seeds are clean and derivable client-side — we computed today's epoch-day root address before it was referenced anywhere in the response, and it matched.

EXHIBIT D

Data is real and rich

A full 1,385-sequence event stream for the Final, per-stat Merkle proofs, verifiable end to end.

02

Gotchas — field notes

Each of these cost real integration hours. Listed in the order we hit them.

  1. 01Finalisation is action-based, not status-basedgame_finalised arrives with GameState: "scheduled" and empty Data — no StatusId 100 anywhere on the event. Consumers mapping on status alone silently miss the whistle. We only caught this by rehearsing against a completed fixture first.
  2. 02Scores live under numeric stat-id keysHome/away scores sit in the Stats bag under numeric stat-id keys ("1" home, "2" away) — no named fields, no published registry. We cross-validated against the proof's own statsToProve.
  3. 03Undocumented params, and an exact-match timestamp rulestat-validation 404s without seq; the required params were discoverable only by trial. And the on-chain payload timestamp must equal summary.updateStats.minTimestamp exactly — otherwise the verifier throws TimestampMismatch.
  4. 04Two-token auth, learned via 401sEvery data request needs both a guest JWT from /auth/guest/start and an X-Api-Token header. Nothing states this up front.
  5. 05The “snapshot” is an append-only logThe scores "snapshot" is actually an append-only event list — the max-Seq item is the current state, not a single mutable record.
03

Recommendations

TO TXLINE

What would have saved the most time

  • 01Publish the finalisation-event contract (action vs. status semantics) plus an official stat-id registry.
  • 02Document two-token auth, stat-validation's required params, and the minTimestamp-must-match rule prominently.
  • 03Officially publish the program IDL and instruction discriminators — we pinned repo commit f7e3bcd5db4c6744445f75dfab7eccc879c6d2de to be safe.
  • 04A push / WebSocket channel for finalisation would beat 30s polling for settlement use-cases.
  • 05An official SDK would have saved most of the above — similar to the 0xPulsePlay/txline-kit SDK.

This feedback describes our own TxODDS/TxLINE integration for Proofline. See Mainnet for the on-chain evidence this integration produced, and Story for the full submission narrative.