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
| Field | Notes |
|---|---|
adapter | Contract the gateway dispatches to. |
destination | Chain the hook executes on. |
status | active, paused, deprecated, draft. Only active executes. |
permissions | open, allowlist (named apps), or owner-only. |
spend | Per-call cap and currency, or none for hooks that move no value. |
actions[] | Name, input schema, output schema. |
source | Repository 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)| Status | New calls |
|---|---|
active | Executed |
paused | Rejected WH-304 |
deprecated | Rejected WH-304; explorer links to successor |
draft | Not 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.