Attestations
Every cell and the Grid root carry an attestation envelope — a portable, self-describing reference to the signed proof. Validated by attestation.schema.json. Verification MUST NOT require trusting any sink, server, or vault.
Envelope shape
{
"format": "eas-onchain",
"uid": "0x394d…",
"uri": "eas://8453/0x394d…",
"attester": "did:pkh:eip155:8453:0x…",
"iat": "2025-06-01T12:00:00.000Z",
"value_hash": "0xabc…",
"exp": "2026-06-01T12:00:00.000Z",
"revocation": { "method": "eas", "uri": "eas://8453/0x…" }
}| Field | Required | Meaning |
|---|---|---|
format | yes | How the attestation was produced (see formats below) |
uid | yes | Unique id: EAS uid for eas-*, JWS jti for jws-ed25519, etc. Used as merkle leaf for the root. |
uri | yes | Location of raw attestation. Schemes: eas:, eth:, ipfs:, https:, data: |
attester | yes | DID of the signer. Recovered key MUST resolve to this DID. |
iat | yes | Issued-at (ISO-8601) |
value_hash | yes | H(JCS(cell.value)) for cells; merkle root for root attestation. See Canonicalization. |
nbf, exp | no | Not-before / expiry windows |
revocation | no | Pointer to revocation status (eas or status-list-2021) |
payload | no | Base64url raw signed payload for fully offline verification |
Formats
| format | Description |
|---|---|
eas-onchain | Ethereum Attestation Service record on-chain (gridz.bio production). Revocable via EAS. |
eas-offchain | EAS off-chain attestation with the same logical fields |
eip712-raw | Raw EIP-712 signature over GridzCell / GridzRoot |
eip712-oneclaw | Byte-for-byte identical to eip712-raw at verification; suffix records 1Claw HSM provenance only |
jws-ed25519 | Ed25519 JWS over JCS payload (Solana, passkeys-adjacent flows) |
cose-webauthn | WebAuthn / COSE attestation; attester typically did:key |
EIP-712 structs
Defined in eip712-types.ts. Domain:
{
name: "Gridz",
version: "1",
chainId: <chain>,
verifyingContract: <GridzResolver proxy address>
}GridzCell
Primary type for a single cell attestation:
| Field | Type | Meaning |
|---|---|---|
gridId | bytes32 | Stable Grid id (see canonicalization) |
key | string | Cell key verbatim, e.g. com.github |
valueHashHex | string | keccak256(JCS(value)) as 0x hex |
widgetTypeHash | bytes32 | keccak256(utf8(widget_type ?? "")) |
expiresAt | uint64 | Unix seconds; 0 = never |
nonce | uint64 | Monotonic per (gridId, key); prevents replay of stale values |
GridzRoot
Primary type for the Grid root attestation:
| Field | Type | Meaning |
|---|---|---|
gridId | bytes32 | Same gridId as cells |
merkleRoot | bytes32 | Sorted merkle root over cell attestation UIDs |
schemaVersion | string | e.g. gridz/1.0.0 |
cellCount | uint64 | Number of merkle leaves |
issuedAt | uint64 | Unix seconds |
EAS schemas
On-chain EAS registrations mirror the EIP-712 logical fields. EAS carries refUID and time in its envelope instead of embedding nonce / issuedAt in the schema string.
gridz.cell.v1
bytes32 gridId, string key, string valueHashHex, uint64 expiresAt, bytes32 widgetTypeHash
Revocable. Used for every published cell on gridz.bio (Base mainnet).
gridz.root.v1
bytes32 gridId, bytes32 merkleRoot, string schemaVersion
Revocable. Binds the full cell set when a root attestation is published.
gridz.bio publish flow
- Browser wallet signs
GridzCellvia EIP-712 (user holds keys). - Client POSTs signed payload to
/api/publish. - Registrar contract calls EAS
attestandGridzResolver.setCellAttestationon Base (registrar pays gas). - Profile read path loads cells from resolver + EAS and assembles the Grid JSON with
format: "eas-onchain"envelopes.
Details: On-chain (Base), Using gridz.bio.