{
"version": "0.3.18",
"name": "streak",
"instructions": [
{
"accounts": [
{
"docs": [
"Admin wallet; pays for account rent."
],
"isMut": true,
"isSigner": true,
"name": "payer"
},
{
"docs": [
"Treasury PDA (seeds: [b\"treasury\"])."
],
"isMut": true,
"isSigner": false,
"name": "treasury"
},
{
"docs": [
"USDC mint."
],
"isMut": false,
"isSigner": false,
"name": "mint"
},
{
"docs": [
"Treasury USDC ATA (created if missing)."
],
"isMut": true,
"isSigner": false,
"name": "treasuryAta"
},
{
"address": "11111111111111111111111111111111",
"isMut": false,
"isSigner": false,
"name": "systemProgram"
},
{
"address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"isMut": false,
"isSigner": false,
"name": "tokenProgram"
},
{
"address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",
"isMut": false,
"isSigner": false,
"name": "ataProgram"
}
],
"args": [],
"discriminant": {
"type": "u8",
"value": 0
},
"docs": [
"One-time setup: creates Treasury PDA + treasury USDC ATA.",
"Caller must be ADMIN_ADDRESS."
],
"name": "initialize"
},
{
"accounts": [
{
"docs": [
"Wallet paying for tickets."
],
"isMut": true,
"isSigner": true,
"name": "user"
},
{
"docs": [
"User's USDC ATA (source of funds)."
],
"isMut": true,
"isSigner": false,
"name": "userAta"
},
{
"docs": [
"Treasury PDA — jackpot counters updated here."
],
"isMut": true,
"isSigner": false,
"name": "treasury"
},
{
"docs": [
"Treasury USDC ATA (destination of deposit)."
],
"isMut": true,
"isSigner": false,
"name": "treasuryAta"
},
{
"docs": [
"User PDA (seeds: [b\"ticket\", user_pubkey]); created on first purchase."
],
"isMut": true,
"isSigner": false,
"name": "credits"
},
{
"docs": [
"FEE_COLLECTOR USDC ATA — receives 5% team share."
],
"isMut": true,
"isSigner": false,
"name": "feeCollectorAta"
},
{
"docs": [
"USDC mint."
],
"isMut": false,
"isSigner": false,
"name": "mint"
},
{
"address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"isMut": false,
"isSigner": false,
"name": "tokenProgram"
},
{
"address": "11111111111111111111111111111111",
"isMut": false,
"isSigner": false,
"name": "systemProgram"
}
],
"args": [
{
"docs": [
"µUSDC to spend (6 decimals)."
],
"name": "amount",
"type": "u64"
}
],
"discriminant": {
"type": "u8",
"value": 1
},
"docs": [
"Purchase gaming credits (tickets) with USDC.",
"Transfers `amount` µUSDC from user ATA → treasury ATA; splits revenue on-chain;",
"emits TicketPurchased. The indexer reads that event to credit user_balances."
],
"name": "buyTicket"
},
{
"accounts": [
{
"docs": [
"Must be EXECUTOR_ADDRESS."
],
"isMut": true,
"isSigner": true,
"name": "executor"
},
{
"docs": [
"Executor's USDC ATA (source)."
],
"isMut": true,
"isSigner": false,
"name": "executorAta"
},
{
"isMut": true,
"isSigner": false,
"name": "treasury"
},
{
"isMut": true,
"isSigner": false,
"name": "treasuryAta"
},
{
"isMut": true,
"isSigner": false,
"name": "feeCollectorAta"
},
{
"isMut": false,
"isSigner": false,
"name": "mint"
},
{
"address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"isMut": false,
"isSigner": false,
"name": "tokenProgram"
}
],
"args": [
{
"docs": [
"µUSDC to route."
],
"name": "amount",
"type": "u64"
}
],
"discriminant": {
"type": "u8",
"value": 2
},
"docs": [
"Route trading-fee proceeds into the treasury and split on-chain.",
"Only EXECUTOR_ADDRESS may sign.",
"Transfers `amount` µUSDC executor_ata → treasury_ata; updates Treasury counters;",
"emits FeesRouted."
],
"name": "adminRouteFees"
},
{
"accounts": [
{
"docs": [
"Must be EXECUTOR_ADDRESS."
],
"isMut": true,
"isSigner": true,
"name": "executor"
},
{
"isMut": true,
"isSigner": false,
"name": "treasury"
},
{
"isMut": true,
"isSigner": false,
"name": "treasuryAta"
},
{
"docs": [
"Winner's USDC ATA."
],
"isMut": true,
"isSigner": false,
"name": "recipientAta"
},
{
"isMut": false,
"isSigner": false,
"name": "mint"
},
{
"address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"isMut": false,
"isSigner": false,
"name": "tokenProgram"
}
],
"args": [
{
"docs": [
"µUSDC to transfer."
],
"name": "amount",
"type": "u64"
},
{
"docs": [
"Market series (0 = BTC/USD)."
],
"name": "seriesId",
"type": "u16"
},
{
"docs": [
"0=none (bet winners), 1=daily jackpot, 2=weekly jackpot."
],
"name": "pool",
"type": "u8"
},
{
"docs": [
"5-min period: floor(unix_ts / 300)."
],
"name": "period",
"type": "u64"
}
],
"discriminant": {
"type": "u8",
"value": 3
},
"docs": [
"Transfer µUSDC from treasury vault → recipient ATA.",
"pool=0 bet winners; pool=1 daily jackpot; pool=2 weekly jackpot.",
"Only EXECUTOR_ADDRESS may sign. Emits Paid."
],
"name": "adminDisburseFromTreasury"
},
{
"accounts": [
{
"isMut": true,
"isSigner": true,
"name": "executor"
},
{
"isMut": true,
"isSigner": false,
"name": "treasury"
}
],
"args": [],
"discriminant": {
"type": "u8",
"value": 6
},
"docs": [
"Week-end settlement: move remaining weekly_jackpot → stability_reserve.",
"No USDC transfer. Emits WeeklyFinalized."
],
"name": "adminFinalizeWeekly"
},
{
"accounts": [
{
"isMut": true,
"isSigner": true,
"name": "executor"
},
{
"isMut": true,
"isSigner": false,
"name": "treasury"
}
],
"args": [],
"discriminant": {
"type": "u8",
"value": 7
},
"docs": [
"UTC day-end: sweep remaining daily_jackpot → stability_reserve.",
"No USDC transfer. Emits DailyFinalized."
],
"name": "adminFinalizeDaily"
},
{
"accounts": [
{
"isMut": true,
"isSigner": true,
"name": "executor"
},
{
"isMut": true,
"isSigner": false,
"name": "treasury"
}
],
"args": [],
"discriminant": {
"type": "u8",
"value": 8
},
"docs": [
"T+1 rotation: daily_accrual → daily_jackpot for the next UTC day.",
"Requires daily_jackpot == 0. Emits DailyRotated."
],
"name": "adminRotateDailyVault"
}
],
"accounts": [
{
"discriminator": [
1,
0,
0,
0,
0,
0,
0,
0
],
"docs": [
"Protocol USDC custodian and jackpot counters; one global PDA.",
"PDA seeds: [b\"treasury\"]"
],
"name": "Treasury",
"type": {
"fields": [
{
"docs": [
"Today's playable UTC daily vault (T+1 locked)."
],
"name": "dailyJackpot",
"type": "u64"
},
{
"docs": [
"Weekly jackpot accrual in µUSDC."
],
"name": "weeklyJackpot",
"type": "u64"
},
{
"docs": [
"Buyback reserve in µUSDC."
],
"name": "buyback",
"type": "u64"
},
{
"docs": [
"Pyth BTC/USD price mantissa at last settlement (raw, apply expo)."
],
"name": "lastClosePrice",
"type": "i64"
},
{
"docs": [
"Pyth exponent for lastClosePrice (typically -8 for BTC/USD)."
],
"name": "lastCloseExpo",
"type": "i32"
},
{
"docs": [
"Alignment padding."
],
"name": "padClose",
"type": {
"array": [
"u8",
4
]
}
},
{
"docs": [
"publish_time from Pyth feed at last settlement."
],
"name": "lastClosePublishTime",
"type": "i64"
},
{
"docs": [
"Excess weekly + finalized daily remainder."
],
"name": "stabilityReserve",
"type": "u64"
},
{
"docs": [
"Ticket 70% accrual for tomorrow's vault."
],
"name": "dailyAccrual",
"type": "u64"
}
],
"kind": "struct"
}
},
{
"discriminator": [
2,
0,
0,
0,
0,
0,
0,
0
],
"docs": [
"Per-wallet gaming credit account; created on first BuyTicket.",
"PDA seeds: [b\"ticket\", user_pubkey]"
],
"name": "User",
"type": {
"fields": [
{
"docs": [
"Wallet that owns this account."
],
"name": "user",
"type": "publicKey"
},
{
"docs": [
"On-chain ticket credits from BuyTicket."
],
"name": "balance",
"type": "u64"
},
{
"docs": [
"Lifetime µUSDC spent on tickets (never decreases)."
],
"name": "totalPurchased",
"type": "u64"
},
{
"docs": [
"Legacy field — unused (bets are server-authoritative)."
],
"name": "lastBetPeriod",
"type": "u64"
}
],
"kind": "struct"
}
}
],
"types": [],
"events": [
{
"docs": [
"Emitted once by Initialize."
],
"fields": [
{
"docs": [
"Admin wallet that called Initialize."
],
"index": false,
"name": "admin",
"type": "publicKey"
}
],
"name": "Initialized"
},
{
"docs": [
"Emitted by BuyTicket.",
"Indexer reads this to credit the user's off-chain spendable balance."
],
"fields": [
{
"docs": [
"Wallet that purchased credits."
],
"index": true,
"name": "user",
"type": "publicKey"
},
{
"docs": [
"µUSDC spent (gross, before revenue split)."
],
"index": false,
"name": "amount",
"type": "u64"
}
],
"name": "TicketPurchased"
},
{
"docs": [
"Emitted by AdminRouteFees."
],
"fields": [
{
"docs": [
"Total µUSDC routed."
],
"index": false,
"name": "amount",
"type": "u64"
},
{
"index": false,
"name": "dailyShare",
"type": "u64"
},
{
"index": false,
"name": "weeklyShare",
"type": "u64"
},
{
"index": false,
"name": "buybackShare",
"type": "u64"
},
{
"index": false,
"name": "teamShare",
"type": "u64"
}
],
"name": "FeesRouted"
},
{
"docs": [
"Emitted by AdminDisburseFromTreasury. Bot reads this to confirm payouts in DB."
],
"fields": [
{
"docs": [
"Winner's wallet."
],
"index": true,
"name": "recipient",
"type": "publicKey"
},
{
"docs": [
"µUSDC paid out."
],
"index": false,
"name": "amount",
"type": "u64"
},
{
"index": false,
"name": "seriesId",
"type": "u16"
},
{
"index": false,
"name": "period",
"type": "u64"
}
],
"name": "Paid"
},
{
"docs": [
"Emitted by AdminFinalizeWeekly."
],
"fields": [
{
"index": false,
"name": "movedToStability",
"type": "u64"
}
],
"name": "WeeklyFinalized"
},
{
"docs": [
"Emitted by AdminFinalizeDaily."
],
"fields": [
{
"index": false,
"name": "movedToStability",
"type": "u64"
}
],
"name": "DailyFinalized"
},
{
"docs": [
"Emitted by AdminRotateDailyVault."
],
"fields": [
{
"docs": [
"µUSDC moved from daily_accrual → daily_jackpot."
],
"index": false,
"name": "vaultLocked",
"type": "u64"
}
],
"name": "DailyRotated"
}
],
"errors": [
{
"code": 0,
"msg": "Invalid instruction data",
"name": "InvalidInstruction"
},
{
"code": 1,
"msg": "Program already initialized",
"name": "AlreadyInitialized"
},
{
"code": 2,
"msg": "Signer is not authorized for this instruction",
"name": "Unauthorized"
},
{
"code": 3,
"msg": "Account does not match expected PDA",
"name": "BadPda"
},
{
"code": 4,
"msg": "Program not initialized — call Initialize first",
"name": "NotInitialized"
},
{
"code": 5,
"msg": "Arithmetic overflow",
"name": "Overflow"
},
{
"code": 6,
"msg": "Mint mismatch",
"name": "BadMint"
},
{
"code": 9,
"msg": "Treasury balance insufficient for payout",
"name": "InsufficientTreasury"
},
{
"code": 10,
"msg": "Deposit amount must be > 0",
"name": "ZeroAmount"
},
{
"code": 21,
"msg": "Price account owner is not the Pyth program",
"name": "PythBadOwner"
},
{
"code": 22,
"msg": "Could not parse Pyth price account",
"name": "PythInvalidAccount"
},
{
"code": 23,
"msg": "Pyth price is stale (exceeds PYTH_MAX_PRICE_AGE_SECS)",
"name": "OraclePriceStale"
},
{
"code": 24,
"msg": "Could not normalize oracle prices for comparison",
"name": "OracleNormalize"
},
{
"code": 47,
"msg": "Genesis price not set — call Initialize to seed the treasury price chain",
"name": "GenesisNotSet"
}
],
"metadata": {
"address": "9s4fFVusCVuuNQpfrmVp6H9z2E5ykqPiDBZvTFWhedzz",
"bpfUpgradeableLoader": "BPFLoaderUpgradeab1e11111111111111111111111",
"origin": "steel"
}
}