Uniswap v4 hooks
Mechanisms nobody built yet, written properly.
Uniswap v4 turned the AMM into a platform, and most of what has been built on it re-implements something that
already worked: limit orders, TWAMM, a KYC gate, another dynamic fee. HookForge is a catalogue of what is
missing. Every hook is checked against the roughly 140 published hooks and hackathon submissions before it is
written, states its prior art and its limitations in its own source, and ships with tests against a real
PoolManager, a deploy script, a TypeScript client and a page here.
- Hooks shipped
- 14
- In the catalogue
- 57
- Tests passing
- 192
- Chains
- 18
- Admin keys
- 0
What makes these different
-
They answer for themselves
A hook is just an address in a
PoolKey, and nothing about that address tells an indexer, a wallet or an agent what the pool does. Every HookForge hook implementsIHookMetadata: ask it its name, its version, its tags and the URI of its manifest, in oneeth_call, with no registry in the loop. -
The docs are generated from the contract
Every page here is built from the Solidity: the prose is its NatSpec, the parameters are its
configureABI, the callbacks are the flags it declares, the tags are whathookTags()returns. Documentation drift is not managed, it is impossible. -
Prior art is part of the contract
Each hook names what already exists and what is actually new about it, in the source, where it cannot be quietly dropped from a marketing page. If a mechanism has been built before, this catalogue says so.
-
Limitations are stated, not buried
Every hook has a section saying where it does not help. A fee that prices staleness does nothing for a busy pair; a priority-fee tax is inert on a chain with no priority auction. That belongs on the page, not in a post-mortem.
-
Agents are a first-class reader
The catalogue ships as an MCP server, a llms.txt, and JSON at stable URLs. A coding agent can search by problem, read a hook's parameters, and decode what any hook address will do, without scraping this page.
-
No admin keys
Nothing in this catalogue has an owner, a pause switch or an upgrade path. Parameters are fixed before a pool exists and cannot be changed under the liquidity that trusted them.
Recently shipped
Hover a card to see which of the fourteen callbacks it claims.
-
Agent-native
AgentBudget
A spending limit the venue itself enforces: an autonomous agent may swap on this pool only within a budget its principal signed, and the pool refuses the swap that would exceed it.
-
Curves
RatchetFloor
A price floor that only ever moves up.
-
Launch
AntiSnipeRamp
Opens a pool at a punitive fee that decays to normal over a fixed window, and pays every cent of the difference to liquidity providers rather than to the deployer.
-
Liquidity provider economics
LiquidityFloor
A liquidity commitment enforced per position: a fraction of what you add cannot leave until the pool's unlock date, and every provider is held to that fraction of their own stake rather than to a shared pool total.
-
Order flow and MEV
ArbTaxDecay
Prices the staleness of a pool: the longer a pool goes untraded, the more the next swap pays.
-
Order flow and MEV
FlowClassifier
Publishes, on-chain, how much of a pool's order flow arrives first in the block and how far it moves the price when it does. It changes nothing about the pool it measures.
Use one in five minutes
npm i @hookforge/sdk
import {getHook, hookAddress, poolKeyFor} from "@hookforge/sdk";
// Which hook solves "my pool is arbitraged after every quiet period"?
const hook = getHook("arb-tax-decay");
const key = poolKeyFor({
hook: hookAddress("arb-tax-decay", 8453), // Base
currencyA: USDC, currencyB: WETH,
tickSpacing: 60, dynamicFee: true,
});
Or point a coding agent at the catalogue directly:
{
"mcpServers": {
"hookforge": {"command": "npx", "args": ["-y", "@hookforge/mcp"]}
}
}