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…" }
}
FieldRequiredMeaning
formatyesHow the attestation was produced (see formats below)
uidyesUnique id: EAS uid for eas-*, JWS jti for jws-ed25519, etc. Used as merkle leaf for the root.
uriyesLocation of raw attestation. Schemes: eas:, eth:, ipfs:, https:, data:
attesteryesDID of the signer. Recovered key MUST resolve to this DID.
iatyesIssued-at (ISO-8601)
value_hashyesH(JCS(cell.value)) for cells; merkle root for root attestation. See Canonicalization.
nbf, expnoNot-before / expiry windows
revocationnoPointer to revocation status (eas or status-list-2021)
payloadnoBase64url raw signed payload for fully offline verification

Formats

formatDescription
eas-onchainEthereum Attestation Service record on-chain (gridz.bio production). Revocable via EAS.
eas-offchainEAS off-chain attestation with the same logical fields
eip712-rawRaw EIP-712 signature over GridzCell / GridzRoot
eip712-oneclawByte-for-byte identical to eip712-raw at verification; suffix records 1Claw HSM provenance only
jws-ed25519Ed25519 JWS over JCS payload (Solana, passkeys-adjacent flows)
cose-webauthnWebAuthn / 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:

FieldTypeMeaning
gridIdbytes32Stable Grid id (see canonicalization)
keystringCell key verbatim, e.g. com.github
valueHashHexstringkeccak256(JCS(value)) as 0x hex
widgetTypeHashbytes32keccak256(utf8(widget_type ?? ""))
expiresAtuint64Unix seconds; 0 = never
nonceuint64Monotonic per (gridId, key); prevents replay of stale values

GridzRoot

Primary type for the Grid root attestation:

FieldTypeMeaning
gridIdbytes32Same gridId as cells
merkleRootbytes32Sorted merkle root over cell attestation UIDs
schemaVersionstringe.g. gridz/1.0.0
cellCountuint64Number of merkle leaves
issuedAtuint64Unix 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

  1. Browser wallet signs GridzCell via EIP-712 (user holds keys).
  2. Client POSTs signed payload to /api/publish.
  3. Registrar contract calls EAS attest and GridzResolver.setCellAttestation on Base (registrar pays gas).
  4. 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.