feat(phase1): wallet scanner — scan API, classifier, token fetch, web UI

- @pyre/core: conservative classifier (classifyTokenAccount) + types + risk
  constants. EMPTY only when truly empty + classic-SPL + not frozen/delegated;
  Token-2022/unknown → UNSUPPORTED; frozen/delegated/NFT/valuable/over-threshold
  → PROTECTED_SKIP; TRANSMUTABLE only via explicit route hook (none in MVP).
  43 unit tests incl. a "never says safe" assertion.
- @pyre/solana: parseTokenAccounts (SPL + Token-2022 detection, NFT heuristic,
  rent, defensive owner cross-check) + tests. Tx builders remain Phase-2 stubs.
- @pyre/config: loadConfig() from env.
- @pyre/api: POST /api/scan — validates pubkey, recomputes classification
  server-side, CORS + rate-limit; DB persistence deferred. Live-RPC smoke OK.
- @pyre/web: wallet-connect (Wallet Standard) + grouped scan UI, ember theme,
  trust wording (no "safe"); next.config transpiles @pyre/core; prod build OK.

Built by 4 agents on a locked core contract; 2 audit agents (security: SOUND;
build: 1 blocker → fixed). Stripped .js import extensions in @pyre/core so
Turbopack resolves the source package. All typecheck + tests + build green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-31 03:10:52 +00:00
parent a294a8a9fb
commit 2101e18b3e
24 changed files with 2930 additions and 467 deletions

View File

@@ -147,10 +147,10 @@
<section class="overall">
<div class="overall-head">
<h2>Overall MVP Progress</h2>
<span class="overall-pct">16%</span>
<span class="overall-pct">27%</span>
</div>
<div class="bar"><span style="width: 16%"></span></div>
<p class="count">8 of 50 phase deliverables complete</p>
<div class="bar"><span style="width: 27%"></span></div>
<p class="count">14 of 51 phase deliverables complete</p>
</section>
<h2 class="section">Development Phases</h2>
@@ -172,19 +172,20 @@
<li class="item done"><span class="mark"></span><span>Environment templates</span></li>
</ul>
</article>
<article class="card todo">
<article class="card in_progress">
<header class="card-head">
<h3><span class="phase-id">Phase 1</span> Wallet Scanner</h3>
<span class="badge todo">TODO</span>
<span class="badge in_progress">IN PROGRESS</span>
</header>
<p class="count">0 / 6 complete</p>
<p class="count">6 / 7 complete</p>
<ul class="checklist">
<li class="item"><span class="mark"></span><span>Wallet connect frontend</span></li>
<li class="item"><span class="mark"></span><span>Scan endpoint</span></li>
<li class="item"><span class="mark"></span><span>Token account fetch</span></li>
<li class="item"><span class="mark"></span><span>Basic classification</span></li>
<li class="item"><span class="mark"></span><span>Scan results UI</span></li>
<li class="item"><span class="mark"></span><span>Protected/skipped UI</span></li>
<li class="item done"><span class="mark"></span><span>Wallet connect frontend</span></li>
<li class="item done"><span class="mark"></span><span>Scan endpoint (POST /api/scan)</span></li>
<li class="item done"><span class="mark"></span><span>Token account fetch (SPL + Token-2022 detect)</span></li>
<li class="item done"><span class="mark"></span><span>Basic classification (conservative, 43 tests)</span></li>
<li class="item done"><span class="mark"></span><span>Scan results UI (grouped)</span></li>
<li class="item done"><span class="mark"></span><span>Protected/skipped UI</span></li>
<li class="item"><span class="mark"></span><span>Deploy app + live-wallet e2e verification</span></li>
</ul>
</article>
<article class="card todo">

View File

@@ -23,14 +23,15 @@
{
"id": 1,
"name": "Wallet Scanner",
"state": "todo",
"state": "in_progress",
"items": [
{ "label": "Wallet connect frontend", "done": false },
{ "label": "Scan endpoint", "done": false },
{ "label": "Token account fetch", "done": false },
{ "label": "Basic classification", "done": false },
{ "label": "Scan results UI", "done": false },
{ "label": "Protected/skipped UI", "done": false }
{ "label": "Wallet connect frontend", "done": true },
{ "label": "Scan endpoint (POST /api/scan)", "done": true },
{ "label": "Token account fetch (SPL + Token-2022 detect)", "done": true },
{ "label": "Basic classification (conservative, 43 tests)", "done": true },
{ "label": "Scan results UI (grouped)", "done": true },
{ "label": "Protected/skipped UI", "done": true },
{ "label": "Deploy app + live-wallet e2e verification", "done": false }
]
},
{