FablesRWAETH on Robinhood Chain

Uniswap v4 Hook Contract 0xca89f079af00f752bfd3c345358dc38d4d73e080 on Robinhood Chain · Dynamic fee · Verified contract

Volume (24h)
$10.88K
Value locked (TVL)
$6.87K
All-time volume
$5.12M
Pools using this hook
2
Swaps (24h)
393 (276 traders)
Total swaps
22,201

What it does

A dynamic-fee hook for tokenized equity pools that charges higher LP-protecting fees during the market open and close, lets LPs deposit ranged liquidity with withdrawals that cannot be paused, and allows temporary operator fee overrides.

How it works step by step

  • Sets swap fees from a market-session calendar: opening descent, overnight floor, closed floor, closing ramp and post-closure spike, all driven by block.timestamp.
  • Applies an optional directional premium so one swap direction can be priced higher than the other.
  • Lets a trusted poke role temporarily replace per-direction fees, bounded by a floor, the pool cap, and a 72-hour expiry.
  • Holds concentrated liquidity in hook-owned v4 positions per tick range and mints ERC-6909 receipts 1:1 with liquidity.
  • Skims an optional claim-fee percentage from collected LP fees, routed to a recipient as a pull-only claim.
  • Supports optional staking where fee accrual goes to a distributor or to Voter-gated eligibility, and pausing of deposits, claims and transfers with bounded durations.
Swap behaviour
On every swap the hook returns a fee override: the session-based autonomous fee (plus a directional premium) unless a live operator poke applies, clamped to the pool cap. It does not alter swap deltas.
Liquidity behaviour
Users deposit concentrated liquidity into hook-owned v4 positions per tick range and receive ERC-6909 receipts 1:1 with liquidity units. Deposits enforce deadline and amount ceilings; withdrawals are unconditional and pay out principal plus accrued fees as PoolManager claims. Optional staking routes fee accrual to a distributor or Voter-gated eligibility.
Fee behaviour
Per-swap fee resolved by direction: a live poke replaces the autonomous fee (clamped by a floor of max(configured floor, half the pre-poke fee, capped at a 50% discount) and by the pool cap); otherwise the session-based autonomous fee (open descent, overnight, closed floor, closing ramp, closed spike) plus a directional premium, clamped to the pool cap. Claim fee skims a configurable bps of collected LP fees (max 20%), with a rate history to prevent retroactive charges.
Owner & admin controls
Owner-role holders (via AccessManager with delays) can set pool configs, floors and caps (setPoolConfig), premiums (setPoolAsymmetry), claim fee rate and recipient (setClaimFee, setClaimFeeBps), distributor and FF sink, ballot gate, session hours, day overrides and early-close windows, and authority. A zero-delay guardian/poker role can call pokeFee (temporary fee override bounded by floor and cap, 72h TTL), clearPoke, pause and pausePool (one-way freezes up to 7 days). setPaused and setPoolPaused can lift pauses and sit on the delayed admin role. Withdrawals and unstaking are designed to remain unpausable.

Enabled Uniswap v4 callbacks

beforeInitialize, beforeSwap

beforeInitialize: enforces dynamic-fee pools, pool must be configured, and blocks native ETH currency0 unless the native variant is used. beforeSwap: returns the per-swap fee override only; it does not modify swap deltas.

Security & trust assessment

Risk level: medium (verified source, high confidence).

Who controls it: A privileged key set can reshape fees within bounds, route claim-fee revenue to a chosen sink, set distributor and sink addresses, and pause deposits, claims, staking, transfers and sweeps (not withdrawals). The zero-delay guardian can freeze the hook or a pool for up to 7 days and reshape a pool's fee for up to 72 hours within floor and cap bounds.

Risk to user funds: The hook cannot move principal out of user positions beyond the PoolManager settlement that withdrawal performs, and withdrawals are not pausable. Privileged roles can change the fee paid on swaps and the fee skim on collected LP fees, and can route claim-fee and distributor revenue. Misconfigured native-ETH deposits are refused or refunded to the caller; ETH sent to the hook outside that path has no rescue function.

Security findings

  • [medium] Zero-delay fee poke can be renewed indefinitely: A poked fee can cut the pool's live autonomous fee by at most 50% and is bounded below by a floor, but a zero-delay poker key can renew pokes indefinitely to keep one-sided fees at the floor.
  • [low] Live pool reconfiguration reprices open markets: Setting a pool's floor, cap or config to values that do not match the live curve (for example closedSpike above cap, which is resolved by clamping) can reprice an open market; setPoolConfig is callable on live pools by the delayed admin role.
  • [info] Pause expiry limits freeze duration: Pausing is bounded to 7 days per call and must be renewed, so a stalled admin cannot freeze deposits and claims permanently; withdrawals are never blocked by pause.
  • [info] Claim fee applies only to fees, with history-bounded retroactivity: Claim fee is skimmed from collected LP fees at collection time and is not applied to principal; the recipient is one-way once set, and rate history is walked to bound retroactive charges.
  • [info] Custody model keeps user funds on PoolManager claims: Token transfers route through the PoolManager as ERC-6909 claims and the hook never holds user tokens as balances, reducing blocklist and custody exposure. Native-currency paths carry refund and sweep logic that routes only the caller's unspent remainder.

Contract details

Verified source
Yes (FablesRWAETH)
Compiler
solc 0.8.26+commit.8a97fa7a
Bytecode size
43,368 bytes
Upgradeable proxy
No
Detected patterns
dynamic-fee, erc6909-claims, moves-currency, pausable, self-unlock

Pools using FablesRWAETH