SOL staking program with points-based rewards.
- Stake SOL → Earn 1 point per token per day
- Unstake SOL → Withdraw staked amount
- Claim → Withdraw rewards (vault - staked)
| Account | PDA Seed | Purpose |
|---|---|---|
| Config | stake + owner |
Stores staked amount, points, timestamps |
| Vault | vault + owner |
Holds staked SOL + rewards |
Creates Config and Vault PDAs for the user.
await program.methods.initialize().accounts({
owner: user.publicKey,
}).pubkeys({
config: findConfigAddress(user.publicKey),
vault: findVaultAddress(user.publicKey),
}).rpc();Transfer SOL to vault, update staked amount.
await program.methods.stake(new BN(amount)).accounts({
owner: user.publicKey,
config: findConfigAddress(user.publicKey),
vault: findVaultAddress(user.publicKey),
}).rpc();Withdraw staked SOL, reset points on withdrawn amount.
await program.methods.unstake(new BN(amount)).accounts({
owner: user.publicKey,
config: findConfigAddress(user.publicKey),
vault: findVaultAddress(user.publicKey),
}).rpc();Transfer accumulated points as rewards.
await program.methods.claim().accounts({
owner: user.publicKey,
config: findConfigAddress(user.publicKey),
vault: findVaultAddress(user.publicKey),
}).rpc();earned = staked_amount * (elapsed_seconds / 86400)
1 point per token per day.
flowchart TD
User[User] -->|initialize| Config[Config PDA]
User -->|initialize| Vault[Vault PDA]
User -->|stake| Vault
Vault -->|stores| SOL
User -->|claim| Rewards[Vault - Staked]
Vault -->|transfers| Rewards
subgraph "Points System"
Config -->|reads| staked_amount
Config -->|reads| last_updated_time
Config -->|updates| total_points
end
3FfvX3mWgiWhAgcBwYPmWsZysiANEkdx3K4xxVeVskaB