Docs
Hook check API
Ask what any Uniswap v4 hook on Arc can do, from your own app. Free, no key.
The same answers the hook reader shows, as JSON for your own app, bot or wallet. It is free, needs no key and reads Arc mainnet. Any website may call it from the browser.
One hook
curl https://arcsmith.xyz/api/v1/hooks/0x099ea6E7c769c8ecBE7E3c601B48dD1d5C2fA8c4What the hook's address allows it to do. This needs no index, so it keeps answering when the index is down.
{
"address": "0x099ea6E7c769c8ecBE7E3c601B48dD1d5C2fA8c4",
"chainId": 5042,
"canBeHook": true,
"reach": { "level": "changes_amounts", "label": "Can move your money" },
"summary": "In short: this hook can take a cut of your trade, change the fee trade by trade, block trades and refuse new liquidity.",
"abilities": [
{
"key": "cut",
"question": "Can it take a cut of your trade?",
"audience": "trade",
"can": true,
"severity": "bad",
"answer": "It can keep part of what you receive, or charge you more than the pool's price. ..."
}
],
"permissions": [{ "key": "beforeSwap", "bit": 7, "label": "Before every swap", "enabled": true, "risk": "notice" }],
"contract": { "hasCode": true, "codeSize": 11290 },
"source": { "published": true, "name": "HookKernel", "exact": true },
"arcsmithKernel": true,
"links": { "reader": "...", "explorer": "...", "badge": "..." }
}| Field | Meaning |
|---|---|
canBeHook | False when no permission flag is set. Uniswap v4 only accepts a hook that asks for at least one callback. |
reach.level | The strongest thing it can do: changes_amounts, can_refuse, informational or none. |
abilities | Seven yes/no questions. Keys: cut, price, fee, blockTrade (audience trade) and lock, lpCut, blockDeposit (audience liquidity). severity says how much a yes should worry someone and only matters when can is true. |
permissions | The 14 raw flags decoded from the lowest 14 bits of the address. |
contract | Whether there is code at the address on Arc and how big. null if the RPC didn't answer. |
source | Whether the source is published on Arc Explorer, and under what name. null means not known yet: the first lookup of a hook can take several seconds, so ask again. |
One token
curl https://arcsmith.xyz/api/v1/tokens/0xe8ac3CD26df2BB82D1752057438e51B482496D05Every Uniswap v4 pool the token trades in on Arc, with the hook each one runs. Each pool carries its liquidity, volume and swap count, whether it is thin (under $100 of liquidity), and for hooked pools the hook's reach, the keys of the abilities it has (canDo) and a link to its full answer. When a token is in more pools than fit in one answer, capped is true and the most liquid ones are listed. A 404 means the index doesn't know the address as a token.
Real token or lookalike
Anyone can deploy a token called USDC. For the few tokens Arc's own documentation lists (USDC, EURC, USYC, cirBTC and WETH) the token answer carries an identity: canonical when the address is the documented one, lookalike when another token uses its symbol or name (then realAddress is the real one, matchedBy says symbol or name, and tokensWithThisSymbol counts the copies). For any other token the field is absent: we don't guess who made it. The list is hand-kept from docs.arc.io; a name proves nothing, the address does.
Rankings without wash trading
curl https://arcsmith.xyz/api/v1/rankingsThe busiest hooks on Arc by volume, with the hooks that have big volume but almost no liquidity left out. The method field states the rule and how many hooks it left out. Cached for five minutes.
What a trade really costs
curl https://arcsmith.xyz/api/v1/pools/0x704947b2d54f1522e294c781240863a3e59ab68d709bec3f3ae167aeba821eac/costA buy and a sell of about 5 USDC (or EURC) are run through Uniswap's Quoter against the live pool and compared with its current price. The Quoter runs the hook, so a tax, a dynamic fee or a refusal shows up in the number. cost is the share of the trade's value lost (0.031 is 3.1%), poolFee is the pool's own fee, and a trade the pool would refuse comes back as { ok: false, reason }. Pools with neither USDC nor EURC answer 422.
It is a simulation for one anonymous sender. A hook can treat other senders differently, so a real trade can differ, and the probe is small, so a very thin pool can cost more for a bigger trade. The same numbers appear in the "Cost of a $5 trade" column on a token's hook reader page.
For token scanners
curl "https://arcsmith.xyz/api/v1/tokens/0xe8ac3CD26df2BB82D1752057438e51B482496D05?cost=true"A test written for plain pools can mistake a Uniswap v4 hook for a trap: a hook may charge on every trade, so the output is lower than the price, or it may use its own accounting that a generic simulation doesn't understand. Both are normal for v4. What matters is what the pool does when you trade through it. With cost=true each hooked pool gets a cost from a real simulation through the pool and its hook: whether a small buy and a small sell go through (ok), and what share of their value they lose. A sell that comes back ok: false is a refusal worth flagging. A sell that works at 3% is a tax, not a trap.
- Use
reachandcanDofor what the hook is allowed to do, andcostfor what it does to a small trade right now. - Costs are for the largest eight hooked pools and cached for a minute. Pools without USDC or EURC have no
cost. - The simulation uses one anonymous sender. A hook that treats senders differently can still behave differently for a real trade, so treat a clean result as evidence, not proof.
A badge for your page
[](https://arcsmith.xyz/hooks/0x099ea6E7c769c8ecBE7E3c601B48dD1d5C2fA8c4)A small image for a README, a listing or a wallet screen: it says what the hook's address allows, in the same words as the answer's reach.label. It is built from the address alone, so it never waits on the index, and it isn't rate limited. Link it to the hook's reader page so anyone who clicks sees what the label means. The hook reader's Copy badge button gives you this Markdown.
| Label | Colour | Means |
|---|---|---|
| Can move your money | Orange | It can change what you pay or receive. |
| Can refuse trades | Sand | It can stop a trade or a deposit, but can't change the amounts. |
| Informational only | Grey | It is told about trades and deposits but can't change or stop them. |
| No callbacks | Grey | No permission flag is set. |
There is no green badge and no "safe" wording, on purpose: the badge reads the address, not the code, so it can't vouch for a hook. Please don't present it as an audit or a safety rating.
Share cards. A link to a hook reader page, for a hook or a token, shows a preview card when it is posted on X, Telegram or Discord: for a hook, its name and what it can do; for a token, its pools and the hooks they run. The reader pages have a Share on X button.
From your AI assistant (MCP)
The same checks are a remote MCP server, so assistants like Claude and Cursor can call them while they answer you: ask "what can the hook on this pool do?" and it reads the answer from Arcsmith. No key, no install, read-only.
https://arcsmith.xyz/mcpFull setup and examples: AI assistants (MCP).
- Claude: Settings → Connectors → Add custom connector, and paste the URL. In Claude Code:
claude mcp add --transport http arcsmith https://arcsmith.xyz/mcp - Cursor: add it to
.cursor/mcp.jsonundermcpServersas{ "arcsmith": { "url": "https://arcsmith.xyz/mcp" } }
| Tool | What it answers |
|---|---|
check_hook | What a hook can do with a trade, its 14 flags, and whether its source is published |
check_token | A token's pools on Arc, each pool's hook, lookalike warnings; cost=true adds a small simulated buy and sell |
trade_cost | What a ~$5 buy and sell cost in one pool, hook included |
top_hooks | The busiest hooks on Arc, without wash-traded ones |
Errors and limits
Every error has one shape, { "error": { "code": "...", "message": "..." } }.
| Status | Code | When |
|---|---|---|
| 400 | invalid_address | The address isn't 42 characters starting with 0x. |
| 404 | token_not_found | The index doesn't know the address as a token. |
| 429 | rate_limited | More than 60 requests a minute from one address. Wait a minute. |
| 502 | index_unavailable | The Arc index didn't answer. Hook answers don't depend on it. |
- Answers can be reused for a short time (the hook answer for five minutes, a token for 30 seconds). Cache on your side too.
- Pools, volume and liquidity come from a community index of Uniswap v4 on Arc. Volume is priced from pool ratios and can be inflated for thinly traded tokens.
