Verifier

Check an attestation.

Paste the attestation id you were given. The API re-checks the Ed25519 signature and re-reads the balance at the current finalized block. If the service is unreachable it says so; it never guesses.

Reading the result: signature_valid says the document was issued by this desk and not altered. still_held says the balance is present right now at a finalized block. control says whether the address holder signed the id.

Result appears here.

Verify without this site

An attestation is designed to be checked with no dependency on flashrouter.io being up or honest.

Get the public key

Published at GET /v1/pof/key and pinned in the repository under api/worker/KEYS.md. The envelope's kid tells you which key signed it.

Canonicalize and check the signature

Remove the signature field, serialize the remaining object with keys sorted and no whitespace, and verify the Ed25519 signature over the UTF-8 bytes.

Re-fetch the balances by block hash

Ask any node for the balance at observation.start.hash and observation.end.hash. Both must be at least claimed. If either block hash is not finalized on the chain you are looking at, the attestation is not one of ours.

# Node 20+ — offline signature check
import { createPublicKey, verify } from "node:crypto";
const att = JSON.parse(process.argv[2]);          // the attestation JSON
const { signature, ...unsigned } = att;
const canon = JSON.stringify(unsigned, Object.keys(unsigned).sort());
const key = createPublicKey({ key: Buffer.concat([
  Buffer.from("302a300506032b6570032100", "hex"),   // Ed25519 SPKI prefix
  Buffer.from(att.public_key, "base64") ]), format: "der", type: "spki" });
console.log(verify(null, Buffer.from(canon), key, Buffer.from(signature, "base64")));