diff --git a/README.md b/README.md index 4de3fa06..38f492d1 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Creators choose a 0 / 1 / 3 % trading fee that is pushed **in full** to benefici - **Any quote asset.** ETH, USDG, USDC on Arc, **TWIG** ([Twigpine](https://twigpine.com)'s token on Base: a 1:1 wrapper of GITLAWB, wrap or unwrap any time with no fee; priced at GITLAWB's price; fees paid or burned in TWIG; no longer offered in the Base form, ahead of the planned [token migration](https://migrate.twigpine.com), while launches already paired with it keep their badge, price and trading), **GITLAWB** ([Twigpine](https://twigpine.com)'s token, on Base and bridged 1:1 to - Robinhood Chain; priced from its Base Uniswap v4 WETH pool; fees paid or burned in GITLAWB; the Robinhood Chain form offers it), or a **tokenized stock**: Coinbase's B20 stocks on Base + Robinhood Chain; priced from its Base Uniswap v4 WETH pool; fees paid or burned in GITLAWB; no longer offered in any launch form, for the same migration, while launches already paired with it keep their badge, price and trading), or a **tokenized stock**: Coinbase's B20 stocks on Base (every stock Coinbase lists: NVDAc, AAPLc, TSLAc, NFLXc, …, and new listings picked up from Coinbase's registry as they appear; shown in USD where Chainlink publishes an on-chain feed) and Robinhood Stock Tokens on Robinhood Chain. - **Trade in-page.** Buys and sells go straight to the Uniswap v4 pool through the Universal Router; the site never touches funds. diff --git a/app/src/app/agents/page.tsx b/app/src/app/agents/page.tsx index 658909b7..e246c6bc 100644 --- a/app/src/app/agents/page.tsx +++ b/app/src/app/agents/page.tsx @@ -76,7 +76,7 @@ export default function AgentsPage() {
-
quote
ETH uses address zero. For GITLAWB on Robinhood Chain use 0xd1b0d44E4f6ed940fcC7A9F59Bf30Daf62cCFe3D; for USDG on Robinhood Chain, 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168. On Base, TWIG (0x6aC18bcf4eDE02591d4917452700ea5eaAea13c1) and GITLAWB (0x5F980Dcfc4c0fa3911554cf5ab288ed0eb13DBa3) are still recognised, badged and priced, but the Base form offers neither: GITLAWB left it when TWIG took its place, and TWIG left it ahead of the planned token migration. For any ERC-20 quote call findSalt(...) first so the token address sorts above the quote.
+
quote
ETH uses address zero. For USDG on Robinhood Chain use 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168. TWIG (0x6aC18bcf4eDE02591d4917452700ea5eaAea13c1, Base) and GITLAWB (0x5F980Dcfc4c0fa3911554cf5ab288ed0eb13DBa3 on Base, 0xd1b0d44E4f6ed940fcC7A9F59Bf30Daf62cCFe3D on Robinhood Chain) are still recognised, badged and priced. No form offers them now. GITLAWB left the Base form when TWIG took its place; then TWIG left the Base form and GITLAWB the Robinhood Chain form, ahead of the planned token migration. For any ERC-20 quote call findSalt(...) first so the token address sorts above the quote.
supply
0 means the default 1B supply.
startTick
Sets the opening market cap. A multiple of 200; 184200 ≈ 10 ETH FDV for 1B supply.
lpFee
In pips: 0, 10000 = 1%, or 30000 = 3%.
diff --git a/app/src/app/api/quotes/route.ts b/app/src/app/api/quotes/route.ts index c9141cae..1af12eff 100644 --- a/app/src/app/api/quotes/route.ts +++ b/app/src/app/api/quotes/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from "next/server"; import { isChainKey } from "@/lib/chainPublic"; -import { launchpad } from "@/lib/launchpad/config"; +import { launchpad, officialQuotes, type Quote } from "@/lib/launchpad/config"; import { STOCK_SOURCE, baseStockList, ensureRegistry, refreshBaseRegistry, stockIssued, stockList, stockPrices } from "@/lib/launchpad/stocksServer"; import { searchStocks } from "@/lib/launchpad/stocks"; import { BASE_STOCK_SEARCH_LIMIT, searchBaseStocks, stockTileSvg } from "@/lib/launchpad/baseStocks"; @@ -13,8 +13,11 @@ export const dynamic = "force-dynamic"; type StockHit = { key: "stock"; address: string; symbol: string; name: string; decimals: number; usd: number | null; logo: string | null; issued: boolean | null }; /** - * GET /api/quotes?chain=[&q=AAPL] → quote assets the launch form may offer on that chain: - * the fixed ones (ETH, USDG, USDC, GITLAWB on Robinhood Chain with GITLAWB's live USD; never TWIG, which left the Base form) plus tokenized stocks from that chain's registry (with live USD where the stock has a price): + * GET /api/quotes?chain=[&q=AAPL] → the chain's quote assets with live USD: + * `fixed` = the form's own quotes (ETH, USDG, USDC: `offered: true`) then the official ones the form no longer offers + * (TWIG and GITLAWB on Base, GITLAWB on Robinhood Chain: `offered: false`, priced at GITLAWB's live price). Outside + * callers read prices from it by key (Playground prices its tokenize launches here), so the official ones stay listed; + * the launch form itself reads only `stocks`. Plus tokenized stocks from that chain's registry (with live USD where the stock has a price): * Coinbase tokenized stocks on Base, Robinhood Stock Tokens on Robinhood Chain, none on Arc. * `stocks` is one page of matches; `stocksMatched` is how many match the search in all and `stocksTotal` how many the chain's registry holds, so the form can say there are more. * Each stock's `issued` says whether any of it is in circulation: false = none yet (nobody can buy with it), null = not known (Robinhood, or no good read yet). @@ -26,10 +29,11 @@ export async function GET(req: Request) { if (!isChainKey(chain)) return NextResponse.json({ error: "bad chain" }, { status: 400 }); const q = (u.searchParams.get("q") ?? "").slice(0, 12); const gl = await gitlawbUsd(); // one price for both chains: the Robinhood token is the Base token bridged 1:1 - const fixed = launchpad(chain).quotes.map((x) => { + const priced = (x: Quote, offered: boolean) => { const linked = gitlawbLinkedUsd(x.key, gl); // GITLAWB, and TWIG (unwraps 1:1 to GITLAWB), take GITLAWB's live price - return { ...x, usd: linked === undefined ? x.usd : linked }; - }); + return { ...x, usd: linked === undefined ? x.usd : linked, offered }; + }; + const fixed = [...launchpad(chain).quotes.map((x) => priced(x, true)), ...officialQuotes(chain).map((x) => priced(x, false))]; const { stocks, stocksTotal, stocksMatched } = await memo(`quotes:stocks:${chain}:${q.toUpperCase()}`, 30_000, async (): Promise<{ stocks: StockHit[]; stocksTotal: number; stocksMatched: number }> => { let hits: { address: string; symbol: string; name: string; decimals: number; logo: string | null }[]; let matched: number; diff --git a/app/src/app/launch/page.tsx b/app/src/app/launch/page.tsx index a6c12f36..28d55c99 100644 --- a/app/src/app/launch/page.tsx +++ b/app/src/app/launch/page.tsx @@ -2,7 +2,6 @@ import type { Metadata } from "next"; import { pageMetadata } from "@/lib/seo"; import LaunchForm from "@/components/launchpad/LaunchForm"; import { ethUsd } from "@/lib/launchpad/ethPrice"; -import { gitlawbUsd } from "@/lib/launchpad/gitlawbServer"; import { DEFAULT_CHAIN, chainKeyOr, type ChainKey } from "@/lib/chainPublic"; import { CONFIGURED_CHAINS, launchpad } from "@/lib/launchpad/config"; @@ -22,7 +21,7 @@ function initialChainFor(param: string | undefined): ChainKey { export default async function LaunchPage({ searchParams }: { searchParams: Promise<{ chain?: string }> }) { const sp = await searchParams; - const [usd, gitlawb] = await Promise.all([ethUsd(), gitlawbUsd()]); + const usd = await ethUsd(); return ( <>
@@ -30,7 +29,7 @@ export default async function LaunchPage({ searchParams }: { searchParams: Promi

Launch a token

Pick a chain, fill this in, sign once, done. No platform fee. You only pay gas.

- +
); diff --git a/app/src/app/llms.txt/route.ts b/app/src/app/llms.txt/route.ts index f5205792..14fa65f9 100644 --- a/app/src/app/llms.txt/route.ts +++ b/app/src/app/llms.txt/route.ts @@ -68,7 +68,7 @@ ${verificationLine("Arc (5042)", a, [ ## What a launch does 1. deploys a fixed-supply ERC-20 (1,000,000,000; no mint/pause/blacklist/tax/owner) -2. initializes a Uniswap v4 pool quote/token (quote = ETH, GITLAWB or USDG on Robinhood Chain, USDC on Arc, or a registry stock token, all in the form; also TWIG, GITLAWB, USDC or WETH on Base, priced but not in the form; tick spacing 200, no hook) at the chosen start tick +2. initializes a Uniswap v4 pool quote/token (quote = ETH, USDG on Robinhood Chain, USDC on Arc, or a registry stock token, all in the form; also TWIG, GITLAWB, USDC or WETH on Base and GITLAWB on Robinhood Chain, priced but not in the form; tick spacing 200, no hook) at the chosen start tick 3. mints one single-sided position holding 100% of supply to an ownerless locker (no withdraw path exists) 4. registers fee routing: lpFee 0 | 10000 (1%) | 30000 (3%) pips; recipients [] = fees burned, else {payout,bps}[] summing to 10000. Fixed forever. @@ -87,7 +87,7 @@ USDC (Base, 6 dec): 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (Circle's; p WETH (Base, 18 dec): 0x4200000000000000000000000000000000000006 (priced at ETH; buyers pay WETH, not ETH) TWIG (Base, 18 dec): 0x6aC18bcf4eDE02591d4917452700ea5eaAea13c1 (Twigpine's token: 1:1 wrapper of GITLAWB, wrap/unwrap any time, no fee; no longer offered in the Base form, launches already paired with it keep trading; priced = GITLAWB; fees paid in TWIG, burned when recipients = []) GITLAWB (Base, 18 dec): 0x5F980Dcfc4c0fa3911554cf5ab288ed0eb13DBa3 (Twigpine's token; still recognised and priced on Base; fees paid in GITLAWB, burned when recipients = []) -GITLAWB (Robinhood, 18 dec): 0xd1b0d44E4f6ed940fcC7A9F59Bf30Daf62cCFe3D (LayerZero OFT of the Base token, 1:1) +GITLAWB (Robinhood, 18 dec): 0xd1b0d44E4f6ed940fcC7A9F59Bf30Daf62cCFe3D (LayerZero OFT of the Base token, 1:1; no longer offered in the Robinhood Chain form, launches already paired with it keep trading) ## Launch (contract call) factory.launch((name, symbol, metadataURI, quote, supply=0, startTick, lpFee, salt, recipients)) diff --git a/app/src/app/rules/page.tsx b/app/src/app/rules/page.tsx index f9a1b987..a93863b8 100644 --- a/app/src/app/rules/page.tsx +++ b/app/src/app/rules/page.tsx @@ -19,7 +19,7 @@ export const metadata: Metadata = pageMetadata({ path: "/rules", title: "How it const STEPS = [ { title: "Your token is deployed", description: "A plain ERC-20 with EIP-2612 permit. Fixed supply, 1 billion by default. No mint, no pause, no blacklist, no transfer tax, no owner.", value: "1B", label: "default supply" }, - { title: "A market opens", description: "A Uniswap v4 pool pairs your token with ETH, GITLAWB or USDG on Robinhood Chain, a tokenized stock (Coinbase stocks on Base, Robinhood Stock Tokens on Robinhood Chain), or USDC on Arc. No hook. The pool starts at the market cap you pick.", value: "v4", label: "Uniswap pool" }, + { title: "A market opens", description: "A Uniswap v4 pool pairs your token with ETH, USDG on Robinhood Chain, a tokenized stock (Coinbase stocks on Base, Robinhood Stock Tokens on Robinhood Chain), or USDC on Arc. No hook. The pool starts at the market cap you pick.", value: "v4", label: "Uniswap pool" }, { title: "The liquidity position is locked", description: "100% of the supply goes into one single-sided position at launch. Its NFT is minted to an ownerless locker that has no function to withdraw, transfer or shrink it. Ever.", value: "100%", label: "deposited at launch" }, { title: "Fee routing is written in", description: "The trading fee you choose (0%, 1% or 3%) goes 100% to the beneficiaries you name, or is burned if you name none. Fixed at launch, unchangeable.", value: "0 / 1 / 3%", label: "your trading fee" }, ] as const; @@ -137,7 +137,7 @@ export default function RulesPage() {
Why is my token under “quiet launches”?

The home page ranks by facts, not by launch order. A token is live once a wallet other than its launcher has traded it in the last 24 hours; trades in the launch block and the next three blocks (snipe bots) don't count, and neither do the launcher's own. Live tokens rank by outside wallets in the last hour, then today, then by their last outside trade. A wallet's newest launch gets its first hour on the board regardless; after that it sits under quiet launches, one row per wallet, until someone trades it.

Nothing is hidden: every launch stays in the New tab, in search and in the API. The only way up is a trade from an outside wallet.

{boostEnabled() ? : null}
What can change after launch?

Nothing on-chain can be edited after launch: not the name, not the fee, not the beneficiaries. Metadata (image, description, links) is stored by this site and can change; the token itself cannot.

-
What is a TWIG- or GITLAWB-quoted pool?

TWIG is Twigpine's token on Base: a 1:1 wrapper of GITLAWB. Anyone can wrap GITLAWB into TWIG, or unwrap it back, at any time with no fee, and every TWIG is backed by one GITLAWB held in its contract, which has no owner and no transfer restrictions. The Base form no longer offers it, ahead of the planned GITLAWB and TWIG token migration (migrate.twigpine.com). Launches already paired with TWIG keep their badge, price and trading: buyers pay in TWIG; any trading fee is paid in TWIG to the beneficiaries named at launch (by their shares) when it is collected, and a launch that names none has its TWIG fees burned when they are collected.

GITLAWB is Twigpine's token on Base, bridged 1:1 to Robinhood Chain over LayerZero (one supply, two chains): an ordinary ERC-20 with no transfer restrictions and no issuer switch. The Robinhood Chain form offers it; on Base, pools already paired with GITLAWB keep their badge and price. Fees work the same way: paid in GITLAWB when collected, and a launch that names no beneficiary has its GITLAWB fees burned when they are collected.

Dollar figures for both come from the Uniswap v4 WETH/GITLAWB pool price on Base, cross-checked against a 30-minute on-chain average, and ETH/USD; one TWIG counts as one GITLAWB, since it unwraps to one. They are for display and sorting only; nothing on-chain depends on them.

+
What is a TWIG- or GITLAWB-quoted pool?

TWIG is Twigpine's token on Base: a 1:1 wrapper of GITLAWB. Anyone can wrap GITLAWB into TWIG, or unwrap it back, at any time with no fee, and every TWIG is backed by one GITLAWB held in its contract, which has no owner and no transfer restrictions. The Base form no longer offers it, ahead of the planned GITLAWB and TWIG token migration (migrate.twigpine.com). Launches already paired with TWIG keep their badge, price and trading: buyers pay in TWIG; any trading fee is paid in TWIG to the beneficiaries named at launch (by their shares) when it is collected, and a launch that names none has its TWIG fees burned when they are collected.

GITLAWB is Twigpine's token on Base, bridged 1:1 to Robinhood Chain over LayerZero (one supply, two chains): an ordinary ERC-20 with no transfer restrictions and no issuer switch. No launch form offers it any more, ahead of the same planned migration; pools already paired with GITLAWB, on either chain, keep their badge, price and trading. Fees work the same way: paid in GITLAWB when collected, and a launch that names no beneficiary has its GITLAWB fees burned when they are collected.

Dollar figures for both come from the Uniswap v4 WETH/GITLAWB pool price on Base, cross-checked against a 30-minute on-chain average, and ETH/USD; one TWIG counts as one GITLAWB, since it unwraps to one. They are for display and sorting only; nothing on-chain depends on them.

What should I know about stock-quoted pools?

Stock-quoted pools use tokenized stocks as the quote asset: Coinbase tokenized stocks (B20) on Base, recognised here only from Coinbase's official list and priced in dollars where Chainlink publishes an on-chain feed (the others show no dollar price); Robinhood Stock Tokens on Robinhood Chain, recognised only from Robinhood's own registry.

Both are securities issued by third parties under Regulation S and are not offered to US persons. Coinbase's also exclude the UK, Canada, Australia, Singapore and Switzerland. Their issuers can pause transfers or freeze wallets in restricted jurisdictions. Holding or trading them is subject to the issuer's terms, not ours.

diff --git a/app/src/components/launchpad/GitlawbBadge.tsx b/app/src/components/launchpad/GitlawbBadge.tsx index f43b48c3..0197751a 100644 --- a/app/src/components/launchpad/GitlawbBadge.tsx +++ b/app/src/components/launchpad/GitlawbBadge.tsx @@ -8,7 +8,8 @@ export function GitlawbMark({ size = 16, className = "" }: { size?: number; clas /** * Badge for tokens paired with GITLAWB. Shown wherever a token appears (list, trending, feed, token page, - * dashboard, share card) — the visible perk of picking GITLAWB as the quote asset. "sm" is 20px tall so it sits + * dashboard, share card). No launch form offers GITLAWB any more (the token migration); launches already paired with it + * keep the badge. "sm" is 20px tall so it sits * inside a text-sm line without changing row heights. Black like the logo tile, * white text, a light hairline in dark mode so it still reads as a chip on a dark page. `collapse` shows the mark * alone on phones, keeping the label for screen readers. diff --git a/app/src/components/launchpad/LaunchForm.tsx b/app/src/components/launchpad/LaunchForm.tsx index ba24b6a7..53cf50e7 100644 --- a/app/src/components/launchpad/LaunchForm.tsx +++ b/app/src/components/launchpad/LaunchForm.tsx @@ -12,8 +12,6 @@ import { previewLaunch } from "@/lib/launchpad/launch-preview"; import ImageUpload from "./ImageUpload"; import FeeChip, { feeModeOf } from "./FeeChip"; import LaunchFeeSettings, { type FeeBeneficiary } from "./LaunchFeeSettings"; -import { QuoteBrandBadge } from "./QuoteBadge"; -import { GitlawbMark } from "./GitlawbBadge"; import { ChainLogo } from "./ChainLogo"; import { XMark } from "./BrandMarks"; import { ToggleGroup, ToggleGroupItem } from "@/components/vendor/toggle-group"; @@ -29,8 +27,6 @@ import { fdvForStartTick, fmtCompact, fmtQuoteUnits, fmtUnitsExact, fmtUsd, init import { BUY_PRESETS, defaultFirstBuy, gasReserveInQuote, suggestFirstBuy } from "@/lib/launchpad/first-buy"; import { getFirstBuyDeclined, getFirstBuyDeclinedServer, setFirstBuyDeclined, subscribeFirstBuyDeclined } from "@/lib/launchpad/first-buy-session"; import { encodeV4ExactInSingle, type PoolKey } from "@/lib/launchpad/swap"; -import { GITLAWB_SITE } from "@/lib/launchpad/gitlawb"; -import { gitlawbLinkedUsd } from "@/lib/launchpad/twig"; import { parseXHandle } from "@/lib/launchpad/xHandle"; import { CHAINS, CHAIN_LABELS, CHAIN_KEYS, DEFAULT_CHAIN, BUILDER_DATA_SUFFIX, explorerTx, shortAddr, type ChainKey } from "@/lib/chainPublic"; import { friendlyError } from "@/lib/errors"; @@ -72,10 +68,9 @@ function randomSalt(): Hex { const STOCK_PICK_MESSAGE = "Pick a stock to price the token in, or switch the quote."; /** Per-chain copy in the form. A chain's quotes and stock registry differ, so its sentences do too; `stock` is null where no registry exists. */ -const CHAIN_COPY: Record = { +const CHAIN_COPY: Record = { base: { blurb: "Priced in ETH or a Coinbase tokenized stock. Gas ≈ cents.", - gitlawbOrigin: "", // the Base form offers neither GITLAWB nor TWIG, so this copy is never shown there stock: { pays: "Buyers pay with a Coinbase tokenized stock; fees are paid in that stock.", badge: "Coinbase stock", @@ -84,8 +79,7 @@ const CHAIN_COPY: Record 0n ? { hash: h, out: received, exact: true } : { hash: h, out, exact: false }; } -export default function LaunchForm({ ethUsd, gitlawbUsd = null, initialChain = DEFAULT_CHAIN }: { ethUsd: number | null; gitlawbUsd?: number | null; initialChain?: ChainKey }) { +export default function LaunchForm({ ethUsd, initialChain = DEFAULT_CHAIN }: { ethUsd: number | null; initialChain?: ChainKey }) { const router = useRouter(); const [chain, setChain] = useState(initialChain); const cfg = launchpad(chain); @@ -183,15 +176,9 @@ export default function LaunchForm({ ethUsd, gitlawbUsd = null, initialChain = D const [stockTotal, setStockTotal] = useState(0); // how many stocks the chain's registry holds; the list below shows one page of them const [stockMatched, setStockMatched] = useState(0); // how many match the search in all const [stockAnswered, setStockAnswered] = useState(null); // the search text the page shown answers - // GITLAWB's USD is live: the page fetched it server-side (same as ethUsd); the static config carries null (gitlawbLinkedUsd). - const staticQuote: Quote = quoteKey === "stock" && stock ? stock : (cfg.quotes.find((q) => q.key === quoteKey) ?? cfg.quotes[0]); - const linkedUsd = gitlawbLinkedUsd(staticQuote.key, gitlawbUsd); - const quote: Quote = linkedUsd === undefined ? staticQuote : { ...staticQuote, usd: linkedUsd }; - // the branded quote this chain's form offers, if any: GITLAWB on Robinhood Chain. Never TWIG: it left the Base form - // for the token migration, and launches already paired with it keep their badge everywhere else on the site. - const brandQuote = cfg.quotes.find((q) => q.key === "gitlawb") ?? null; - // GITLAWB: badged, priced at its live price, millions of units per dollar - const isBrandQuote = quote.key === "gitlawb"; + // The form offers no branded quote: GITLAWB and TWIG left it for the planned token migration (config.ts OFFICIAL_QUOTES), + // and launches already paired with them keep their badge, price and trading everywhere else on the site. + const quote: Quote = quoteKey === "stock" && stock ? stock : (cfg.quotes.find((q) => q.key === quoteKey) ?? cfg.quotes[0]); const quoteUsd = quoteUsdOf(quote, ethUsd); const NATIVE_SYMBOL = CHAIN.nativeCurrency.symbol; const gasReserve = GAS_RESERVE_WEI[chain]; @@ -292,7 +279,7 @@ export default function LaunchForm({ ethUsd, gitlawbUsd = null, initialChain = D const initialBuy = typedBuy || suggestion.amount || ""; const buySource: "typed" | "suggested" | "none" = typedBuy ? "typed" : suggestion.amount ? "suggested" : "none"; const initialBuyRaw = parseBuyAmount(initialBuy, quote.decimals); - // "1,000,000 GITLAWB", not "1000000 GITLAWB": every digit of what the buy will send, grouped (never rounded, it is what the creator confirms) + // "1,000,000 USDG", not "1000000 USDG": every digit of what the buy will send, grouped (never rounded, it is what the creator confirms) const initialBuyLabel = initialBuyRaw ? `${fmtUnitsExact(initialBuyRaw, quote.decimals)} ${quote.symbol}` : ""; const errors: string[] = []; // the token step's checks, named once: the validation list and the step rail both read them @@ -303,7 +290,6 @@ export default function LaunchForm({ ethUsd, gitlawbUsd = null, initialChain = D if (!symbolOk) errors.push("Symbol: use 1–10 English letters (A–Z) or digits (0–9)."); if (startTick === null) errors.push("Starting market cap must be a positive number."); if (quoteKey === "stock" && !stock) errors.push(STOCK_PICK_MESSAGE); - if (isBrandQuote && quote.usd === null && !customMcap.trim() && startTick === null) errors.push(`${quote.symbol} price unavailable right now: enter a custom starting market cap in ${quote.symbol}, or reload.`); if (!httpsOrEmpty(image)) errors.push("Image must be an https URL."); if (!httpsOrEmpty(banner)) errors.push("Banner must be an https URL."); if (!httpsOrEmpty(website)) errors.push("Website must be an https URL."); @@ -553,7 +539,7 @@ export default function LaunchForm({ ethUsd, gitlawbUsd = null, initialChain = D ); })} - {/* every chain offers at least one fixed quote; Base and Robinhood Chain add tokenized stocks, Robinhood Chain GITLAWB */} + {/* every chain offers at least one fixed quote; Base and Robinhood Chain add tokenized stocks */} {cfg.quotes.length > 0 ? (
@@ -569,30 +555,7 @@ export default function LaunchForm({ ethUsd, gitlawbUsd = null, initialChain = D

{/* the picked quote key, not the resolved quote: with Stock chosen and no stock yet, the quote still falls back to the first one */} - {quoteKey === "stock" ? (CHAIN_COPY[chain].stock?.pays ?? "") : quote.key === "usdg" || quote.key === "usdc" ? `Buyers pay with ${quote.symbol}; market cap and fees are in dollars.` : isBrandQuote ? `Buyers pay with ${quote.symbol}; fees are paid in ${quote.symbol}, or burned.` : "Buyers pay with ETH."} -

- {brandQuote && quote.key !== brandQuote.key ? ( - - ) : null} -
- ) : null} - {isBrandQuote ? ( -
- - {quote.logo ? ( - // eslint-disable-next-line @next/next/no-img-element - - ) : null} - {quote.symbol} - {quote.name} - {quote.usd ? {fmtUsd(quote.usd)} : price unavailable} - -

- Your token carries the badge on the launch list, trending, the activity feed, its page and its share card.{" "} - GITLAWB is Twigpine's token{CHAIN_COPY[chain].gitlawbOrigin}: an ordinary ERC-20, no transfer restrictions, no issuer switch. Name no beneficiary and the fees are burned as GITLAWB when collected. Price from the Uniswap v4 WETH/GITLAWB pool on Base.{" "} - twigpine.com ↗ + {quoteKey === "stock" ? (CHAIN_COPY[chain].stock?.pays ?? "") : quote.key === "usdg" || quote.key === "usdc" ? `Buyers pay with ${quote.symbol}; market cap and fees are in dollars.` : "Buyers pay with ETH."}

) : null} @@ -824,8 +787,8 @@ export default function LaunchForm({ ethUsd, gitlawbUsd = null, initialChain = D {fdvPreview !== null && tokensPerEth !== null ? (

Opens at {cap(fdvPreview).main} - · {cap(fdvPreview).detail} fully diluted. The first {isBrandQuote ? "1M " : ""}{quote.symbol} buys about{" "} - {fmtCompact(tokensPerEth * (isBrandQuote ? 1e6 : 1), 0)} tokens, then the price climbs along the curve. + · {cap(fdvPreview).detail} fully diluted. The first {quote.symbol} buys about{" "} + {fmtCompact(tokensPerEth, 0)} tokens, then the price climbs along the curve.

) : null} @@ -1000,7 +963,6 @@ export default function LaunchForm({ ethUsd, gitlawbUsd = null, initialChain = D

At launch

-
@@ -1054,7 +1016,6 @@ function Step({ n, done, last = false, icon, children }: { n: number; done: bool /** A quote's mark in the picker: the bundled logo where there is one, a plain glyph for the rest. */ function QuoteMark({ k }: { k: Quote["key"] }) { - if (k === "gitlawb") return ; if (k === "stock") return