Liquidity

Concentrated Positions

Slipstream is Topaz's concentrated-liquidity engine — a fork of Aerodrome Slipstream, which adapts the Uniswap V3 design for the ve(3,3) flywheel. This page is the operating manual for LPing in Slipstream pools.

Pools on each network

These pool mechanics apply on BNB Chain, Robinhood Chain, Base, Ethereum and Arc. Pools, gauges, assets and fee settings belong to the selected network. BNB examples below describe the hub; read the selected pool for its current local configuration. Network availability.

Gauge-staked LPs earn TOPAZ on BNB and xTOPAZ on live spokes. Unstaked liquidity earns trading fees; each unit earns fees or emissions. V2 LP tokens can be partially staked, so a position can have separate staked and unstaked balances and prior rewards to claim. Concentrated NFTs stake as whole positions. Multichain emissions.

Pool identity: pair + tick spacing

Within one chain and factory, a Slipstream pool is identified by (token0, token1, tickSpacing). The same pair can have multiple Slipstream pools — one per supported tick spacing. Each pool has its own price, its own liquidity, and its own fee. The router considers all of them when choosing a swap route, but as an LP you pick exactly one when minting.

Tick spacingDefault feeBest for
10.01% default feeHighly correlated pairs (USDT/USDC, wrapped equivalents).
500.05% default feeTight-correlated pairs (ETH/stETH, BTC/WBTC) and low-volatility blue chips.
1000.10% default feeModerately correlated pairs.
2000.30% default feeVolatile blue chip pairs.
20001.00% default feeLong-tail and emerging pairs.

The fees above are defaults at pool creation. The protocol fee manager can override any individual pool's base fee within a 0%–3% range, and a few pools may also run a volatility-based dynamic fee on top — both through the DynamicSwapFeeModule that the CLFactory currently routes fee resolution to. See Pool Fees.

Choosing a price range

The most important decision when minting. Range selection determines both your capital efficiency and your impermanent loss profile.

  • ✓Tighter means more fees per dollar in range, more time spent out of range, and more sensitivity to IL when in range.
  • ✓Wider means less fees per dollar but more passive — closer to v2-style exposure.
  • ✓Both ticks must align to the pool's tick spacing. The app rounds your chosen prices to valid ticks automatically.
  • ✓Tick range: −887,272 ≤ tick ≤ 887,272 (the pool's theoretical price domain). Picking the extreme ticks gives a full-range position.

For a deeper treatment of range strategy and the math behind capital efficiency, read Concentrated Liquidity and Impermanent Loss.

Minting a position

  1. 1Open Positions , start a new position, pick the pair and tick-spacing tier, then choose Auto, Custom range or Full range.
  2. 2Set the price range. The app will show how much of each token you'll need.
  3. 3Approve each token to the position manager. Regular wallets grant a maximum allowance once, so later deposits need no new approval; batched smart-wallet plans use an exact grant.
  4. 4Mint. You receive an ERC-721 position NFT from the NonfungiblePositionManager. The NFT encodes the pool, range, liquidity, and fee accumulator.
  5. 5Optional: stake the NFT in the pool's gauge to earn TOPAZ emissions on BNB or xTOPAZ emissions on spokes (you forfeit swap fees in exchange — staked positions earn emissions only).
ℹOne token at limit ticks
Using the canonical token1/token0 price, a position below its range holds token0; above its range it holds token1. Inside the range it holds both. Token0 is determined by address order, not which token has a lower market price. Inverting the display swaps the labels, not the underlying position math.

Managing an existing position

Position NFTs support four operations on the NonfungiblePositionManager contract:

  • ✓increaseLiquidity — add more capital to the same NFT and range. Keeps fees accruing without minting a new position.
  • ✓decreaseLiquidity — pull some or all liquidity from the position. The underlying tokens are transferred to the NFT's tokensOwed fields; you collect them in the next step.
  • ✓collect — transfer accumulated fees and any decreased liquidity to a recipient (usually yourself). Pass type(uint128).max to drain both tokens.
  • ✓burn — burn the NFT once liquidity is zero and fees are collected. Closes the position permanently.

Rebalancing

Self-managed concentrated positions don't auto-adjust; on pools with a Topaz Auto vault you can choose Auto instead and let the vault manage the range. If price moves out of your range, you have three options:

  • ✓Wait for it to come back. The position stays valid; fees just don't accrue while out of range.
  • ✓Withdraw and remint at a new range that brackets the current price. This is the standard 'rebalance' — and it crystallizes any IL since the last mint.
  • ✓Mint additional positions at new ranges, keeping the old position open. Useful if you want exposure across multiple price bands.
⚠Rebalancing isn't free
Each rebalance costs gas (mint + decrease + collect + burn or increase) and locks in IL. Frequent rebalancing on a volatile pair can eat fee earnings. If you can't actively manage, wider ranges or full-range positions are often better.

Working with ETH (BNB)

Slipstream pools hold WBNB, not native BNB. The position manager supports a multicall pattern to wrap-and-mint atomically:

solidity
bytes[] memory data = new bytes[](2);
data[0] = abi.encodeWithSelector(
    INonfungiblePositionManager.mint.selector,
    mintParams
);
data[1] = abi.encodeWithSelector(
    INonfungiblePositionManager.refundETH.selector
);
positionManager.multicall{value: bnbAmount}(data);

The app handles this for you when you choose the native side with the BNB/WBNB toggle under the amount. The same pattern works for increaseLiquidity and for unwrapWETH9 on collect to receive native BNB instead of WBNB.

Staked vs unstaked positions

Slipstream lets you keep your position NFT in your wallet (unstaked) or deposit it into the pool's gauge (staked). The trade-off is structural:

ModeEarnsPays
UnstakedSwap fees from in-range tradesPool's unstaked-position fee (default 10%, max 50%) routed through the gauge to voters — see Pool Fees.
StakedLocal emissions based on gauge funding and eligible staked liquidity: TOPAZ on BNB, xTOPAZ on spokesForfeits the swap fees on this position; those flow to voters via the FeesVotingReward contract.

Which is better depends on the gauge's emission rate vs. the fee yield. Active pools with low vote share may favor unstaked; pools with strong vote allocation often favor staked. See Staking in Gauges for the mechanics.

Common pitfalls

  • ✓Ticks not divisible by tickSpacing → mint reverts. The app prevents this, but custom integrations need to round explicitly.
  • ✓Token order matters: token0 must be the lower-address token. The app sorts for you; calling the contract directly does not.
  • ✓Setting slippage too tight on the mint can cause MintTooLittle errors during volatile periods. Default 0.5–1.0% is usually fine.
  • ✓Forgetting to collect fees before withdrawing — fees aren't auto-claimed on decreaseLiquidity, they sit in tokensOwed until you collect.
  • ✓Staking a position into a gauge while it still has uncollected fees is fine, but you should collect first if you want to keep those fees — staked positions don't accumulate swap fees, only emissions.

Start from one token

The Concentrated liquidity zap can split a funding token and mint a new NFT in an existing pool on BNB Chain, Robinhood Chain, Base, Ethereum or Arc. Review its range, route, minimum liquidity and leftovers. It does not increase an existing NFT or stake it automatically.

On each network, use its own position manager and wrapped-native token; Arc has no wrapped native, so its pools use the six-decimal USDC ERC-20 and no native value. The BNB multicall example above must not be reused with BNB addresses on another network.

Continue reading