Skip to main content

Mainnet Addresses

TypeAddress
Program ID9ExbZjAapQww1vfcisDmrngPinHTEfpjYRWMunJgcKaA
TxL Token MintZhw9TVKp68a1QrftncMSd6ELXKDtpVMNuMGr1jNwdeL
USDT MintEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
API Endpointhttps://txline.txodds.com/api/

Devnet Addresses

TypeAddress
Program ID6pW64gN1s2uqjHkn1unFeEjAwJkPGHoppGvS715wyP2J
TxL Token Mint4Zao8ocPhmMgq7PdsYWyxvqySMGx7xb9cMftPMkEokRG
USDT MintELWTKspHKCnCfCiCiqYw1EDH77k8VCP74dK9qytG2Ujh
API Endpointhttps://txline-dev.txodds.com/api/
Use all values from one network only. A devnet subscribe transaction from 6pW64gN1s2uqjHkn1unFeEjAwJkPGHoppGvS715wyP2J must be activated with https://txline-dev.txodds.com, and a mainnet subscribe transaction from 9ExbZjAapQww1vfcisDmrngPinHTEfpjYRWMunJgcKaA must be activated with https://txline.txodds.com.

API Hosts

NetworkGuest AuthAPI Base
Mainnethttps://txline.txodds.com/auth/guest/starthttps://txline.txodds.com/api/
Devnethttps://txline-dev.txodds.com/auth/guest/starthttps://txline-dev.txodds.com/api/
Use the host root for /auth/guest/start, then use the matching /api/token/activate endpoint after the on-chain subscribe transaction confirms.

Deriving Program Derived Addresses (PDAs)

The program uses several PDAs that you’ll need to derive when interacting with it:
import { PublicKey } from "@solana/web3.js";
import { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token";
import { BN } from "@coral-xyz/anchor";

const programId = new PublicKey("9ExbZjAapQww1vfcisDmrngPinHTEfpjYRWMunJgcKaA");
const txlTokenMint = new PublicKey("Zhw9TVKp68a1QrftncMSd6ELXKDtpVMNuMGr1jNwdeL");

// For devnet, replace both constants with the devnet values above.

// Token Treasury PDA - owns the vault that collects subscription fees
const [tokenTreasuryPda] = PublicKey.findProgramAddressSync(
  [Buffer.from("token_treasury_v2")],
  programId
);

// Token Treasury Vault - the ATA that holds collected TxL tokens
const tokenTreasuryVault = getAssociatedTokenAddressSync(
  txlTokenMint,
  tokenTreasuryPda,
  true, // Allow PDA owner
  TOKEN_2022_PROGRAM_ID
);

// Pricing Matrix PDA - contains service tier pricing information
const [pricingMatrixPda] = PublicKey.findProgramAddressSync(
  [Buffer.from("pricing_matrix")],
  programId
);

// USDT Treasury PDA - owns the vault that collects USDT for token purchases
const [usdtTreasuryPda] = PublicKey.findProgramAddressSync(
  [Buffer.from("usdt_treasury")],
  programId
);

const usdtMint = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB");

// USDT Treasury Vault - the ATA that holds collected USDT
const usdtTreasuryVault = getAssociatedTokenAddressSync(
  usdtMint,
  usdtTreasuryPda,
  true,
  TOKEN_2022_PROGRAM_ID
);

// Daily Scores Merkle Roots PDA - for validating scores data
const epochDay = Math.floor(Date.now() / (24 * 60 * 60 * 1000));
const [dailyScoresPda] = PublicKey.findProgramAddressSync(
  [
    Buffer.from("daily_scores_roots"),
    new BN(epochDay).toArrayLike(Buffer, "le", 2)
  ],
  programId
);

// Daily Batch Roots PDA - for validating odds data
const [dailyBatchRootsPda] = PublicKey.findProgramAddressSync(
  [
    Buffer.from("daily_batch_roots"),
    new BN(epochDay).toArrayLike(Buffer, "le", 2)
  ],
  programId
);

// Ten Daily Fixtures Roots PDA - for validating fixtures data
const alignedEpochDay = Math.floor(epochDay / 10) * 10;
const [tenDailyFixturesRootsPda] = PublicKey.findProgramAddressSync(
  [
    Buffer.from("ten_daily_fixtures_roots"),
    new BN(alignedEpochDay).toArrayLike(Buffer, "le", 2)
  ],
  programId
);

console.log("Token Treasury PDA:", tokenTreasuryPda.toBase58());
console.log("Token Treasury Vault:", tokenTreasuryVault.toBase58());
console.log("USDT Treasury PDA:", usdtTreasuryPda.toBase58());
console.log("USDT Treasury Vault:", usdtTreasuryVault.toBase58());
console.log("Pricing Matrix PDA:", pricingMatrixPda.toBase58());
console.log("Daily Scores PDA:", dailyScoresPda.toBase58());
console.log("Daily Batch Roots PDA:", dailyBatchRootsPda.toBase58());
console.log("Ten Daily Fixtures Roots PDA:", tenDailyFixturesRootsPda.toBase58());