Skip to main content

Documentation Index

Fetch the complete documentation index at: https://txline-docs.txodds.com/llms.txt

Use this file to discover all available pages before exploring further.

Scores Validation

Validate scores data against on-chain Merkle roots using cryptographic proofs.
import { PublicKey, ComputeBudgetProgram } from "@solana/web3.js";
import { BN } from "@coral-xyz/anchor";

const fixtureId = 17271370;
const seq = 401;
const statKey = 1;
const statKey2 = 2;

// Fetch validation data from API
const validationResponse = await httpClient.get(
  "/api/scores/stat-validation",
  {
    params: {
      fixtureId,
      seq,
      statKey,
      statKey2
    },
  }
);
const validation = validationResponse.data;

// Find the daily scores roots PDA
const epochDay = Math.floor(validation.ts / (24 * 60 * 60 * 1000));
const [dailyScoresRootsPda] = PublicKey.findProgramAddressSync(
  [
    Buffer.from("daily_scores_roots"),
    new BN(epochDay).toArrayLike(Buffer, "le", 2),
  ],
  program.programId
);

// Prepare stat to prove
const statToProve = {
  statToProve: {
    key: validation.statToProve.key,
    value: validation.statToProve.value,
    period: validation.statToProve.period,
  },
  eventStatRoot: validation.eventStatRoot,
  statProof: validation.statProof.map((node) => ({
    hash: node.hash,
    isRightSibling: node.isRightSibling,
  })),
};

// Define predicate (comparison threshold)
const predicate = {
  threshold: 11,
  comparison: { lessThan: {} },
};

// Prepare proofs
const fixtureProof = validation.subTreeProof.map((node) => ({
  hash: node.hash,
  isRightSibling: node.isRightSibling,
}));

const mainTreeProof = validation.mainTreeProof.map((node) => ({
  hash: node.hash,
  isRightSibling: node.isRightSibling,
}));

const fixtureSummary = {
  fixtureId: new BN(validation.summary.fixtureId),
  updateStats: {
    updateCount: validation.summary.updateStats.updateCount,
    minTimestamp: new BN(validation.summary.updateStats.minTimestamp),
    maxTimestamp: new BN(validation.summary.updateStats.maxTimestamp),
  },
  eventsSubTreeRoot: validation.summary.eventStatsSubTreeRoot,
};

// Execute on-chain validation
const signature = await program.methods
  .validateStat(
    new BN(validation.ts),
    fixtureSummary,
    fixtureProof,
    mainTreeProof,
    predicate,
    statToProve,
    null,  // No second stat
    null   // No operator
  )
  .accounts({
    dailyScoresMerkleRoots: dailyScoresRootsPda,
  })
  .preInstructions([
    ComputeBudgetProgram.setComputeUnitLimit({
      units: 10000000,
    }),
  ])
  .rpc();

console.log("Validation confirmed:", signature);
console.log(`Validated: ${statToProve.statToProve.key} = ${statToProve.statToProve.value}`);

Two-Stat Validation

Validate a comparison between two stats (e.g., score difference).
// Prepare second stat
const stat2 = {
  statToProve: validation.statToProve2,
  eventStatRoot: validation.eventStatRoot,
  statProof: validation.statProof2.map((node) => ({
    hash: node.hash,
    isRightSibling: node.isRightSibling,
  })),
};

// Define operation (subtract stat2 from stat1)
const op = { subtract: {} };

// Define predicate for comparison
const predicate2 = {
  threshold: 5,
  comparison: { lessThan: {} },
};

// Execute two-stat validation
const signature2 = await program.methods
  .validateStat(
    new BN(validation.ts),
    fixtureSummary,
    fixtureProof,
    mainTreeProof,
    predicate2,
    statToProve,
    stat2,  // Second stat
    op      // Operation
  )
  .accounts({
    dailyScoresMerkleRoots: dailyScoresRootsPda,
  })
  .preInstructions([
    ComputeBudgetProgram.setComputeUnitLimit({
      units: 10000000,
    }),
  ])
  .rpc();

console.log("Two-stat validation confirmed:", signature2);

Validation Use Cases

On-chain validation enables trustless verification of:
  • Trading Settlement - Prove score outcomes for bet settlement
  • Conditional Logic - Execute smart contract logic based on verified game stats
  • Dispute Resolution - Provide cryptographic proof of game data
  • Automated Markets - Settle prediction markets with on-chain verification