π = π — Pi fungibility proof

A native Pi payment carries no observable per-unit mining origin on the Pi Mainnet ledger.

View the Project on GitHub aybvip/pi-fungibility

Index — every file, and what question it answers

A map of the repository. Two layers:

Every document is written in English (*.md).


Part 1 — By file

Root

| File | What it is | |—|—| | README.md | Start here. TL;DR, official sources, 4-layer proof, FAQ table, scope, runnable code | | PROOF.md | Step-by-step proof that an app owner cannot tell where π came from | | SCOPE.md | Precise scope: what is proven vs not claimed (+ independent verification) | | AUDIT-REQUEST.md | Audit status: not independently audited — what that means, and how to do one | | PRIOR-ART.md | Prior art: what already existed, what was searched, what appears new — and what is explicitly not claimed | | FALSIFICATION.md | Falsification criterion: the four things that would kill the claim, how to try each, and what does not count | | VERIFICATION.md | Verification status: last verified date, what ran where (local vs CI), live Mainnet vs offline layers, how to read a red build, and what is not verified | | CONTRIBUTING.md | How to contribute: report findings, zero-dep rules, add a FAQ | | THREAT-MODEL.md | Threat model: assets, actors, capabilities, trust assumptions, attacks, out-of-scope | | SECURITY.md | Read-only by design: no wallet/passphrase/keys/signing/deps; how to audit | | DISCLAIMER.md | Independent & unofficial; no financial advice; no custody; no warranty | | SOURCES.md | All official sources, with verbatim quotes (§0–§22); §0 pins each source’s exact revision | | index.html | Website landing page (GitHub Pages) | | llms.txt | Machine-readable index for AI tools / LLM crawlers | | DEPLOY-MIRRORS.md | Mirrors: why GitHub Pages is canonical, how the mirror config keeps rel="canonical" on the canonical host, and the Netlify / Cloudflare Pages settings | | CITATION.cff | Citation metadata (GitHub “Cite this repository”) | | LICENSE | MIT |

Docs — FAQ (one per objection)

| File | Question it answers | |—|—| | FAQ-TRANSACTION-VS-COIN.md | “You can follow the transactions — so you can tell where the π came from?” → you can trace the transaction, never the coin (three levels + the honest account-level boundary) | | FAQ-RECIPIENT-CANNOT-TELL.md | “I mixed mined + bought π, then sent some — can the recipient tell?” (deterministic proof) | | FAQ-CAN-CORE-TEAM-SET-PRICE.md | “Can the Core Team set a different price by origin, or block sales?” (no — on-chain) | | FAQ-EXCHANGE-DEPOSIT-VERIFY.md | “Is an exchange’s balance really backed?” → three claims: A fungibility (proven), B a specific deposit (verifiable), C reserve backing (not claimed) | | FAQ-MICRO-PI-ID.md | “Every micro-π has its own ID” | | FAQ-SDK-PLATFORM-API-FIELDS.md | “Doesn’t the SDK / Platform API expose where the π came from?” (no — full field enumeration) | | FAQ-SMART-CONTRACTS-AND-TOKENS.md | “Pi now has Soroban smart contracts and ecosystem tokens — so you can tag a coin’s origin now?” (no — scalars only; tokens are a different asset) | | FAQ-MUXED-M-VS-G.md | “Exchanges use M addresses, not G” | | FAQ-EXCHANGE-ADDRESSES-OBSERVED.md | “These two exchange addresses — can you trace a coin’s origin?” | | FAQ-TAX-SOURCING.md | “Bought vs mined — what does the ledger see?” (nothing; off-chain records are a different evidence source) | | FAQ-SOURCE-VS-PRIVILEGES.md | “Same price, but different privileges?” — PiPower / Engagement Score (PiRC1, Pi Launchpad): account-bound, never a second price for π | | MICA-WHITEPAPER.md | “The MiCA whitepaper says Pi comes only from mining” | | FAQ-DONT-BUY-PI.md | “Pi once said don’t buy Pi” (Enclosed Mainnet; ended 2025-02-20) | | FAQ-FUNGIBILITY-VS-PRICE.md | “Same coin ≠ same price” | | FAQ-UNOFFICIAL-REPO-SCAM.md | “It’s an unofficial GitHub repo — must be a scam/phishing” | | FAQ-TAINT-CONTAGION.md | “If tainted π touches my wallet, doesn’t the taint spread through my whole balance?” → no taint field; the allocation problem; the transitive reductio; the honest account-level boundary | | FAQ-ALL-OBJECTIONS.md | Full catalog of every remaining objection (groups A–E) |

Examples — runnable proofs (zero dependencies)

| File | What it does | |—|—| | provenance-check.mjs | Reads a real tx on-chain; shows there is no origin field | | memo-check.mjs | Samples 200 real Mainnet txs; shows most carry no memo (memo_type: "none") — memo is optional sender text, not provenance | | falsify-try.mjs | Falsification attempt (F1/F3): enumerates every key on a real payment and scans for origin-like tokens; exits non-zero on a hit | | coin-id-check.mjs | Shows the balance is one scalar — no per-unit ID | | mixing-check.mjs | Live demo: commingling → scalar balance → origin-less payment | | verify-deposit.mjs | Verifies a specific transfer is a real native Pi payment on Mainnet (Claim B) | | self-test.mjs | Automated checks: offline unit tests (same-op rule, failed-tx gate) + offline transport-failure handling (HTTP 500/429, invalid JSON, connection failure, timeout) + online end-to-end | | model-check.mjs | Executable ledger model + property check (2000 seeds, offline): scalar state, non-injective history→state | | exhaustive-check.mjs | Exhaustive bounded check (offline): enumerates all 1452 histories; origin-invisibility for every one | | run-all.mjs | Runs every check and prints a summary (--offline to skip network) | | lib.mjs | Shared helpers: read-only API client (timeout + clear errors on HTTP/JSON/connection failures), strkey validation | | regenerate-snapshots.mjs | Maintenance tool: rewrites the *-output.txt snapshots as clean UTF-8/LF | | app-payment-flow/frontend.html | Official Pi.createPayment flow (U2A) | | app-payment-flow/server.js | Backend handling PaymentDTO; prints its keys | | payment-dto-sample.json | Sample PaymentDTO showing the missing origin field | | *-output.txt | Committed outputs of the scripts (expected results) |


Part 2 — By question

The objection / question Where to look
Are mined π and exchange π the same? README.md TL;DR · PROOF.md
Can the recipient tell mined from bought (after mixing)? FAQ-RECIPIENT-CANNOT-TELL.md
Can’t you just follow the transactions and see which π came from where? FAQ-TRANSACTION-VS-COIN.md
Doesn’t the transaction graph reveal the origin? SCOPE.md §4 · FAQ-RECIPIENT-CANNOT-TELL.md §3
Every micro-π has an ID? FAQ-MICRO-PI-ID.md
Doesn’t the SDK / Platform API expose the origin? FAQ-SDK-PLATFORM-API-FIELDS.md
Do Soroban smart contracts / ecosystem tokens change fungibility? FAQ-SMART-CONTRACTS-AND-TOKENS.md
Exchanges use M, not G? FAQ-MUXED-M-VS-G.md
Two concrete exchange addresses (Bitget/OKX) — what do they show? FAQ-EXCHANGE-ADDRESSES-OBSERVED.md
Bought vs mined — what does the chain see vs off-chain records? FAQ-TAX-SOURCING.md
Same price, but different privileges (history-based)? FAQ-SOURCE-VS-PRIVILEGES.md
What is PiPower, and does a launchpad discount create “premium π”? FAQ-SOURCE-VS-PRIVILEGES.md §Official corroboration
Can the Core Team set a different price / block sales? FAQ-CAN-CORE-TEAM-SET-PRICE.md
Is an exchange’s on-chain balance really backed? FAQ-EXCHANGE-DEPOSIT-VERIFY.md
The MiCA whitepaper says “only through mining”? MICA-WHITEPAPER.md
“Pi said don’t buy Pi”? FAQ-DONT-BUY-PI.md
Same coin but different price? FAQ-FUNGIBILITY-VS-PRICE.md
Is this repo a scam / phishing? FAQ-UNOFFICIAL-REPO-SCAM.md · SECURITY.md · DISCLAIMER.md
What exactly is proven — and not? SCOPE.md
Has this been independently audited? AUDIT-REQUEST.md
Has anyone else already proven this — are you first? PRIOR-ART.md
How would someone disprove this? FALSIFICATION.md
Has anyone actually run this, when, and where? VERIFICATION.md
Who could attack this, and what do we assume? THREAT-MODEL.md
Does “taint” spread to the rest of my balance? FAQ-TAINT-CONTAGION.md
Any other objection (lockups, KYC, governance…)? FAQ-ALL-OBJECTIONS.md
Which official sources back all this? SOURCES.md

Part 3 — Run the proofs

node examples/run-all.mjs            # everything at once (+ summary); add --offline to skip network

node examples/self-test.mjs          # 34 offline checks + 3 online end-to-end (37 total)
node examples/model-check.mjs        # offline ledger model + property check (2000 seeds)
node examples/exhaustive-check.mjs   # offline exhaustive bounded check (all 1452 histories)
node examples/provenance-check.mjs
node examples/coin-id-check.mjs
node examples/falsify-try.mjs
node examples/verify-deposit.mjs <TXID> [TO_ADDRESS]
node examples/mixing-check.mjs
node examples/mixing-check.mjs <SENDER_ACCOUNT>

Node 18+ · zero dependencies · read-only (see SECURITY.md).


π = π. Proven: a payment carries no observable per-coin origin. Not claimed: price, identity-hiding, IOU equivalence, reserve backing, independent audit. See SCOPE.md · AUDIT-REQUEST.md.