- @pyre/solana: buildCloseEmptyAccountsTx (UNSIGNED v0 tx; re-validates each account on-chain — owner==wallet, balance==0, correct program, not frozen/delegated, Token-2022 EMPTY_CLOSE_ONLY via §7.1; rejects whole build on any ineligible account), simulateTransaction, decodeTransaction. Rent destination + close authority + fee payer all pinned to the wallet. - @pyre/api: POST /api/build/close-empty (server re-validates, 400 on ineligible) and POST /api/receipt (on-chain verified: meta.err==null, signer==wallet, rent from balance delta; lists only closes whose destination==wallet). - @pyre/web: select empty accounts → build → CLIENT-SIDE decode+match (7 checks: feePayer/all-closeAccount/dest==wallet/closed-set==selected==preview) gates signing → sign in wallet → send → confirm → on-chain receipt w/ explorer link. Built by 3 agents, reviewed by 2 audits (security: SOUND — no critical/high; integration: SHIP). Applied audit fixes: receipt destination check, doc/lint cleanup. typecheck 8/8, core 85, solana 19, web build green. Live-verified: the API refuses to build a close tx for a non-empty account (400). buildBurnTx remains a Phase-3 stub. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PYRE Status Dashboard
A static, self-contained dark "ember"-themed page the team uses to track PYRE MVP progress. It is a snapshot, not live telemetry.
Files
status.json— the single source of truth. All content on the page (phases, checklists, infra, dates, links) comes from here.index.html— the prebuilt rendered page. Committed so the page works even before anyone runs the generator. Self-contained: inline CSS, no external requests, no JS.README.md— this file.
Editing & regenerating
-
Edit
status.json— flip an item's"done"totrue, update a phase"state"(todo/in_progress/done), or bump"updated". -
Regenerate the page from the repo root:
node scripts/gen-status.mjsThe generator is dependency-free (plain Node ESM, no npm install). It reads
infra/status/status.jsonand rewritesinfra/status/index.html, recomputing the overall % complete from the item done-counts. It prints the output path when finished. -
Commit the regenerated
index.htmlalongside thestatus.jsonchange so the prebuilt page stays consistent with the data.
Deployment
The provision script deploys infra/status/* to /var/www/feedthepyre/status,
and nginx serves it as the site root (feedthepyre.com) until the real PYRE app
ships. Because index.html is prebuilt and self-contained, deployment is a plain
file copy — no build step or generator run is required on the server.