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.
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")));