Live on Arbitrum OneUniswap v4 hookERC-4626 vaultNo emissions · no lockups

USDC yield from real Uniswap v4 trading activity.

Two distinct streams, kept separate on purpose:

  • Market yield — variable, uncapped. Each hooked swap routes 80% of its fee into poolManager.donate(). Per donation event, v4 credits each position L_i / Σ L_k, where the sum is over every position on this exact PoolId (currency pair + fee + tickSpacing + hooks) whose tick range covers the active tick at the donation block. Liquidity is sampled per-event, not averaged; “liquidity-time” is the count of donations a position is in-range for. Late LPs do not retroactively dilute past donations, but they do dilute every future one in proportion to their L. Vault liquidity is presently dominant in this range — a market state, not a protocol invariant.
  • Incentive yield — capped, scheduled, conditional. A 180-day early-depositor program funded from treasury inflows. Today the epoch pool reads live below; caps and windows are on-chain.

Pair: WETH / USDC.

Fees are distributed to in-range liquidity at each donation eventConcentrated-LP exposure includes IL vs USDCRange is owner-controlled · Safe-rebalancedBonus capped: $25K/wallet · $10K/epochRisk runbook ↗
Live on-chain · Arbitrum One
TVL
Live vault assets
Share price
1 share → asset
Swaps
Hook-routed
Reserve fills
Hook-settled trades
Bonus pool
Epoch 0, claimable
Depositors
Unique LPs
Honest comparison

Vault yield vs passive v3 LP baseline

The only chart that answers “does the hook actually beat v3?”. Methodology is committed up front; numbers fill in with on-chain history. We render the comparison even on days the baseline wins.

Days since launch: 12.7
Window threshold: 7d
Vault — realized return since launch
From convertToAssets(10^shareDec) / 10^assetDec − 1. Share price advances at flush blocks; this is realized only, excluding latent v4 fee growth.
TVL:·noise floor:$10,000
Snapshots stored: 0 · cadence: 1/hour, in your browser only (localStorage; not shared, not a server backfill)
v3 baseline — same window
backfill pending
Uniswap v3 WETH/USDC 0.05% (Arbitrum) · pool
Read-path: connecting · data: computing rolling 7d
Methodology — exactly how each number is computed
  1. Vault realized yield = vault.convertToAssets(10^shareDec) / 10^assetDec − 1 where shareDec = assetDec + _decimalsOffset() (currently for shares, 6 for assets). First deposit mints at parity by ERC-4626 convention, so this ratio − 1 is the cumulative realized return. Excludes uncollected v4 fees by design — see SPEC §2.2.
  2. v3 baseline = passive full-range LP yield on Uniswap v3 WETH/USDC 0.05% (Arbitrum) over the same time window. Computed from feeGrowthGlobal0X128 / feeGrowthGlobal1X128 deltas, divided by liquidity at sample time, marked to USDC at spot. This is conservative: tighter v3 ranges earn more, but they also have non-zero re-balance cost we’re not modeling.
  3. Window — rolling 7 days, refreshed hourly. Below the threshold we show neither vault APR nor baseline APR; both numbers would be statistical noise.
  4. Honesty contract — when the v3 baseline beats the vault on a given window, we render the window. If we hid losing windows the chart would be marketing, not signal.
In plain English

What happens when you deposit USDC.

  1. 01

    You deposit USDC into this vault.

  2. 02

    The vault can deploy it as a single-sided concentrated-liquidity position on Uniswap v4 on the WETH / USDC pool. While the live price sits above that range, the position is parked in USDC and not active swap depth yet.

  3. 03

    Swaps routed through the hook attempt to apply a 25 bps fee (1.5× in volatile blocks, hard-capped at 50 bps).

  4. 04

    By default 80% of that fee is sent into poolManager.donate(). The atomic unit is the donation event (one per distribute call). Per event, v4 credits each position L_i / L(t_d), where L(t_d) is the pool’s active liquidity scalar on this exact PoolId. Yield is time-integrated exposure to those events, not a count of them: one large fee at a moment of small L can outweigh many small ones at high L. Late LPs cannot retroactively dilute past donations; they do dilute future ones in proportion to their L. (The other 20% funds the treasury. Treasury share is owner-adjustable, hard-capped at 50%.)

  5. 05

    Your share price is the single accounting anchor: totalAssets() / totalSupply(). There is no per-user reward tracking — all attribution is share-based. ERC-4626 leaves totalAssets() implementation-defined; this vault uses a discrete-harvest model: uncollected v4 fee growth is excluded from totalAssets() and imported step-wise when collectYield() (permissionless) or any deposit/withdraw flushes — a choice that keeps the realized side tamper-evident, not a v4-level invariant. As a consequence, share price is a step function: continuous in spot between flushes, with upward jumps at each flush. Between flushes, the displayed price is a lower bound on lifetime entitlement; anyone can call collectYield() first to trade against the post-flush price.

Honest caveat. The vault is single-sided: it can hold USDC outside the active price band while waiting to convert across the owner-configured tick range. Fee capture starts when liquidity is in range. Anyone can call collectYield() to harvest accrued fees into share price — that part is permissionless. Moving the range itself (rebalance()) is owner-only, so if the market price drifts outside the configured ticks the position can sit idle until the owner repositions it.

Vault overview

Live on-chain state. Deposit to start earning fee yield.

TVL
Total assets under management
Share price
1 share → asset units (×10¹⁸)
Depositors
Unique LPs
Yield collected
Lifetime harvested into share price
Performance fee
Treasury cut on yield
Tick range
Live on-chain · owner-rebalanceable
Vault
WETH / USDC · deposit USDC
AmountBalance: — USDC
The vault accepts USDC only. When the selected LP range is active, the vault must hold both USDC and WETH; the zap deposit swaps part of your USDC into WETH automatically.
Checking vault range status…
Connect a wallet to deposit.
Deposits are not swaps. Deposit mints ERC-4626 vault shares; redeem returns the vault asset by default. Share price rises as hook fees accrue; anyone can call collectYield(). Deployment into active range happens on deposit() and owner rebalance() paths.
Bootstrap pool · live on-chain

Real USDC sitting in epoch 0

Verify these numbers yourself. Every value below is read live from BootstrapRewards and on Arbitrum One.

Epoch 0 bonus pool
Fills as hook fees accumulate from swaps
Claimed so far
Cumulative claims by eligible LPs
Contract balance
Total USDC held by BootstrapRewards
Per-epoch cap
Hard ceiling on epoch bonus pool
Epoch 0 window
Start
End
End in
Statusaccruing
Program parameters
Bonus share of treasury
Epoch length
Total epochs
Real treasury
Why this is real

Click Read Contract on Arbiscan and call epochs(0). The first return value is bonusPool in USDC units (×106). It will match the value above. Anyone can also call payoutAsset.balanceOf(bootstrap) and confirm the USDC actually sits in the contract — not in a treasury wallet.

Untracked balance. If contract balance > bonus pool, anyone may call pullInflow() on BootstrapRewards to commit the residual into the active epoch's bonus pool. Permissionless, idempotent.

Your eligibility

Connect a wallet to preview your bonus eligibility.

Model your real return

See exactly what a deposit earns on live pool data.

Project your share of hook fees and the early-depositor bonus using live pool numbers — TVL, share price, fee distribution split, bonus pool. Every input is on-chain and editable.

Reserve desk

Live, public state of the vault's single-sided reserve sale on the hook. Anyone can verify the offer, the price, and every fill — no indexer, straight from chain.

Quote source & gate. Vault price is posted by an allowlisted keeper (Safe-managed). Each fill is gated on-chain against live spot, directionally: fill ⇔ P_spot ≤ P_vault when the vault sells token1, and fill ⇔ P_spot ≥ P_vault when it sells token0 (PRICE_IMPROVEMENT mode; VAULT_SPREAD flips the inequality). A stale or mispriced quote cannot execute against the pool. Spec §3.4 ↗

No offer posted

The vault has no active reserve offer. New offers appear here the instant the operator posts one on-chain.

Lifetime hook activity
Total swaps
0
Reserve fills
0
Reserve sold
— ?
cumulative inventory cleared
Fees routed
atomic units (mixed currencies)
Recent activity
Last ~200k blocks · refreshes every 30s
Direct from chain
Loading events…

Swap directly through the hook

Routes through The-Pool's own Uniswap v4 PoolKey. 80% of every hook fee flows back to in-range LPs (including you, if you've deposited).

Swaps are trades. They do not mint vault shares; you receive the output token directly.

Low deployed liquidity (informational)
Vault reports little or no deployed liquidity. Quotes from the V4Quoter are authoritative — if a quote returns, the swap is enabled. Quote failures may indicate the pool has no in-range liquidity (e.g. a single-sided USDC position outside the live tick), in which case NoLiquidityToReceiveFees can revert.
FromBalance: USDC
USDC
To (estimated)Balance: WETH
0.0WETH
Slippage tolerance

How it works

Four contracts, one transaction per swap. No off-chain keepers, no token.

01
Swap triggers the hook
Swaps routed through the pool hook call DynamicFeeHookV2 — a 25 bps fee is computed from swap deltas and can scale 1.5× during volatile blocks.
02
Fee is split and donated
FeeDistributor routes 20% to the treasury and 80% straight into poolManager.donate() — same tx, no escrow. Treasury share is owner-adjustable, hard-capped at 50%.
03
Share price accrues
Per donation event, v4 credits each LP L_i / L(t_d), where L(t_d) is the active liquidity scalar on this exact PoolId (a snapshot, not a TWAP, not a global v4 sum). Yield is time-integrated exposure to those events, not a count of them. Share price = totalAssets()/totalSupply(); this vault uses discrete harvest — an implementation choice that excludes uncollected v4 fees from totalAssets() and imports them step-wise via collectYield() (permissionless) or any deposit/withdraw flush.
04
Owner rebalances the range
Ticks are owner-adjustable without touching depositor accounting. Range shifts leave share price untouched.
Contracts · Arbitrum One
LiquidityVaultV20xf79c…eee0
DynamicFeeHookV20x4865…00cC
FeeDistributor0x5757…78B0
BootstrapRewards0x3E6E…a03d
Asset (USDC)0xaf88…5831
Single-sided by design

You deposit USDC. The vault works best when WETH / USDC trades inside its selected range. If price is outside that range, some funds may wait in USDC instead of being forced into a bad trade.

A reserve keeper can help reduce idle time by offering unused reserves to swaps. Reserve quotes are posted by an allowlisted keeper (Safe-managed) and gated on-chain by an AMM-spot price-improvement check before any fill — discretionary input, deterministic gate.

Security — anti-sandwich reference-price gating, two-step ownership handoff, ERC-4626 virtual-shares inflation mitigation, SafeERC20 on every transfer.

Risks & custody model
  • Impermanent loss. Concentrated-LP exposure is not USDC-flat: when WETH price moves inside the range, the position rebalances against you relative to a USDC-only basis.
  • Range-shift risk. rebalance() is owner-only via the Safe. Frequency and tick choice can change fee capture timing; depositor accounting is unaffected.
  • Pro-rata dilution. The 80% donation is shared across every in-range LP. If third-party LPs join the same range, the vault's share of each donation falls accordingly.
  • Bonus is conditional. Epoch pool is funded only when treasury inflows arrive and pullInflow() is called. Caps and windows are on-chain; funded balance is shown live below.
  • Reserve quote is discretionary. Posted by an allowlisted keeper. Fills are still gated by an on-chain AMM-spot price-improvement check.
  • Custody & admin. Vault is Pausable and owned by VaultOwnerController, which is owned by a Safe multisig. Hot keeper can only call typed reserve operations — no withdraw, no rebalance. Hook, vault, and distributor contracts are non-upgradeable; migration would require redeployment.