Concentrated liquidity on Shield
Shield uses Uniswap v3’s concentrated-liquidity math. Your range determines the asset mix and liquidity your deposit supports, and your active liquidity earns a share of the trading fees charged. Shield’s supported price limits differ from Uniswap v3’s. Your bounds must fit those limits and the pool’s permitted price increments, so check the resulting range before you submit. Full Range selects the widest supported range for that pool. Check the pool’s current fee when choosing where to provide liquidity. That fee can change, and your earnings depend on the fees actually charged and the share allocated to liquidity providers. See LP fee entitlements.High level liquidity flow
The following diagram illustrates how a market maker starting with no liquidity position can create and manage a liquidity positionIn the app
Before you startYou’ll need: Shield Wallet connected to Shield Swap, and a pool open under Pools.Check the pool before choosing
The chart tabs Price, Volume, Liquidity, and Depth show recent price movement and where other positions sit. The Oracle panel below shows the TWAP (the time-weighted average price), the LP Fees earned in the pool over the selected window, and Last Trade. The pool’s fee percentage appears under its name in the Pools list and in Switch pair on the Trade page.Choose a range
- In the panel on the right, keep New Position selected and enter an amount for one asset.
- Keep Full Range for the pool’s widest supported range, or select Custom.
- With Custom selected, choose a preset or set the range by hand:
- Stable sets a narrow band, about 2 percent either side of the current price.
- Wide sets a broad band, from 50 percent below the current price to 100 percent above it.
- Lower sets a band from 50 percent below the current price up to the current price.
- Upper sets a band from the current price up to 100 percent above it.
- Drag the handles on the chart, or enter prices in Min and Max.
- Check Min and Max. Each shows the price and its distance from the current price as a percentage.
Troubleshooting
Next steps
- Minting a position to open a position with the range you chose.
- Rebalancing positions to move an existing position to a new range.
Set a liquidity range
Prerequisites: Your authenticated mainnetclient for Typescript, dex for Python, or CLI profile from Setup.Start by finding pools for USDCx and ETH, then select one by its full pool key. A pair can have multiple pools. Keep the selected key when you preview the range and mint. Run the three steps in your language in order; discovery and selection do not require a funded account.In step 2, replace the quoted POOL_KEY with a key printed in step 1, including its field suffix. Check the token IDs before choosing. In the Typescript range preview, supply AMOUNT0_BASE_UNITS and AMOUNT1_BASE_UNITS as bigint budgets in each token’s native base units. Step 2 shows the token order and decimals for those amounts.Use the pool’s stored tick spacing when choosing bounds; the current trading fee can change without changing that spacing. Both ticks must be multiples of the spacing. The Typescript preview and CLI plan report the aligned bounds, and the Python example uses the slot’s range helper. See Price, ticks, and square-root price and Liquidity formulas for Shield’s numeric conventions and limits.- Typescript
- Python
- CLI
Step 1: Discover pools
Change the two symbols to find a different pair. Match both token IDs in either order.page.pagination and increase offset to inspect later pages if your pool is absent.Step 2: Select a pool
Step 3: Set a liquidity range
previewMint accepts either a width around the current price or explicit ticks, aligns the result to the pool’s spacing, and reports whether the range includes the current price. Nothing is spent.tickLower and tickUpper instead of rangePercent. preview.inRange is false when the current tick is outside the range. See Minting a position for the full preview-then-mint sequence, using the same pool key.How it works on chain
A position is active when the pool’s stored tick satisfiestick_lower <= current_tick < tick_upper. The lower tick is included and the upper tick is excluded.What backs the liquidity
The amounts come from the current square-root price and the square-root prices at your bounds. Owed balances are separate from this inventory. See Price, ticks, and square-root price.
What happens at a boundary
- The contract records the swap step’s LP fee using the active liquidity before crossing. The fee is earned in that step’s input token, in proportion to each active position’s liquidity.
- It updates the boundary’s fee-growth-outside values and applies its signed liquidity change for the direction of travel.
- It updates the stored tick and nearest-tick pointers. The active ranges for the next step now reflect the crossing.
Before you mint
Shield stores initialized ticks in a per-pool linked list. A new boundary needs the initialized tick below it as an insertion hint. Fetch hints close to submission; another accepted transaction can make one stale.Record the reference price, aligned ticks, expected inventory at entry, and your rebalance trigger. The range, liquidity, and fee accounting are public; ownership is confidential. See Public data.Next steps
- Minting a position to open a position with the range you chose.
- Rebalancing positions to move an existing position to a new range.