Concentrated Liquidity Campaigns

Reward users providing liquidity in Uniswap v3 and v4 pools, and on any other concentrated liquidity DEX

🌐 Overview

Merkl’s Concentrated Liquidity campaigns allow campaign creators to reward Liquidity Providers (LPs) on concentrated liquidity AMMs like Uniswap V4, Uniswap v3, Quickswap, and Sushiswap.

Unlike traditional incentives where users are rewarded based on deposit amount, Concentrated Liquidity campaigns reward LPs based on how they provide liquidity, within specific price ranges, and their contribution to the overall liquidity of the pool.

Rewards can be distributed in two ways: a variable reward rate, where a fixed budget is split between LPs according to weighted parameters, or a fixed APR, where every eligible position earns a predefined APR on its liquidity near the price. Both are detailed below.

Concentrated Liquidity

🔢 Reward formulas

Merkl supports two distribution modes for a concentrated liquidity pool. The mode defines how much each LP earns over time and is independent from the pool you incentivize.

  • Variable reward rate: a fixed budget is distributed each period and split between LPs according to weighted parameters (liquidity contribution, token 0, token 1). The APR floats with the pool's TVL.
  • Fixed APR: you target a predefined APR, and every eligible position earns that APR on its liquidity near the current price. The budget acts as a cap.

🔁 Variable reward rate

LPs who provide liquidity in optimal, high-impact ranges are rewarded more generously, ensuring capital efficiency.

When campaign creators launch concentrated liquidity campaigns, they define:

  • The pool to be incentivized (using the pool address or ID)
  • A set of incentive parameters, which define how rewards will be distributed among liquidity providers.
    • In-Range positions only: Only reward positions that are being used in swaps
    • Liquidity Contribution: Measures the time-weighted contribution of a position to the overall liquidity in the pool. Positions that remain tightly concentrated around the active tick contribute more liquidity (assuming equal TVL) than those spread across a wider range.
    • Token 0 holding: The share of token 0 held by a position relative to the total token 0 in the pool.
    • Token 1 holding: The share of token 1 held by a position relative to the total token 1 in the pool.

A position is "in range" when the current market price falls within the price range specified by the position's lower and upper ticks. When a position is in range, it actively provides liquidity for trades and earns fees. Out-of-range positions do not contribute to liquidity at the current price and therefore don't earn trading fees. We highly recommend only rewarding in range positions.

A position might generate high fees during a short burst of activity, but if it wasn’t consistently concentrated throughout the reward period, it won’t earn significant rewards. What matters here is sustained concentration over time, not short-term volume or swap activity.

Each factor is assigned a weight (% liquidity contribution, % token0, % token1), which the campaign creator defines when setting up the campaign in Merkl Studio.

Merkl analyzes liquidity within the pool during the incentive period and assigns rewards based on these 3 parameters.

With this setup, this is as if the overall incentive budget was split in 3, with a proportion being shared by LPs based on how much liquidity they have on the active tick, a proportion shared based on the overall amount of token 0 they've held and a last portion based on the relative token 1 balance they've had in their position during the time period.

Merkl released an improved version of its concentrated liquidity reward engine to bring major enhancements, delivering a more performant, stable, and JIT attack-resistant reward mechanism.

The system enables precise measurement of liquidity over time, resulting in more deterministic and reliable attribution of LP contributions while minimizing the influence of short-term volatility.

🧮 Example: Variable reward rate

If incentive weights are set as:

  • Liquidity contribution = 50%
  • Token 0 = 25%
  • Token 1 = 25%

Then:

  • A user representing 40% of the total liquidity in the pool (and hereby earning ~40% of the fees accruing to the pool) receives 20% of total rewards (40% × 50%).
  • A user holding 30% of Token 0 receives 7.5% of total rewards (30% × 25%).
  • A user holding 20% of Token 1 receives 5% of total rewards (20% × 25%).

🔒 Fixed APR

In Fixed APR mode, you don't split a budget with weights. You set a target APR, and Merkl pays that APR on the liquidity each position holds near the current price.

In Merkl Studio, a Fixed APR campaign only asks for a single Target APR, with no token weights to configure:

How it works:

  • A price band is defined around the current price using tick deltas (e.g. ±1000 ticks). When you set them in Merkl Studio, the interface shows the corresponding percentage range around the current price. A position is eligible as long as its range overlaps the band, even if its range doesn't currently cover the live price.
  • The band tracks the live price: it re-centers on the new price every time the price moves, i.e. on each swap. Rewards are integrated over time using the band that applied during each interval, so a position's eligibility and its in-band share evolve as the price moves. You earn while the price stays near your range, and stop earning if it moves away.
  • Each position earns the target APR on the USD value of the part of its TVL that sits inside the band, pro-rated by how much of the position falls in the band. Liquidity outside the band earns nothing.
  • Set the Target Token to USDC. The APR is a dollar-denominated yield, so Merkl needs a USD reference to measure each position's liquidity value, and that reference is USDC. This field must be filled for the campaign to be created.
  • The token 0 / token 1 / fee weights do not apply in this mode: you only set the target APR.
  • The budget is a cap: if it is depleted before the end date, the campaign ends early and unused rewards are returned to the creator.

There is no tightness bonus: per dollar of in-band liquidity, every LP earns the same APR. But two positions of the same total size are not paid equally if they don't hold the same amount of liquidity inside the band. Concentrating near the price simply puts more of your TVL in the rewarded zone.

Fixed mode can target either a fixed % APR (the standard setup) or a fixed number of reward tokens per dollar of liquidity per year (handy for point programs). See the campaign configuration reference for the underlying pricing settings.

🧮 Example: Fixed APR

On a USDC/WETH pool with a 5% target APR and a band of ±1000 ticks around the current price:

  • A position with its full $10,000 inside the band earns 5% on $10,000 ≈ $500/yr.
  • A position of the same $10,000, but with only half of its liquidity overlapping the band, earns 5% on $5,000 ≈ $250/yr. Despite having the same total size, it receives half the reward because only half of its liquidity sits within the band.
  • A position entirely outside the band earns nothing.

Fixed APR is a good fit when you want to guarantee a yield on the liquidity sitting near the price and build depth there, without raising the fee weight, which can push LP behavior toward wash-trading. It is available on all supported concentrated liquidity DEXs.

♟️ Reward strategy examples

The parameter tuning below applies to variable reward rate campaigns. In Fixed APR mode there are no weights to tune: you set a target APR directly.

Campaign creators can fine-tune parameters to match their objectives:

  • Encouraging deep liquidity: Increasing the weight of liquidity contribution / fee earned to encourage deep liquidity in high-volume trading ranges.
  • Stablecoin peg protection: To help maintain a stablecoin peg (e.g., USDC), increasing the weight of Token 0 rewards can encourage LPs to hold more of the pegged token in the pool, discouraging dumps and supporting stability.
  • Optimized tight range incentives: With Uniswap V4 Hooks, LPs can implement automated rebalancing strategies to maintain optimal tight-range positions and maximize reward efficiency.

Here are some suggestions depending on your needs and pool type:

  • For stable pools/pegged pools (e.g., USDC/USDT or WBTC/BTC): Liquidity contribution = 80%, token0 = 10%, token1 = 10%
  • For volatile pools (e.g., WETH/USDC): Liquidity contribution = 20%, token0 = 40%, token1 = 40% (the higher the volatility, the higher the weights for token0 and token1 percentages should be)
  • You can also refer to the Merkl blog about liquidity walls explaining how to prevent a token from dumping, or a stablecoin from losing its peg

Merkl is not responsible for defining your strategy and targets. Nevertheless, you can refer to live campaigns to look for typical APRs and/or parameter weights on similar campaigns.

⛔ Out of range liquidity

Campaign creators can choose whether to reward out-of-range liquidity. By default, only in-range positions receive rewards.

We strongly recommend incentivizing in-range liquidity, as this ensures active liquidity provision and avoids rewarding idle capital.

This applies to variable reward rate campaigns. In Fixed APR mode, eligibility is based on overlap with the price band, not on whether the position currently covers the live price: a position that is out of range can still earn as long as its range overlaps the band.

🔎 Fake volume attacks detection

Merkl automatically detects and blacklists users attempting to game the system via:

  • Wash trading: Creating tight positions and self-trading to earn rewards.
  • Frequent rebalancing: If mistaken for wash trading, may trigger blacklisting.

☑️ Tick price limits & eligibility

This feature lets the campaign creator set a fixed price window (a minimum and/or a maximum price) and reward only the positions that stay entirely inside it. The window is chosen once at campaign creation and never moves: it simply decides which positions are eligible. This is separate from the Fixed APR price band, which is a moving window that follows the live price to compute rewards.

To qualify for rewards under a campaign with a tick price limits eligibility rule, a liquidity position must meet both of the following conditions:

  • (if set by the campaign creator) Upper Tick Price must be below the specified threshold_0: Upper Tick Price < threshold_0
  • (Resp.) Lower Tick Price must be above the specified threshold: Lower Tick Price > threshold_1

Here, price refers to the ratio of token 1 to token 0. For example, if token 1 is ETH and token 0 is BTC, the price reflects the ETH/BTC exchange rate.

This rule ensures that only positions providing liquidity within a targeted price range are eligible for rewards. Positions exceeding these limits on either side are not eligible.

Example:

Suppose the thresholds are:

  • Upper Price Threshold = 1,050 token 1 per token 0
  • Lower Price Threshold = 950 token 1 per token 0

Then:

  • A position from 960 to 1,040 qualifies (upper < 1,050, lower > 950).
  • A position from 940 to 1,020 does not qualify (lower < 950).
  • A position from 990 to 1,080 does not qualify (upper > 1,050).

This setup encourages liquidity within a narrow, strategic price corridor, optimizing depth and efficiency around critical price levels.

The thresholds are set independently. It is possible to define a limit for the upper tick price without setting one for the lower tick price (and vice versa).

📈 APRs calculation

This describes variable rate campaigns, where the APR floats with TVL. In Fixed APR campaigns the APR is set in advance and applies to each position's in-band liquidity.

APRs shown on the Merkl interface for concentrated liquidity campaigns represent average values. They are calculated by dividing the annualized reward emissions for a pool by its current TVL.

However, actual APR varies per position. A position may earn more or less than the displayed average depending on factors like:

  • How tightly liquidity is concentrated
  • How others are providing liquidity
  • The weight of campaign’s parameters

Example:

  • If liquidity contribution = 99%, a full-range position may earn minimal rewards despite providing high liquidity.
  • If Token A = 60% and Token B = 10%, LPs holding more Token A will earn disproportionately higher rewards and you may be better off skewing your position so it has more of token A than of token B.

The TVL of concentrated liquidity pools is updated every 2 hours and excludes blacklisted liquidity (so if the pool TVL is $1M and a blacklisted user holds 30% of the pool's TVL, the displayed TVL will be $700k)