How it works

The exact checks, in the order they run, each with the line of source that makes the sentence true. lib.rs is programs/fairproof/src/lib.rs, the on-chain program; verify.ts is web/verify/src/verify.ts, the verifier your browser runs; README.md under web/verify documents it.

1. The launch transaction: the program refuses, it does not annotate

2. What the verifier checks, every time someone looks

Locked & Fair only when all ten checks pass: the proof exists and is authentic, the vault is authentic and still holds the recorded LP, the mint account is real, the LP mint is real, the lock is still active by chain time, mint authority renounced, freeze authority renounced, no Token-2022 control surface, and the locked share meets the minimum.

source: verify.ts:12-25, 169-180

3. Token-2022 policy: the table, not a summary

Renouncing both base authorities is not enough on Token-2022: a mint can keep a control surface in an extension. The program’s gate reads the base authorities; the verifier decodes every extension on the mint and refuses to badge one that keeps a post-launch control surface. FairProof will not badge such a launch.

ExtensionVerdictCondition
PermanentDelegateNot Fairwith a delegate set
TransferHookNot Fairwith a program or authority
TransferFeeConfigNot Fairwith a live authority, or an immutable 100% fee
PausableNot Fairwith an authority, or paused
MintCloseAuthorityNot Fairset
DefaultAccountStateNot Fairfrozen
NonTransferableNot Fairpresent
InterestBearing / ScaledUiAmount / ConfidentialTransferFeeNot Fairwith an authority
Any account-only or unrecognised extension; any malformed payloadNot Fairalways
Metadata and group pointers; confidential-transfer configurationDisclosed, not refusedshown on the page
Immutable transfer fee below 100%Disclosed, not refusedshown with its basis points
source: web/verify/README.md:163-175; verify.ts:290-375

4. The four verdicts

Labels are code constants. Precedence: Not Verified beats Expired beats Not Fair beats Locked & Fair. No fallback can produce Locked & Fair.

source: verify.ts:149-154, 32-33

Samples of the reference badge art, not live launches.

5. Expiry, honestly

Lock Expired means the unlock time has passed or the LP has been withdrawn, and the page says so: “LP is withdrawable.” It is never shown as Locked & Fair, and a badge pasted while the lock was active turns amber the moment chain time passes the unlock date — the embed points at the live badge, never at a state.

source: verify.ts:26, 826-829; web/page/src/render.ts:216-219; web/badge/src/badge.ts:164-168

Two consequences worth reading twice. First, “LP locked” without a date and a share is not a FairProof statement; the page always shows both. Second, a lock does not stop the LP mint’s own supply from growing if the DEX that issued it keeps its mint authority — that is why the locked share is recomputed from live supply on every read, and why the scope statement exists.

6. The proof page and the badge

Scope, glossary, verdict semantics and privacy in the docs →