@reverefi/sdk
v0.3.0
Published
Revere: offers addressed to a graded slab's cert. The standard's reference library — cert keys, resolve, offers, and the transactions to make, accept and fund them.
Maintainers
Readme
Revere
Offers addressed to a graded slab, from any chain.
A graded card's cert number — PSA 148617224, CGC 6149683293 — is printed on its label and is
unique in the world. Revere makes that number an address. Anyone can look up which tokenized slab it
is, who holds it right now, and every offer on it, then settle a sale atomically on the chain where
the slab's token lives. No marketplace account, no venue lock-in, no server in the middle.
Revere is an open standard plus a small library. Any client with a library that reads smart contracts can use it.
Origin. Revere was designed by Chad Neal and published by SHYGUY LLC, first on 2026-10-01. It is open and permissionless on purpose — for holders everywhere, whichever venue their slab sits in. Build on it freely; the name, and the record of where it came from, stay with its author: PROVENANCE.md.
import { createPublicClient, http } from "viem";
import { polygon } from "viem/chains";
import { resolve } from "@reverefi/sdk";
const client = createPublicClient({ chain: polygon, transport: http() });
const slab = await resolve("CGC 6149683293", { client });
// {
// certId: "CGC:6149683293",
// slabs: [{ custodian: "courtyard", location: "eip155:137/erc721:0x251b…/1400…8522",
// holder: "0x0f92…1406", status: "held", attestations: [{ attesterName: "Revere attester #1 (SHYGUY LLC)", … }] }]
// }Why
Tokenized slabs live inside custodians: Courtyard on Polygon, Collector Crypt on Solana and its bridged copies. Today an offer on a slab is a marketplace account bidding inside one venue, and it follows the slab only while the slab stays there. Wallets often don't show slabs at all unless the metadata is perfect. Revere keys everything to the one identifier every venue agrees on: the cert.
How it works
"CGC 6149683293"
│ canonical form + keccak256 STANDARD.md §1–§3
▼
certKey 0x9543…183f ──► certAddress 0x7911…183f
│ EAS Indexer: attestations for this cert, §5
│ from the attesters you trust
▼
token 0x251b…/1400…8522 on Polygon (Courtyard)
│ ownerOf — read live, never stored §5
▼
holder 0x0f92…1406
│ offers: USDC escrowed on the slab's chain, §6–§9
│ funded from any chain over Circle CCTP
▼
accept = send the token to the escrow:
slab → buyer's settle address, USDC → seller, one transaction- Certs are addresses.
certKey = keccak256("CGC:6149683293"), the same on every chain. - Attestations link a cert to a token. Anyone can attest; each client chooses whom to trust. Attester #1 reads only what the token's own metadata says.
- The holder is never stored. It's read from the token at the moment you ask.
- Offers are funded or they don't exist. Money in escrow is the spam filter.
- The escrow has no owner, no admin, no upgrade, no pause and no fee.
Status
| Part | State |
|---|---|
| The standard (STANDARD.md) | draft v0.2 — breaking changes allowed until v1 |
| certKey, parseCert, locations | done — v0.2 strict per-grader shapes, 54 published vectors |
| Attestations on Polygon (EAS) | live: schema v1 registered, attester #1 attesting on demand |
| resolve(cert), offers(cert) | done |
| SDK 0.1: transaction builders (offer, accept, cancel, refund, CCTP funding), types | done — checked end to end on Polygon and Base forks against the deployed escrow, real USDC, Courtyard and Circle's TokenMessengerV2 (npm run e2e) |
| Offers: escrow v2 on Polygon (evm/) | live at 0xf906…D77F (Sourcify exact match), 2026-10-03 — 88 tests + 9 Polygon-fork tests against Circle's real contracts; AI audit by CertiK (Lite scan): 0 findings, 2026-10-03 (not a CertiK certification). v1 (0xc3b6…1a8b) retired; it held nothing |
| Offers from any chain (CCTP v2) | built into the escrow: fund from any CCTP chain; payouts and refunds to any |
| First live settlement | 2026-10-01: a real Courtyard slab for 1 USDC, accepted in one transaction (INFRASTRUCTURE.md) |
| Site (site/) | live at revere.fi — five swipeable panels, a live lookup on this SDK, label-QR scanning, a wireframe forge; strict CSP, everything self-hosted; polish check 15/15 |
| Accept page (app/) | a static page that accepts an offer from any wallet extension |
| Solana (Collector Crypt) | not started |
Contract and program addresses, verified on chain: INFRASTRUCTURE.md.
The escrow has had an AI audit, not a manual one. It's live so it can be used with small amounts while the rest of Revere is built. Don't escrow more than you'd be comfortable losing until a manual audit is published here.
Use it
npm install @reverefi/sdk viemimport { checkCert, resolve, offers, makeOffer, offerTxs, acceptTx } from "@reverefi/sdk";
const c = checkCert("CGC 6149683293"); // or { ok: false, message: "Just CGC and the cert number — …" }
const { slabs: [slab] } = await resolve(c.certId, { client }); // the attested token, its holder read live
const book = await offers(c.certId, { client });
// A buyer, on Polygon: approve exactly the price, then offer. Sign the two txs with any wallet.
const offer = makeOffer({ certKey: c.certKey, slab, price: 25_000_000n, days: 7, settleTo: me, buyer: me });
const [approve, make] = offerTxs(offer);
// The holder: one transaction moves the slab to the buyer and the USDC to the holder.
const accept = acceptTx({ holder: slab.holder, offer: book.offers[0] });From another chain, fundingTxs({ polygon, source: "base", offer, feeBps: await cctpFeeBps("base") }) builds the
approve and the CCTP burn — after the escrow has validated the offer, with the escrow as the only caller that can
deliver it. Then attestation("base", txHash) waits for Circle, and fundTx(…) delivers it on Polygon.
Every builder returns { chainId, to, data, value }: nothing here holds a key or sends anything.
Subpaths load less: @reverefi/sdk/cert is cert keys only (no viem), @reverefi/sdk/write the builders,
@reverefi/sdk/cctp Circle's sources, fees and attestations. Types ship with the package.
From a clone
npm install
npm test # rules, 54 vectors (cross-checked against viem), reads, builders
npm run types # a TypeScript consumer compiled against the published types
npm run e2e # the write path on Polygon + Base forks (needs foundry's anvil)
cd evm && forge test # the escrow (POLYGON_RPC=<url> adds the mainnet-fork tests)
node examples/resolve.mjs "CGC 6149683293" # a live lookup on PolygonAPI
| Function | Returns |
|---|---|
| checkCert(text) | { ok: true, grader, cert, certId, certKey }, or { ok: false, reason, message } — why it isn't a cert |
| parseCert(text) / certFromText(text) | a cert from text / from text or a grader's link (label QR), or null |
| certId(grader, cert) / certKey(grader, cert) / certAddress(key) | the canonical id / its bytes32 key / its EAS recipient |
| resolve(cert, { client, attesters? }) | the cert's slabs, with live holders (an RPC failure throws; only a revert is "gone") |
| offers(cert, { client, logsClient?, prior? }) | every offer on the cert, newest first, with its live status |
| offerIsFor(offer, slab) | whether an offer names the attested token — only then can the holder accept it |
| makeOffer({ … }) / checkOffer(client, offer) | an Offer checked as the escrow checks it / the escrow's own verdict, by error name |
| offerTxs(offer) | Polygon: approve exactly the price, then offer |
| acceptTx({ holder, offer, payout? }) | safeTransferFrom to the escrow with the acceptance data |
| cancelTx(id) / refundTx(id) / flushTx(domain, to) | the escrow's other paths |
| cctpFeeBps(source) / fundingTxs({ … }) / attestation(source, tx) / fundTx(a) | funding from another chain over CCTP v2 |
| evmBytes32 / solanaBytes32 | CCTP recipients (🔴 Solana: a USDC token account, not a wallet) |
| evmLocation / solanaLocation | CAIP-19 asset ids |
Contributing
The standard is a draft, and the place to argue with it is an issue. A change to §1–§3 changes every
cert key, so it needs test vectors and a reason. Run npm test before sending anything. See
CONTRIBUTING.md.
Security
See SECURITY.md. Never open a public issue for a vulnerability.
License
MIT © 2026 SHYGUY LLC. Revere is a project of Meex — revere.fi.
