> ## Documentation Index
> Fetch the complete documentation index at: https://docs.filter.fun/llms.txt
> Use this file to discover all available pages before exploring further.

# Rollover calculator — what filtered-token holders get

> Interactive calculator showing how much of the winning token a filtered-token holder can expect, in token amounts and dollars.

export const RolloverCalculator = () => {
  const [tokens, setTokens] = React.useState(12);
  const [avgLp, setAvgLp] = React.useState(3);
  const [yourPct, setYourPct] = React.useState(10);
  const [winnerMcap, setWinnerMcap] = React.useState(50000);
  const [ethPrice, setEthPrice] = React.useState(3500);
  const [isDark, setIsDark] = React.useState(false);

  React.useEffect(() => {
    if (typeof document === 'undefined') return;
    const check = () => setIsDark(document.documentElement.classList.contains('dark'));
    check();
    const obs = new MutationObserver(check);
    obs.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });
    return () => obs.disconnect();
  }, []);

  const filteredCount = Math.floor(tokens / 2);
  const totalFilteredLp = filteredCount * avgLp;
  const bounty = totalFilteredLp * 0.025;
  const netPot = totalFilteredLp - bounty;
  const rollover = netPot * 0.45;
  const holdBonus = netPot * 0.25;
  const mechanics = netPot * 0.10;
  const pol = netPot * 0.10;
  const treasury = netPot * 0.10;
  const yourTokenShare = totalFilteredLp > 0 ? avgLp / totalFilteredLp : 0;
  const yourRolloverEth = rollover * yourTokenShare * (yourPct / 100);
  const yourBonusEth = holdBonus * yourTokenShare * (yourPct / 100) * (1 / 3);
  const totalEth = yourRolloverEth + yourBonusEth;
  const totalUsd = totalEth * ethPrice;
  const winnerSupply = 1e9;
  const winnerPriceUsd = winnerMcap / winnerSupply;
  const yourRolloverUsd = yourRolloverEth * ethPrice;
  const winnerTokens = winnerPriceUsd > 0 ? yourRolloverUsd / winnerPriceUsd : 0;
  const winnerPct = (winnerTokens / winnerSupply) * 100;

  const fmtEth = (n) => n.toFixed(n < 1 ? 3 : 2) + " ETH";
  const fmtUsd = (n) => "$" + Math.round(n).toLocaleString();
  const fmtTokens = (n) => {
    if (n >= 1e6) return (n / 1e6).toFixed(1) + "M tokens";
    if (n >= 1e3) return Math.round(n / 1e3) + "k tokens";
    return Math.round(n) + " tokens";
  };
  const fmtMcap = (n) => n >= 1e6 ? "$" + (n / 1e6).toFixed(1) + "M" : "$" + Math.round(n / 1000) + "k";

  const presetSparse = () => { setTokens(6); setAvgLp(1.5); setYourPct(10); setWinnerMcap(25000); };
  const presetAvg = () => { setTokens(12); setAvgLp(3.0); setYourPct(10); setWinnerMcap(50000); };
  const presetViral = () => { setTokens(12); setAvgLp(8.0); setYourPct(10); setWinnerMcap(250000); };

  const cardBg = isDark ? 'rgba(255, 255, 255, 0.06)' : 'rgba(0, 0, 0, 0.04)';
  const borderC = isDark ? 'rgba(255, 255, 255, 0.18)' : 'rgba(0, 0, 0, 0.12)';
  const pinkBg = isDark ? 'rgba(255, 58, 161, 0.20)' : 'rgba(255, 58, 161, 0.10)';
  const greenBg = isDark ? 'rgba(124, 214, 68, 0.22)' : 'rgba(75, 167, 50, 0.13)';
  const pinkText = isDark ? '#ff7fc8' : '#993556';
  const greenText = isDark ? '#9be371' : '#3b6d11';
  const pinkHeading = '#ff3aa1';
  const greenHeading = isDark ? '#7cd644' : '#52a832';
  const muted = { opacity: 0.7 };
  const btn = { flex: 1, fontSize: '13px', padding: '8px 12px', background: 'transparent', border: `0.5px solid ${borderC}`, borderRadius: '8px', cursor: 'pointer', color: 'inherit' };
  const row = { display: 'grid', gridTemplateColumns: '220px 1fr 90px', alignItems: 'center', gap: '12px' };
  const lbl = { fontSize: '14px', ...muted };
  const out = { fontSize: '14px', fontWeight: 500, textAlign: 'right' };
  const card = { background: cardBg, padding: '14px', borderRadius: '8px' };
  const small = { background: cardBg, padding: '10px', borderRadius: '8px' };

  return (
    <div style={{ padding: '1rem 0', fontFamily: 'system-ui, -apple-system, sans-serif' }}>
      <div style={{ display: 'flex', gap: '8px', marginBottom: '1.5rem' }}>
        <button type="button" style={btn} onClick={presetSparse}>Sparse week</button>
        <button type="button" style={btn} onClick={presetAvg}>Average week</button>
        <button type="button" style={btn} onClick={presetViral}>Viral week</button>
      </div>

      <div style={{ display: 'grid', gridTemplateColumns: '1fr', gap: '1rem', marginBottom: '1.5rem' }}>
        <div style={row}>
          <label style={lbl}>Tokens activated this week</label>
          <input type="range" min="4" max="12" step="1" value={tokens} onChange={(e) => setTokens(+e.target.value)} style={{ width: '100%' }} />
          <span style={out}>{tokens}</span>
        </div>
        <div style={row}>
          <label style={lbl}>Average LP per token at hour 96</label>
          <input type="range" min="0.5" max="20" step="0.1" value={avgLp} onChange={(e) => setAvgLp(+e.target.value)} style={{ width: '100%' }} />
          <span style={out}>{avgLp.toFixed(1)} ETH</span>
        </div>
        <div style={row}>
          <label style={lbl}>Your % of one filtered token</label>
          <input type="range" min="0.1" max="50" step="0.1" value={yourPct} onChange={(e) => setYourPct(+e.target.value)} style={{ width: '100%' }} />
          <span style={out}>{yourPct.toFixed(1)}%</span>
        </div>
        <div style={row}>
          <label style={lbl}>Winner market cap at settlement</label>
          <input type="range" min="10000" max="1000000" step="5000" value={winnerMcap} onChange={(e) => setWinnerMcap(+e.target.value)} style={{ width: '100%' }} />
          <span style={out}>{fmtMcap(winnerMcap)}</span>
        </div>
        <div style={row}>
          <label style={lbl}>ETH price (USD)</label>
          <input type="range" min="1500" max="6000" step="100" value={ethPrice} onChange={(e) => setEthPrice(+e.target.value)} style={{ width: '100%' }} />
          <span style={out}>${ethPrice.toLocaleString()}</span>
        </div>
      </div>

      <div style={{ marginBottom: '1rem' }}>
        <div style={{ fontSize: '13px', marginBottom: '4px', ...muted }}>Losers pot</div>
        <div style={{ display: 'flex', alignItems: 'baseline', gap: '12px', padding: '12px 16px', background: cardBg, borderRadius: '8px' }}>
          <span style={{ fontSize: '18px', fontWeight: 500 }}>{fmtEth(totalFilteredLp)}</span>
          <span style={{ fontSize: '13px', ...muted }}>{fmtUsd(totalFilteredLp * ethPrice)}</span>
          <span style={{ fontSize: '12px', marginLeft: 'auto', opacity: 0.55 }}>After 2.5% bounty: {fmtUsd(netPot * ethPrice)}</span>
        </div>
      </div>

      <div style={{ marginBottom: '1.5rem' }}>
        <div style={{ fontSize: '13px', marginBottom: '4px', ...muted }}>Pot allocation (45/25/10/10/10)</div>
        <div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, 1fr)', gap: '8px' }}>
          <div style={small}><div style={{ fontSize: '11px', ...muted }}>Rollover 45%</div><div style={{ fontSize: '14px', fontWeight: 500, marginTop: '2px' }}>{fmtEth(rollover)}</div></div>
          <div style={small}><div style={{ fontSize: '11px', ...muted }}>Hold bonus 25%</div><div style={{ fontSize: '14px', fontWeight: 500, marginTop: '2px' }}>{fmtEth(holdBonus)}</div></div>
          <div style={small}><div style={{ fontSize: '11px', ...muted }}>Mechanics 10%</div><div style={{ fontSize: '14px', fontWeight: 500, marginTop: '2px' }}>{fmtEth(mechanics)}</div></div>
          <div style={small}><div style={{ fontSize: '11px', ...muted }}>POL 10%</div><div style={{ fontSize: '14px', fontWeight: 500, marginTop: '2px' }}>{fmtEth(pol)}</div></div>
          <div style={small}><div style={{ fontSize: '11px', ...muted }}>Treasury 10%</div><div style={{ fontSize: '14px', fontWeight: 500, marginTop: '2px' }}>{fmtEth(treasury)}</div></div>
        </div>
      </div>

      <div style={{ borderTop: `0.5px solid ${borderC}`, paddingTop: '1.25rem' }}>
        <div style={{ fontSize: '14px', fontWeight: 500, marginBottom: '12px' }}>Your slice as a filtered-token holder</div>

        <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '12px', marginBottom: '12px' }}>
          <div style={{ background: pinkBg, padding: '14px', borderRadius: '8px' }}>
            <div style={{ fontSize: '12px', color: pinkHeading, marginBottom: '4px' }}>Rollover share</div>
            <div style={{ fontSize: '22px', fontWeight: 500, color: pinkText }}>{fmtEth(yourRolloverEth)}</div>
            <div style={{ fontSize: '13px', color: pinkText, opacity: 0.85, marginTop: '2px' }}>{fmtUsd(yourRolloverEth * ethPrice)}</div>
          </div>
          <div style={{ background: greenBg, padding: '14px', borderRadius: '8px' }}>
            <div style={{ fontSize: '12px', color: greenHeading, marginBottom: '4px' }}>+ Hold bonus (if held 14 days)</div>
            <div style={{ fontSize: '22px', fontWeight: 500, color: greenText }}>{fmtEth(yourBonusEth)}</div>
            <div style={{ fontSize: '13px', color: greenText, opacity: 0.85, marginTop: '2px' }}>{fmtUsd(yourBonusEth * ethPrice)}</div>
          </div>
        </div>

        <div style={{ ...card, marginBottom: '12px' }}>
          <div style={{ fontSize: '12px', marginBottom: '4px', ...muted }}>Estimated total payout</div>
          <div style={{ display: 'flex', alignItems: 'baseline', gap: '12px' }}>
            <span style={{ fontSize: '26px', fontWeight: 500 }}>{fmtEth(totalEth)}</span>
            <span style={{ fontSize: '16px', ...muted }}>{fmtUsd(totalUsd)}</span>
          </div>
        </div>

        <div style={card}>
          <div style={{ fontSize: '12px', marginBottom: '6px', ...muted }}>
            Estimated winner tokens received <span style={{ fontSize: '11px', opacity: 0.55 }}>(zero-slippage approximation)</span>
          </div>
          <div style={{ display: 'flex', alignItems: 'baseline', gap: '12px' }}>
            <span style={{ fontSize: '18px', fontWeight: 500 }}>{fmtTokens(winnerTokens)}</span>
            <span style={{ fontSize: '13px', ...muted }}>({winnerPct.toFixed(2)}% of supply)</span>
          </div>
        </div>
      </div>
    </div>
  );
};

# Rollover calculator ▼

If your token gets filtered, your position auto-rolls into the winner — pro rata. This page shows how much of the winning token to expect, in both token amounts and dollar value, across realistic week scenarios. Try the calculator below, or scroll down for the closed-form formula and three sample scenarios.

## Calculator

<RolloverCalculator />

## How the math works

Your rollover share comes out of a single closed-form expression:

```
your_rollover_eth = (your_token_lp / total_filtered_lp)
                  × (losers_pot − bounty)
                  × 0.45
                  × your_pct_of_token
```

The settlement pipeline that produces it:

1. At hour 96, the bottom 6 tokens by HP are filtered. Their LP unwinds into WETH — that's the **losers pot**.
2. **2.5% of the losers pot** is taken as the champion bounty and sent to the winning token's creator.
3. The remaining 97.5% splits five ways:
   * **45% rollover** to filtered-token holders (this is your share)
   * **25% hold bonus** to anyone who holds the winner token for 14 days
   * **10% mechanics** fund (week-specific incentives)
   * **10% POL** deployed permanently into the winner's pool
   * **10% treasury**
4. Your rollover ETH market-buys the winner token; you receive winner tokens proportionally.

## Three reference scenarios

All assume you hold 10% of one filtered token; ETH at \$3,500.

| Week shape              | Tokens |  Avg LP | Losers pot | Your rollover | + Hold bonus est. |         Total |
| ----------------------- | -----: | ------: | ---------: | ------------: | ----------------: | ------------: |
| Sparse (4-token cohort) |      6 | 1.5 ETH |    4.5 ETH |         \$230 |              \$77 |   **\~\$307** |
| Average                 |     12 |   3 ETH |     18 ETH |         \$461 |             \$146 |   **\~\$607** |
| Viral                   |     12 |   8 ETH |     48 ETH |       \$1,228 |             \$390 | **\~\$1,618** |

## Three things the calculator hides

**You receive winner tokens, not ETH.** The rollover ETH market-buys the winner, then sends you tokens. So your effective payout depends on the winner's price stability over time. Winner mcap doubles → your dollar value doubles. Winner mcap halves → halves.

**Time-weighting penalizes mid-week selling.** Your effective rollover entitlement uses `min(balance_h72, balance_h96)` — so if you sold half your position between hours 72 and 96, your rollover scales with the lower (post-sell) balance. Designed to defeat bank-run dynamics. The calculator assumes you held continuously from hour 72.

**The biggest swing is week quality, not your holdings size.** Going from sparse to viral is a \~5× swing in payout; going from 1% to 50% holdings is "only" 50×. Both matter, but week quality matters more than most participants intuit.

## Caveats on the model

The calculator approximates real outcomes. What it does NOT model:

* **Slippage on the rollover buy.** A large rollover pool buying into a thin winner pool moves price; real winner-tokens-received will be lower than the zero-slippage estimate.
* **Uneven LP distribution.** Real cohorts won't have all 12 tokens at exactly the average LP; the bottom-half (filtered) tokens will typically have less LP than the top-half (survivors).
* **Hold bonus exact share.** Bonus is divided pro-rata among all qualifying winner-holders; the calculator assumes your bonus share is \~1/3 of the ratio you'd get if you only competed with other rollover recipients (rough but directionally honest).
* **Time-weight penalties on mid-week selling.** Calculator assumes continuous holding from h72 onwards.

## Related

* **Creator-side ROI calculator:** [filter.fun/launch](https://filter.fun/launch) (cost + earnings projection for token creators)
* **HP scoring methodology:** [HP methodology](/protocol/hp-methodology) (how cuts are determined in the first place)

## Calculator inputs (machine-readable)

| input                        |   min |     max | default | unit    |
| ---------------------------- | ----: | ------: | ------: | ------- |
| tokens\_activated            |     4 |      12 |      12 | count   |
| avg\_lp\_per\_token          |   0.5 |      20 |     3.0 | ETH     |
| your\_pct\_of\_token         |   0.1 |      50 |    10.0 | percent |
| winner\_mcap\_at\_settlement | 10000 | 1000000 |   50000 | USD     |
| eth\_price                   |  1500 |    6000 |    3500 | USD     |

## Settlement split constants

| field                 | value                           |
| --------------------- | ------------------------------- |
| champion\_bounty\_pct | 0.025                           |
| rollover\_pct         | 0.45                            |
| hold\_bonus\_pct      | 0.25                            |
| mechanics\_pct        | 0.10                            |
| pol\_pct              | 0.10                            |
| treasury\_pct         | 0.10                            |
| filter\_threshold     | 0.50                            |
| time\_weight\_window  | h72 to h96                      |
| time\_weight\_formula | min(balance\_h72, balance\_h96) |
