Skip to content

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 pays each participant a steady reward proportional to their stake and the time they hold it:

reward = stake held x rate x time held

Where stake held is the participant's stake and rate is the guaranteed yield, expressed as an APY. Set the rate to +1% APY and each participant earns exactly 1% of their stake per year, paid continuously in the reward token (wSOL in the examples below), whatever the total stake in the campaign.

In practical terms, a +1% rate works out to:

  • ~0.000822 wSOL reserved per SOL over a 30-day period
  • ~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 period, 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.

Extending the campaign

A campaign's reward period 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 reward from that point forward. A lower rate gradually reduces the reward. New rates only apply forward, never retroactively. There's no limit on how many times a campaign can re-price over its life, so a long-running campaign can adjust its rate as often as it needs.
  • Lapsed periods. If the owner stops extending, the campaign runs its remaining funded course and stops. A lapsed period can't be revived (that would let idle positions accrue retroactively); continuing later means a fresh campaign.

Rewarding commitment

A fixed reward attracts stake, but some of it is mercenary: participants who farm the reward 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 reward 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.

Keep the end ahead of the lock

A lock can never reach past the campaign's end, so the commitment only bites for as long as the end stays ahead of it. If you run a perpetual campaign by keeping the end just an epoch or two out, the effective lock shrinks to that short window and the penalty loses its teeth. To get the full 30-day commitment, keep the campaign's end at least 30 days ahead when you extend.

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.
  • 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 period. 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 reward is live.

Days 2-4: Stake grows past the cap. The reward 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 reward 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 reward 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 period lapse. Participants claim their final wSOL. The Owner reclaims the unused balance, then closes the campaign to recover rent.