Data · v0, live
Data layer
Index any Elysium contract. Holders, events, webhooks, snapshots.
Indexer
connecting
Contracts—
Events—
Transfers—
Holders—
Lag—
Head block—
Safe block—head - 12
Indexed—
Register a contract
Recently registered
Serves
- IndexLiveContracts →
- WebhooksLiveWebhooks →
- SnapshotsLiveSnapshots →
Holders preview
No live contract
Holders show once a contract finishes backfill.
Snapshot to CSV
curl
curl -s -o holders.csv "http://127.0.0.1:8787/v1/contracts/0xa24326d9bcbd110c918dcf386472441b9347cbf6/snapshot?format=csv"cli
charon snapshot 0xa24326d9bcbd110c918dcf386472441b9347cbf6 --csv --out holders.csv&block=N for a past block. At or below the safe block the file is final.
Verify a webhook
ts · @charon/sdk
import express from "express";
import { verifySignature } from "@charon/sdk";
const app = express();
// Keep the raw bytes: the signature covers them exactly.
app.post("/hooks/charon", express.raw({ type: "application/json" }), async (req, res) => {
const ok = await verifySignature(
process.env.CHARON_WEBHOOK_SECRET!, // the whsec_... shown once at creation
req.body, // Buffer = Uint8Array
req.get("x-charon-signature"),
);
if (!ok) return res.status(401).end();
const delivery = JSON.parse(req.body.toString("utf8"));
// delivery.id is stable across retries: dedupe on it. Answer 2xx within 10 s.
console.log(delivery.type, delivery.event?.name, delivery.event?.blockNumber);
res.status(200).end();
});
app.listen(3000);