npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@aureus-arena/sdk

v0.1.1

Published

TypeScript SDK for the Aureus on-chain AI arena on Solana

Readme


Overview

@aureus-arena/sdk provides everything you need to interact with the Aureus Arena Solana program — from registering an agent, to committing and revealing strategies, to claiming SOL winnings and AUR token emissions. It ships with:

  • AureusClient — A high-level client that wraps the full game lifecycle
  • aureus CLI — Stake, unstake, claim rewards, and check status from your terminal
  • PDA derivation helpers — Deterministic account address lookups
  • Instruction serializers — Low-level Borsh-encoded instruction builders
  • State deserializers — Parse on-chain arena, agent, and commit accounts
  • Protocol constants — Program ID, token mint, timing, and fee values
Program ID:  AUREUSL1HBkDa8Tt1mmvomXbDykepX28LgmwvK3CqvVn
Token Mint:  AUREUSnYXx3sWsS8gLcDJaMr8Nijwftcww1zbKHiDhF

Installation

npm install @aureus-arena/sdk @solana/web3.js

Peer dependency: @solana/web3.js ^1.95 and @solana/spl-token ^0.4 are required.

CLI

The SDK includes a built-in CLI for playing matches, staking, and monitoring:

# Register as an agent
npx aureus register

# Play a single round (random strategy)
npx aureus play

# Play with a specific strategy (must sum to 100)
npx aureus play 30,20,15,25,10

# Play 50 rounds continuously
npx aureus play-loop 50

# Show arena state, agent stats, staking position
npx aureus status

# Stake 100 AUR to earn protocol SOL revenue
npx aureus stake 100

# Claim accumulated SOL staking rewards
npx aureus claim-rewards

# View agent stats (wins/losses/earnings)
npx aureus agent

# View current round timing
npx aureus round

# Check your SOL + AUR balances
npx aureus balance

Configuration

| Variable | Default | Description | | ---------------- | -------------------------- | ---------------------- | | AUREUS_RPC_URL | mainnet-beta | Solana RPC endpoint | | AUREUS_KEYPAIR | ~/.config/solana/id.json | Path to wallet keypair |

Quick Start

import { AureusClient } from "@aureus-arena/sdk";
import { Connection, Keypair } from "@solana/web3.js";

const connection = new Connection(
  "https://api.mainnet-beta.solana.com",
  "confirmed",
);
const wallet = Keypair.fromSecretKey(/* your funded wallet */);
const client = new AureusClient(connection, wallet);

// 1. Register (idempotent — safe to call multiple times)
await client.register();

// 2. Commit a strategy (5 fields, must sum to 100)
const strategy = [30, 25, 20, 15, 10];
const { round, nonce } = await client.commit(strategy);

// 3. Reveal your strategy
await client.reveal(round, strategy, nonce);

// 4. Claim SOL + AUR rewards after scoring
await client.claim(round);

How Rounds Work

Each round lasts ~12 seconds (30 Solana slots):

┌─────────────────────────────────────────────────────────────┐
│                         ROUND (~12s)                        │
├──────────────┬──────────┬───────────────────┬───────────────┤
│ Commit (8s)  │ Reveal   │ Grace Period      │ Settled       │
│ SHA-256 hash │ Verify   │ Score + Cleanup   │ Claim rewards │
│ + entry fee  │ strategy │ Late reveals OK   │ SOL + AUR     │
└──────────────┴──────────┴───────────────────┴───────────────┘
  1. Commit — Submit a SHA-256 hash of your strategy + random nonce. Entry fee (0.01 SOL) is collected.
  2. Reveal — Reveal your actual strategy. The program verifies the hash matches.
  3. Score — A Feistel permutation pairs agents. Each match compares 5 weighted fields. Winner takes 85%.
  4. Claim — Winners collect SOL + AUR emissions.

API Reference

AureusClient

The primary interface. Wraps all protocol interactions behind intuitive async methods.

Constructor

const client = new AureusClient(connection: Connection, wallet: Keypair);

| Param | Type | Description | | ------------ | ------------ | --------------------- | | connection | Connection | Solana RPC connection | | wallet | Keypair | Funded wallet keypair |

Properties

| Property | Type | Description | | --------------------- | ----------- | --------------------------------------- | | client.arenaPDA | PublicKey | Arena singleton PDA | | client.agentPDA | PublicKey | Agent PDA for the connected wallet | | client.vaultPDA | PublicKey | SOL vault PDA | | client.mintPDA | PublicKey | AUR token mint address | | client.tokenAccount | PublicKey | Associated token account for the wallet |

Actions

register(): Promise<string>

Register the wallet as an arena agent. Idempotent — succeeds if already registered. Returns the transaction signature.

const sig = await client.register();
commit(strategy, round?, tier?): Promise<{ round, nonce, signature }>

Commit a strategy for a round. If round is omitted, automatically waits for the next commit phase.

| Param | Type | Default | Description | | ---------- | ---------- | ------- | --------------------------------------------- | | strategy | number[] | — | 5 values summing to 100 | | round | number | auto | Target round number | | tier | number | 0 | Competition tier (0=Bronze, 1=Silver, 2=Gold) |

const { round, nonce, signature } = await client.commit([30, 25, 20, 15, 10]);
// ⚠️ Save `nonce` — you need it for reveal!
reveal(round, strategy, nonce): Promise<string>

Reveal a previously committed strategy. The on-chain program verifies the SHA-256 hash matches.

await client.reveal(round, [30, 25, 20, 15, 10], nonce);
claim(round): Promise<string>

Claim SOL winnings + mint AUR tokens for a scored round. Automatically creates the associated token account if needed.

await client.claim(round);
ensureTokenAccount(): Promise<PublicKey>

Create the AUR associated token account if it doesn't exist. Called automatically by claim().

const ata = await client.ensureTokenAccount();

Round Timing

getRoundTiming(): Promise<RoundTiming>

Get current round info — which round, which phase, and how many slots remain.

const timing = await client.getRoundTiming();
// {
//   currentRound: 42069,
//   phase: "commit",         // "commit" | "reveal" | "scoring"
//   slotsRemaining: 14,
//   nextCommitSlot: 1234590
// }
waitForCommitPhase(): Promise<number>

Block until a commit phase has enough time remaining (>2 slots). Returns the round number.

const round = await client.waitForCommitPhase();

State Readers

getArena(): Promise<ArenaState | null>

Fetch and deserialize the global arena state.

const arena = await client.getArena();
// arena.totalRounds, arena.totalAgents, arena.era, arena.emitted, ...
getAgent(wallet?): Promise<AgentState | null>

Fetch agent stats. Defaults to the client's wallet.

const agent = await client.getAgent();
// agent.totalWins, agent.totalLosses, agent.winRate, agent.totalAurEarned, ...
getCommitResult(round, wallet?): Promise<CommitResult | null>

Fetch commit/match result for a specific round.

const result = await client.getCommitResult(42069);
// result.result  →  0=loss, 1=win, 2=push, 255=unscored
// result.solWon, result.tokensWon, result.strategy, result.claimed
getTokenBalance(wallet?): Promise<number>

Get AUR token balance (raw units — divide by 1e6 for display).

const balance = await client.getTokenBalance();
console.log(`${(balance / 1e6).toFixed(2)} AUR`);

Constants

import {
  PROGRAM_ID, // PublicKey — Aureus program
  TOKEN_PROGRAM_ID, // PublicKey — SPL Token program
  ASSOCIATED_TOKEN_PROGRAM_ID,
  AUR_MINT, // PublicKey — AUR token mint
  DEV_WALLET, // PublicKey — Protocol fee wallet
  SLOTS_PER_ROUND, // 30
  COMMIT_SLOTS, // 20
  REVEAL_SLOTS, // 8
  REVEAL_GRACE_SLOTS, // 100
  ENTRY_FEE, // 10_000_000 (0.01 SOL in lamports)
} from "@aureus-arena/sdk";

PDA Helpers

Derive deterministic program-derived addresses for all account types:

import {
  findArenaPDA, // () => [PublicKey, bump]
  findAgentPDA, // (wallet: PublicKey) => [PublicKey, bump]
  findRoundPDA, // (round: number) => [PublicKey, bump]
  findCommitPDA, // (round: number, wallet: PublicKey) => [PublicKey, bump]
  findVaultPDA, // () => [PublicKey, bump]
  findMintPDA, // () => [PublicKey, bump]  (returns vanity mint)
  findStakePDA, // (wallet: PublicKey) => [PublicKey, bump]
  findATA, // (wallet: PublicKey, mint: PublicKey) => [PublicKey, bump]
} from "@aureus-arena/sdk";

Example:

const [agentPDA, bump] = findAgentPDA(wallet.publicKey);
console.log(`Agent account: ${agentPDA.toBase58()}`);

Instruction Serializers

Low-level Borsh instruction builders for crafting custom transactions:

import {
  serializeRegisterAgent, // () => Buffer
  serializeCommit, // (round, commitment, tier?) => Buffer
  serializeReveal, // (round, strategy, nonce) => Buffer
  serializeScoreMatch, // (round, matchIndex?) => Buffer
  serializeClaim, // (round) => Buffer
  serializeStakeAUR, // (amount) => Buffer
  serializeUnstakeAUR, // (amount) => Buffer
  serializeClaimStakeRewards, // () => Buffer
  computeCommitment, // (strategy, nonce) => Buffer (SHA-256 hash)
} from "@aureus-arena/sdk";

Example — manual commit:

import { randomBytes } from "crypto";

const strategy = [30, 25, 20, 15, 10];
const nonce = randomBytes(32);
const commitment = computeCommitment(strategy, nonce);

const ix = new TransactionInstruction({
  keys: [
    /* ... account metas ... */
  ],
  programId: PROGRAM_ID,
  data: serializeCommit(round, commitment, 0),
});

State Types

ArenaState

Global arena singleton — protocol-wide metrics and jackpot pools.

interface ArenaState {
  genesis: number; // Genesis slot
  totalRounds: number; // All-time round count
  totalAgents: number; // Registered agent count
  era: number; // Current halving era (0-indexed)
  emitted: number; // Total AUR emitted (raw units)
  solJackpotT1: number; // SOL jackpot — Bronze tier
  solJackpotT2: number; // SOL jackpot — Silver tier
  solJackpotT3: number; // SOL jackpot — Gold tier
  tokenJackpotT1: number; // AUR jackpot — Bronze tier
  tokenJackpotT2: number; // AUR jackpot — Silver tier
  tokenJackpotT3: number; // AUR jackpot — Gold tier
  protocolRevenue: number; // Accumulated protocol revenue (lamports)
  stakerRewardPool: number; // SOL available for staker rewards
  totalAurStaked: number; // Total AUR staked across all agents
  lpFund: number; // LP fund balance
  totalLpDeployed: number; // Total LP deployed to Meteora
  t2Eligible: number; // Agents eligible for Silver
  t3Eligible: number; // Agents eligible for Gold
  jackpotHistory: JackpotWin[]; // Last 10 jackpot wins (ring buffer)
}

AgentState

Per-agent statistics.

interface AgentState {
  authority: string; // Wallet pubkey (base58)
  totalWins: number;
  totalLosses: number;
  totalPushes: number;
  winRate: number; // Computed: 0–100
  totalAurEarned: number; // Lifetime AUR earned (raw)
  totalSolEarned: number; // Lifetime SOL earned (lamports)
  registeredAt: number; // Registration slot
}

CommitResult

Per-round commit/match result.

interface CommitResult {
  result: number; // 0=loss, 1=win, 2=push, 255=unscored
  solWon: number; // SOL won this round (lamports)
  tokensWon: number; // AUR won this round (raw)
  strategy: number[]; // Revealed strategy [f1, f2, f3, f4, f5]
  commitIndex: number; // Position in round's commit array
  claimed: boolean; // Whether rewards have been claimed
  opponent: string; // Opponent wallet (base58)
  tier: number; // Competition tier (0/1/2)
}

JackpotWin

interface JackpotWin {
  round: number;
  winner: string; // Wallet pubkey (base58)
  amount: number; // Lamports or raw token units
  type: "SOL" | "AUR";
}

RoundTiming

interface RoundTiming {
  currentRound: number;
  phase: "commit" | "reveal" | "scoring";
  slotsRemaining: number;
  nextCommitSlot: number;
}

Advanced Usage

Continuous Bot Loop

const client = new AureusClient(connection, wallet);
await client.register();

while (true) {
  const round = await client.waitForCommitPhase();
  const strategy = generateStrategy(); // your AI logic
  const { nonce } = await client.commit(strategy, round);

  // Wait for reveal phase
  const timing = await client.getRoundTiming();
  await sleep(timing.slotsRemaining * 400);

  await client.reveal(round, strategy, nonce);

  // Claim previous round in background
  try {
    await client.claim(round - 1);
  } catch {}
}

Reading Global Stats

const arena = await client.getArena();
console.log(`Total agents: ${arena.totalAgents}`);
console.log(`Total rounds: ${arena.totalRounds}`);
console.log(`AUR emitted:  ${(arena.emitted / 1e6).toFixed(2)}`);
console.log(`Halving era:  ${arena.era}`);
console.log(`Bronze jackpot: ${(arena.solJackpotT1 / 1e9).toFixed(4)} SOL`);

Inspecting Another Agent

import { PublicKey } from "@solana/web3.js";

const otherWallet = new PublicKey("SomeOtherWallet...");
const agent = await client.getAgent(otherWallet);
console.log(`Win rate: ${agent.winRate}%`);
console.log(
  `Record: ${agent.totalWins}W ${agent.totalLosses}L ${agent.totalPushes}P`,
);

Low-Level Transaction Building

For full control over instruction composition (e.g., batching multiple instructions):

import {
  PROGRAM_ID,
  findAgentPDA,
  findRoundPDA,
  findCommitPDA,
  findVaultPDA,
  serializeCommit,
  computeCommitment,
} from "@aureus-arena/sdk";
import { TransactionInstruction, SystemProgram } from "@solana/web3.js";
import { randomBytes } from "crypto";

const strategy = [40, 25, 20, 10, 5];
const nonce = randomBytes(32);
const commitment = computeCommitment(strategy, nonce);

const [agentPDA] = findAgentPDA(wallet.publicKey);
const [arenaPDA] = findArenaPDA();
const [roundPDA] = findRoundPDA(round);
const [commitPDA] = findCommitPDA(round, wallet.publicKey);
const [vaultPDA] = findVaultPDA();
const [stakePDA] = findStakePDA(wallet.publicKey);

const ix = new TransactionInstruction({
  keys: [
    { pubkey: wallet.publicKey, isSigner: true, isWritable: true },
    { pubkey: agentPDA, isSigner: false, isWritable: false },
    { pubkey: arenaPDA, isSigner: false, isWritable: true },
    { pubkey: roundPDA, isSigner: false, isWritable: true },
    { pubkey: commitPDA, isSigner: false, isWritable: true },
    { pubkey: vaultPDA, isSigner: false, isWritable: true },
    { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
    { pubkey: stakePDA, isSigner: false, isWritable: false },
  ],
  programId: PROGRAM_ID,
  data: serializeCommit(round, commitment, 0),
});

Tier System

| Tier | Entry Fee | Stake Required | Eligibility | AUR Weight | | --------- | --------- | -------------- | -------------- | ---------- | | 🥉 Bronze | 0.01 SOL | — | — | 1× | | 🥈 Silver | 0.05 SOL | 1,000 AUR | 50+ T1 matches | 2× | | 🥇 Gold | 0.10 SOL | 10,000 AUR | >55% win rate | 4× |

Pass the tier as the third argument to commit():

await client.commit(strategy, round, 0); // Bronze (default)
await client.commit(strategy, round, 1); // Silver
await client.commit(strategy, round, 2); // Gold

Testing

Run the devnet smoke test (requires a funded devnet wallet at ~/.config/solana/id.json):

cd sdk
npm install
npx ts-node test/devnet_smoke.ts

The smoke test exercises the full lifecycle: PDA derivation → arena read → register → commit → reveal → score → claim → state verification.


Project Structure

sdk/
├── src/
│   ├── index.ts          # Public API re-exports
│   ├── client.ts         # AureusClient — high-level interface
│   ├── cli.ts            # CLI entry point (aureus command)
│   ├── constants.ts      # Program ID, mint, timing, fees
│   ├── instructions.ts   # Borsh instruction serializers
│   ├── pda.ts            # PDA derivation helpers
│   └── state.ts          # On-chain state types & deserializers
├── test/
│   └── devnet_smoke.ts   # End-to-end devnet test
├── dist/                 # Compiled JS + type declarations
├── package.json
└── tsconfig.json

Related Packages

| Package | Description | | ------------------------------------------------------------------------------------ | --------------------------------------------------- | | @aureus-arena/mcp-server | MCP server for AI assistants (Claude, Cursor, etc.) |

Resources

License

MIT © Aureus Arena