CONDUCTOR
Wallet

Data · v0, live

The data layer underneath.

The indexer underneath Conductor. Automations read the chain through the same open indexer anyone can use. Register any Robinhood Chain contract and get holders, decoded events, signed webhooks and snapshots at any block.

Indexer · live

connecting
Contracts—
Events—
Transfers—
Holders tracked—
Lag—
Head block—
Safe block—head - 12
Indexed through—

Register a contract

Public and keyless, 5 per minute per IP. ERC-20 and ERC-721 are detected on their own; anything else needs its ABI.

Custom ABI

Optional for ERC-20 and ERC-721, where it adds extra events. Required for anything else.

Recently registered

What the data layer serves

  • Index · LiveRegister any contract. Conductor finds its deploy block, backfills every log, decodes it, and follows the head.Contracts →
  • Webhooks · LiveSubscribe to an event or an address. Confirmed logs arrive as HMAC-signed POSTs, retried until they land.Webhooks →
  • Snapshots · LiveEvery holder as of any indexed block, as JSON or CSV. Built for airdrops and holder-gated payouts.Snapshots →

How indexing works

  1. 01Register.Paste an address. Conductor checks it has code and queues it.
  2. 02Index.It backfills from the deploy block, decodes every log, and stays a few blocks behind the head.
  3. 03Query.Read holders, balances, transfers and events over HTTP, or get them pushed as signed webhooks.

Holders preview

No live contract

No live contract yet. Holders appear once a registered contract finishes its backfill.

Snapshot to CSV

The full holder list at a block, for airdrops and holder-gated payouts. One line, as pasted:

curl
curl -s -o holders.csv "http://127.0.0.1:8787/v1/contracts/0xa24326d9bcbd110c918dcf386472441b9347cbf6/snapshot?format=csv"
cli
lattice snapshot 0xa24326d9bcbd110c918dcf386472441b9347cbf6 --csv --out holders.csv

Add &block=N for a past block; at or below the safe block the file never changes.

Verify a webhook

Every delivery is signed: x-lattice-signature: t=<unix>,v1=<hmac> over ${t}.${rawBody}. Verify the raw body before parsing it; the SDK does the HMAC, the 300 s replay window and the constant-time compare.

ts · @lattice/sdk
import express from "express";
import { verifySignature } from "@lattice/sdk";

const app = express();

// Keep the raw bytes: the signature covers them exactly.
app.post("/hooks/lattice", express.raw({ type: "application/json" }), async (req, res) => {
  const ok = await verifySignature(
    process.env.LATTICE_WEBHOOK_SECRET!, // the whsec_... shown once at creation
    req.body,                            // Buffer = Uint8Array
    req.get("x-lattice-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);

Keyboard shortcuts

  • Control roomga
  • New automationgn
  • Terminalgt
  • Runs, protocol-widegr
  • Explorege
  • Hooksgh
  • Datagd
  • Docsgo
  • Homegg
  • Toggle the terminal drawer (app pages)ctrl+`
  • Show this list?
  • Close a menu or this listesc