A verified-claim launchpad on Base — a token can only be launched when its real-world reason is proven true under GenLayer validator consensus.
The verification is the product. Anyone launches a real ERC-20 for a reason — a viral post, a real-world event, a shipped release, an onchain metric — and a GenLayer intelligent contract proves that reason true under validator consensus before the token is allowed to mint. No consensus, no token. Consensus-gated emission is the anti-spam layer and the whole point.
Live: tokenpost.vercel.app (Base Sepolia)
user (Base) → ClaimLauncher.submitClaim(reason, claim, sources, …)
→ LayerZero → [ZKsync Era hub] → relayer → ClaimVerifier (GenLayer)
→ validators independently verify and reach CONSENSUS on the verdict
→ verdict → relayer → VerdictReceiver.deliverDirect → ClaimLauncher
→ VERIFIED: TokenFactory mints ; REJECTED: terminal ; transient: Retryable
GenLayer's EVM is zkSync-OS based, so cross-chain interop routes through a ZKsync Era Sepolia hub with a stateless self-run relayer (dedup is on-chain in both directions). Verdict delivery uses GenLayer's canonical dispatch-on-receive + authorized-relayer model (VerdictReceiver.deliverDirect), so it is transport-agnostic and unaffected by LayerZero's testnet reverse-leg stalls. The relayer becomes native at GenLayer mainnet with contract logic unchanged.
The loop is genuinely async — minutes, not blocks. The product treats a pending verdict as a first-class UX state (live claim pages, in-flight status on profiles).
| Reason | Proven under consensus | Technique |
|---|---|---|
| Viral post | the post is real + its author | web fetch across mirrors, consensus on reproducible fields |
| Real-world event | the event actually happened | sources + independent web search + LLM judge under prompt_comparative |
| GitHub release | a tagged release actually shipped | same subjective pipeline, release-specific guidance |
| Sports result | the final official outcome | same pipeline, finality-aware (in-progress ⇒ NOT_YET) |
| Price target | the asset actually hit the price | same pipeline, strict price semantics |
| Onchain metric | a contract crossed a threshold | real eth_call per validator (JSON-RPC over nondet web), deterministic comparator — the LLM never does the arithmetic |
Subjective reasons share one claim-truth pipeline: each validator independently fetches the user's sources (gl.nondet.web.get), runs its own web search through a self-run search proxy, and judges TRUE / FALSE / UNVERIFIABLE / NOT_YET under gl.eq_principle.prompt_comparative. Disagreement ⇒ no emission.
GenLayer is used for exactly the parts that need validator consensus on external, real-world state — not as a generic backend:
- Proving a claim is true — validators independently gather evidence and must agree on the verdict before anything mints.
- Reading chain state trustlessly — OnchainMetric verdicts are settled by each validator's own
eth_call, compared under consensus. - Deriving token identity from the verified claim — deterministic where it must be (name/ticker from the claim subject), LLM-generated under a comparative equivalence principle where it helps (description).
The token itself is a normal ERC-20 — trading needs ordinary wallet behavior. GenLayer owns the trust layer; Base owns issuance and trading.
- GenLayer (Python intelligent contract) —
contracts-genlayer/ClaimVerifier.py: decodes the reason-tagged claim, runs the matching verification, reaches consensus, replies with a verdict. All verification IP lives here. - Base (Solidity, Foundry) —
packages/contracts-evm/:ClaimLauncher.sol(submits claims, receives verdicts, mints on success),TokenFactory.sol(gated minter — only mints for a verified verdict),TokenpostToken.sol(cloned per launch),BondingCurveMath.sol+adapters/(constant-product curve + graduation to Uniswap v4). - Bridge / relayer — GenLayer × LayerZero loop + the stateless relayer, hosted always-on as
supabase/functions/relay(pg_cron, every minute). - Web app —
apps/web(Next.js App Router, Vercel): one launch interface for all six reasons, async claim status, explore / token / trending / activity / profile. - SDK —
packages/sdk.
Design history (specs and plans, dated) in docs/design/; GenVM/runner findings in docs/GENLAYER-FEEDBACK.md.
ClaimLauncher:0xe008003cD89852149e6e28BCAe7d372a71B13e8CTokenFactory(gated minter):0xE137D66F1EA17E16099992B7a2E22a4aA44b2dccVerdictReceiver(dispatch-on-receive):0xeDEE6765B37b97640b72a1c03f0D9f6d92ACbCE6TokenpostToken(impl, cloned per launch):0x432CE43D02719174e14c402EA680CB6E234Af06FUniswapV4Adapter(graduation):0xAF7fF487f938F92833D4345837812910c963FD8AClaimVerifier(GenLayer studionet, chainId 61999):0x3051287A442251C7f9d3B4a1Ac24b4baec2B8D4c
Full record (bridge contracts, LZ options, per-reason proof pairs) in packages/contracts-evm/deployments/base-sepolia.json.
- ✅ All six reasons proven live end-to-end, each with real consensus-verified mints — and false claims proven to terminally reject (proof pairs recorded in the deployments file).
- ✅ OnchainMetric settles by real chain reads: validators each
eth_callthe target contract and consensus compares verdicts; the minted token's description records the literal read (e.g.totalSupply() read 1e27 >= threshold 1e24). - ✅ Graduation proven live: bonding curve → real Uniswap v4 pool with permanently locked full-range liquidity.
- ✅ Relayer hosted always-on (Supabase Edge Function + pg_cron); submit→mint typically 5–15 minutes on testnet.
- ⏳ Indexer + public API/SDK surfaces (docs pages mark these honestly as in development).
- ⏳ The loop is spoke-shaped by design (claimIds, EIDs, and the verifier are chain-parameterized) — additional chains are future work, deliberately out of current scope.
apps/web Next.js app (Vercel)
packages/contracts-evm ClaimLauncher, TokenFactory, TokenpostToken, curve + adapters
packages/sdk launch + query helpers
contracts-genlayer ClaimVerifier.py + per-reason verification (GenLayer)
supabase/functions relay (bridge relayer) + search (validator web-search proxy)
docs/ architecture, design history, GenLayer builder feedback