Protocol
Uniswap V3.
Ladders built from NonfungiblePositionManager positions, one NFT per funded bin.
On V3, each bin is a standard Uniswap V3 position minted through the NonfungiblePositionManager and held by ObolLadderManager.
- Positions per ladder
- One NFT per funded bin (empty bins are not minted)
- Tokens
- ERC-20 only (ETH is wrapped to WETH by the app)
Opening on V3
Canonical pool check
The manager reads
token0,token1andfeefrom the pool and requiresfactory.getPool(token0, token1, fee) == pool. The position manager mints into that canonical pool, so forks and look-alike pools (PancakeSwap, Sushi…) are rejected.Price guard
slot0().tickmust be within[minTick, maxTick].Mint the bins
For every bin with non-zero liquidity,
mint()is called with that bin's token budget. The manager then clears its allowances and refunds what was not used.
Claiming and closing
collect() pokes each position and returns all fees owed. On close, decreaseLiquidity() returns the principal, collect() returns principal plus fees, and the difference is the fee part the 7.5% applies to. The NFTs are then burned.