Skip to content
Mainnet Live. All executions, addresses and hashes are live.
WORMHOOK
conceptualv0.1 · skeleton docs

Registry

How hooks are identified, versioned, permissioned and capped.

Hook IDs

<namespace>.<name>.v<major>
imd.research.v1
vault.rebalance.v1
nft.mint-mirror.v2
  • Namespace belongs to one owner (imd, demo, your org).
  • Name is lowercase with dashes.
  • Major version is part of the ID. A published ID never changes its interface. Breaking changes register a new ID; the old one can be deprecated but stays resolvable so historical executions still make sense.

Minor and patch versions (1.2.0) can change implementation behind the same interface and are recorded in the hook's version history.

What a registration contains

FieldNotes
adapterContract the gateway dispatches to.
destinationChain the hook executes on.
statusactive, paused, deprecated, draft. Only active executes.
permissionsopen, allowlist (named apps), or owner-only.
spendPer-call cap and currency, or none for hooks that move no value.
actions[]Name, input schema, output schema.
sourceRepository and commit the adapter was built from, plus audit status. "Not audited" is a valid, displayed value.

Status transitions

draft ──► active ──► paused ──► active
             │
             └────► deprecated   (terminal; new ID for the successor)
StatusNew calls
activeExecuted
pausedRejected WH-304
deprecatedRejected WH-304; explorer links to successor
draftNot callable; visible for review

Registering a hook

register.tsconceptual
await registry.register({
  id: "vault.rebalance.v1",
  adapter: "0x…VaultAdapter",
  destination: "base",
  permissions: { kind: "allowlist", apps: ["keeper-vaults"] },
  spend: { perCallCap: "5000", currency: "USDC" },
  actions: [{ name: "REBALANCE", inputs: […], outputs: […] }],
  source: { repo: "github.com/…", commit: "77de1c3" },
});

Browse the demo registry at /registry.