Companion piece to Constructive Gauges, a plain-English walkthrough of the formal paper written for readers who want the intuition without the proofs.

Before you start

  • Tick: an integer price step; one tick is a 0.01% price move.
  • Width: how many ticks a position spans. Narrow = tight around the current price.
  • Nominal liquidity (): the position’s raw liquidity number, roughly proportional to capital divided by width.
  • In-range / out-of-range: whether the current tick lies inside the position’s range.
  • Impermanent loss: the balance-sheet cost to an LP as the price moves through the range (the position’s token mix shifts against the LP). Staked LPs in ve(3,3) forfeit swap fees to voters, so emissions are the only offset.
  • Accumulator: the gauge’s running total of credited rewards per unit of staked liquidity; each LP’s claim is the delta since they last snapshotted it.

Roadmap

  • Problem: current gauges reward nominal presence at the active tick.
  • Fix: replace raw liquidity with a four-factor score .
  • Result: parasitic attackers lose most of their reward; normal LPs largely keep theirs.
  • Why all three corrections: dropping any one of , , or reopens exactly one attack.

The problem

Concentrated liquidity gauges hand out emission rewards (typically a protocol’s native token) to liquidity providers. They do it in the simplest way possible. Every LP earns a share proportional to their nominal staked liquidity.

That sounds fine, but it treats very different positions as equal:

  • A wide position doing little work earns the same per unit of as a tight position doing real work.
  • A one second old position earns the same as a week old one.
  • In naive scoring, a position whose range no longer covers the current tick would earn the same as one actually serving trades. (Most live CL gauges already handle this third gap via their per-position accumulator; the first two are the ones that have a discrepancy in practice).

Parasitic extraction exploits these gaps. A deposit-then-withdraw cycle with a tight position at the current tick can harvest emissions without ever bearing real impermanent loss or providing real depth. The main paper proposes fixes, and this companion walks through why they work.

The corrective scoring function

The paper replaces nominal staked liquidity with a product of four factors.

Each factor.

SymbolNameDescription
nominal liquidityunchanged from the baseline gauge
concentration weighttight positions (small ) score higher than wide ones; capped so infinitely tight positions don’t blow up
freshness weightfresh positions start at zero, ramp up to full over a warmup window, then stay there until the next rebalance
in-range indicatorone when the tick is inside the position’s range, zero otherwise

The mechanical change is a single substitution inside the existing gauge.

Each LP’s reward shareWhat it measures
Old rulenominal stake at the active tick
New ruleproxy for tradeable depth contributed

That is the whole mechanism; the rest of the paper shows the product behaves well.

Each factor plugs one of the three gaps from the previous section. Concentration plugs width arbitrage (wide positions earn less per ). Freshness plugs the short-cycle deposit-and-withdraw attack (fresh positions earn almost nothing). The indicator plugs passive out-of-range accrual (drifted-out positions earn zero).

The product is a proxy for real tradeable depth contributed right now.

Side-by-side: same capital, different width

Both LPs stake nominal liquidity at the current tick on a CL100 pool, both past the warmup, both in-range. With the reference concentration curve (, tickSpacing ticks)

LPWidth (ticks)Score
A (tight)200 (= 2 × tickSpacing, the min)100 (capped)100,000
B (wider)2,000 (= 20 × tickSpacing)5050,000

Under today’s rule, both earn the same per unit of . Under the new rule A earns 2× B per unit of , reflecting that tight liquidity at the active tick is more useful to swappers than wide liquidity spread across a range that mostly sits idle.

How we think about LP behaviour

To talk about who the mechanism helps or hurts, we need a model of how the tick moves and what LPs do.

The tick. The price in a CL pool is tracked as an integer tick, where each tick is a 0.01% price step. As swaps happen, the tick wanders up and down. The paper models this wandering as a random walk with volatility , so over a period of seconds the tick typically drifts by about in log-price terms.

Two kinds of LP.

  • Parasitic (short-cycle). Deposits a tight position right at the current tick, waits a few seconds, withdraws. Never there long enough to actually serve trade flow. Never takes impermanent loss.
  • Legitimate (active). Deposits a position, leaves it up for a realistic time (minutes to hours), rebalances when the tick drifts. Provides real depth.

Does the corrective scoring function hurt the parasitic LP without hurting the legitimate one?

The parasitic-extraction ratio bound

Main paper, Theorem 1.

A short-cycle attacker deposits at the current tick with minimum width and withdraws after seconds. The paper bounds the ratio of their reward under the new rule to their reward under the old:

with the term a mean-field error from concentrating the total-score denominator at its expectation across the pool’s LPs.

Two factors. The first is the freshness ratio, measuring how much of the warmup the attacker’s position has completed relative to , the freshness a typical legitimate LP runs at in steady state (a population average measured from the calibration dataset in the main paper).

The second is the concentration ratio. The attacker chooses minimum width, so this compares their concentration against , the population-average concentration of in-range legitimate LPs. The sign and magnitude of depend on the population’s typical width and are not pinned down here; the bound’s bite at short cycles comes from the freshness ratio, not the concentration ratio.

Why the freshness factor dominates. At short cycles (the warmup window), the time-averaged freshness simplifies to , a small number. Meanwhile a population of LPs rebalancing on the order of minutes has . So the ratio is tiny.

Calibrated reference numbers

Warmup seconds, dataset-wide median legitimate cadence minutes across the 48-pool calibration in the main paper. Then .

A parasitic attacker cycling every 2 seconds (one Base block) gets

Plug into the bound

At the 2-second cycle, the per-block parasitic ratio is bounded by roughly 5% of the standard-gauge baseline times the concentration ratio. The prior Parasitic Liquidity paper measured the combined minimum-width plus warmup remediation at about 0.66% of baseline empirically, which is the level the three-factor scoring inherits in this regime.

Freshness dominates the short-cycle bound. At , freshness goes to zero and the bound collapses. Concentration matters more against the slower “wide position” variants of the attack.

There’s a subtler structure inside the bound. Freshness goes up as the position ages, while the chance of being in range goes down (the tick has more time to wander away). Because these two factors pull in opposite directions over the cycle, their combined contribution is less than naive multiplication would suggest. The main paper’s proof makes this precise with a standard inequality for oppositely trending functions.

The legitimate LP yield equality

Main paper, Theorem 2.

If the new rule just penalised everyone equally, it wouldn’t be useful. Theorem 2 says the honest LP’s yield ratio is, up to mean-field error, exactly the product of a concentration ratio and a freshness ratio weighted by the LP’s pointwise in-range probability:

Same factors as Theorem 1, but here as an equality rather than an upper bound. is the freshness time-average weighted by the LP’s pointwise in-range probability over the rebalance interval. For an LP whose range tracks the tick well (in-range nearly all the time), and the equality reads against the same that appears in Theorem 1.

An honest LP who rebalances at roughly the population typical cadence and holds roughly the population typical width lands with both ratios close to 1.

Tip

Theorem 2 is a two-sided statement, not a one-sided bound. An LP with or reads it as a yield premium; one with the inequalities the other way reads it as drag. The mechanism nudges LPs towards “whatever most active LPs are doing”, which is precisely the behaviour that provides real depth.

Example

At the calibrated reference numbers ( s, s), an honest LP rebalancing at the dataset-wide median cadence has by definition. Their drag is then driven entirely by the concentration ratio and the difference between and . The main paper computes the bare freshness drag relative to the standard gauge as at the median.

An overly active LP rebalancing every 10 seconds has and earns roughly a quarter of what they would have. The mechanism punishes atypical aggression, not legitimate activity.

Why all three terms matter

Main paper, Theorem 3.

Could you keep only one or two of the corrections and still get the result? No. Dropping any one reopens exactly one parasitic attack.

Drop thisReopens this attackHow to witness
(freshness)short-cycle spamtight position,
(indicator)out-of-range accrualhold after tick drifts out
(concentration)†width arbitrageunbounded at narrow widths

† The row presumes the cap is dropped alongside . At fixed deployment with both and retained, revenue per unit of capital is already bounded regardless of ‘s presence, and this row collapses to a family-expressivity claim rather than an attack at fixed parameters.

Tip

Each of the three factors plugs a distinct hole, and none of the three is redundant. The mechanism is the minimal fix.

For the production CL gauges the main paper inspects (Aerodrome Slipstream, PancakeSwap V3, Ramses V2, Thena, Pharaoh, Shadow), out-of-range positions already stop accruing because the per-position accumulator is built to skip them. The indicator is still a necessary part of the general scoring family, but for these mainstream deployments the operationally novel additions are the concentration and freshness terms.

Parasitic attackers are bounded to a few percent of their current yield (Theorem 1). Normal LPs at typical profile keep effectively all of theirs (Theorem 2). All three corrective factors are independently necessary (Theorem 3).

Two edge cases

Two design questions the main paper handles as propositions.

Can an attacker just spam rebalances to reset the freshness clock?

Main paper, Proposition 1.

No. Rebalancing at any interval (below the warmup window) gives time-averaged freshness , which is strictly less than the legitimate population’s . A spammer always earns strictly less than an LP at typical cadence.

Tip

The ramp is the point. Rebalancing constantly keeps the position perpetually in the low-freshness zone; earning less, not more. You can’t game a ramp by resetting its start more often.

Can an LP rebalance right before claiming to inflate their payout?

Main paper, Proposition 2.

No. Under the standard Synthetix reward accumulator, the reward claimable at any moment depends only on what has already accumulated up to that moment. A rebalance right before claiming affects future accrual but cannot retroactively inflate what has already been accrued.

Tip

Rewards pile up continuously into a per-position running total. Claiming just reads that total. A rebalance at time only starts affecting the accumulator from onwards, so it can’t reach back and boost the past.

This is a property of the accumulator pattern, not a new invention, but it’s worth pinning down so implementers don’t accidentally break it (for example by evaluating freshness at claim time instead of integrating it continuously).

Empirical and engineering layers

Three layers sit on top of the theorems.

  • Tick model validated on-chain. The assumed log-price random walk is checked against 31,912 live swaps across two Aerodrome CL100 pools. Agreement is tight at short cycles. Long-cycle departures run conservative (reality is slightly more “in range” than the model predicts), so the bounds hold.
  • Reference Foundry suite. A minimal reference implementation of the scoring function runs against live Aerodrome Slipstream on Base mainnet. Each claim maps to a specific test (tight-vs-wide, freshness decay, out-of-range zero, multi-epoch accumulation).
  • Operational calibration. Parameters (, , minimum width) are fixed from a single-operator dataset of 94,469 rebalance events across 48 pools over a 38-day pre-migration window. The dataset sits in the active-management tail of the V3 LP literature, not at the population median; the main paper treats the resulting drag figures as upper bounds for that regime.

What’s not in this walkthrough

  • The ve(3,3) compatibility argument. The corrective scoring is a drop-in replacement for the existing gauge accumulator and doesn’t touch voting, bribes, or veNFT mechanics.
  • The Aerodrome post-upgrade step-gate comparison. The deployed 10-second all-or-nothing gate with full forfeit below threshold is less general than a continuous ramp; see the main paper for the direct comparison.
  • Engineering detail of the reference implementation. The main paper and its Foundry README cover this.

For formal proofs, empirical tables, and the ve(3,3) framing, see the main paper.