Skip to main content

Staking

Staking is how you put skin in the game. When you submit predictions to a SignalNet round, you lock SIGNAL tokens in the StakeVault contract. Your stake determines your potential reward — and your potential loss.

How It Works

Staking in SignalNet is not a passive yield strategy. It's a conviction mechanism tied directly to your signal quality.

The Flow

1. Approve    →  Allow StakeVault to transfer SIGNAL on your behalf
2. Submit → Send predictions + stake to Tournament contract
3. Lock → Tokens are held in StakeVault until round resolves
4. Score → Your predictions are evaluated against actual returns
5. Claim → Claim your stake back ± reward/penalty via merkle proof

Step 1: Approve Tokens

Before your first submission, approve the StakeVault contract to spend your SIGNAL tokens. This is a standard ERC-20 approve() call.

from signalnet import SignalNet

sn = SignalNet(api_key="your_key")
# SDK handles approval automatically

Or manually via your wallet:

  • Token: SignalNetToken at 0xdECC2df65B67e4b2e505a2816B334961AF16E773
  • Spender: StakeVault at 0x225A784ec3C0178316aD0a083D2327CE1b0d04Ab
  • Amount: How much you want to approve (can be more than one round's stake)

Step 2: Submit + Stake

When you submit predictions via Tournament.submitSignal(), you specify:

  • roundId — which round you're entering
  • signalHash — keccak256 hash of your predictions
  • stakeAmount — how much SIGNAL to lock (100–10,000, varies by tournament)
  • modelIndex — which model slot (0, 1, or 2)

The contract:

  1. Validates your stake is within limits
  2. Checks you haven't already submitted for this model slot
  3. Calls StakeVault.deposit() which transfers tokens from your wallet to the vault
  4. Records your submission on-chain

Step 3: Tokens Are Locked

While the round is active and resolving, your tokens are held in the StakeVault. You cannot withdraw them. The vault tracks per-round, per-user balances.

Step 4: Scoring

After the prediction horizon (typically 20 trading days), your signal is scored:

MetricWhat It Measures
ICSpearman correlation with actual stock returns
TCTrue Contribution — your marginal value to the aggregated signal
MMCMeta-Model Contribution — performance relative to the consensus

Your final score is a weighted combination:

Final Score = w_corr × IC + w_tc × TC + w_mmc × MMC

Default weights: IC 40%, TC 35%, MMC 25%. High TC+MMC weight (60%) rewards signal uniqueness over raw accuracy.

Step 5: Claim Payout

After resolution, the manager computes normalized payouts off-chain and posts a merkle root. You claim by providing a merkle proof.

Payouts are pool-normalized — if the total positive rewards exceed the reward pool + slashed tokens, all rewards are scaled down proportionally. This ensures the contract never runs out of tokens.

Raw Reward = Score × Stake × 0.25
Scale Factor = min(1.0, Budget / Total Positive Rewards)
Final Payout = Stake + (Raw Reward × Scale Factor)

If your score is positive: You get your stake back plus a scaled reward.

  • Example: 1,000 SIGNAL staked, score = +0.10, scale factor = 1.0 → Payout = 1,025 SIGNAL

If your score is negative: A portion of your stake is slashed (capped at 25%).

  • Example: 1,000 SIGNAL staked, score = -0.08 → Loss = 20 SIGNAL → Payout = 980 SIGNAL

Genesis Round exception: No slashing (max_loss_bps = 0). Your worst case is getting your full stake back.

See Payout System for the full normalization algorithm.

Stake Limits

ParameterValue
Minimum stake100 SIGNAL
Maximum stake10,000 SIGNAL (2,000 for Genesis)
Max models per user3
Max loss per round25% of stake (0% for Genesis)
Max reward per round25% of stake

Multi-Model Support

You can submit up to 3 different models per round (model index 0, 1, 2). Each has its own independent stake and score. This lets you:

  • Run different strategies simultaneously
  • Diversify your risk
  • Test new approaches alongside proven ones

Contracts

ContractAddressRole
SignalNetToken0xdECC...E773ERC-20 token
StakeVault0x225A...04AbHolds locked stakes
Tournament0x6CCB...2f98Round + submission logic

All contracts are deployed on Base Sepolia (chain ID 84532).

FAQ

Do I need to approve before every submission? No. If your approval amount covers your stake, you don't need to re-approve. You can approve a large amount once.

Can I increase my stake after submitting? No. Stake amount is fixed at submission time. Submit a different model slot if you want to stake more.

What happens if a round is cancelled? You can call reclaimStake() to get your full stake back.

Are my tokens safe in the vault? The StakeVault is a simple escrow — only the Tournament contract (operator) can move funds, and only according to the round lifecycle rules. The contract is non-upgradeable.