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:
SignalNetTokenat0xdECC2df65B67e4b2e505a2816B334961AF16E773 - Spender:
StakeVaultat0x225A784ec3C0178316aD0a083D2327CE1b0d04Ab - 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 enteringsignalHash— keccak256 hash of your predictionsstakeAmount— how much SIGNAL to lock (100–10,000, varies by tournament)modelIndex— which model slot (0, 1, or 2)
The contract:
- Validates your stake is within limits
- Checks you haven't already submitted for this model slot
- Calls
StakeVault.deposit()which transfers tokens from your wallet to the vault - 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:
| Metric | What It Measures |
|---|---|
| IC | Spearman correlation with actual stock returns |
| TC | True Contribution — your marginal value to the aggregated signal |
| MMC | Meta-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
| Parameter | Value |
|---|---|
| Minimum stake | 100 SIGNAL |
| Maximum stake | 10,000 SIGNAL (2,000 for Genesis) |
| Max models per user | 3 |
| Max loss per round | 25% of stake (0% for Genesis) |
| Max reward per round | 25% 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
| Contract | Address | Role |
|---|---|---|
| SignalNetToken | 0xdECC...E773 | ERC-20 token |
| StakeVault | 0x225A...04Ab | Holds locked stakes |
| Tournament | 0x6CCB...2f98 | Round + 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.