Appearance
Fixed Campaigns
A fixed campaign promises a guaranteed rate per unit of stake held. If you set a +1% APY boost, every participant earns exactly that rate on their stake, no matter how many others join. The trade-off: as more stake arrives, the owner funds the vault to cover the larger obligation.
Fixed campaigns are ideal for validators who want to attract stake by offering a predictable yield boost on top of base staking rewards.
How it works
The campaign stores a per-second rate and pays each participant:
reward = stake held x rate x seconds / rate scale
Where stake held is the participant's stake (in lamports), rate is the per-second rate, and rate scale is 10^18 (a fixed-point precision constant).
To deliver +1% APY, the rate works out to:
rate = 0.01 x 10^18 / 31,536,000 = 317,097,920
With stake held in lamports of SOL and the reward paid in lamports of wSOL, that rate pays each participant exactly 1% of their stake per year. In more practical terms:
- ~0.000822 wSOL reserved per SOL over a 30-day window
- ~0.55 wSOL per epoch (~2 days) per 10,000 SOL
Funding model
The vault balance is the ceiling on how much stake a campaign can cover. When the delegate reports a participant's stake, the campaign reserves that participant's entire remaining reward up front and rejects the report if the vault can't cover it.
Funding rule of thumb
Keep the vault holding about stake x 1% x (days left / 365) wSOL. For 10,000 SOL over a 30-day window, that's roughly 8.2 wSOL.
This means:
- Start small. Fund one month for the current stake (~8 wSOL for 10K SOL) instead of a full year (~100 wSOL). You only pay for the capacity you actually use.
- Top up on demand. When a stake report is rejected, it's a demand signal: more real stake showed up, so fund the vault and retry.
- The vault is the cap. The vault balance directly controls how much stake the campaign can cover at any given time.
Rolling horizon
A campaign's reward window isn't fixed at creation. The owner can push the end forward at any time, optionally re-pricing from that point onward. This makes a campaign effectively perpetual: fund a little, extend a little, repeat.
- Re-pricing. Passing a higher rate when extending raises the boost from that point forward. A lower rate gradually reduces the boost. New rates only apply forward, never retroactively.
- Lapsed windows. If the owner stops extending, the campaign runs its remaining funded course and stops. A lapsed window can't be revived (that would let idle positions accrue retroactively); continuing later means a fresh campaign.
Rewarding commitment
A fixed boost attracts stake, but some of it is mercenary: delegators who farm the boost for a few days and pull out, leaving no lasting stake. To discourage that, a campaign can turn on an optional early-exit penalty, a commitment lockup plus a maximum penalty, set once at creation.
With a 30-day lock and a 50% maximum, a participant who has earned 100 wSOL of boost and claims on day 15 forfeits 25 wSOL to the protocol treasury and keeps 75. Claim on day 1 and the cut is near the full 50; hold to day 30 and it's zero. Pulling stake out early is penalized the same way, scaled by how much left and how early. The penalty only reshapes who receives reward tokens, so it never touches stake or the vault's ability to pay.
See Commitment lockup & early-exit penalty for the full model.
Example: a validator's +1% APY boost
A validator wants to attract more stake by paying participants an extra 1% APY in wrapped SOL (wSOL). The JPool delegate automatically reports each participant's SOL backing the validator.
Roles
- The Owner (the validator): creates, funds, and extends the campaign horizon.
- The Delegate: reports each participant's SOL backing the Owner .
- Participants: earn the +1% boost and claim rewards whenever they like.
Flow
Step by step
Day 0: The Owner opens small, funds one month. The Owner creates a campaign: fixed mode, +1% rate, 30-day window. The Owner sends 8.3 wSOL to the vault. The Delegate reports 10,000 SOL of delegations, the campaign reserves ~8.2 wSOL, and the boost is live.
Days 2-4: Stake grows past the cap. The boost works and more participants come in. The Delegate reports 20,000 SOL, but the vault holds only 8.3, so the report is rejected. The Owner tops up +8.5 wSOL and the retry clears. The same cycle repeats at 30,000 SOL. Each rejection simply signals "more real stake showed up, fund it."
Days 5-25: Participants earn and claim. Rewards accrue continuously. A participant holding 1,000 SOL collects 1,000 x 1% x (days / 365) wSOL whenever they claim. Exits release future boost back to the vault; new entries reserve their own.
Day 28: The Owner extends the campaign. The Owner tops up the vault, and extends the campaign with a new end at Day 60. The campaign re-reserves every active participant's boost for days 30-60 (the same solvency check as every promise). Participants keep earning across the boundary without lifting a finger.
Day 60: Wind down. The Owner lets the window lapse. Participants claim their final wSOL. The Owner reclaims the unused surplus, then closes the campaign to recover rent.