$SPIN
Money bet at online casinos in Connecticut
StatusNot signedNot settleable.
UpdatesMonthly
On Solana
Read this feed
The feed account holds prints once the program is deployed. Until then, the signed report is read at /api/indices/spin/report, from the first signing.
TypeScript
// $SPIN on Solana: the newest print in its feed account.
const FEED = "FC3P4xx9CTXixdnjJMHiJUUc6AW21tFhvhzYxoEutVDm";
const PROGRAM = "838cdWMpb2WeAT4stt7rgaBcwEcJh5ziS9P9RKLeTw7o";
const res = await fetch("https://api.mainnet-beta.solana.com", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "getAccountInfo",
params: [FEED, { encoding: "base64", commitment: "finalized" }] }),
});
const { result } = await res.json();
if (result.value?.owner !== PROGRAM) throw new Error("not a Tickerz feed");
const d = Buffer.from(result.value.data[0], "base64").subarray(8); // after the 8 byte discriminator
const decimals = d[52], grade = d[54], head = d[55], count = d[56];
if (count === 0) throw new Error("no print yet");
const o = 72 + 72 * head; // prints[head], the newest
const print = {
period_start: Number(d.readBigInt64LE(o)), // UTC seconds
value: d.readBigInt64LE(o + 8), // value / 10 ** decimals
published_at: Number(d.readBigInt64LE(o + 16)),
report_hash: d.subarray(o + 32, o + 64).toString("hex"),
status: ["provisional", "final", "corrected"][d[o + 64]],
};
const settleable = grade === 1 && print.status !== "provisional";Rust (Anchor)
use anchor_lang::prelude::*;
// $SPIN on Solana.
pub const TICKERZ_ORACLE: Pubkey = Pubkey::from_str_const("838cdWMpb2WeAT4stt7rgaBcwEcJh5ziS9P9RKLeTw7o");
pub const FEED: Pubkey = Pubkey::from_str_const("FC3P4xx9CTXixdnjJMHiJUUc6AW21tFhvhzYxoEutVDm");
#[derive(Accounts)]
pub struct ReadTickerz<'info> {
/// CHECK: address and owner checked; layout at tickerz.com/methodology#the-solana-feed
#[account(address = FEED, owner = TICKERZ_ORACLE)]
pub feed: UncheckedAccount<'info>,
}
/// The newest print, refused unless a market may settle on it (grade 1, status 1 final or 2 corrected).
/// Returns (period_start, value, status); value / 10^decimals in the index's unit.
pub fn latest_settled(feed: &AccountInfo) -> Result<(i64, i64, u8)> {
let data = feed.try_borrow_data()?;
let d = &data[8..]; // after the 8 byte discriminator
let (grade, head, count) = (d[54], d[55] as usize, d[56]);
require!(count > 0, ErrorCode::AccountNotInitialized);
let o = 72 + 72 * head; // prints[head]
let at = |i: usize| i64::from_le_bytes(d[i..i + 8].try_into().unwrap());
let (period_start, value, status) = (at(o), at(o + 8), d[o + 64]);
require!(grade == 1 && status != 0, ErrorCode::ConstraintRaw);
Ok((period_start, value, status))
}