ERC1967Proxy
RobinhoodERC1967Proxy is a Uniswap v4 hook on Robinhood Chain. Brand new: its first pool went live today. Still in use: 3 trades in the last week, and 3 new pools this week.
- Contract name
- ERC1967Proxy
How this hook works
Token launcherGrip lets anyone launch a coin paired with ETH, a dollar coin or a tokenized stock on Robinhood Chain. This hook runs every Grip pool: it locks the whole supply in the pool for good and takes a fee on every trade that goes to the coin's holders.
Liquidity is locked for good
Only the Grip launcher can add liquidity, and it puts the whole supply in at launch. Nobody can remove it, so the pool can't be drained (a rug pull).
The code that does this (beforeAddLiquidity):function beforeAddLiquidity(address sender, PoolKey calldata, IPoolManager.ModifyLiquidityParams calldata, bytes calldata) external view onlyPoolManager returns (bytes4) { if (sender != launcher) revert NotLauncher(); return IHooks.beforeAddLiquidity.selector; }A fee that pays holders
Every buy and sell pays a fee chosen at launch, from 1% to 10%, taken in the coin it is paired with, never in the coin itself. Anyone can send the collected fees to the coin's vault, which pays the holders and a daily prize draw.
The code that does this (_take):function _take(PoolId id, Pool storage pool, uint256 fee) private { poolManager.mint(address(this), uint256(uint160(pool.quote)), fee); // the hook's credit, held as PoolManager claims pending[id] += fee; emit Fee(id, pool.token, fee); }Copycat pools can't trade the coin
The hook records exactly how many coins each trade in the official pool pays out, and the coin refuses to move any other amount out of Uniswap. So copycat pools for the same coin don't work.
The code that does this (_release):function _release(address token, uint256 amount) private { bytes32 slot = _slot(token); assembly ("memory-safe") { tstore(slot, add(tload(slot), amount)) } }Only official pools can open
A pool using this hook can only be set up by the Grip launcher for a coin it registered.
The code that does this (beforeInitialize):function beforeInitialize(address sender, PoolKey calldata key, uint160) external view onlyPoolManager returns (bytes4) { if (sender != launcher || pools[key.toId()].token == address(0)) revert NotGripPool(); return IHooks.beforeInitialize.selector; }
Who controls it: The owner of the Grip launcher (the hook developer) can replace the hook's code until upgrades are frozen on the launcher, and then never again. A new version must keep the same launcher and hook settings. The fee for each coin is set at launch.
Based on the hook’s published code.What do these labels mean?
What it can do
Its code executes inside each trade in pools that use it.
It can take or add tokens during a swap. Fees, burns and custom curves work this way, and so do scams.
It checks every deposit before it goes in.
It runs when a pool is created, often to lock in that pool’s settings.
It runs when someone donates tokens to the pool’s LPs.
Hook history
- Took its fee from a trade 3 times
Latest transactions
- 0x86bd519c…051016 block 113,661,270 · 0.00000334 LEGIT
- 0xc2f9b426…3e0df0 block 113,632,011 · 0.00000236 LEGIT
- 0x22f8d11a…aa69e5 block 113,596,312 · 0.0000750 LEGIT
- Sent collected fees to the coin's holder vault 1 time
Counted from what the hook recorded on-chain across all its pools, for every action in its published code, plus token transfers in and out of it.