Skip to content
Arcsmith

Read any hook on Arc

Paste a hook or token address to see what it can do with your trade.

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

GET /api/v1/hooks/{address}
curl https://arcsmith.xyz/api/v1/hooks/0x099ea6E7c769c8ecBE7E3c601B48dD1d5C2fA8c4

What the hook's address allows it to do. This needs no index, so it keeps answering when the index is down.

Shortened answer
{
  "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": "..." }
}
FieldMeaning
canBeHookFalse when no permission flag is set. Uniswap v4 only accepts a hook that asks for at least one callback.
reach.levelThe strongest thing it can do: changes_amounts, can_refuse, informational or none.
abilitiesSeven 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.
permissionsThe 14 raw flags decoded from the lowest 14 bits of the address.
contractWhether there is code at the address on Arc and how big. null if the RPC didn't answer.
sourceWhether 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

GET /api/v1/tokens/{address}
curl https://arcsmith.xyz/api/v1/tokens/0xe8ac3CD26df2BB82D1752057438e51B482496D05

Every 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

GET /api/v1/rankings
curl https://arcsmith.xyz/api/v1/rankings

The 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

GET /api/v1/pools/{poolId}/cost
curl https://arcsmith.xyz/api/v1/pools/0x704947b2d54f1522e294c781240863a3e59ab68d709bec3f3ae167aeba821eac/cost

A 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

GET /api/v1/tokens/{address}?cost=true
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 reach and canDo for what the hook is allowed to do, and cost for 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

GET /api/v1/hooks/{address}/badge.svg
[![Arcsmith hook check](https://arcsmith.xyz/api/v1/hooks/0x099ea6E7c769c8ecBE7E3c601B48dD1d5C2fA8c4/badge.svg)](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.

LabelColourMeans
Can move your moneyOrangeIt can change what you pay or receive.
Can refuse tradesSandIt can stop a trade or a deposit, but can't change the amounts.
Informational onlyGreyIt is told about trades and deposits but can't change or stop them.
No callbacksGreyNo 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.

MCP server URL (Streamable HTTP)
https://arcsmith.xyz/mcp

Full 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.json under mcpServers as { "arcsmith": { "url": "https://arcsmith.xyz/mcp" } }
ToolWhat it answers
check_hookWhat a hook can do with a trade, its 14 flags, and whether its source is published
check_tokenA token's pools on Arc, each pool's hook, lookalike warnings; cost=true adds a small simulated buy and sell
trade_costWhat a ~$5 buy and sell cost in one pool, hook included
top_hooksThe busiest hooks on Arc, without wash-traded ones

Errors and limits

Every error has one shape, { "error": { "code": "...", "message": "..." } }.

StatusCodeWhen
400invalid_addressThe address isn't 42 characters starting with 0x.
404token_not_foundThe index doesn't know the address as a token.
429rate_limitedMore than 60 requests a minute from one address. Wait a minute.
502index_unavailableThe 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.