slashveto.me tracks an Aztec sequencer from the first observed duty miss to an L1 slash and ejection:
duty miss → node offense → L1 vote → quorum → execution delay
→ executable → executed → stake removed → ejection
A path can stop at any step. The product keeps candidate amounts, executed rounds, and actual stake deductions separate. L1 votes do not encode an offense reason; a displayed reason is always labelled as evidence from the attached Aztec node.
| Surface | Source | Purpose |
|---|---|---|
| Monitor | Ethereum RPC queried in the browser | Independent view of canonical contracts, votes, candidates, execution, and slash logs. |
| PINGME | Backend using one Aztec node and Ethereum RPC | Earlier Sentinel/offense evidence, durable cases, and Telegram or Web Push alerts. |
Monitor never calls the backend. PINGME keeps the last known state when one source fails and reports that source as stale. Neither surface is an oracle: node evidence is one observer's report, while L1 establishes contract state without revealing the reason behind a vote.
The primary object is a slashing case: network, contract lineage, sequencer, and target epoch with its source observations and state transitions. Linking is exact and conservative. An actual slash joins through its execution transaction and action order, never by address and approximate time.
shared/protocol/contains the pure case projection, vote tallying, round lifecycle, transitions, and notification wording shared by frontend and backend.src/contains the React PWA and independent browser L1 collector.collector/contains the Node backend, SQLite repository, three evidence collectors, API, durable outbox, Telegram, and Web Push.scripts/deploy-backend.shinstalls an immutable backend release under systemd.
The backend API is rooted at /api. /live reports process liveness and
/health reports whether the required evidence sources are current.
| Method | Route | Purpose |
|---|---|---|
GET |
/api/config, /api/status, /api/network |
Capabilities; freshness and protocol state; public cases (ETag-revalidatable) |
GET |
/api/sequencers/:address, /api/cases/:id |
Public sequencer and exact-case views |
POST |
/api/watches |
Create a private watch and return its management token once |
GET/PATCH/DELETE |
/api/watches/:id |
Bearer-authenticated watch management |
PUT/DELETE |
/api/watches/:id/channels/web_push |
Web Push enrollment |
POST |
/api/watches/:id/channels/telegram-link |
One-time Telegram enrollment link |
POST |
/api/watches/:id/channels/test |
Queue a test alert |
Node 24 and the pinned pnpm version are required:
corepack enable
pnpm install --frozen-lockfile
cp .env.example .env
cp collector/.env.example collector/.env
pnpm dev
pnpm dev:backendRun the release gate with:
pnpm checkEvery VITE_* value is public. RPC credentials, Aztec admin credentials,
Telegram tokens, VAPID private keys, and the SQLite database belong only in the
backend environment. The ignored apiReference.md and onchainSources.md are
local research inputs, not runtime dependencies or published documentation.
The protocol model was checked against the active Aztec mainnet deployment and
aztec-packages commit def7152a
on 2026-07-29. Contracts and parameters are upgradeable; runtime code discovers
the responsible lineage and reads its values.