Fixed α makes BTC staking yield a bet on STRK price: proposal for a floating α

TL;DR
BTC staking rewards are a fixed 25% of emission (α), paid in STRK. So BTC APR moves linearly with the STRK/BTC price, while STRK APR doesn’t move with price at all. Over the last 11 months BTC APR ranged from 1.7% to 10.4% while STRK APR stayed at 7.7–10%. At STRK = $1, BTC stakers would earn ~90% APR; at $2, ~180%. The inflows SNIP-31 counted on to correct this didn’t happen.

Proposal: replace the fixed α with a floating α that keeps BTC APR at ~0.4× STRK APR (the past year’s average ratio). STRK stakers’ rewards stay unchanged: the excess is simply not minted. Backtested over the last 11 months, BTC stakers would have received slightly more than they actually did.


Current state (on-chain, 2026-10-10)

STRK staking BTC staking
Share of emissions 75% 25% (α)
Rewards per year ~119.6M STRK ~39.9M STRK (~$2.8M)
Total staked 1.561B STRK (~$111M) 534.6 BTC (~$44M)
Gross APR (0% commission) 7.66% 6.41%

Prices: STRK ≈ $0.071, BTC ≈ $82.7k.

Today’s numbers are a spike, not the norm

Period (Nov 2025 – Oct 2026) STRK APR BTC APR BTC/STRK ratio
Average 8.4% 3.4% ~0.4
Range 7.7–10.1% 1.7–10.4% 0.19–1.35
Mid-Sep 2026 (STRK ≈ $0.029) 7.7% 2.6% 0.33
Now 7.7% 6.4–6.8% 0.85–0.88

STRK rose ~2.5× in a month, so BTC APR rose ~2.5× too. That is the whole story behind today’s near-parity.

The structural problem

BTC APR = α · mint · P_STRK / (BTC staked · P_BTC)

Holding today’s BTC stake constant:

STRK price BTC APR Paid to BTC pool / yr BTC needed to bring APR back to 3.4%
$0.071 (now) 6.4% $2.8M ~1,000
$0.25 22.6% $10.0M 3,548
$0.50 45% $20.0M 7,095
$1.00 90% $39.9M 14,190
$2.00 180% $79.8M 28,380

STRK stakers stay at ~7.7% in every row. The more successful STRK becomes, the more the protocol overpays the same BTC capital: up to 1–2× the entire BTC TVL every year, in newly minted STRK.

Why the self-correction doesn’t work

SNIP-31 assumed that “less BTC → higher APR → inflows”. On-chain, that didn’t happen:

  • Late March 2026: BTC APR jumped to 6.8%. BTC stake went 673 → 628.
  • Oct 2026: BTC APR went from 2.6% to 6.7%. BTC stake went 589 → 554.
  • Since April, BTC stake has stayed at 550–700 BTC whatever the APR.
  • The Dec 2025 peak (1,732 BTC) came from the BTCFi Season incentive campaign, not from staking APR, and it left when the campaign ended.

A rising APR mostly pays more to capital that is already staked, rather than attracting new capital.

Why the ratio matters (risk and dilution)

  1. Risk. A STRK staker has 100% of principal exposed to STRK. A BTC staker has none; only the yield is in STRK.
  2. Dilution. BTC rewards are emission on top of STRK staker rewards (c was raised to 4% when BTC staking launched). The dilution falls on all STRK holders, stakers and non-stakers alike.
  3. Real yield. Emission is ~2.1% of circulating supply per year, so a STRK staker’s real yield is ~5.5%. A BTC staker’s 6.4% has no dilution of principal, so at today’s prices BTC stakers earn a higher real yield than the people paying for it.

Proposal: floating α

α = k · V_BTC / (V_STRK + k · V_BTC),   k = 0.4
V = amount staked × 7-day TWAP price
α ≤ 33%  (the SNIP-31 bound)
STRK staker rewards unchanged; BTC rewards = α/(1−α) × STRK rewards

This targets BTC APR ≈ 0.4 × STRK APR (≈3.1% today), the average ratio of the past year. It doesn’t change the level of rewards on average; it only removes the swings, in both directions.

Backtest, Nov 2025 – Oct 2026 (same on-chain data):

Fixed α = 25% Floating α
Avg BTC APR 3.38% 3.31%
Peak BTC APR 10.4% 5.3%
Total paid to BTC stakers 33.5M STRK 36.1M STRK
α today 25% ~13–14%
BTC APR today 6.4% ~3.1%
Emission today 159.5M/yr ~139M/yr (−13%)

When STRK falls, α rises (up to 33%) and protects BTC yield. When STRK rallies, the excess isn’t minted. At STRK = $1 that avoids ~38M STRK/yr of emission; BTC stakers keep ~3%.

This is not a cut to BTC rewards. Over the past year it would have paid BTC stakers more. It is protection against exactly the price scenarios the whole ecosystem is hoping for.

Implementation notes

  • α is currently a hard-coded constant (ALPHA = 25; get_alpha() only reads it, there is no setter). Any change needs a contract upgrade and a vote, so it is worth doing it once, properly.
  • Decouple the two roles of α. α also sets BTC’s weight in consensus ((1−α)·s/S + α·b/B). Consensus weight must not move with price, so keep it at 25% and let only the reward share float.
  • Oracle. 7-day TWAP (Pragma or Ekubo), a cap on how fast α can change (exact rate to be discussed), and a fallback to 25% if the oracle fails.
  • Simpler alternative. Add a governance setter, and have the Monetary Council update α monthly using the published formula.
  • Precedents. Babylon cut BTC-only rewards from 4% to 1% (Nov 2025) and moved the rest into BABY co-staking. Core DAO ties BTC yield to the amount of CORE staked. Starknet’s own SNIP-35 already adjusts a protocol parameter (base fee) to the STRK price.

Acknowledging the other side

BTC staking brings TVL, liquidity and BTC users to Starknet, and BTC stakers take bridge and custodian risk (about two thirds is SolvBTC). That’s why this proposal keeps BTC yield around its historical average rather than cutting it. It only stops the yield from scaling with the STRK price.

How to reproduce

  • RewardSupplier.calculate_current_epoch_rewards() → (strk_rewards, btc_rewards) per epoch; 3600 s epochs → 8,760 per year
  • RewardSupplier.get_alpha() → 25
  • Staking.get_total_stake_for_token(token) for STRK and each BTC wrapper, queried at historical blocks for the time series
  • Staking: 0x00ca1702e64c81d9a07b86bd2c540188d92a2c73cf5cc0e508d949015e7e84a7
  • RewardSupplier: 0x009035556d1ee136e7722ae4e78f92828553a45eed3bc9b2aba90788ec2ca112
  • Prices: CoinGecko daily

Happy to share the scripts and data for the history and the backtest.

Thanks for the detailed write-up, and for publishing the contract calls so the numbers can be checked. I agree with the core observation: with a fixed α, BTC yield is mostly a bet on the STRK/BTC price, and your data suggests a higher APR doesn’t bring in new BTC. A floating α looks like a reasonable direction. But the backtest shows less than the summary suggests, and a few details need pinning down:

  1. “BTC stakers would have received slightly more” holds in STRK (36.1M vs 33.5M), but average BTC APR is lower (3.31% vs 3.38%). The floating α pays more STRK than the fixed one only while α is above 25%, which happens when STRK is cheap or when a lot of BTC is staked, so a higher STRK total doesn’t mean more value. Could you add the totals in USD or BTC?

  2. Below the 33% cap, your formula gives exactly BTC APR = k × STRK APR. With k set to the past year’s average ratio, the backtest reproduces the past year’s average BTC APR by construction, so it confirms the formula rather than testing the idea. The more useful question is how k would be chosen and revised over time.

  3. The cap on how fast α can change is left open, but it largely determines how the mechanism behaves. Was a cap used in the backtest? Also, the backtest uses daily CoinGecko prices while the mechanism would use a 7-day on-chain TWAP. Were the results recomputed with a TWAP?

  4. The fallback to 25% brings back the exact price exposure the proposal removes, and oracle failures tend to coincide with volatile periods. Would freezing α at its last value be safer?

  5. Your “self-correction” section shows that a higher APR mostly pays more to capital already staked. The same applies when STRK falls and α rises toward 33%: the extra emission goes to the same stake. What is the downside protection meant to achieve, if not retention?

  6. Validators. Since commission is a fixed share of pool rewards, every validator’s BTC-pool commission would move by exactly the same factor as BTC rewards overall, and would stop scaling with the STRK price in the same way staker yield does. So the effect on a given validator is simply proportional to the size of its BTC pools, and validators without BTC pools aren’t affected at all, apart from lower dilution. It would help to state this explicitly and show the current distribution of BTC stake across validators, so it’s clear who actually carries the change.

Thanks, this is exactly the kind of review the post needed. Answers point by point, all numbers recomputed from on-chain data as of Oct 16.

Two clarifications first

1. The original post sketched a direction, not a finished mechanism. The formula, the bounds and the “7-day TWAP / rate cap” were ideas to show the direction was feasible, not a spec. Your questions are the right ones, so below is a concrete algorithm, modelled on SNIP-35 (automatic base-fee adjustment to the STRK price), which already answers several of them.

2. The backtest period was mostly a falling STRK market (≈$0.14 in Nov 2025 → ≈$0.03 in Aug–Sep 2026). That is why a floating α paid BTC stakers more over that period. The case for the change is the opposite scenario: STRK rises and new BTC doesn’t arrive. That isn’t hypothetical:

  • On Oct 11 and Oct 12 (STRK ≈ $0.103 and $0.123), BTC staking paid 8.75% and 10.37%, while STRK staking paid 7.69%. For two days, the protocol paid more for staking wrapped BTC than for staking its own token.
  • With today’s numbers (591 BTC staked, BTC ≈ $81.9k, STRK APR 7.71%), BTC APR exceeds STRK APR as soon as STRK crosses $0.094, about +24% from today.
  • In fairness, Oct 16 brought the first notable inflow after the spike: +37 BTC (SolvBTC 355 → 390), total 554 → 591. That already moved the crossover price from ~$0.085 to ~$0.094. But inflows of that scale don’t change the picture.

What happens if STRK rises

Forward scenarios, STRK rising smoothly over 12 months, STRK stake constant:

STRK in 12 months BTC stake Fixed α: BTC APR at the end Fixed α: paid to BTC pool over the year Floating α: BTC APR BTC APR > STRK APR from
$0.15 unchanged 12.3% $4.3M 3.1% day 115
$0.30 unchanged 24.6% $6.5M 3.1% day 57
$0.30 doubles 12.3% $6.5M 3.1% day 115
$1.00 unchanged 81.9% $14.2M 3.1% day 31
$1.00 doubles 41.0% $14.2M 3.1% day 42

Even if BTC stake doubles, a STRK rally to $0.30 leaves BTC stakers earning ~1.6× what STRK stakers earn. Note that the USD amount paid with a fixed α doesn’t depend on how much BTC shows up at all; only the APR per BTC does. That is the core problem: with a fixed α, the protocol’s USD spend on BTC scales with the STRK price, not with anything BTC contributes.


Concrete mechanism (SNIP-35-style)

Every epoch (1 h):
  r          = P_STRK / P_BTC            # from the oracle (SNIP-35 already brings STRK/USD into the protocol)
  V_BTC      = B / r                     # BTC stake valued in STRK
  α_target   = k·V_BTC / (S + k·V_BTC)   # → BTC APR = k × STRK APR
  α_target   = min(α_target, α_max)
  α_new      = clamp(α_target, α_old / (1+δ), α_old × (1+δ))   # δ = 0.5% per epoch
  if oracle unavailable: α_new = α_old   # freeze, as in SNIP-35
  STRK rewards per epoch: unchanged
  BTC rewards per epoch  = α_new/(1−α_new) × STRK rewards
  Consensus weight of BTC: stays at 25% (decoupled from the reward α)

As in SNIP-35, the per-epoch step cap does the smoothing, so no TWAP is needed. In the backtest a TWAP actually did worse, because it lags the price: the peak BTC APR was 7.9% with a 7-day TWAP versus 4.7% with spot price plus a step cap.


Answers to your points

1. Totals in USD/BTC. The claim holds in value too, though the margin is smaller than in STRK:

Nov 2025 – Oct 2026 Fixed α = 25% Floating α (k=0.4, cap 33%, δ=0.5%/epoch, spot)
Paid to BTC stakers, STRK 33.6M 36.4M (+8%)
…in USD (at each day’s price) $1.95M $2.02M (+3%)
…in BTC 24.9 25.5 (+2%)
Avg BTC APR 3.38% 3.30%
Peak BTC APR 10.37% 4.70%
Days with BTC APR > STRK APR 2 0

2. “By construction.” Agreed: below the cap, BTC APR = k × STRK APR by definition, so the backtest only shows the mechanism stays budget-neutral when k is set to the past average. The real test is out of sample, i.e. the forward scenarios above. On choosing k: I’d make it a governance parameter, reviewed periodically by the Monetary Council, set from an explicit principle (“BTC yield as a fraction of STRK yield, reflecting that BTC stakers carry no STRK principal risk and no dilution”). For reference: k = 0.5 would have paid BTC stakers +20% in USD over the same period, k = 0.6 would have paid +28%.

3. Rate cap and TWAP. No rate cap in the original backtest, and the “TWAP” was a 7-day average of daily CoinGecko prices, not an on-chain TWAP. Recomputed with the step cap: δ = 0.2%, 0.5% and 1% per epoch give near-identical totals (+3–4% USD) and peaks of 6.2%, 4.7% and 4.4% respectively. Daily prices can’t capture intra-day moves, which is a limitation of the data, not of the mechanism.

4. Fallback. You’re right. Freezing α at the last value is safer than reverting to 25%, and it’s what SNIP-35 does. Adopted.

5. Downside protection. Fair point. The data doesn’t show that a higher APR retains BTC, so α rising toward the cap mostly pays the same stake more. Its only purpose is symmetry: the rule isn’t a one-way cut. The cut-only alternative (α_max = 25%) over the same period: BTC stakers would have received −13% in USD, average BTC APR 2.86% instead of 3.38%, and the peak still capped at 4.5%. I’m open to either. Cut-only is simpler and saves more emission; the symmetric version is easier to defend to BTC stakers.

6. Validators. Correct, the effect is proportional to the size of each validator’s BTC pools. Current distribution (Oct 16, on-chain staker_pool_info):

  • 29 of 133 validators have BTC pools. The other 104 are affected only through lower dilution.
  • The top 3 hold ~90% of all staked BTC:
    • 0x0725…220e: 285 BTC (48%), commission 5%
    • 0x024e…95c2: 152 BTC (26%), commission 0%
    • 0x00d3…0ee7: 94 BTC (16%), commission 10%
  • Next: 0x01ac…2c00 32 BTC (5%); everyone else under 8 BTC.

So in practice the change affects mainly three operators, one of them charging no commission. Their BTC-pool commission income would stop scaling with the STRK price, exactly as their delegators’ yield would.

Scripts and data available on request.