Skip to main content

Parallel analysis lane

[← Source sessions](/audits/fable/key-sessions) · [Transcript archive](/audits/fable/transcripts) · [Executive summary](/audits/fable/findings-summary)
# Parallel analysis lane | Field | Value | | --- | --- | | Session ID | `ccc13607-f742-4b18-95c7-6ed08d80885f` | | Lead session | `d6b4e576-1fc1-496b-bbb9-ab75f9e0af0d` | | Record type | Parallel workstream export | :::note[Appendix record] Readable export of a supplementary review session. Tool outputs and system context are omitted; download the [JSONL archive](/audits/fable-chats-4626-2026-06.zip) for the complete log. ::: ## Engagement brief

Explore the file /home/akitav2/projects/4626/frontend/src/pages/deploy/DeployVault.tsx (it is ~10,800 lines) and its sibling files in /home/akitav2/projects/4626/frontend/src/pages/deploy/ (e.g. deployVaultHelpers.ts and anything else in that folder).

I need a structural map to plan a UI/UX redesign that preserves ALL logic. Report:

  1. The list of sibling files in frontend/src/pages/deploy/ with one-line descriptions.
  2. In DeployVault.tsx: the major top-level sections in render order (hero/header, launch checklist, creator coin card, phase sections 1/2/2b/3/4, dry-run panel, role policy health, CTA/deploy button, export plan JSON, etc.) with approximate line ranges.
  3. Key state variables / hooks used (deploy status state, dry-run state, readiness/preflight checks, admin checklist, vanity plan, batcher config, session gating). List the most important useState/useMemo/useEffect clusters and any reducer/state-machine if present.
  4. How addresses are rendered today — is there an existing address row component or inline JSX? How copy buttons / BaseScan links / local-fork labeling are done.
  5. What sub-components already exist that are imported into DeployVault (e.g. ShareBridgeFinalizeWiringPanel, AddOwnerSigningPanel, anything under src/components related to deploy).
  6. How the "1-Click Deploy" CTA gating works (what conditions enable it) and the dry-run button flow at a high level.
  7. Any existing CSS/Tailwind patterns or design tokens used on this page (class names, btn-* usage, components/ui imports).

Be thorough — medium-to-very-thorough. Return a structured report with line ranges so I can plan a decomposition.

Analysis

Mapping the deploy folder and scanning DeployVault.tsx structure for sections, state, and components.

[REDACTED]

Tools invoked: UpdateCurrentStep, Glob, Grep, Grep

Analysis

[REDACTED]

Tools invoked: Grep, Grep, Grep, Read, Read, Read

Analysis

[REDACTED]

Tools invoked: Read, Read, Grep, Grep

Analysis

[REDACTED]

Tools invoked: Grep, Read, Read, Read, Read

Analysis

[REDACTED]

Tools invoked: Grep, Read, Read, Read, Read, Read

Analysis

[REDACTED]

Tools invoked: Grep, Read, Read, Read, Read, Read

Analysis

[REDACTED]

Tools invoked: Read, Read, Grep, Read, Read, Glob

Analysis

[REDACTED]

Tools invoked: Grep, Read, Read, Grep

Analysis

[REDACTED]

Tools invoked: Grep, Read, Read, Read

Analysis

[REDACTED]

Tools invoked: Grep, Read, Grep

Analysis

[REDACTED]

Tools invoked: Read, Read, Grep, Read

Analysis

[REDACTED]

Tools invoked: Read, Grep, Grep

Analysis

[REDACTED]

Tools invoked: Grep, Read, Read

Analysis

[REDACTED]

Tools invoked: Read, Grep, Read

Analysis

[REDACTED]

Tools invoked: Read, UpdateCurrentStep

Analysis

[REDACTED]

Tools invoked: Grep

Analysis

Deploy Vault structural map

For a UI/UX redesign that preserves logic, treat DeployVault.tsx as three layers: module-level constants/ABIs (~lines 1–2271), DeployVaultBatcher (deploy engine + plan UI, ~2375–8432), and DeployVaultMain (page shell + gating, ~8434–10812). There is no useReducer — state is useState + many useQuery/useMemo/useEffect clusters.


1. Sibling files in frontend/src/pages/deploy/

FileOne-line description
DeployVault.tsxMonolithic page: error boundary, ~4k lines of ABIs/helpers, DeployVaultBatcher (session submit/dry-run/plan UI), DeployVaultMain (auth/gating shell).
deployVaultHelpers.tsPure vanity/address/normalization helpers, salt search messages, share-OFT vanity start — extracted for unit tests.
deployVaultSignatureUtils.tsAA signature extraction, debug logging, timeout helpers — side-effect-free except optional logger.
deployVaultSignals.tsTimeline progress derivation, provider-collision detection, share-vanity skip log keys.
deployVaultVanityPersistence.tslocalStorage cache for vanity plan version/salt search outcomes.
Deploy.tsx/deploy landing: lazy-loads DeployChoiceCards with SEO shell.
DeployChoiceCards.tsx3D WebGL coin vs vault chooser cards linking to /deploy/coin and /deploy/vault.
DeployCoin.tsx/deploy/coin — header + LaunchCoinCard for Zora Creator Coin launch.
DeployVaultDryRun.test.tsStatic wiring tests: dry-run route, local-fork gate, H-2 busy-lock regression.
deployVaultVanity.test.tsUnit tests for vanity search helpers in deployVaultHelpers.ts.
deployVaultVanityPersistence.test.tsTests for vanity plan localStorage persistence.
deployVaultSignals.test.tsTests for timeline/signal helpers.

2. DeployVault.tsx — top-level structure & render order

File regions (for decomposition)

RegionLines (approx.)Role
Imports + constants1–155Wagmi/Privy, @/lib/deploy/*, @/features/deploy-vault/deploySteps, UI imports
ABIs, types, utilities156–903EntryPoint assert, error patterns, DeployVaultErrorBoundary, sanitizeDeployVaultError
export function DeployVault()968–996Privy-disabled shell → else wrap DeployVaultMain in boundary
More ABIs + batcher ABIs1066–2271Large inline contract ABIs used by submit/preflight
AddressRow2273–2334Inline address row component
Role policy label parsers2336–2373Pure helpers for role-policy UI
DeployVaultBatcher2375–8432All deploy execution, queries, plan timeline, CTAs
DeployVaultMain8434–10812Page layout, identity/gating, mounts DeployVaultBatcher

DeployVaultMain render order (~10249–10811)

SectionLinesNotes
Page shell10249–10253vault-shell, PageMeta, cinematic-section, max-width container
Hero / header10255–10323Label “Deploy”, headline, Coin/Vault tab pills, Base pill
External signer nudge10269–10317Amber motion.div when Privy authed but !smartWalletCapabilityReady — Rabby/MetaMask/CBW connect
One-time owner approval10325–10425Purple panel #owner-approval-setup: prolink, copy, Base Account connect, Approve Once
Deployment status10427–10467DeploymentSuccess / AlreadyDeployedBanner, pending/stale local record banners
Post-deploy vault icon10469–10487VaultImageGenerator when alreadyDeployed
Admin launch checklist10489–10525Admin-only; min coin age input + firstLaunchChecklist dots
Main card (vault-surface)10527–10804Only when !alreadyDeployed
Creator coin review10530–10603Zora avatar, name/symbol, full address string, coin-type pill, auth warnings
Deploy subsection10605–10803Label “Deploy”, long if/else auth/gating ladder, then DeployVaultBatcher or disabled button
Deploy blocker footer10758–10788deployBlocker copy + optional LaunchCoinCard / Zora handoff
Debug toggle10791–10798cv:debug localStorage toggle
Deposit footnote10800–1080250M token deposit note

Note: There is no manual creator-token input in JSX. creatorToken is autofilled from Zora profile (wagmi or Privy wallet) or set via LaunchCoinCard.onCoinCreated. URL ?token= is stripped (8890–8900) but never read into state.

DeployVaultBatcher render order (~7490–8430)

SectionLinesNotes
Intro copy7490–7520Server-continue vs 4-op explanation; stale auth warning
Vanity notices7509–7520Custom/default vanity messages
Deployment plan (<details>)7522–8191Collapsible “Canonical stage timeline”
↳ Setup / workflow7541–7584Timeline summary, owner approval, initial deposit, active batcher, deploy mode
Phase 17586–7670Core vault/wrapper/share + shared infra rows
Phase 2 core7672–7727Gauge/CCA/oracle + phase2 shared infra
Pipe A / Share bridge7728–7736ShareBridgeFinalizeWiringPanel
Phase 2b OVault mesh7737–7883Solana lanes, explorer links, mesh status grid
Phase 2 finalize rows7884–7941Burn stream, payout router, policy controller, payout recipient
Phase 37944–8098Strategies + impairment claims/escrow + Charm/Ajna addresses
Phase 48100–8136Auction + CCA floor + cleanup stage
Export / dry-run8138–8190Buttons + dry-run result/failure detail
ERC-4337 summary8193–8205Sender address + smart-wallet balance
Runtime batcher warning8207–8223Dismissible amber banner from /api/deploy/config
Role policy health8225–8328Diagnostics query + canary override input
1-Click Deploy CTA8330–8378Primary button or “ERC-4337 Setup Required” panel
Disabled reason / errors / tx8380–8429Amber blocker, red error (with Basescan tx links), submitted tx id

3. Key state, hooks, and logic clusters

No reducer / state machine

Phase tracking uses phase string union ('idle' \| 'phase1' \| … \| 'done') plus lastSessionStep from server polling — not a formal reducer.

DeployVaultMain — primary state (~8434+)

ClusterMechanismPurpose
Auth / walletsusePrivy, useWallets, useSmartWallets, useAccount, useSiweAuth, useAccountMeSession, embedded EOA, canonical CSW, external EOA
creatorTokenuseState('') + autofill effects (8988–9007)Creator coin address (profile-driven)
Owner-installaddPrivySmartWalletOwner*, auto-retry effects (~9945+)One-time Privy smart wallet as CSW owner
External connectexternalWalletConnectBusy/Error, connectExternalSignerWalletRabby/MetaMask/CBW for deploy signing
AdminminCoinAgeDays, isAdmin via /api/auth/adminLaunch checklist tuning
Deployment trackinguseDeploymentTracker, justCompletedDeployment1 deploy per CSW per version; auction completion gate
IdentityresolveCreatorIdentity, owner queries, identityBlockingReasonCanonical CSW vs connected wallet
EligibilityevaluateDeployEligibility, canDeploy, deployBlockerPage-level deploy gate (10064–10242)
Infra readinessbytecodeInfraQuery, entryPointBytecodeQuery, creatorAllowlistQueryBatcher, bytecode store, allowlist, EntryPoint
Market floormarketFloorQueryCCA floor display (UI reference)
Derived namesderivedShareSymbol/Name, derivedVaultSymbol/Name (9068–9087)Token naming for deploy payload

DeployVaultBatcher — primary state (~2375+)

StateLinesPurpose
batcherOverride, deploymentVersionOverride2447–2449Sync from /api/deploy/config
busy, phase, phaseTxs, txId, lastSessionStep2579–2602Live deploy progress
dryRunBusy, dryRunResult, dryRunError2580–2582Local-fork dry-run
exportBusy, exportStatus2583–2584Plan JSON download
runtimeBatcherConfigError, runtimeBatcherWarningDismissed2586–2587Runtime config warning
ovaultMeshStatus, seenOvaultMeshStep2591–2592Phase 2b mesh preflight
rolePolicyOverrideInput2607–2611Canary role-policy ID
Session persistencedeploySessionStorageKey, persistDeploySession, loadDeploySessionlocalStorage session resume
Vanity cachesshareOftVanityCacheRef, vaultVanityVersionCacheRefWASM/version search memo

Major query clusters (DeployVaultBatcher)

  • rolePolicyDiagnosticsQuery/api/deploy/v2/session/role-policy/resolve
  • batcherInfraQuery / batcherSharedInfraQuery — on-chain batcher modules
  • vanityPlanQueryresolveDeployVanityPlan
  • expectedAddressesQuery — deterministic CREATE2 plan
  • mainnetAddressCodeQuery — fork vs mainnet bytecode (local-fork labeling)
  • Runtime config effect (3453–3485) — fetches /api/deploy/config, sets overrides

Session / submit hook

  • useDeploySessionV2() (2761): postSessionRequest, pollSession
  • submit() (~4555–7233): builds plan, creates session, UserOps / server-continue, phase orchestration
  • exportPlan() (7235–7261): submit({ planOnly: true, validateDepositBalance: true }) → JSON blob download
  • runDryRun() (7263–7288): planOnlyPOST /api/deploy/v2/session/dry-run

Timeline helpers

Imported from @/features/deploy-vault/deploySteps: DEPLOY_TIMELINE_STAGES, timelineStageFromDeployStep, etc.
Progress UI uses deployVaultSignals.ts: deriveDeployTimelineProgressState, summarizeDeployTimelineProgress.


4. Address rendering today

Primary component: inline AddressRow (2273–2334)

Not a shared @/components export — lives in this file.

Props: label, address, deployed?, forkOnly?, variant?: 'default' \| 'shared', dryRunPassed?

Behavior:

  • Full address in font-mono, right-aligned
  • forkOnly: amber text + (local fork)no Basescan link
  • deployed === false: (pending); null: (checking…)
  • Live on mainnet: <a href="https://basescan.org/address/{a}"> — full address, not truncated
  • No copy button on AddressRow (copy exists only on owner-approval prolink, 10354–10371)

Truncation helper: shortAddress (775) used in prose, checklist hints, errors — not in AddressRow links.

Solana addresses: bytes32ToSolanaAddress + solanaExplorerAddressUrl (818+) — direct Solana explorer links in Phase 2b block (7777–7847), separate from AddressRow.

Tx links: hrefForTxhttps://basescan.org/tx/{hash} for phase “view tx” and error parsing (3365–3370, 8388–8400).


5. Sub-components imported into DeployVault

From @/components/deploy/

ComponentUsed inRole
ShareBridgeFinalizeWiringPanelDeployVaultBatcher ~7729Pipe A finalize wiring preflight
RequestCreatorAccessDeployVaultMain gating ladder ~10645+Allowlist denied / error
DeploymentSuccess, AlreadyDeployedBannerDeployVaultMain ~10429+Post-deploy / already-deployed
VaultImageGeneratorDeployVaultMain ~10480Post-deploy AI token icon

Not imported: DeployStrategies.tsx (exists in folder but unused here).
Not imported: AddOwnerSigningPanel — owner install is inline in the purple panel (~10325–10425).

From other feature areas

ComponentRole
LaunchCoinCard (@/features/waitlist/LaunchCoinCard)Creator coin creation when blocked (~10772)
PageMetaSEO
Button, LoadingInline, LoadingText@/components/ui/*

Internal (same file)

  • DeployVaultErrorBoundary (905–966)
  • AddressRow (2273–2334)
  • DeployVaultBatcher (2375–8432)
  • DeployVaultMain (8434–10812)

6. CTA gating — two layers

A. Page gate: canDeploy (DeployVaultMain, 10064–10085)

All must be true before DeployVaultBatcher mounts:

  • Valid creator coin address + Zora CREATOR type
  • canonicalIdentityType === 'contract'
  • Coin age ≥ minCoinAgeDays (admin-tunable)
  • Authorized deployer (!identityBlockingReason)
  • Allowlist success + pass (or disabled mode)
  • Derived share/vault names/symbols
  • connectedWalletAddress present
  • CSW holds ≥ 50M creator tokens (fundingGateOk)
  • Batcher configured + bytecode infra OK
  • Solana override inputs valid (if set)
  • deployEligibility.canProceedWithDeploySession
  • smartWalletCapabilityReady

smartWalletCapabilityReady (10020–10027): strict no-EOA → embedded/smart-wallet owner; else Coinbase Wallet direct, embedded owner, connected EOA owner, or Privy smart wallet paths.

Above DeployVaultBatcher: long conditional chain (10612–10755) handles sign-in, allowlist, identity, batcher, balance, owner approval scroll-target, etc.

B. Batcher gate: disabled + hasDeploySignerPath (DeployVaultBatcher)

disabledReason (7309–7327) blocks the 1-Click Deploy button when:

  • busy, role-policy parse error, batcher infra loading/error, vanity plan loading, expected-addresses loading/missing

hasDeploySignerPath (7332–7334): must have a viable ERC-4337 signer lane (same strict/default rules as above).

1-Click Deploy button (~8349–8357):

disabled={disabled || exportBusy || dryRunBusy}
onClick={() => void submit()}

Label: '1‑Click Deploy (Gas-Free)' when not busy.

If !hasDeploySignerPath, shows amber ERC-4337 Setup Required panel instead (8360–8377).

Dry-run flow (high level)

  1. Gate: dryRunLocalForkRpc = isLocalForkRpcUrl(VITE_BASE_RPC) — button hidden outside local fork; shows pnpm run dev:deploy-dry-run hint (8148–8161).
  2. Click Run dry-run: runDryRun() sets dryRunBusy, clears prior results.
  3. Plan build: submit({ planOnly: true }) — same path as deploy but no chain submission.
  4. API: POST /api/deploy/v2/session/dry-run with plan.sessionCreateRequest, timeout from VITE_DEPLOY_DRY_RUN_REQUEST_TIMEOUT_MS.
  5. UI: normalizeDryRunResponse → success/failure message; phase rows get green ✓ via dryRunPassed on AddressRow.
  6. Safety: dryRunBusy also blocks submit() and export (H-2 regression test).

Export Plan JSON: same planOnly path with validateDepositBalance: true, downloads deploy-plan-{token}-{ts}.json.


7. CSS / Tailwind / design tokens

Layout / brand shells (global classes, not raw btn-*)

  • vault-shell — page wrapper
  • cinematic-section — section spacing
  • vault-surface, vault-surface-muted, vault-hover-lift — cards
  • vault-pill — Base chain badge
  • label, headline — typography (hero)
  • text-brand-primary, text-brand-accent — coin avatar fallback gradient

Color system (heavy inline Tailwind)

  • Zinc scale for body/copy (text-zinc-400/500/600, borders border-zinc-900/50)
  • Amber panels: warnings, identity mismatch, owner/setup (border-amber-500/25, from-amber-500/16)
  • Purple owner-approval panel
  • Emerald success / dry-run pass / creator coin pill
  • Sky shared-infra rows in plan (variant="shared" on AddressRow)
  • Blue dry-run in-progress, primary actions via Button variant="primary"

UI components (preferred over legacy btn-*)

  • Button from @/components/ui/Buttonvariant="primary" \| "secondary"
  • LoadingInline, LoadingText from @/components/ui/LoadingState
  • Disabled CTAs still use raw <button className="w-full py-4 bg-black/30 border border-zinc-900/60 …"> in the gating ladder (not <Button>)

Motion

  • framer-motionmotion.div on external-signer nudge and creator coin review expand (10531–10535)

Icons

  • lucide-react: ChevronDown, ExternalLink

Suggested decomposition boundaries (for redesign)

Extract targetCurrent linesRationale
DeployVaultPlanTimeline.tsx7522–8191Largest UI block; pure display + AddressRow
DeployVaultAddressRow.tsx2273–2334Reused ~40× in timeline
DeployVaultOwnerApprovalPanel.tsx10325–10425Distinct purple flow
DeployVaultGatingLadder.tsx10612–10755Long if/else → state machine UI
useDeployVaultPageState.tsDeployVaultMain hooksIdentity, canDeploy, queries
useDeployVaultSession.tsDeployVaultBatcher submit/pollKeep submit/dry-run/export intact
ABIs → deployVaultAbis.ts1066–2271Shrinks file ~1.2k lines with zero behavior change

This map should let you redesign layout/copy/visual hierarchy while keeping submit(), canDeploy, session storage, and query keys as the logic boundary.

[REDACTED]