Staking AUR
Stake your AUR tokens to earn passive SOL income from every match played in the arena. The more AUR you stake relative to other stakers, the larger your share of protocol revenue.
Overview
graph LR
M["Matches Played"] -->|"10% protocol cut"| P["Protocol Revenue"]
P -->|"30%"| SR["Staker Reward Pool"]
SR --> S1["Staker A<br/>40% of pool"]
SR --> S2["Staker B<br/>35% of pool"]
SR --> S3["Staker C<br/>25% of pool"]Every scored match contributes 30% of the protocol's 10% cut to the staker reward pool. Your share is proportional to how much AUR you've staked relative to the total staked supply.
How It Works
1. Stake AUR
Transfer AUR tokens from your wallet to the protocol vault. Your stake PDA is created automatically on first stake.
You stake 10,000 AUR
Total staked across all stakers: 100,000 AUR
Your share: 10,000 / 100,000 = 10%2. Rewards Accumulate Automatically
Every time a match is scored, the protocol updates a global cumulative reward factor. You don't need to claim every round — rewards pile up until you're ready.
3. Claim or Unstake (after cooldown)
After staking, there is a 200-round cooldown (~40 minutes) before you can unstake or claim rewards. This prevents reward sniping — a technique where whales briefly stake large amounts to capture disproportionate rewards.
- Claim — Withdraw your accumulated SOL rewards while keeping your AUR staked
- Unstake — Withdraw some or all of your AUR + automatically claim pending SOL rewards
⏱️ The cooldown resets every time you add more AUR to your stake.
Using the CLI
The easiest way to stake is with the Aureus CLI:
# Install the SDK (includes CLI)
npm install -g @aureus-arena/sdk
# Check your current position
aureus status
# Stake 100 AUR
aureus stake 100
# Claim accumulated SOL rewards
aureus claim-rewards
# Unstake 50 AUR
aureus unstake 50See the CLI Reference for all commands and configuration options.
Proportional Reward Math
The protocol uses a cumulative factor approach (similar to Synthetix StakingRewards or SushiSwap MasterChef) for gas-efficient, proportional distribution.
Global State (Arena PDA)
| Field | Description |
|---|---|
reward_per_token_cumulative | Running total of SOL distributed per staked AUR (scaled by 1e12) |
total_aur_staked | Total AUR staked across all stakers |
staker_reward_pool | SOL available for staker distribution |
Per-Staker State (Stake PDA)
| Field | Description |
|---|---|
aur_staked | Amount of AUR this staker has staked |
reward_debt | Snapshot of reward_per_token_cumulative at last stake/claim |
pending_rewards | Unclaimed SOL accumulated before most recent stake change |
When a match is scored:
graph TD
MATCH["Match Scored<br/>0.002 SOL protocol cut"] -->|"30% = 0.0006 SOL"| POOL["staker_reward_pool += 600"]
POOL --> FACTOR["reward_per_token_cumulative<br/>+= (600 × 1e12) / total_aur_staked"]When you claim:
pending_rewards = aur_staked × (cumulative_now − reward_debt) / 1e12graph LR
CALC["Your Pending SOL"] --> PAY["Transfer SOL<br/>vault → your wallet"]
PAY --> RESET["reward_debt = cumulative_now<br/>pending_rewards = 0"]Example Walkthrough
Suppose there are two stakers:
| Event | Alice (Staked) | Bob (Staked) | Total Staked | Cumulative Factor |
|---|---|---|---|---|
| Alice stakes 60 AUR | 60 | 0 | 60 | 0 |
| 10 matches scored (6,000 lamports to pool) | 60 | 0 | 60 | 100×10¹² |
| Bob stakes 40 AUR | 60 | 40 | 100 | 100×10¹² |
| 10 more matches scored (6,000 lamports) | 60 | 40 | 100 | 160×10¹² |
Alice claims:
pending = 60 × (160×10¹² − 0) / 10¹² = 9,600 lamportsBob claims:
pending = 40 × (160×10¹² − 100×10¹²) / 10¹² = 2,400 lamportsTotal distributed: 12,000 lamports = exactly what went into the pool ✅
Alice earned more because she was staked for longer and had a larger share.
Revenue Sources
Staker rewards come from two sources:
1. Match Protocol Fees (30% of 10%)
Every match contributes 0.0006 SOL per match (at 0.01 SOL entry fee):
Per match: 0.02 SOL pot × 10% protocol × 30% staker = 0.0006 SOL2. LP Swap Fees (via ClaimPoolFees)
When the AUR/SOL liquidity pool generates trading fees, anyone can call ClaimPoolFees to collect them:
- wSOL fees → Added to
staker_reward_pool, increasing the cumulative factor - AUR fees → Added to T1
token_jackpotviaswap_fee_aur_jackpot, feeding the T1 jackpot pool
graph LR
TRADES["DEX Swaps<br/>AUR ↔ SOL"] -->|"trading fees"| POOL["Meteora DLMM<br/>Position"]
POOL -->|"ClaimPoolFees"| SPLIT{"Token type?"}
SPLIT -->|"wSOL"| CHECK{"Stakers exist?"}
CHECK -->|"Yes"| STAKERS["staker_reward_pool<br/>(cumulative factor ↑)"]
CHECK -->|"No"| JP["T1 SOL Jackpot"]
SPLIT -->|"AUR"| JACKPOT["T1 token_jackpot<br/>(transfer-based)"]Instructions
Stake (IX 6)
| Account | Type | Description |
|---|---|---|
| Staker | signer, writable | Your wallet |
| Stake PDA | writable | ["stake", wallet] |
| Arena PDA | writable | Global state |
| Staker AUR ATA | writable | Your AUR token account |
| Vault AUR ATA | writable | Protocol's AUR token account |
| Token Program | — | SPL Token |
| System Program | — | For PDA creation |
Data: [6, amount_u64_le]
Unstake (IX 7)
Same accounts as Stake, plus:
| Account | Type | Description |
|---|---|---|
| SOL Vault | writable | For SOL reward payout |
Data: [7, amount_u64_le]
Claim Rewards (IX 8)
| Account | Type | Description |
|---|---|---|
| Staker | signer, writable | Your wallet |
| Stake PDA | writable | ["stake", wallet] |
| Arena PDA | — | Read cumulative factor |
| SOL Vault | writable | Source of SOL rewards |
Data: [8]
Anti-Sniping Cooldown
To protect long-term stakers from dilution, the protocol enforces a 200-round cooldown (~6,000 slots ≈ 40 minutes) after any stake action.
The attack it prevents:
- Whale watches the mempool, sees a large round about to be scored
- Stakes 900K AUR right before scoring → captures ~90% of that round's staker rewards
- Unstakes immediately → long-term stakers got diluted to ~10%
How the cooldown stops it:
- Cannot unstake or claim rewards until cooldown expires
- Cooldown resets every time you add more stake (prevents pre-warming with 1 AUR)
- 40 minutes is long enough that future round activity is unpredictable
- Short enough that legitimate stakers barely notice
| Constant | Value | Duration |
|---|---|---|
STAKE_COOLDOWN_SLOTS | 6,000 | ~40 minutes |
Zero-Staker Fallback
If there are no active stakers when SOL rewards are generated (from match protocol fees or LP pool fees), the SOL is redirected to the T1 SOL jackpot rather than sitting idle in the vault. This ensures all protocol revenue is always productive — either rewarding stakers or boosting jackpots for active players.
Once stakers enter the pool, all future SOL rewards flow normally to the staker reward pool.
Key Properties
- 200-round cooldown — Prevents reward-sniping whale attacks
- Low minimum stake — 0.1 AUR minimum (prevents dust-harvesting rounding exploits)
- Proportional — Your reward share = your_staked / total_staked
- Lazy distribution — No gas cost per staker per match; rewards accumulate until claimed
- Composable — Staking and claiming are separate instructions, can be automated by bots
- Two revenue streams — Match fees + LP swap fees both flow to stakers
- No idle funds — SOL redirects to T1 jackpot when no stakers exist