Skip to content

Add ZK shielded pool with Poseidon hashing and compliance gates#1

Open
opengrid1 wants to merge 55 commits into
claude/relaxed-mayer-ln64imfrom
claude/elegant-shannon-l56ws9
Open

Add ZK shielded pool with Poseidon hashing and compliance gates#1
opengrid1 wants to merge 55 commits into
claude/relaxed-mayer-ln64imfrom
claude/elegant-shannon-l56ws9

Conversation

@opengrid1

Copy link
Copy Markdown
Owner

Summary

Introduces a complete zero-knowledge privacy pool for native ETH, enabling fixed-denomination deposits and withdrawals with optional compliance screening. Uses Poseidon hashing (cheaper than MiMC) and Groth16 proofs to hide the link between deposits and withdrawals while preventing double-spends via nullifiers.

Key Changes

Core Contracts:

  • ShieldedPool.sol – Main pool contract handling deposits (against secret commitments) and withdrawals (via ZK proofs). Includes optional compliance gate integration and per-note nullifier tracking to prevent double-spends.
  • MerkleTreeWithHistory.sol – Append-only incremental Merkle tree with rolling 30-root history, using Poseidon hashing. Mirrors Tornado's design but with cheaper hash function.
  • Verifier.sol – Auto-generated Groth16 verifier (from snarkjs) for the withdrawal circuit.
  • AllowlistGate.sol – Reference implementation of IComplianceGate for owner-managed deposit screening (Privacy-Pools / 0xbow style).

Interfaces:

  • IHasher.sol – On-chain Poseidon(2) hasher interface
  • IVerifier.sol – Groth16 verifier interface
  • IComplianceGate.sol – Pluggable deposit screening interface

Circuits & Build:

  • circuits/withdraw.circom – Membership + nullifier circuit (6 public signals: root, nullifierHash, recipient, relayer, fee, refund)
  • circuits/merkleTree.circom – Poseidon-based Merkle inclusion proof
  • js/build-circuit.sh – Compiles circuit, runs Groth16 trusted setup, exports Solidity verifier
  • js/build-fixture.js – Generates on-chain Poseidon bytecode, tree zeros, and a real proof fixture for testing
  • js/lib.js – Shared Poseidon + JS Merkle tree mirror (used by fixture generation and relayer scripts)

Testing & Deployment:

  • test/ShieldedPool.t.sol – End-to-end Foundry tests against a real Groth16 proof (deposit, withdraw, double-spend prevention, compliance checks)
  • script/Deploy.s.sol – Full-stack deployment script (hasher, verifier, gate, pool)
  • foundry.toml – Forge config with build artifact permissions

Notable Implementation Details

  • Privacy model: Anonymity set is the number of deposits sharing the denomination; the ZK proof alone does not provide privacy (single depositor = trivial link).
  • Non-malleability: Public signals (recipient, relayer, fee, refund) are bound into the proof via dummy quadratic constraints so valid proofs cannot be front-run or re-targeted.
  • Root history: Withdrawals reference any of the last 30 roots, so proofs remain valid as new deposits arrive.
  • Compliance: Optional gate allows screening (allowlist, attestations, association-set) without touching user funds; can be disabled for pure mixer mode.
  • Dev setup: Phase-2 zkey uses fixed entropy for reproducible builds; production deployments require a fresh multi-party ceremony.

https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA

claude added 30 commits June 23, 2026 10:22
Adds the first half of a Tornado-style fixed-denomination privacy pool for
ETH mainnet (Veil-inspired):

- circuits/withdraw.circom + merkleTree.circom: Poseidon-based membership
  proof with nullifier double-spend protection and non-malleable public inputs
- js/build-circuit.sh: reproducible Groth16 trusted setup + Solidity verifier
  export (dev-only phase-2 contribution; needs a real ceremony for mainnet)
- src/Verifier.sol: generated Groth16 verifier (6 public signals)
- js/lib.js: shared Poseidon hashing + JS mirror of the on-chain Merkle tree

Pool contract, on-chain Poseidon hasher, compliance gate and Foundry tests
are next.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…, tests

Finishes the fixed-denomination ETH privacy pool (Veil-inspired). Full
deposit -> withdraw works end-to-end and is proven by Foundry tests that
verify a REAL Groth16 proof on-chain.

- MerkleTreeWithHistory.sol: incremental Poseidon tree with rolling root
  history (zeros derived from ZERO_VALUE via the on-chain hasher)
- ShieldedPool.sol: deposit/withdraw, nullifier double-spend protection,
  non-malleable recipient/relayer/fee binding, optional compliance gate,
  reentrancy guard
- AllowlistGate.sol + IComplianceGate: pluggable deposit screening
  (address(0) gate == pure mixer mode)
- IHasher/IVerifier interfaces
- js/build-fixture.js: generates on-chain Poseidon bytecode, tree zeros,
  and a real proof fixture for the tests
- test/ShieldedPool.t.sol: 7 passing tests (deposit+withdraw, double-spend,
  gating, tampered proof, unknown root, wrong denomination, gateless pool)
- script/Deploy.s.sol: deploys hasher + verifier + gate + pool
- README: build/test/deploy steps and the anonymity-set caveats

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Static site under privacy/web (plain HTML, hand-written CSS, one small
script, no framework or build step). Dark terminal aesthetic with a single
amber accent.

Copy is deliberately blunt about the design's limits instead of selling
around them: an interactive anonymity-set slider showing that a lone
depositor has no cover, plus honest sections on timing, fixed
denominations, the compliance hook, and the unaudited dev trusted setup.
No marketing buzzwords, no em dashes, no fake live counters.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Generated by the Vercel CLI on first deploy. Keeps the local project
linkage (non-secret project/org ids) out of git.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Adds a WebGL robot (Three.js, vendored locally) behind the hero: metallic
PBR body, environment-map reflections, a grounded shadow, idle float and
head tracking on the pointer. Reads as 3D with depth and shading, not a
flat SVG.

- vendor/three.module.js, RoomEnvironment.js, RoundedBoxGeometry.js (local,
  no CDN at runtime)
- vendor/robot.js builds the robot from rounded primitives and drives the
  scene; import map maps the bare 'three' specifier
- gradient overlay keeps the hero copy readable over the model
- degrades quietly: no WebGL or prefers-reduced-motion gives a single
  static frame; pauses when the tab is hidden or the hero scrolls away

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Adds the token layer for the Umbra privacy protocol so the project can run
a presale.

- UmbraToken: capped ERC20. Initial allocation minted at deploy (presale +
  liquidity + treasury); the rest of the cap is mintable only by a single
  minter, reserved for anonymity-mining rewards.
- TokenPresale: flat-price sale with soft/hard cap, time window, optional
  per-wallet cap. Succeeds at the soft cap (buyers claim, raise goes to
  treasury), otherwise fails and everyone refunds in full. Overpay past any
  cap is refunded inside the buy. finalize() is permissionless so funds
  can't be trapped.
- 6 tests covering success+claim+treasury, failure+refund, hard-cap early
  finalize with overpay refund, per-wallet cap, window guards, and the
  token cap/minter rules. Full suite now 13 passing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
React + Vite + TS app with wagmi/viem set up, matching the Umbra look.
Built so wiring the backend is a one-file change.

- src/lib/config.ts: the single place to paste deployed addresses; empty
  means not-live and the UI degrades instead of erroring
- src/lib/abis.ts: typed ABIs matching privacy/src/*.sol
- src/hooks/usePresale.ts: batched reads + buy/claim/refund/finalize writes
- src/pages/Presale.tsx: fully wired (progress, caps, countdown, phase,
  buy form, claim/refund/finalize)
- src/pages/Pool.tsx: deposit/withdraw shape with client-side note
  generation; deposit/withdraw stay disabled pending the in-browser prover
- wallet connect (injected), Sepolia config

Type-checks and builds clean (~134KB gzipped). Verified both pages render.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Adds script/DeployUmbra.s.sol (deploys UmbraToken + TokenPresale and funds
the sale) and proves the presale works when deployed, not just in unit
tests: on a local chain a buyer purchased with 5 ETH, the sale finalized
(succeeded), and the buyer claimed 50,000 UMBRA.

Default START_DELAY is generous (presale constructor requires startTime >=
block.timestamp, and the deploy tx mines a block or two after the start is
computed; a tight delay reverts the deploy). Also ignore broadcast/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
The live dApp showed a dead 'not live' screen before any deploy, which read
as a static landing page. Now, when no presale address is configured, the
Presale page renders a clearly-labelled demo with sample data whose buy /
finalize / claim buttons work locally, so the flow is fully clickable. The
chain-backed path is unchanged and takes over automatically once a real
address is set in src/lib/config.ts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Restyles the dApp into a polished dark privacy-app look: near-black canvas
with an ambient emerald glow and faint grid, a single emerald accent,
glassy centered cards with soft shadows, glowing primary buttons and LIVE
pill, segmented denomination control, sticky blurred nav, and Inter +
JetBrains Mono type. Same components and logic, new skin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
The previous emerald/glassy theme was nothing like veil.cash. Pulled the
actual veil.cash CSS: it is monochrome (near-black #0a0a0a, white/grey, no
colour accent, flat) with the squarish Quantico font. Reskinned to match:
flat black canvas, white-on-black primary buttons and LIVE pill, uppercase
Quantico headings/labels, white progress bar, underline nav tabs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Closer pass after seeing the actual app: cool near-black slate (not flat
black), cream off-white PILL buttons (not white rectangles), Title-Case
Quantico headings (not all-caps), slate-blue active states, generous
rounding. Pool page restructured into a veil-style card with a segmented
Deposit/Withdraw toggle, pool selector, amount box and fee line.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Rebuilt the dApp UI to a bespoke, hand-built design system rather than a
generic crypto dashboard look:
- pure black #050505, hairline blue-gray borders, large negative space
- JetBrains Mono workhorse + Silkscreen pixel marks/labels, tabular numbers
- monochrome with sparing muted-blue accents (tab underline, prompt glyph,
  status dots, active pool); no glass, gradients or glow
- isolated bordered panels with header rows and hairline dividers
- geometric hexagon logo mark
- terminal-style inputs with a prompt glyph, custom radii
- Pool: SELECT POOL rows, expandable GLOBAL ACTIVITY feed, and
  Deposit/Transfer/Withdraw tabbed actions
- Presale: panel-headed stats grid, thin progress, flat primary button

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
New launchpad dApp UI (launchpad/app) in the engineered terminal design
system shared with the Umbra protocol app: pure black, hairline blue-gray
borders, JetBrains Mono + Silkscreen, sparing muted-blue accents.

- Explore: filterable grid of launches with status pills and progress
- Launch detail: token hero, stats grid, B20 token/compliance-roles panel,
  sticky participate/buy panel
- Create: stepped issue form (token / sale / B20 compliance roles) with
  role toggles, liquidity slider, and a launch summary
- mock data for now; structured to wire to B20 issuance + presale later

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…arklines

Tasteful, on-brand richness without going generic: a Bloomberg-style data
ticker strip (total raised, live, launches, holders, network, standard), a
featured live-launch spotlight, deterministic funding-curve sparklines on
each card, and refined card hover micro-interactions.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
The header connect button used the engineered 5px radius and read as a
plain rectangle. Made it a prominent rounded pill in both apps:
- launchpad: white pill with a status dot, top-right
- protocol dApp: connect/connected buttons now pill-shaped (.btn.pill)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
The header overflowed on mobile: the connect wallet label wrapped to two
lines (huge button) and content was clipped on the left. Fixed in both apps:
- white-space: nowrap on buttons; overflow-x: hidden guard
- launchpad: collapse nav links on small screens, shrink the wallet pill,
  single-column grid, smaller headline/featured
- protocol dApp: tighter nav + smaller connect pill on small screens

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Previous mobile fix hid the nav links entirely. Instead, let the header
wrap: row 1 is brand + connect pill, row 2 is the Explore/Create nav links
under a hairline divider. Navigation stays available on mobile, still no
horizontal overflow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Replaced the 4-toggle simplification with the real B20 capability set:
- Token variant (Standard / Asset-RWA, which adds OPERATOR_ROLE)
- Roles & admin: permanently admin-less (renounce DEFAULT_ADMIN),
  MINT/BURN/METADATA roles
- Optional supply cap enforced per mint
- Granular pause: transfers / mint / burn independently
- Compliance: Open / Allowlist / Blocklist transfer policy bound to
  sender / receiver / mint-receiver scopes, plus freeze-and-seize
  (BURN_BLOCKED_ROLE)
- Standards: ERC-2612 permit (built-in), bytes32 transfer memos,
  ERC-7572 contractURI
- live configuration summary line

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Answers how a creator adds a token image and links:
- Create: new Listing section (02) with logo upload + live preview,
  description, and Website/X/Telegram/Discord inputs; explained that these
  pin to IPFS and write to the token's ERC-7572 contractURI metadata
- contractURI field reframed as an advanced override
- Launch detail shows social chips under About
- mock launches gained links; sections renumbered
- fix: segmented controls (variant/policy) were unstyled default buttons;
  added the missing .seg styles

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
A launchpad needs both sides. The detail page now adapts by phase:
- presale (live): Buy contributes at the flat price; Sell is blocked until
  the sale closes and liquidity is seeded
- funded (success): full Buy/Sell trade widget against the locked liquidity
  pool at market price, with you-receive output and price-impact/slippage;
  stats switch to market price, 24h change and locked liquidity
- upcoming shows a countdown, failed shows refund

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Replaced the presale 'raise then list' model with instant trading. Tokens
go live on a bonding curve the moment they launch — buy AND sell
immediately, no presale, no waiting. They graduate to a Base DEX (LP
burned) once they fill the curve.

- data: bonding / graduated statuses, market cap, 24h change, liquidity,
  graduation target, created-ago
- detail: always-on Buy/Sell trade widget against the curve, with
  you-receive + price impact; graduation progress for bonding tokens
- explore: bonding/graduated filters, total-mcap ticker, trending spotlight,
  cards with market cap, 24h change, graduation progress
- create: 'Sale' (presale caps/duration/liquidity) replaced by a bonding
  'Launch' section — graduation target + optional initial dev buy
- listing + full B20 compliance config retained

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Built out the footer into Product / Learn / Legal columns plus socials, all
linking to real in-app pages:
- Docs page: sticky section nav + content covering overview, quickstart,
  bonding curve, graduation, creating, trading, the B20 standard,
  compliance, fees, FAQ and risks; footer Learn links deep-link to sections
- Terms page: terms of use, no-advice disclaimer, privacy, no-warranty
- routing extended (docs/terms views with anchor scrolling), Docs added to
  the header nav, Footer component shared across pages

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
- replaced unicode-glyph social icons with proper inline SVGs (X, Telegram,
  Discord, GitHub, globe) in the footer and detail social chips
- docs section nav was a giant vertical list on mobile (felt zoomed-in);
  now a horizontal scroll row
- tightened base font and reduced heading sizes on small screens

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…nes)

Mobile Chrome/Safari 'text autosizing' was inflating body copy on
text-heavy views (e.g. the docs page), so text looked zoomed even though
CSS sizes were small — and it never showed on desktop. Added
text-size-adjust: 100% to html in all three apps (launchpad, protocol dApp,
landing).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Root cause of the 'no side spacing' / 'zoomed' look: pages use class
'wrap page' on the same element. .wrap sets padding: 0 20px, but .page (and
.foot) used the padding shorthand with 0 horizontal, overriding it back to
zero. On desktop this was hidden by max-width centering; on mobile content
ran edge-to-edge. Switched .page/.foot to padding-top/bottom only so the
wrap's horizontal padding survives.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Proper details (verified against base/base-std):
- token variant is now Asset / Stablecoin (not 'Standard / Asset RWA');
  Asset shows decimals (6-18), Stablecoin shows ISO currency code (decimals
  fixed at 6); docs updated to match
Remove AI-looking bits:
- stripped all 24 em dashes across the UI copy and comments, replaced with
  plain punctuation

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
IB20Factory / IB20 / B20Constants transcribed from the official base/base-std
repo (createB20 signature, B20AssetCreateParams struct, role IDs). Basis for
the bonding-curve + launchpad-factory contracts.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Removed the footer tagline that restated the hero pitch (instant
bonding-curve buy/sell). Repeated marketing copy reads as AI-generated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
The slogan-style 'Launch a token. Trade it instantly.' plus the run-on
explainer read as AI marketing copy. Replaced with a flat, descriptive line.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
claude added 25 commits June 24, 2026 17:33
- removed the redundant '+ Create launch' button (Create is in the nav)
- headline/tagline now name B20 and drop the AI-sounding 'no presale':
  'Launch B20 tokens on Base' / 'Every coin is a native B20 token, live on a
  bonding curve from the first block. It graduates to a DEX once the curve
  fills.'

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Reworded the remaining 'no presale' / 'wait for a presale' copy in Create
and Docs to plain phrasing about trading from the first block.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Emptied the sample LAUNCHES list and added an 'Awaiting launches' empty
state on Explore. Ticker totals now read 0 honestly. The grid/featured/
filters render only when real launches exist (wired to chain later).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
The mobile media query set .nav 'padding: 12px 0', whose shorthand zeroed
the horizontal padding the .wrap provides, so header items ran to the screen
edges on phones. Switched to padding-top/bottom only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Dropped the '← Back to launchpad' / '← All launches' links on Docs, Terms,
Create and Launch detail. Navigation is handled by the header nav (and brand)
and footer, so the back arrows were redundant. Cleaned up the now-unused
back props.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Fixed-price escrow presale for $WORK: contribute widget, soft/hard cap
progress, allocation breakdown, utility, and settlement mechanics. Wired
into header nav, router and footer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Lower per-wallet max to 0.5 ETH and reprice to 0.00000004 ETH per WORK so
the 25% presale supply still clears at the 10 ETH hard cap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…and governance

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
… launch

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…ve raised bar

Wire wagmi/viem on Base mainnet. Connect Wallet now connects an injected
wallet. Contribute sends ETH directly to the proceeds wallet and links the
Basescan tx. The progress bar reads the proceeds wallet balance live.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Replace injected-only connect with the AppKit modal via the wagmi adapter,
so mobile wallets can connect over WalletConnect alongside browser wallets.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…, OG image

Replace the old hexagon glyph with the new coin mark (CoinMark) across the
header and footer, add a PNG favicon, and add Open Graph / Twitter card meta
with a coin-O monogram social image.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…ssing)

Presale records contributions on-chain and forwards ETH to the project
wallet. Distributor pays out WORK pro-rata at the fixed presale price once
the sale closes. Verified B20 factory interface against Base docs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
CreateWork.s.sol calls the B20 factory precompile via Base's official base-std
encoders to mint $WORK, then deploys and funds the distributor. DeployPresale
script + setup.sh + README runbook. Removed redundant local B20 interfaces.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…g mcap

Rewrite docs, Create, Explore, LaunchDetail and footer copy from the old
bonding-curve/graduation/burned-LP model to: launch straight into a Uniswap v4
pool at a fixed $15,000 USD starting market cap (Chainlink oracle), liquidity
single-sided and managed by the project. Removed the false locked/burned-LP
claims to keep the copy honest.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
…launcher yet)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0128r67aVuA625JW9qLKPyfA
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants