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 spacing | Default fee | Best for |
|---|---|---|
| 1 | 0.01% default fee | Highly correlated pairs (USDT/USDC, wrapped equivalents). |
| 50 | 0.05% default fee | Tight-correlated pairs (ETH/stETH, BTC/WBTC) and low-volatility blue chips. |
| 100 | 0.10% default fee | Moderately correlated pairs. |
| 200 | 0.30% default fee | Volatile blue chip pairs. |
| 2000 | 1.00% default fee | Long-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
- 1Open Positions , start a new position, pick the pair and tick-spacing tier, then choose Auto, Custom range or Full range.
- 2Set the price range. The app will show how much of each token you'll need.
- 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.
- 4Mint. You receive an ERC-721 position NFT from the
NonfungiblePositionManager. The NFT encodes the pool, range, liquidity, and fee accumulator. - 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).
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).maxto 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.
Working with ETH (BNB)
Slipstream pools hold WBNB, not native BNB. The position manager supports a multicall pattern to wrap-and-mint atomically:
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:
| Mode | Earns | Pays |
|---|---|---|
| Unstaked | Swap fees from in-range trades | Pool's unstaked-position fee (default 10%, max 50%) routed through the gauge to voters — see Pool Fees. |
| Staked | Local emissions based on gauge funding and eligible staked liquidity: TOPAZ on BNB, xTOPAZ on spokes | Forfeits 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
Pool Fees →
Default fees, custom fees, dynamic fees, and unstaked-position fees.
Staking in Gauges →
Deposit your position NFT to earn TOPAZ emissions on BNB or xTOPAZ emissions on spokes.
Concentrated Liquidity →
The concepts behind ticks, ranges, and capital efficiency.
Impermanent Loss →
Why range selection determines your IL profile.