Every "Connect wallet" button looked for a connector with id "coinbaseWallet",
but wagmi's Coinbase connector registers as "coinbaseWalletSDK". The lookup
never matched, so the app always fell through to the generic injected
connector. Coinbase Smart Wallet could not be chosen, and in a browser with
no wallet extension the click failed with ProviderNotFound and no UI reacted:
a dead button. That also hid that @coinbase/wallet-sdk (an optional peer of
wagmi) was not installed; the production bundle carried a "Cannot find
module" stub in its place.
- lib/wallet-connectors.ts: pure module choosing which wallets to offer
(browser-announced EIP-6963 wallets first, the generic browser wallet only
when something is injected without announcing itself, Coinbase always) and
turning connect failures into plain text without echoing raw errors.
- components/WalletPicker.tsx: the connect dialog on the existing Sheet, one
in-flight request at a time, errors shown inline with role=alert, closes on
success. components/ConnectWallet.tsx: a button in the caller's styling
that opens it.
- Header, trade panel, launch form, posts composer and the /me dashboard all
connect through the picker; no component calls useConnect any more except
the picker, and a test pins that.
- @coinbase/wallet-sdk ^4.3.7 installed (registry tarball, integrity matches,
no eval or script/iframe injection; its origins were already in the CSP).
Verified in headless Chrome against the dev server: no wallet shows Coinbase
plus guidance and the Coinbase row waits on its popup; a fake EIP-6963 wallet
is listed, connects, and the header shows the address chip; a bare
window.ethereum is offered as "Browser wallet". Lint, typecheck, 279 tests
and a production build pass.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_0146kzimBSuHTErfKYhMCaic
next 16.3.1 -> 16.3.4 closes GHSA-2xp9-vwfh-vxw4 (unauthenticated RCE in the
Image Optimization API via AVIF; the /_next/image route is enabled by default
and reachable in production even though the app never uses next/image) and
GHSA-p293-qw3h-jr36 (unauthenticated RCE on Windows-hosted servers).
eslint-config-next moves in lockstep. js-yaml 4.3.2 clears the dev-only
GHSA-2883-xcg3-v3hh advisory under eslint. npm audit: 0 vulnerabilities.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EBa4QU3W9Ak65FwHSUs6hR
On top of the UI rebuild: light is the default again and every light token is the
original Clear Sky palette (guard test restored, adapted to @theme static); dark stays
behind the header toggle with its shadows and chart tokens. The shadcn CLI runtime
dependency and its registry config are removed (nothing imported it; 220 packages
gone). Empty-value placeholders read "—" again instead of "N/A", and the tests that
forbade the dash character are dropped. README banner and brand artwork restored.
Adds editServer.test.ts with 8 tests covering: RPC error returns 503 with
nonce intact, invalid signature returns 401 with nonce intact, valid
signature consumes nonce and writes metadata, already-used nonce rejected,
rate-limit DoS mechanism, cross-wallet isolation, 10 invalid-sig requests
do not freeze the wallet, non-creator nonce requests do not spend the
wallet bucket.
Test infrastructure: tsx dev dependency, tsconfig.test.json for path-alias
mocking of @/lib/db and @/lib/chain, db-mock.ts and chain-mock.ts for
mocked DB and RPC, test-loader.mjs for @/ path resolution. The test script
uses tsx with react-server conditions; test:unit preserves the original
node-only runner for pure-logic tests.
Combine the reviewed launchpad UI, chart normalization, transaction safeguards, and navigation fixes into one commit directly on main. Preserve the complete tested source tree, optional first-buy integration, and official X links.
Builds on the system-dark-mode work: the palette moves from a
prefers-color-scheme media query to a class on <html> so the reader can
choose. Dark is the default and carries the pure-black palette; light is
the unclassed base so the toggler's bare classList.toggle("dark") works.
- globals.css: light tokens in @theme, dark overrides in .dark, print
fallback to ink-on-white, View Transitions CSS for the toggle wipe.
Hero wash, progress bar and shadow system unchanged.
- ThemeProvider (next-themes, attribute="class", defaultTheme="dark") and
ThemeToggle wrapping MagicUI's animated-theme-toggler in controlled mode,
with a reduced-motion patch. Toggle sits in the header and the mobile menu.
- PriceChart re-reads its colours when the html class changes; volume bars
and gridlines come from tokens instead of hardcoded light rgba.
- Sheet scrim gets its own token so it stays dark in both themes; the warm
filled button uses warm-ink to keep AA.
- theme.test.ts checks the class-based ramp: AA contrast in both themes,
every base token has a dark counterpart, no .light rule, print fallback.
openlaunch — launch a token. Free. Open source. On Base or Robinhood Chain.
Contracts (LaunchFactory / LaunchLocker / LaunchToken, Foundry), the site (Next.js),
brand assets. No platform fee, liquidity locked forever.