Bell on Robinhood Chain
Uniswap v4 Hook Contract 0x2ed78feeb547832da1fdd9f40d1efc21965720cc on Robinhood Chain · Custom pricing · Verified contract
- Volume (24h)
- $137
- Value locked (TVL)
- $0
- All-time volume
- $137
- Pools using this hook
- 1
- Swaps (24h)
- 4 (1 traders)
- Total swaps
- 4
What it does
Bell charges a fixed 0.5% to 3% toll on the ETH side of every swap in its own pool, plus a surcharge of up to 20% that decays to zero over the first minute, so trades in the first minute pay the most and later trades pay the base toll.
How it works step by step
- Deploys a fixed-supply ERC-20 (one billion tokens minted once to the deployer in the constructor) that is also the Uniswap v4 hook for its own ETH/token pool.
- Hooks beforeInitialize, beforeSwap and afterSwap, with before and after swap return-delta permissions, so it can take a fee from swaps through the PoolManager.
- Charges a toll of 50 to 300 bps on the ETH side of every swap, plus a ring-in surcharge of 20% that decays linearly to zero over 60 seconds after the cast.
- Books each toll 80% to the ringer side (split between ringer and a named band address by bandBps) and the remaining 20% plus rounding to a tower address, recorded as tin balances.
- Mints an ERC-6909 ETH claim against the PoolManager for each booked toll; bearers draw their tin in ETH through draw() and unlockCallback().
- Liquidity hooks (add, remove, donate, afterInitialize) all revert with NotWired, so liquidity actions are not intercepted by the hook.
- Swap behaviour
- On swaps in the home pool, the hook computes a rate of tollBps plus the current ring-in and takes it from the ETH side: for ETH-specified legs it adjusts the amount in beforeSwap, and for coin-specified legs it takes the toll in afterSwap from the ETH actually moved. Buys and sells of the coin therefore both pay the toll on the ETH side, with the ring-in making swaps within the first 60 seconds after the cast pay more. Swaps in any other pool revert with ForeignPool.
- Liquidity behaviour
- No liquidity callbacks. All liquidity hooks revert with NotWired, so the hook does not restrict or take fees on adding or removing liquidity.
- Fee behaviour
- Fees are not set through the LP fee; the home pool is initialised with a zero static fee. Instead a toll of tollBps (50 to 300 bps, fixed at the cast) plus a decaying ring-in (up to 20% extra, zero after 60 seconds) is taken from the ETH side of each swap. Of each toll, 80% goes to the ringer side (with bandBps of that going to the band address) and 20% plus rounding goes to the tower; all amounts are recorded in tins and claimable only by their bearers.
- Owner & admin controls
- The owner is set to the deployer in the constructor and renounced in the same constructor, so owner() returns zero and there is no owner-gated function. There is no pause, no upgrade mechanism, no blocklist and no way to change the fee, recipients or the pool key after the cast. Only the bearer of each tin can draw from it.
Enabled Uniswap v4 callbacks
beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta
beforeInitialize: restricts pool creation to the Belfry deployer with the exact canonical key and records the home pool. beforeSwap: takes the toll on ETH-specified legs before the pool runs, and returns a before-swap delta. afterSwap: takes the toll on coin-specified legs after the ETH amount is known, and returns an after-swap delta. beforeSwapReturnDelta and afterSwapReturnDelta: allow the hook to take the toll as an adjustment to the swap deltas.
Security & trust assessment
Risk level: medium (verified source, high confidence).
Who controls it: No privileged key remains after the constructor: ownership is renounced, the recipients and fee are immutable, and there is no pause or upgrade. The only control is the tin bearer over their own balance.
Risk to user funds: The hook takes ETH from swaps and holds it as ERC-6909 claims on the PoolManager, recorded in tins; only the tin bearers can draw it, and the hook does not hold tokens directly or block swaps other than reverting on malformed or unfilled legs.
Security findings
- [info] Hook takes fees via return deltas: beforeSwap and afterSwap return non-zero deltas that carry the toll, so every swap in the home pool pays tollBps plus the ring-in, which is intended but is an unavoidable cost to traders.
- [info] Ring-in surcharge at launch: ringInBps starts at 2000 bps (20%) at castAt and decays to zero over 60 seconds, so early buyers and sellers pay the highest combined rate.
- [low] Swap reverts on unfilled ETH-named legs: afterSwap reverts with Unfilled if an ETH-specified swap does not fill exactly as predicted, and beforeSwap reverts with OddAmount for very large or edge amounts; this can cause failed transactions rather than loss of funds.
- [info] Immutable recipients and fee: The ringer, band, tower, tollBps and bandBps are immutable and set at the cast, with no owner function to change them, so no privileged key can alter the take after deployment.
- [info] Verified source matches stated design: The verified Bell source matches the stated design: no owner after renouncement, no pause, and no liquidity hooks; the accounting uses ERC-6909 claims that only the bearer can draw.
Contract details
- Verified source
- Yes (Bell)
- Compiler
- solc 0.8.26+commit.8a97fa7a
- Bytecode size
- 9,472 bytes
- Upgradeable proxy
- No
- Detected patterns
- erc20, erc6909-claims, moves-currency, ownable, return-delta, self-unlock, tax
Pools using Bell
- ETH / PEAL (0.00% fee) — 24h volume $137, TVL $0, 4 swaps today