Skip to content
Oracle

$WAGE

The machine wage

Latest signedNone yetNot signed yet
UpdatesDailyNot signed yet
SettleableNoDisplay grade: sampled or cheap to move
SourcesNone yetNot signed yet

On Solana

Feed account
8PAwGMo8KGt6Pq7cR4GqCmozZ4ASyZYB7phf65gtwsRXLive at deploy
Program
838cdWMpb2WeAT4stt7rgaBcwEcJh5ziS9P9RKLeTw7oSolana mainnet
Rule
Version 1 Rule JSON
Rule hash
d75b48b90b6b3d666f80a5df366075ddf2fc7463106d05d75c40e2d9607d4faa

Last 10 signed

This index is not signed yet.

Read this feed

The feed account holds prints once the program is deployed. Until then, read the signed report: /api/indices/wage/report.

TypeScript

// $WAGE on Solana: the newest print in its feed account.
const FEED = "8PAwGMo8KGt6Pq7cR4GqCmozZ4ASyZYB7phf65gtwsRX";
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::*;

// $WAGE on Solana.
pub const TICKERZ_ORACLE: Pubkey = Pubkey::from_str_const("838cdWMpb2WeAT4stt7rgaBcwEcJh5ziS9P9RKLeTw7o");
pub const FEED: Pubkey = Pubkey::from_str_const("8PAwGMo8KGt6Pq7cR4GqCmozZ4ASyZYB7phf65gtwsRX");

#[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))
}

Layout: methodology. Checking a report's signature: the signer file.