From 5b9ea9e1eecf9344e4f6568e106e11689baa4ffb Mon Sep 17 00:00:00 2001 From: Dan Anderson Date: Fri, 23 Oct 2026 18:39:45 -0400 Subject: [PATCH] Chart trading, burns and minting on stats page --- apps/api/src/queries/stats.ts | 51 +++++ apps/api/src/read/launches.ts | 32 +-- .../stats/_components/ecosystem-activity.tsx | 148 +++++++++++++ .../stats/_components/stats-content.tsx | 208 +++++++----------- apps/web/src/app/[lang]/stats/page.tsx | 4 +- apps/web/src/lib/api/launchpad-api.ts | 11 +- apps/web/src/lib/stats-activity.ts | 33 +++ apps/web/src/locales/_source.json | 93 ++++++-- apps/web/src/locales/es.json | 30 ++- apps/web/src/locales/es.status.json | 30 ++- apps/web/src/locales/fr.json | 30 ++- apps/web/src/locales/fr.status.json | 30 ++- apps/web/src/locales/ja.json | 30 ++- apps/web/src/locales/ja.status.json | 30 ++- apps/web/src/locales/ko.json | 30 ++- apps/web/src/locales/ko.status.json | 30 ++- apps/web/src/locales/pt.json | 30 ++- apps/web/src/locales/pt.status.json | 30 ++- apps/web/src/locales/ru.json | 30 ++- apps/web/src/locales/ru.status.json | 30 ++- apps/web/src/locales/uk.json | 30 ++- apps/web/src/locales/uk.status.json | 30 ++- apps/web/src/locales/zh-hk.json | 30 ++- apps/web/src/locales/zh-hk.status.json | 30 ++- apps/web/src/locales/zh-tw.json | 30 ++- apps/web/src/locales/zh-tw.status.json | 30 ++- apps/web/src/locales/zh.json | 30 ++- apps/web/src/locales/zh.status.json | 30 ++- tests/stats-activity.test.ts | 112 ++++++++++ 29 files changed, 964 insertions(+), 328 deletions(-) create mode 100644 apps/api/src/queries/stats.ts create mode 100644 apps/web/src/app/[lang]/stats/_components/ecosystem-activity.tsx create mode 100644 apps/web/src/lib/stats-activity.ts create mode 100644 tests/stats-activity.test.ts diff --git a/apps/api/src/queries/stats.ts b/apps/api/src/queries/stats.ts new file mode 100644 index 00000000..58d2e5d4 --- /dev/null +++ b/apps/api/src/queries/stats.ts @@ -0,0 +1,51 @@ +import { one, q } from "#api/db"; + +export const STATS_BUCKETS = 90; +export const STATS_BLOCKS_PER_BUCKET = 144; + +export async function statsHeight(db: D1Database): Promise { + const row = await one<{ height: number }>(db, + "SELECT CAST(value AS INTEGER) AS height FROM chain_state WHERE key = 'block_height'"); + return row?.height ?? 0; +} + +export interface TradeActivityBucket { + bucket: number; + n: number; + xcp: string; +} + +/** Use the existing partial block index; the maker's mirror row must never + * double a book fill. Both buys and sells contribute positive gross volume. */ +export function tradeActivityByBucket(db: D1Database, startBlock: number, endBlock: number) { + return q(db, + `SELECT e.block_index / 144 AS bucket, COUNT(*) AS n, + CAST(SUM(ABS(CAST(e.xcp_delta AS INTEGER))) AS TEXT) AS xcp + FROM asset_events e + WHERE e.primary_actor = 1 AND e.block_index BETWEEN ?1 AND ?2 + AND EXISTS (SELECT 1 FROM launches l WHERE l.asset = e.asset AND l.conforming = 1) + GROUP BY bucket ORDER BY bucket`, startBlock, endBlock); +} + +export interface BurnActivityBucket { + bucket: number; + asset: string; + divisible: number; + n: number; + quantity: string; +} + +/** The burn index contains holder SENDs and explicit destructions, excluding + * failed-mint cleanup and LP tokens. Keep quantities per asset, as exact raw + * integers: unrelated token units cannot be added into an ecosystem total. + * CROSS JOIN keeps the indexed block range as the outer scan, followed by + * a unique asset lookup, instead of rescanning burns for every launch. */ +export function burnActivityByBucket(db: D1Database, startBlock: number, endBlock: number) { + return q(db, + `SELECT b.block_index / 144 AS bucket, b.asset, l.divisible, + COUNT(*) AS n, CAST(SUM(CAST(b.quantity AS INTEGER)) AS TEXT) AS quantity + FROM token_burns b + CROSS JOIN launches l ON l.asset = b.asset AND l.conforming = 1 + WHERE b.block_index BETWEEN ?1 AND ?2 AND b.tx_index > l.tx_index + GROUP BY bucket, b.asset ORDER BY bucket, b.asset`, startBlock, endBlock); +} diff --git a/apps/api/src/read/launches.ts b/apps/api/src/read/launches.ts index 7af2f489..7f5ebd3a 100644 --- a/apps/api/src/read/launches.ts +++ b/apps/api/src/read/launches.ts @@ -27,6 +27,7 @@ import { tradeVolumeByDay, } from "#api/queries/launches"; import { J, router } from "#api/read/respond"; +import { burnActivityByBucket, statsHeight, STATS_BLOCKS_PER_BUCKET, STATS_BUCKETS, tradeActivityByBucket } from "#api/queries/stats"; import { getRewardAccount, listRewardBatches } from "#api/queries/rewards"; import { getAddressLaunchpadSummary } from "#api/queries/address-summary"; import { @@ -140,10 +141,6 @@ launchesRoute.get("/v2/launches/index", async (c) => { // Conforming launches per phase. The homepage shows a slice of each section // and needs the size of the whole; /stats asks the same question directly. -/** ~28 Bitcoin days of history, which is as far back as a "what's happening - * lately" chart stays a chart rather than a timeline. */ -const ACTIVITY_BUCKETS = 28; -const BLOCKS_PER_DAY = 144; /** Edge-cache lifetimes, in seconds, kept together so the site's freshness * policy reads as one decision rather than as numbers scattered per route. * STATS_TTL matches the cron interval; nothing it summarises can change @@ -209,16 +206,26 @@ launchesRoute.get("/v2/research/behavior", async (c) => { }); launchesRoute.get("/v2/stats", async (c) => { - const height = Number(c.req.query("height") ?? 0) || 0; - const since = height > 0 ? Math.max(0, height - ACTIVITY_BUCKETS * BLOCKS_PER_DAY) : 0; - const sinceBucket = Math.floor(since / BLOCKS_PER_DAY); - const [rows, totals, buckets, refundBuckets, tradeVolume] = await Promise.all([ + const includeActivity = c.req.query("activity") === "1"; + // Anchor every chart to our indexed tip, even if the caller's node is ahead. + // The detailed charts are opt-in so launch counts/rewards do not pay for + // extra aggregation. The chart URL is stable across caller block heights. + const height = includeActivity + ? await statsHeight(c.env.DB) + : Number(c.req.query("height") ?? 0) || 0; + const sinceBucket = includeActivity + ? Math.max(0, Math.floor(height / STATS_BLOCKS_PER_BUCKET) - STATS_BUCKETS + 1) + : Math.floor(Math.max(0, height - 28 * STATS_BLOCKS_PER_BUCKET) / STATS_BLOCKS_PER_BUCKET); + const startBlock = sinceBucket * STATS_BLOCKS_PER_BUCKET; + const [rows, totals, buckets, refundBuckets, tradeVolume, trades, burns] = await Promise.all([ countByPhase(c.env.DB), getMintTotals(c.env.DB), // Whole buckets, so the window is expressed in the unit the rollup stores. listMintBuckets(c.env.DB, sinceBucket), refundsByBucket(c.env.DB, sinceBucket), tradeVolumeByDay(c.env.DB), + includeActivity ? tradeActivityByBucket(c.env.DB, startBlock, height) : Promise.resolve([]), + includeActivity ? burnActivityByBucket(c.env.DB, startBlock, height) : Promise.resolve([]), ]); const counts: Record = { scheduled: 0, @@ -256,21 +263,20 @@ launchesRoute.get("/v2/stats", async (c) => { total, activity, markets, + ...(includeActivity ? { ecosystem: { height, trades_daily: trades, burns_daily: burns } } : {}), // Bucket index is `block / 144`; the client turns it back into an // approximate day using the height it already has. daily: buckets, refunds_daily: refundBuckets, - blocks_per_bucket: BLOCKS_PER_DAY, + blocks_per_bucket: STATS_BLOCKS_PER_BUCKET, }, }, // Matched to the indexer's own cadence rather than the 60s every other // route uses: the cron writes every 5 minutes, so a shorter TTL cannot // make this fresher — it can only re-serve the same answer more times. // - // This used to be the cost control, back when the route ran three full - // aggregates per request. Since migration 0010 those are materialised and - // a miss costs a primary-key lookup plus a short indexed range, so the TTL - // is now about freshness honesty rather than about cost. + // Mint totals are materialised; trading and burns use indexed, bounded + // block ranges. The shared edge cache avoids repeating these per visitor. STATS_TTL, ); }); diff --git a/apps/web/src/app/[lang]/stats/_components/ecosystem-activity.tsx b/apps/web/src/app/[lang]/stats/_components/ecosystem-activity.tsx new file mode 100644 index 00000000..ef6ca60b --- /dev/null +++ b/apps/web/src/app/[lang]/stats/_components/ecosystem-activity.tsx @@ -0,0 +1,148 @@ +"use client"; + +import { useState, type PointerEvent } from "react"; +import type { LaunchStats } from "@/lib/api/launchpad-api"; +import { ACTIVITY_WINDOWS, statsActivity, type ActivityWindow } from "@/lib/stats-activity"; +import { fromSats, tokenQty } from "@/lib/format"; +import { useNumbers } from "@/lib/i18n/numbers"; +import { useT } from "@/lib/i18n/client"; +import { LazyLink } from "@/components/lazy-link"; + +export function EcosystemActivity({ stats }: { stats: LaunchStats }) { + const [days, setDays] = useState(28); + const [selected, setSelected] = useState(null); + const num = useNumbers(); + const t = useT(); + const data = statsActivity(stats, days); + if (!data) return

{t("Activity charts are unavailable right now.")}

; + + const { series, totals, assets } = data; + const point = series[selected ?? series.length - 1]!; + const about = (index: number) => index === series.length - 1 ? t("Current day · partial") : t("About {n}d ago", { n: series.length - 1 - index }); + const rows = [ + { label: t("Trading"), value: `${num.fixed(fromSats(totals.xcp), 1)} XCP`, + detail: t("{n} fills · pools + order book", { n: num.commas(totals.fills) }), + values: series.map(d => fromSats(d.xcp)), color: "text-emerald-600 dark:text-emerald-400", + format: (value: number) => `${num.compact(value)} XCP` }, + { label: t("Burns & destructions"), value: num.commas(totals.burns), + detail: t("Actions across {n} assets", { n: num.commas(assets.length) }), + values: series.map(d => d.burns), color: "text-orange-600 dark:text-orange-400", + format: (value: number) => num.compact(value) }, + { label: t("Minting"), value: num.commas(totals.mints), detail: t("mint transactions"), + values: series.map(d => d.mints), color: "text-purple-600 dark:text-purple-400", + format: (value: number) => num.compact(value) }, + ]; + + return ( +
+
+
+

{t("Activity")}

+

{t("Last {n} days · approximate", { n: days })}

+
+
+ {ACTIVITY_WINDOWS.map(window => ( + + ))} +
+
+ +
+ {rows.map(row => ( +
+
+

{row.label}

+

{row.value}

+

{row.detail}

+
+ +
+ ))} +
+ +
+
+ {about(selected ?? series.length - 1)} + {num.fixed(fromSats(point.xcp), 2)} XCP + {t("{n} burn actions", { n: num.commas(point.burns) })} + {t("{n} mints", { n: num.commas(point.mints) })} +
+

{t("144 blocks per day. Separate scales. Tap or hover to inspect.")}

+
+ +
+
+

{t("Most active burns")}

+ {t("Same period · ranked by actions")} +
+ {assets.length === 0 ?

{t("No burns in this window.")}

: ( +
+ + + + + + {assets.slice(0, 5).map(asset => ( + + + + + + ))} + +
{t("Asset")}{t("Actions")}{t("Tokens removed")}
{asset.asset}{num.commas(asset.n)}{num.compact(tokenQty(asset.quantity, asset.divisible))}
+
+ )} +

{t("Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.")}

+
+
+ ); +} + +function ActivityBars({ label, values, color, selected, onSelect, format, about }: { + label: string; values: number[]; color: string; selected: number | null; + onSelect: (index: number | null) => void; format: (value: number) => string; about: (index: number) => string; +}) { + const t = useT(); + const peak = Math.max(...values, 1); + const width = 560; + const step = width / values.length; + const chartHeight = 80; + const selectAt = (event: PointerEvent) => { + const rect = event.currentTarget.getBoundingClientRect(); + onSelect(Math.max(0, Math.min(values.length - 1, Math.floor((event.clientX - rect.left) / rect.width * values.length)))); + }; + return ( +
+
{format(peak)}{t("per day")}
+ { if (event.pointerType === "mouse") onSelect(null); }} + onKeyDown={event => { + const index = selected ?? values.length - 1; + if (event.key === "ArrowLeft" || event.key === "ArrowRight") { + event.preventDefault(); + onSelect(Math.max(0, Math.min(values.length - 1, index + (event.key === "ArrowLeft" ? -1 : 1)))); + } else if (event.key === "Escape") onSelect(null); + }}> + {label} + {[0, 40, 80].map(y => )} + {selected !== null && } + {values.map((value, i) => { + const height = value > 0 ? Math.max(1, value / peak * chartHeight) : 0; + return + {`${about(i)} · ${format(value)}`} + ; + })} + +
{about(0)}{t("Current day · partial")}
+
+ ); +} diff --git a/apps/web/src/app/[lang]/stats/_components/stats-content.tsx b/apps/web/src/app/[lang]/stats/_components/stats-content.tsx index 00b2ed79..750ff44c 100644 --- a/apps/web/src/app/[lang]/stats/_components/stats-content.tsx +++ b/apps/web/src/app/[lang]/stats/_components/stats-content.tsx @@ -4,6 +4,7 @@ import { rich } from "@/lib/i18n/rich"; import { LazyLink } from "@/components/lazy-link"; import type { fetchCommunities, fetchLaunchStats } from "@/lib/api/launchpad-api"; import { CommunitiesSection } from "@/app/[lang]/stats/_components/communities"; +import { EcosystemActivity } from "@/app/[lang]/stats/_components/ecosystem-activity"; import { Stat } from "@/app/[lang]/stats/_components/stat"; import type { fetchXcpUsd, fetchXcpUsdHistory } from "@/lib/api/price"; import { fromSats } from "@/lib/format"; @@ -32,7 +33,7 @@ export function StatsContent({ height, stats, xcpUsd, xcpUsdHistory, communities ); } - const { counts, total, activity, daily, blocks_per_bucket } = stats; + const { counts, total, activity, blocks_per_bucket } = stats; const settled = counts.graduated + counts.refunded; const activeXcp = fromSats(activity.active_xcp); const poolXcp = fromSats(stats.markets?.pool_xcp ?? 0); @@ -46,16 +47,7 @@ export function StatsContent({ height, stats, xcpUsd, xcpUsdHistory, communities 0, ); - // Fill the window so quiet days read as quiet rather than as missing. The - // bucket is `block / 144`, so the newest bucket is the one the tip is in. - const newest = Math.floor(height / blocks_per_bucket); - const byBucket = new Map(daily.map((d) => [d.bucket, d])); - const series = Array.from({ length: WINDOW_DAYS }, (_, i) => { - const bucket = newest - (WINDOW_DAYS - 1 - i); - return { bucket, daysAgo: newest - bucket, n: byBucket.get(bucket)?.n ?? 0 }; - }); - const peak = series.reduce((m, d) => Math.max(m, d.n), 0); - const windowTotal = series.reduce((sum, d) => sum + d.n, 0); + const newest = Math.floor((stats.ecosystem?.height ?? height) / blocks_per_bucket); const refundsByBucket = new Map((stats.refunds_daily ?? []).map((d) => [d.bucket, d])); const refundSeries = Array.from({ length: WINDOW_DAYS }, (_, i) => { const bucket = newest - (WINDOW_DAYS - 1 - i); @@ -75,133 +67,91 @@ export function StatsContent({ height, stats, xcpUsd, xcpUsdHistory, communities daysAgo === 0 ? t("today") : t("{n}d ago", { n: daysAgo }); return ( -
+

{t("Stats")}

- {t("Every launch that conforms to XCP-69, and what has actually been minted.")} + {t("Trading, burns and minting across XCP-69.")}

- {/* Two columns on a phone, three above it. The tiles are ordered for the - phone with `order-*` and released back to source order at `sm`, where - three-across already pairs them sensibly. On two columns the pairs - are what matter: market cap beside the pools backing it, mints beside - the minters who made them, and the two money-in-motion figures — XCP - committed to open mints, XCP that has actually traded — side by side - rather than split across the whole grid. */} -
- }) - : t("graduated coins") - } - mobileHint={ - xcpUsd - ? rich(t, "≈ {amount} · graduated", { amount: }) - : t("graduated") - } - /> - }) - : t("in pools") - } - /> - 0 - ? rich(t, "≈ {amount} traded, all time", { amount: }) - : t("traded, all time") - } - /> - - - }) - : t("committed to open mints") - } - mobileHint={ - xcpUsd - ? rich(t, "≈ {amount} committed", { amount: }) - : t("committed") - } - /> -
+ -
-
-

{t("Minting activity")}

- - {t("{n} in the last {days} days", { n: num.commas(windowTotal), days: WINDOW_DAYS })} - +
+

{t("Ecosystem overview")}

+
+ }) + : t("graduated coins") + } + mobileHint={ + xcpUsd + ? rich(t, "≈ {amount} · graduated", { amount: }) + : t("graduated") + } + /> + }) + : t("in pools") + } + /> + 0 + ? rich(t, "≈ {amount} traded, all time", { amount: }) + : t("traded, all time") + } + /> + + + }) + : t("committed to open mints") + } + mobileHint={ + xcpUsd + ? rich(t, "≈ {amount} committed", { amount: }) + : t("committed") + } + />
- {peak === 0 ? ( -

{t("No mints in this window.")}

- ) : ( - <> -
- {series.map((d) => ( -
- ))} -
-
- {t("{n}d ago", { n: WINDOW_DAYS })} - {t("now")} -
- - )} -

- {t( - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", - )} -

diff --git a/apps/web/src/app/[lang]/stats/page.tsx b/apps/web/src/app/[lang]/stats/page.tsx index 2a12f349..f6a4dc4e 100644 --- a/apps/web/src/app/[lang]/stats/page.tsx +++ b/apps/web/src/app/[lang]/stats/page.tsx @@ -10,7 +10,7 @@ import { StatsContent } from "@/app/[lang]/stats/_components/stats-content"; const PAGE_METADATA: Metadata = { title: msg("Stats — xcp.fun"), - description: msg("XCP-69 launches by phase, and what has actually been minted."), + description: msg("Trading, burns and minting across XCP-69."), }; /** The page's own metadata, plus the hreflang set for the locale it is @@ -36,7 +36,7 @@ export const revalidate = 60; export default async function StatsPage() { const height = await fetchBlockHeight(); const [stats, xcpUsd, xcpUsdHistory, communities] = await Promise.all([ - fetchLaunchStats(height), + fetchLaunchStats(height, true), fetchXcpUsd(), fetchXcpUsdHistory(), fetchCommunities(), diff --git a/apps/web/src/lib/api/launchpad-api.ts b/apps/web/src/lib/api/launchpad-api.ts index 323ccd24..b1a2fb7f 100644 --- a/apps/web/src/lib/api/launchpad-api.ts +++ b/apps/web/src/lib/api/launchpad-api.ts @@ -1113,6 +1113,12 @@ export async function fetchCandles( } export interface LaunchStats { + /** Optional during API/web rollout. Missing is unavailable, not zero. */ + ecosystem?: { + height: number; + trades_daily: { bucket: number; n: number; xcp: string }[]; + burns_daily: { bucket: number; asset: string; divisible: number; n: number; quantity: string }[]; + }; counts: { scheduled: number; minting: number; graduated: number; refunded: number }; total: number; activity: { @@ -1149,9 +1155,10 @@ export interface LaunchStats { /** How many conforming launches sit in each phase. Null on any failure — the * homepage shows section counts when it has them and simply omits them when * it doesn't, rather than rendering a confident zero. */ -export async function fetchLaunchStats(height = 0): Promise { +export async function fetchLaunchStats(height = 0, includeActivity = false): Promise { try { - const res = await launchpadApiFetch(`/v2/stats?height=${height}`, { + const path = includeActivity ? "/v2/stats?activity=1" : `/v2/stats?height=${height}`; + const res = await launchpadApiFetch(path, { signal: AbortSignal.timeout(3_000), next: { revalidate: 60 }, }); diff --git a/apps/web/src/lib/stats-activity.ts b/apps/web/src/lib/stats-activity.ts new file mode 100644 index 00000000..b8715648 --- /dev/null +++ b/apps/web/src/lib/stats-activity.ts @@ -0,0 +1,33 @@ +import type { LaunchStats } from "@/lib/api/launchpad-api"; + +export const ACTIVITY_WINDOWS = [7, 28, 90] as const; +export type ActivityWindow = typeof ACTIVITY_WINDOWS[number]; + +/** Zero-fill whole, aligned block buckets. Only the newest is partial. + * Preserve raw integers until the chart/display boundary. */ +export function statsActivity(stats: LaunchStats, days: ActivityWindow) { + if (!stats.ecosystem || stats.ecosystem.height <= 0) return null; + const newest = Math.floor(stats.ecosystem.height / stats.blocks_per_bucket); + const first = newest - days + 1; + const mints = new Map(stats.daily.map(d => [d.bucket, d.n])); + const trades = new Map(stats.ecosystem.trades_daily.map(d => [d.bucket, d])); + const burns = new Map(); + const assets = new Map(); + for (const row of stats.ecosystem.burns_daily) { + if (row.bucket < first || row.bucket > newest) continue; + burns.set(row.bucket, (burns.get(row.bucket) ?? 0) + row.n); + const asset = assets.get(row.asset) ?? { asset: row.asset, divisible: !!row.divisible, n: 0, quantity: 0n }; + asset.n += row.n; + asset.quantity += BigInt(row.quantity); + assets.set(row.asset, asset); + } + const series = Array.from({ length: days }, (_, i) => { + const bucket = first + i; + const trade = trades.get(bucket); + return { bucket, mints: mints.get(bucket) ?? 0, fills: trade?.n ?? 0, + xcp: BigInt(trade?.xcp ?? "0"), burns: burns.get(bucket) ?? 0 }; + }); + const totals = series.reduce((a, d) => ({ mints: a.mints + d.mints, fills: a.fills + d.fills, + xcp: a.xcp + d.xcp, burns: a.burns + d.burns }), { mints: 0, fills: 0, xcp: 0n, burns: 0 }); + return { series, totals, assets: [...assets.values()].sort((a, b) => b.n - a.n || a.asset.localeCompare(b.asset)) }; +} diff --git a/apps/web/src/locales/_source.json b/apps/web/src/locales/_source.json index 6d8fdb22..eb3fccba 100644 --- a/apps/web/src/locales/_source.json +++ b/apps/web/src/locales/_source.json @@ -151,6 +151,9 @@ "{label} Counterparty on Bitcoin mainnet. XCP-69 launches are ordinary Bitcoin transactions carrying Counterparty messages.": [ "app/[lang]/docs/page.tsx" ], + "{label}. Use arrow keys to inspect days.": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "{lead} {n} XCP left at {sats} sats/XCP. BTC lands with every sale. Closing settles 5 blocks after it confirms and returns the rest.": [ "app/[lang]/dispense/_components/bridge.tsx" ], @@ -198,6 +201,9 @@ "{n} blocks · {asset}": [ "app/[lang]/[asset]/_components/scheduled-pulse.tsx" ], + "{n} burn actions": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "{n} buyers": [ "app/[lang]/[asset]/_components/pressure-panel.tsx" ], @@ -222,6 +228,9 @@ "{n} fills": [ "components/address-hover-card.tsx" ], + "{n} fills · pools + order book": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "{n} graduated · {pct}%": [ "app/[lang]/stats/_components/stats-content.tsx" ], @@ -252,9 +261,6 @@ "app/[lang]/profile/_components/rewards-card.tsx", "components/address-hover-card.tsx" ], - "{n} mint · about {when}": [ - "app/[lang]/stats/_components/stats-content.tsx" - ], "{n} minted": [ "app/[lang]/[asset]/_components/launch-view.tsx" ], @@ -272,11 +278,9 @@ ], "{n} mints": [ "app/[lang]/profile/_components/rewards-card.tsx", + "app/[lang]/stats/_components/ecosystem-activity.tsx", "components/address-hover-card.tsx" ], - "{n} mints · about {when}": [ - "app/[lang]/stats/_components/stats-content.tsx" - ], "{n} MINTS for every mint": [ "app/[lang]/rewards/_components/rewards-content.tsx" ], @@ -414,6 +418,7 @@ "app/[lang]/[asset]/_components/activity-tabs.tsx" ], "{n}d": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx", "lib/format.ts" ], "{n}d ago": [ @@ -673,6 +678,9 @@ "100% at confirmation": [ "app/[lang]/[asset]/_components/trade-panel.tsx" ], + "144 blocks per day. Separate scales. Tap or hover to inspect.": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "2 · The liquidity is locked": [ "app/[lang]/faq/_components/explainer.tsx" ], @@ -734,6 +742,9 @@ "About": [ "app/[lang]/docs/page.tsx" ], + "About {n}d ago": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Across {n} fully exited position": [ "app/[lang]/profile/_components/history-tab.tsx" ], @@ -758,6 +769,12 @@ "Across {n} pools": [ "app/[lang]/profile/_components/pools-tab.tsx" ], + "Actions": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], + "Actions across {n} assets": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Actions for {name}": [ "components/chat-panel.tsx" ], @@ -766,12 +783,16 @@ ], "Activity": [ "app/[lang]/profile/_components/profile-view.tsx", + "app/[lang]/stats/_components/ecosystem-activity.tsx", "components/site-footer.tsx", "components/site-header.tsx" ], "Activity — xcp.fun": [ "app/[lang]/activity/page.tsx" ], + "Activity charts are unavailable right now.": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Activity unavailable.": [ "components/address-hover-card.tsx" ], @@ -903,7 +924,8 @@ "Asset": [ "app/[lang]/activity/_components/activity-view.tsx", "app/[lang]/faq/page.tsx", - "app/[lang]/mempool/_components/mempool-view.tsx" + "app/[lang]/mempool/_components/mempool-view.tsx", + "app/[lang]/stats/_components/ecosystem-activity.tsx" ], "Asset name first registered in {year}.": [ "app/[lang]/[asset]/_components/launch-view.tsx" @@ -1074,6 +1096,9 @@ "Burns": [ "app/[lang]/activity/_components/activity-view.tsx" ], + "Burns & destructions": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "buy": [ "app/[lang]/limit/_components/limit-surface.tsx" ], @@ -1497,6 +1522,9 @@ "components/language-switch.tsx", "components/site-footer.tsx" ], + "Current day · partial": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Currently unloading:": [ "app/[lang]/dispense/_components/bridge.tsx" ], @@ -1626,6 +1654,9 @@ "Earned so far": [ "app/[lang]/rewards/_components/rewards-content.tsx" ], + "Ecosystem overview": [ + "app/[lang]/stats/_components/stats-content.tsx" + ], "Edit token info": [ "app/[lang]/[asset]/_components/edit-panel.tsx" ], @@ -1669,9 +1700,6 @@ "Event": [ "app/[lang]/activity/_components/activity-view.tsx" ], - "Every launch that conforms to XCP-69, and what has actually been minted.": [ - "app/[lang]/stats/_components/stats-content.tsx" - ], "Every LP token is burned — this liquidity can never be withdrawn.": [ "app/[lang]/[asset]/_components/activity-tabs.tsx" ], @@ -1874,9 +1902,6 @@ "Grid view": [ "app/[lang]/_components/launch-sections.tsx" ], - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": [ - "app/[lang]/stats/_components/stats-content.tsx" - ], "guaranteed by consensus, not this website": [ "app/[lang]/faq/page.tsx" ], @@ -1898,6 +1923,9 @@ "hold one, made none": [ "app/[lang]/stats/_components/communities.tsx" ], + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Holders": [ "app/[lang]/[asset]/_components/activity-tabs.tsx", "app/[lang]/[asset]/_components/launch-stats.tsx", @@ -2072,6 +2100,9 @@ "components/language-switch.tsx", "components/site-footer.tsx" ], + "Last {n} days · approximate": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "latest launch {age}": [ "components/address-hover-card.tsx" ], @@ -2366,6 +2397,7 @@ "app/[lang]/faq/_components/explainer.tsx" ], "mint transactions": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx", "app/[lang]/stats/_components/stats-content.tsx" ], "Mint window": [ @@ -2416,9 +2448,7 @@ "app/[lang]/all/_components/all-launches-view.tsx", "app/[lang]/profile/_components/launches-tab.tsx", "app/[lang]/profile/_components/profile-view.tsx", - "app/[lang]/stats/_components/stats-content.tsx" - ], - "Minting activity": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx", "app/[lang]/stats/_components/stats-content.tsx" ], "minting is live": [ @@ -2480,6 +2510,9 @@ "More than one wallet is installed. Pick the one to connect with.": [ "components/connect-button.tsx" ], + "Most active burns": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Must hold 10 XCP to chat.": [ "components/chat-panel.tsx" ], @@ -2546,6 +2579,9 @@ "No banned users.": [ "components/chat-panel.tsx" ], + "No burns in this window.": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "No closed positions yet.": [ "app/[lang]/profile/_components/history-tab.tsx" ], @@ -2598,9 +2634,6 @@ "No mints from that address. Search matches a full address exactly.": [ "app/[lang]/rewards/_components/earners-table.tsx" ], - "No mints in this window.": [ - "app/[lang]/stats/_components/stats-content.tsx" - ], "No mints yet — be the first.": [ "app/[lang]/[asset]/_components/activity-tabs.tsx" ], @@ -2940,6 +2973,9 @@ "Per address": [ "app/[lang]/[asset]/_components/launch-stats.tsx" ], + "per day": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Per mint": [ "app/[lang]/rewards/_components/rewards-content.tsx" ], @@ -3271,6 +3307,9 @@ "app/[lang]/[asset]/_components/mint-deadline.tsx", "app/[lang]/dispense/_components/bridge.tsx" ], + "Same period · ranked by actions": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Save failed": [ "app/[lang]/[asset]/_components/edit-panel.tsx" ], @@ -3680,6 +3719,9 @@ "This XCP is escrowed by consensus. It returns automatically if a launch misses its soft cap; if the launch graduates, you receive the tokens shown below instead.": [ "app/[lang]/profile/_components/minting-tab.tsx" ], + "Time range": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Time remaining": [ "app/[lang]/[asset]/_components/mint-deadline.tsx" ], @@ -3711,6 +3753,9 @@ "Tokens minted": [ "app/[lang]/faq/_components/explainer.tsx" ], + "Tokens removed": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Too soon — needs to be block {n} or later (1 hour out). The launch has to confirm before it opens.": [ "app/[lang]/create/page.tsx" ], @@ -3764,12 +3809,19 @@ "app/[lang]/[asset]/_components/activity-tabs.tsx", "app/[lang]/activity/_components/activity-view.tsx" ], + "Trading": [ + "app/[lang]/stats/_components/ecosystem-activity.tsx" + ], "Trading and pricing": [ "app/[lang]/docs/page.tsx" ], "Trading Data": [ "app/[lang]/_components/launch-sections.tsx" ], + "Trading, burns and minting across XCP-69.": [ + "app/[lang]/stats/_components/stats-content.tsx", + "app/[lang]/stats/page.tsx" + ], "Transaction": [ "app/[lang]/profile/_components/rewards-tab.tsx" ], @@ -4058,9 +4110,6 @@ "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": [ "app/[lang]/mempool/page.tsx" ], - "XCP-69 launches by phase, and what has actually been minted.": [ - "app/[lang]/stats/page.tsx" - ], "XCP-69 launches on Counterparty": [ "components/site-footer.tsx" ], diff --git a/apps/web/src/locales/es.json b/apps/web/src/locales/es.json index a3d00b4f..bccbc25f 100644 --- a/apps/web/src/locales/es.json +++ b/apps/web/src/locales/es.json @@ -77,12 +77,10 @@ "{n} launch": "{n} lanzamiento", "{n} launches": "{n} lanzamientos", "{n} mint": "{n} acuñación", - "{n} mint · about {when}": "{n} acuñación · {when} aprox.", "{n} minted": "{n} acuñados", "{n} minter": "{n} acuñador", "{n} minters": "{n} acuñadores", "{n} mints": "{n} acuñaciones", - "{n} mints · about {when}": "{n} acuñaciones · {when} aprox.", "{n} MINTS for every mint": "{n} MINTS por cada acuñación", "{n} MINTS per mint · all-time program total, not your wallet balance.": "{n} MINTS por acuñación · total histórico del programa, no el saldo de tu billetera.", "{n} moved": "{n} movieron", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "En custodia hasta que el lanzamiento se resuelva: tokens si se agota, reembolso completo en XCP si no.", "Estimated fill": "Ejecución estimada", "Event": "Evento", - "Every launch that conforms to XCP-69, and what has actually been minted.": "Todos los lanzamientos que cumplen con XCP-69, y lo que de verdad se ha acuñado.", "Every LP token is burned — this liquidity can never be withdrawn.": "Todos los tokens LP están quemados — esta liquidez nunca podrá retirarse.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "Cada acuñación en un lanzamiento conforme, contada. Ordenado por acuñaciones, porque esa es la unidad en la que se paga la recompensa.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "Todos los tokens acuñados vendidos de golpe en una sola operación — el pool sigue cotizando una oferta de compra con {left} XCP restantes, y los vendedores salen a {mult}× el precio de acuñación ({paid}% de lo que pagaron). Esos {left} XCP nunca se pueden retirar: cada lanzamiento es un sumidero permanente para el propio XCP.", @@ -554,7 +551,6 @@ "Graveyard": "Cementerio", "Graveyard pages": "Páginas del cementerio", "Grid view": "Vista de cuadrícula", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "Agrupado de 144 en 144 bloques — un día de Bitcoin. Exacto respecto a la cadena y aproximado respecto al reloj, que es el orden correcto para una cadena que esta página describe.", "guaranteed by consensus, not this website": "garantizado por consenso, no por este sitio", "Hard cap": "Hard cap", "held by {n} sellers": "en manos de {n} vendedores", @@ -712,7 +708,6 @@ "Minters": "Acuñadores", "minting": "acuñando", "Minting": "Acuñando", - "Minting activity": "Actividad de acuñación", "minting is live": "la acuñación está abierta", "minting is live — refresh the page": "la acuñación está abierta — recarga la página", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "La acuñación se paga con XCP desde el saldo de Counterparty de tu dirección — el BTC solo cubre las comisiones de minería. La vía más rápida sin cuenta es un dispensador en la cadena: envías BTC y el protocolo te entrega XCP automáticamente. {link}. La acuñación máxima es de 10 XCP; un lanzamiento necesita 0.5 XCP para el nombre.", @@ -760,7 +755,6 @@ "No matches": "Sin resultados", "No meaningful balance": "Sin saldo relevante", "No mints from that address. Search matches a full address exactly.": "No hay acuñaciones desde esa dirección. La búsqueda requiere la dirección completa y exacta.", - "No mints in this window.": "No hubo acuñaciones en este periodo.", "No mints yet — be the first.": "Aún no hay acuñaciones — sé el primero.", "No mints yet — the first one will appear here.": "Todavía no hay acuñaciones — la primera aparecerá aquí.", "No mints, trades, or transfers on xcp.fun launches yet.": "Todavía no hay acuñaciones, operaciones ni transferencias en lanzamientos de xcp.fun.", @@ -1198,7 +1192,6 @@ "XCP to unload": "XCP a vender", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69 es un estándar de lanzamiento de tokens con parámetros fijos, construido sobre los {pools} de Counterparty. No hay contrato fábrica, ni llave de administrador, ni custodia de la plataforma en ningún momento: el protocolo {is} la plataforma. Cada acción — crear un lanzamiento, acuñar, intercambiar — es una transacción que firmas en tu propia billetera y transmites a Bitcoin. Este sitio es una interfaz sobre datos públicos de la cadena; si desapareciera mañana, cada lanzamiento, reembolso y pool seguiría funcionando exactamente igual.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "Lanzamientos y acuñaciones XCP-69 en la mempool de Bitcoin, todavía sin confirmar.", - "XCP-69 launches by phase, and what has actually been minted.": "Lanzamientos XCP-69 por fase, y lo que de verdad se ha acuñado.", "XCP-69 launches on Counterparty": "Lanzamientos XCP-69 en Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.": "Lanzamientos XCP-69 que cerraron por debajo de su soft cap y reembolsaron a los participantes.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "Lanzamientos XCP-69 que cerraron por debajo de su soft cap. Su suministro temporal de tokens fue destruido y el protocolo devolvió el XCP en custodia de cada participante.", @@ -1298,5 +1291,26 @@ "No expiry": "Sin vencimiento", "Burned": "Quemado", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "Incluye los tokens enviados a la dirección de quema y los tokens destruidos explícitamente.", - "Destroyed": "Destruidos" + "Destroyed": "Destruidos", + "{label}. Use arrow keys to inspect days.": "{label}. Usa las flechas para consultar los días.", + "{n} burn actions": "{n} acciones de quema", + "{n} fills · pools + order book": "{n} ejecuciones · pools + libro de órdenes", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "144 bloques por día. Escalas independientes. Toca o pasa el cursor para consultar.", + "About {n}d ago": "Hace unos {n}d", + "Actions": "Acciones", + "Actions across {n} assets": "Acciones en {n} activos", + "Activity charts are unavailable right now.": "Los gráficos de actividad no están disponibles ahora.", + "Burns & destructions": "Quemas y destrucciones", + "Current day · partial": "Día actual · parcial", + "Ecosystem overview": "Resumen del ecosistema", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "Quemas de titulares y destrucciones explícitas de tokens lanzados. Excluye tokens LP y la limpieza de acuñaciones fallidas. Las cantidades se muestran por activo.", + "Last {n} days · approximate": "Últimos {n} días · aproximados", + "Most active burns": "Quemas más activas", + "No burns in this window.": "No hay quemas en este período.", + "per day": "por día", + "Same period · ranked by actions": "Mismo período · por número de acciones", + "Time range": "Período", + "Tokens removed": "Tokens retirados", + "Trading": "Trading", + "Trading, burns and minting across XCP-69.": "Trading, quemas y acuñación en XCP-69." } diff --git a/apps/web/src/locales/es.status.json b/apps/web/src/locales/es.status.json index d82b1fde..465b379d 100644 --- a/apps/web/src/locales/es.status.json +++ b/apps/web/src/locales/es.status.json @@ -229,7 +229,6 @@ "Every LP token is burned — this liquidity can never be withdrawn.", "Every XCP-69 launch is identical: 100M supply, 69M public sale at 0.01 XCP per 1,000-token lot, 31M reserved for the liquidity pool, 10 XCP per-address cap, an on-chain pre-announcement before minting opens, and a 1,000-block window. There is no fine print to read because there is no fine print. The full parameter set lives on the {link} page.", "Every XCP-69 mint, trade, burn, resting order and launch, newest first.", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", "Every route has a purchase pending in the mempool — check back in a few minutes.", @@ -270,7 +269,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "Hard cap", "Hide filled", "Hide minted", @@ -391,7 +389,6 @@ "Minter outcomes", "Minters", "Minting", - "Minting activity", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", "Minting now", "Minting opens", @@ -431,7 +428,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -781,7 +777,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1065,12 +1060,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} moved", "{n} of {cap}", "{n} of {min} minters", @@ -1283,6 +1276,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/fr.json b/apps/web/src/locales/fr.json index 39b6e956..f7bfb374 100644 --- a/apps/web/src/locales/fr.json +++ b/apps/web/src/locales/fr.json @@ -77,12 +77,10 @@ "{n} launch": "{n} lancement", "{n} launches": "{n} lancements", "{n} mint": "{n} mint", - "{n} mint · about {when}": "{n} mint · {when} env.", "{n} minted": "{n} mintés", "{n} minter": "{n} minteur", "{n} minters": "{n} minteurs", "{n} mints": "{n} mints", - "{n} mints · about {when}": "{n} mints · {when} env.", "{n} MINTS for every mint": "{n} MINTS pour chaque mint", "{n} MINTS per mint · all-time program total, not your wallet balance.": "{n} MINTS par mint · total du programme depuis le début, pas le solde de votre portefeuille.", "{n} moved": "{n} ont déplacé", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "Sous séquestre jusqu'à l'issue du lancement : les tokens si tout est vendu, remboursement intégral en XCP sinon.", "Estimated fill": "Exécution estimée", "Event": "Événement", - "Every launch that conforms to XCP-69, and what has actually been minted.": "Tous les lancements conformes à XCP-69, et ce qui a réellement été minté.", "Every LP token is burned — this liquidity can never be withdrawn.": "Tous les tokens LP sont brûlés — cette liquidité ne pourra jamais être retirée.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "Chaque mint sur un lancement conforme, compté. Classé par mints, parce que c'est l'unité dans laquelle la récompense est versée.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "Tous les tokens mintés dumpés en une seule opération — le pool cote encore une offre d'achat avec {left} XCP restants, et les vendeurs sortent à {mult}× le prix de mint ({paid} % de ce qu'ils ont payé). Ces {left} XCP ne peuvent jamais être retirés : chaque lancement est un puits permanent pour le XCP lui-même.", @@ -554,7 +551,6 @@ "Graveyard": "Cimetière", "Graveyard pages": "Pages du cimetière", "Grid view": "Vue en grille", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "Regroupé par tranches de 144 blocs — une journée Bitcoin. Exact par rapport à la chaîne et approximatif par rapport à l'horloge, ce qui est le bon sens pour une chaîne que cette page décrit.", "guaranteed by consensus, not this website": "garanti par le consensus, pas par ce site", "Hard cap": "Hard cap", "held by {n} sellers": "détenus par {n} vendeurs", @@ -712,7 +708,6 @@ "Minters": "Minteurs", "minting": "mint en cours", "Minting": "Mint en cours", - "Minting activity": "Activité de mint", "minting is live": "le mint est ouvert", "minting is live — refresh the page": "le mint est ouvert — actualisez la page", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "Le mint se paie en XCP, la monnaie de base de Counterparty, depuis le solde Counterparty de votre adresse — le BTC ne couvre que les frais de minage. La voie la plus rapide sans compte est un distributeur on-chain : envoyez du BTC, le protocole vous délivre du XCP automatiquement. {link}. Un mint maximal fait 10 XCP ; un lancement a besoin de 0,5 XCP pour le nom.", @@ -760,7 +755,6 @@ "No matches": "Aucun résultat", "No meaningful balance": "Pas de solde significatif", "No mints from that address. Search matches a full address exactly.": "Aucun mint depuis cette adresse. La recherche exige l'adresse complète et exacte.", - "No mints in this window.": "Aucun mint sur cette période.", "No mints yet — be the first.": "Aucun mint pour l'instant — soyez le premier.", "No mints yet — the first one will appear here.": "Pas encore de mints — le premier apparaîtra ici.", "No mints, trades, or transfers on xcp.fun launches yet.": "Pas encore de mints, d'échanges ni de transferts sur des lancements xcp.fun.", @@ -1198,7 +1192,6 @@ "XCP to unload": "XCP à vendre", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69 est un standard de lancement de tokens à paramètres fixes, construit sur les {pools} de Counterparty. Il n'y a ni contrat usine, ni clé d'administration, ni garde par la plateforme à aucun moment : le protocole {is} la plateforme. Chaque action — créer un lancement, minter, swapper — est une transaction que vous signez dans votre propre portefeuille et diffusez sur Bitcoin. Ce site est une interface sur des données publiques on-chain ; s'il disparaissait demain, chaque lancement, remboursement et pool continuerait de fonctionner exactement comme avant.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "Lancements et mints XCP-69 dans la mempool Bitcoin, pas encore confirmés.", - "XCP-69 launches by phase, and what has actually been minted.": "Lancements XCP-69 par phase, et ce qui a réellement été minté.", "XCP-69 launches on Counterparty": "Lancements XCP-69 sur Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.": "Lancements XCP-69 clôturés sous leur soft cap et qui ont remboursé les participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "Lancements XCP-69 clôturés sous leur soft cap. Leur offre temporaire de tokens a été détruite et les XCP sous séquestre de chaque participant ont été remboursés par le protocole.", @@ -1298,5 +1291,26 @@ "No expiry": "Sans expiration", "Burned": "Brûlés", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "Comprend les tokens envoyés à l’adresse de destruction et les tokens explicitement détruits.", - "Destroyed": "Détruits" + "Destroyed": "Détruits", + "{label}. Use arrow keys to inspect days.": "{label}. Utilisez les flèches pour consulter les jours.", + "{n} burn actions": "{n} opérations de destruction", + "{n} fills · pools + order book": "{n} exécutions · pools + carnet d’ordres", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "144 blocs par jour. Échelles distinctes. Touchez ou survolez pour consulter.", + "About {n}d ago": "Il y a environ {n} j", + "Actions": "Opérations", + "Actions across {n} assets": "Opérations sur {n} actifs", + "Activity charts are unavailable right now.": "Les graphiques d’activité sont indisponibles pour le moment.", + "Burns & destructions": "Burns et destructions", + "Current day · partial": "Jour en cours · partiel", + "Ecosystem overview": "Vue d’ensemble de l’écosystème", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "Burns des détenteurs et destructions explicites des tokens lancés. Exclut les tokens LP et le nettoyage des mints échoués. Les quantités restent séparées par actif.", + "Last {n} days · approximate": "{n} derniers jours · approximatifs", + "Most active burns": "Destructions les plus actives", + "No burns in this window.": "Aucune destruction sur cette période.", + "per day": "par jour", + "Same period · ranked by actions": "Même période · par nombre d’opérations", + "Time range": "Période", + "Tokens removed": "Tokens retirés", + "Trading": "Trading", + "Trading, burns and minting across XCP-69.": "Trading, destructions et minting sur XCP-69." } diff --git a/apps/web/src/locales/fr.status.json b/apps/web/src/locales/fr.status.json index d82b1fde..465b379d 100644 --- a/apps/web/src/locales/fr.status.json +++ b/apps/web/src/locales/fr.status.json @@ -229,7 +229,6 @@ "Every LP token is burned — this liquidity can never be withdrawn.", "Every XCP-69 launch is identical: 100M supply, 69M public sale at 0.01 XCP per 1,000-token lot, 31M reserved for the liquidity pool, 10 XCP per-address cap, an on-chain pre-announcement before minting opens, and a 1,000-block window. There is no fine print to read because there is no fine print. The full parameter set lives on the {link} page.", "Every XCP-69 mint, trade, burn, resting order and launch, newest first.", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", "Every route has a purchase pending in the mempool — check back in a few minutes.", @@ -270,7 +269,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "Hard cap", "Hide filled", "Hide minted", @@ -391,7 +389,6 @@ "Minter outcomes", "Minters", "Minting", - "Minting activity", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", "Minting now", "Minting opens", @@ -431,7 +428,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -781,7 +777,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1065,12 +1060,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} moved", "{n} of {cap}", "{n} of {min} minters", @@ -1283,6 +1276,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/ja.json b/apps/web/src/locales/ja.json index 6477d9db..8660348b 100644 --- a/apps/web/src/locales/ja.json +++ b/apps/web/src/locales/ja.json @@ -77,12 +77,10 @@ "{n} launch": "{n} ローンチ", "{n} launches": "{n} ローンチ", "{n} mint": "{n} ミント", - "{n} mint · about {when}": "{n} 件のミント · {when}頃", "{n} minted": "{n} ミント済み", "{n} minter": "ミンター: {n} アドレス", "{n} minters": "ミンター: {n} アドレス", "{n} mints": "{n} ミント", - "{n} mints · about {when}": "{n} 件のミント · {when}頃", "{n} MINTS for every mint": "ミントごとに {n} MINTS", "{n} MINTS per mint · all-time program total, not your wallet balance.": "ミント 1 回あたり {n} MINTS · プログラム開始からの累計で、ウォレット残高ではありません。", "{n} moved": "{n} が移動", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "ローンチの結果が出るまでエスクローされます。完売すればトークン、そうでなければ XCP を全額返金。", "Estimated fill": "約定見込み", "Event": "イベント", - "Every launch that conforms to XCP-69, and what has actually been minted.": "XCP-69 に準拠するすべてのローンチと、実際にミントされたもの。", "Every LP token is burned — this liquidity can never be withdrawn.": "LP トークンはすべてバーン済み — この流動性は二度と引き出せません。", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "準拠ローンチでのすべてのミントを集計。報酬が支払われる単位であるミント数で順位付けしています。", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "ミントされた全トークンを一度の取引で投げ売り — それでもプールは {left} XCP を残して買い気配を出し続け、売り手はミント価格の {mult}×(支払額の {paid}%)で退出します。その {left} XCP は二度と引き出せません: すべてのローンチは XCP そのものの永久の吸収先です。", @@ -554,7 +551,6 @@ "Graveyard": "墓場", "Graveyard pages": "墓場のページ", "Grid view": "グリッド表示", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "144 ブロック — Bitcoin の 1 日 — ごとにまとめています。チェーンに対しては正確、時計に対しては近似で、チェーンを説明するこのページにはそれが正しい向きです。", "guaranteed by consensus, not this website": "このサイトではなくコンセンサスが保証", "Hard cap": "ハードキャップ", "held by {n} sellers": "{n} の売り手が保有", @@ -712,7 +708,6 @@ "Minters": "ミンター", "minting": "ミント中", "Minting": "ミント中", - "Minting activity": "ミント活動", "minting is live": "ミント受付中", "minting is live — refresh the page": "ミント受付中 — ページを更新してください", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "ミントの支払いは Counterparty の基軸通貨 XCP で行い、アドレスの Counterparty 残高から引き落とされます — BTC はトランザクション手数料にしか使われません。口座不要で最速なのはオンチェーンの自販機です: BTC を送ると、プロトコルが自動的に XCP を渡します。{link}。最大ミントは 10 XCP、ローンチには名前用に 0.5 XCP が必要です。", @@ -760,7 +755,6 @@ "No matches": "一致なし", "No meaningful balance": "意味のある残高なし", "No mints from that address. Search matches a full address exactly.": "そのアドレスからのミントはありません。検索は完全なアドレスに厳密一致します。", - "No mints in this window.": "この期間のミントはありません。", "No mints yet — be the first.": "まだミントはありません — 最初の一人になりましょう。", "No mints yet — the first one will appear here.": "ミントはまだありません — 最初のミントがここに表示されます。", "No mints, trades, or transfers on xcp.fun launches yet.": "xcp.fun のローンチでのミント・取引・送金はまだありません。", @@ -1198,7 +1192,6 @@ "XCP to unload": "売却する XCP", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69 は Counterparty の{pools}の上に築かれた固定パラメータのトークンローンチ標準です。ファクトリーコントラクトも管理者キーもなく、どの時点でもプラットフォームによる資産管理はありません: プロトコル{is}がプラットフォームです。ローンチの作成、ミント、スワップなど、あらゆる操作は自分のウォレットで署名して Bitcoin にブロードキャストするトランザクションです。このサイトは公開オンチェーンデータの上のインターフェースであり、明日消えても、すべてのローンチ、返金、プールはこれまで通り動き続けます。", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "Bitcoin のメンプールで承認待ちの XCP-69 ローンチとミント。", - "XCP-69 launches by phase, and what has actually been minted.": "フェーズ別の XCP-69 ローンチと、実際にミントされた量。", "XCP-69 launches on Counterparty": "Counterparty 上の XCP-69 ローンチ", "XCP-69 launches that closed below their soft cap and refunded participants.": "ソフトキャップに届かず終了し、参加者に返金された XCP-69 ローンチ。", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "ソフトキャップに届かず終了した XCP-69 ローンチ。一時的なトークン供給は破棄され、参加者全員のエスクロー XCP はプロトコルにより返金されました。", @@ -1298,5 +1291,26 @@ "No expiry": "有効期限なし", "Burned": "バーン済み", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "バーンアドレスに送信されたトークンと、明示的に破棄されたトークンを含みます。", - "Destroyed": "破棄済み" + "Destroyed": "破棄済み", + "{label}. Use arrow keys to inspect days.": "{label}。矢印キーで日ごとの値を確認できます。", + "{n} burn actions": "バーン操作 {n} 件", + "{n} fills · pools + order book": "約定 {n} 件 · プール+オーダーブック", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "1日を144ブロックとして表示。各グラフは別の目盛りです。タップまたはホバーで確認できます。", + "About {n}d ago": "約{n}日前", + "Actions": "操作数", + "Actions across {n} assets": "{n}資産での操作", + "Activity charts are unavailable right now.": "現在、アクティビティのグラフを表示できません。", + "Burns & destructions": "バーンと破棄", + "Current day · partial": "現在の日 · 集計途中", + "Ecosystem overview": "エコシステムの概要", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "保有者によるローンチトークンのバーンと明示的な破棄。LPトークンとミント失敗時の自動処理は除外します。数量は資産別に表示します。", + "Last {n} days · approximate": "過去{n}日 · 概算", + "Most active burns": "バーンが活発な資産", + "No burns in this window.": "この期間にバーンはありません。", + "per day": "1日あたり", + "Same period · ranked by actions": "同じ期間 · 操作数順", + "Time range": "期間", + "Tokens removed": "除去されたトークン", + "Trading": "取引", + "Trading, burns and minting across XCP-69.": "XCP-69全体の取引、バーン、ミント。" } diff --git a/apps/web/src/locales/ja.status.json b/apps/web/src/locales/ja.status.json index 73b96359..2d4f78b5 100644 --- a/apps/web/src/locales/ja.status.json +++ b/apps/web/src/locales/ja.status.json @@ -227,7 +227,6 @@ "Every LP token is burned — this liquidity can never be withdrawn.", "Every XCP-69 launch is identical: 100M supply, 69M public sale at 0.01 XCP per 1,000-token lot, 31M reserved for the liquidity pool, 10 XCP per-address cap, an on-chain pre-announcement before minting opens, and a 1,000-block window. There is no fine print to read because there is no fine print. The full parameter set lives on the {link} page.", "Every XCP-69 mint, trade, burn, resting order and launch, newest first.", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", "Every route has a purchase pending in the mempool — check back in a few minutes.", @@ -266,7 +265,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "Hard cap", "Hide filled", "Hide minted", @@ -385,7 +383,6 @@ "Minter outcomes", "Minters", "Minting", - "Minting activity", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", "Minting now", "Minting opens", @@ -425,7 +422,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -768,7 +764,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1052,12 +1047,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} moved", "{n} of {cap}", "{n} of {min} minters", @@ -1273,6 +1266,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/ko.json b/apps/web/src/locales/ko.json index 53740397..34119147 100644 --- a/apps/web/src/locales/ko.json +++ b/apps/web/src/locales/ko.json @@ -77,12 +77,10 @@ "{n} launch": "런칭 {n}개", "{n} launches": "런칭 {n}개", "{n} mint": "민팅 {n}건", - "{n} mint · about {when}": "민팅 {n}건 · {when}쯤", "{n} minted": "{n} 민팅됨", "{n} minter": "민터 {n}개 주소", "{n} minters": "민터 {n}개 주소", "{n} mints": "민팅 {n}건", - "{n} mints · about {when}": "민팅 {n}건 · {when}쯤", "{n} MINTS for every mint": "민팅 1건당 {n} MINTS", "{n} MINTS per mint · all-time program total, not your wallet balance.": "민팅 1건당 {n} MINTS · 프로그램 누적 총액이며 지갑 잔액이 아닙니다.", "{n} moved": "이동 {n}개", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "런칭 결과가 확정될 때까지 에스크로에 보관됩니다. 완판되면 토큰을, 아니면 XCP 전액을 돌려받습니다.", "Estimated fill": "예상 체결", "Event": "이벤트", - "Every launch that conforms to XCP-69, and what has actually been minted.": "XCP-69 표준을 준수하는 모든 런칭과 실제 민팅된 수량입니다.", "Every LP token is burned — this liquidity can never be withdrawn.": "LP 토큰 전량이 소각되었습니다 — 이 유동성은 절대 인출할 수 없습니다.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "표준 준수 런칭의 모든 민팅을 집계했습니다. 보상이 민팅 건수 단위로 지급되므로 민팅 건수로 순위를 매깁니다.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "민팅된 모든 토큰이 한 번에 덤핑되어도 — 풀은 {left} XCP를 남긴 채 여전히 매수 호가를 제시하고, 매도자는 민팅가의 {mult}배 (지불액의 {paid}%)로 빠져나갑니다. 그 {left} XCP는 절대 인출할 수 없습니다: 모든 런칭은 XCP 자체의 영구적인 흡수처입니다.", @@ -554,7 +551,6 @@ "Graveyard": "묘지", "Graveyard pages": "묘지 페이지", "Grid view": "그리드 보기", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "144블록 — 비트코인의 하루 — 단위로 묶었습니다. 체인 기준으로는 정확하고 벽시계 기준으로는 근사치인데, 이 페이지가 다루는 것이 체인이니 그게 맞는 방향입니다.", "guaranteed by consensus, not this website": "이 사이트가 아니라 합의가 보장", "Hard cap": "하드캡", "held by {n} sellers": "매도한 주소 {n}개가 보유", @@ -712,7 +708,6 @@ "Minters": "민터", "minting": "민팅 중", "Minting": "민팅 중", - "Minting activity": "민팅 활동", "minting is live": "민팅 진행 중", "minting is live — refresh the page": "민팅이 시작되었습니다 — 페이지를 새로 고침하세요", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "민팅은 Counterparty의 기축통화 XCP로 지불하며 주소의 Counterparty 잔액에서 차감됩니다 — BTC는 채굴 수수료에만 쓰입니다. 계정 없이 가장 빠른 방법은 온체인 자판기입니다: BTC를 보내면 프로토콜이 자동으로 XCP를 내줍니다. {link}. 최대 민팅은 10 XCP이고, 런칭에는 이름 등록에 0.5 XCP가 필요합니다.", @@ -760,7 +755,6 @@ "No matches": "일치 항목 없음", "No meaningful balance": "의미 있는 잔액 없음", "No mints from that address. Search matches a full address exactly.": "해당 주소의 민팅이 없습니다. 검색은 전체 주소와 정확히 일치해야 합니다.", - "No mints in this window.": "이 기간에 민팅이 없습니다.", "No mints yet — be the first.": "아직 민팅이 없습니다 — 첫 번째가 되어 보세요.", "No mints yet — the first one will appear here.": "아직 민팅이 없습니다 — 첫 민팅이 여기에 표시됩니다.", "No mints, trades, or transfers on xcp.fun launches yet.": "xcp.fun 런칭에서의 민팅, 거래, 전송이 아직 없습니다.", @@ -1198,7 +1192,6 @@ "XCP to unload": "되팔 XCP", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69는 Counterparty {pools} 위에 구축된 고정 파라미터 토큰 런칭 표준입니다. 팩토리 컨트랙트도, 관리자 키도, 어느 시점에도 플랫폼 커스터디도 없습니다: 프로토콜이 {is} 플랫폼입니다. 런칭 생성, 민팅, 스왑 등 모든 행동은 자신의 지갑에서 서명해 비트코인에 브로드캐스트하는 트랜잭션입니다. 이 사이트는 공개 온체인 데이터 위의 인터페이스일 뿐이며, 내일 사라지더라도 모든 런칭, 환불, 풀은 전과 똑같이 계속 작동합니다.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "비트코인 멤풀에서 아직 확인되지 않은 XCP-69 런칭과 민팅입니다.", - "XCP-69 launches by phase, and what has actually been minted.": "단계별 XCP-69 런칭과 실제 민팅된 수량입니다.", "XCP-69 launches on Counterparty": "Counterparty의 XCP-69 런칭", "XCP-69 launches that closed below their soft cap and refunded participants.": "소프트캡 미달로 종료되어 참여자에게 환불된 XCP-69 런칭.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "소프트캡 미달로 종료된 XCP-69 런칭. 임시 토큰 공급량은 파기되었고 모든 참여자의 에스크로된 XCP는 프로토콜이 돌려주었습니다.", @@ -1298,5 +1291,26 @@ "No expiry": "만료 없음", "Burned": "소각됨", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "소각 주소로 전송된 토큰과 명시적으로 파기된 토큰을 포함합니다.", - "Destroyed": "파기됨" + "Destroyed": "파기됨", + "{label}. Use arrow keys to inspect days.": "{label}. 방향키로 날짜별 값을 확인하세요.", + "{n} burn actions": "소각 작업 {n}건", + "{n} fills · pools + order book": "체결 {n}건 · 풀 + 호가창", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "하루는 144블록입니다. 그래프마다 눈금이 다릅니다. 탭하거나 마우스를 올려 확인하세요.", + "About {n}d ago": "약 {n}일 전", + "Actions": "작업 수", + "Actions across {n} assets": "{n}개 자산에서 발생한 작업", + "Activity charts are unavailable right now.": "지금은 활동 차트를 표시할 수 없습니다.", + "Burns & destructions": "소각 및 파기", + "Current day · partial": "현재 일자 · 집계 중", + "Ecosystem overview": "생태계 개요", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "보유자의 출시 토큰 소각 및 명시적 파기입니다. LP 토큰과 실패한 민팅의 자동 정리는 제외합니다. 수량은 자산별로 표시합니다.", + "Last {n} days · approximate": "최근 {n}일 · 대략", + "Most active burns": "소각이 활발한 자산", + "No burns in this window.": "이 기간에는 소각이 없습니다.", + "per day": "일별", + "Same period · ranked by actions": "동일 기간 · 작업 수 순", + "Time range": "기간", + "Tokens removed": "제거된 토큰", + "Trading": "거래", + "Trading, burns and minting across XCP-69.": "XCP-69의 거래, 소각 및 민팅 활동." } diff --git a/apps/web/src/locales/ko.status.json b/apps/web/src/locales/ko.status.json index a27c813c..528a0ccc 100644 --- a/apps/web/src/locales/ko.status.json +++ b/apps/web/src/locales/ko.status.json @@ -229,7 +229,6 @@ "Every LP token is burned — this liquidity can never be withdrawn.", "Every XCP-69 launch is identical: 100M supply, 69M public sale at 0.01 XCP per 1,000-token lot, 31M reserved for the liquidity pool, 10 XCP per-address cap, an on-chain pre-announcement before minting opens, and a 1,000-block window. There is no fine print to read because there is no fine print. The full parameter set lives on the {link} page.", "Every XCP-69 mint, trade, burn, resting order and launch, newest first.", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", "Every route has a purchase pending in the mempool — check back in a few minutes.", @@ -268,7 +267,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "Hard cap", "Hide filled", "Hide minted", @@ -389,7 +387,6 @@ "Minter outcomes", "Minters", "Minting", - "Minting activity", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", "Minting now", "Minting opens", @@ -429,7 +426,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -777,7 +773,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1061,12 +1056,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} moved", "{n} of {cap}", "{n} of {min} minters", @@ -1283,6 +1276,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/pt.json b/apps/web/src/locales/pt.json index e414123b..fc67ebe0 100644 --- a/apps/web/src/locales/pt.json +++ b/apps/web/src/locales/pt.json @@ -77,12 +77,10 @@ "{n} launch": "{n} lançamento", "{n} launches": "{n} lançamentos", "{n} mint": "{n} mint", - "{n} mint · about {when}": "{n} mint · {when} aprox.", "{n} minted": "{n} mintados", "{n} minter": "{n} minter", "{n} minters": "{n} minters", "{n} mints": "{n} mints", - "{n} mints · about {when}": "{n} mints · {when} aprox.", "{n} MINTS for every mint": "{n} MINTS por cada mint", "{n} MINTS per mint · all-time program total, not your wallet balance.": "{n} MINTS por mint · total histórico do programa, não o saldo da sua carteira.", "{n} moved": "{n} moveram", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "Em custódia até o lançamento ser resolvido: tokens se esgotar, reembolso total em XCP se não esgotar.", "Estimated fill": "Execução estimada", "Event": "Evento", - "Every launch that conforms to XCP-69, and what has actually been minted.": "Todos os lançamentos que seguem o XCP-69, e o que de fato foi mintado.", "Every LP token is burned — this liquidity can never be withdrawn.": "Todos os tokens LP estão queimados — esta liquidez nunca poderá ser retirada.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "Cada mint em um lançamento conforme, contado. Ordenado por mints, porque essa é a unidade em que a recompensa é paga.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "Todos os tokens mintados vendidos de uma vez em uma única negociação — o pool ainda cota uma compra com {left} XCP restantes, e os vendedores saem a {mult}× o preço de mint ({paid}% do que pagaram). Esses {left} XCP nunca podem ser sacados: todo lançamento é um ralo permanente para o próprio XCP.", @@ -554,7 +551,6 @@ "Graveyard": "Cemitério", "Graveyard pages": "Páginas do cemitério", "Grid view": "Visualização em grade", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "Agrupado de 144 em 144 blocos — um dia do Bitcoin. Exato em relação à cadeia e aproximado em relação ao relógio, que é a ordem certa para uma cadeia que esta página descreve.", "guaranteed by consensus, not this website": "garantido por consenso, não por este site", "Hard cap": "Hard cap", "held by {n} sellers": "nas mãos de {n} vendedores", @@ -712,7 +708,6 @@ "Minters": "Minters", "minting": "mintando", "Minting": "Mintando", - "Minting activity": "Atividade de mint", "minting is live": "o mint está aberto", "minting is live — refresh the page": "o mint está aberto — recarregue a página", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "O mint é pago em XCP, a moeda base do Counterparty, a partir do saldo Counterparty do seu endereço — o BTC só cobre as taxas de mineração. O caminho mais rápido sem conta é um dispenser on-chain: você envia BTC e o protocolo entrega XCP automaticamente. {link}. O mint máximo é de 10 XCP; um lançamento precisa de 0,5 XCP para o nome.", @@ -760,7 +755,6 @@ "No matches": "Nenhum resultado", "No meaningful balance": "Sem saldo relevante", "No mints from that address. Search matches a full address exactly.": "Não há mints desse endereço. A busca exige o endereço completo e exato.", - "No mints in this window.": "Nenhum mint neste período.", "No mints yet — be the first.": "Ainda não há mints — seja o primeiro.", "No mints yet — the first one will appear here.": "Ainda não há mints — o primeiro vai aparecer aqui.", "No mints, trades, or transfers on xcp.fun launches yet.": "Ainda não há mints, negociações nem transferências em lançamentos do xcp.fun.", @@ -1198,7 +1192,6 @@ "XCP to unload": "XCP a vender", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "O XCP-69 é um padrão de lançamento de tokens com parâmetros fixos, construído sobre os {pools} do Counterparty. Não há contrato fábrica, nem chave de administrador, nem custódia da plataforma em momento algum: o protocolo {is} a plataforma. Toda ação — criar um lançamento, mintar, fazer swap — é uma transação que você assina na sua própria carteira e transmite para o Bitcoin. Este site é uma interface sobre dados públicos on-chain; se ele sumisse amanhã, cada lançamento, reembolso e pool continuaria funcionando exatamente como antes.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "Lançamentos e mints XCP-69 na mempool do Bitcoin, ainda sem confirmação.", - "XCP-69 launches by phase, and what has actually been minted.": "Lançamentos XCP-69 por fase, e o que de fato foi mintado.", "XCP-69 launches on Counterparty": "Lançamentos XCP-69 na Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.": "Lançamentos XCP-69 que fecharam abaixo do soft cap e reembolsaram os participantes.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "Lançamentos XCP-69 que fecharam abaixo do soft cap. O fornecimento temporário de tokens foi destruído e o protocolo devolveu o XCP em custódia de cada participante.", @@ -1298,5 +1291,26 @@ "No expiry": "Sem expiração", "Burned": "Queimados", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "Inclui tokens enviados ao endereço de queima e tokens explicitamente destruídos.", - "Destroyed": "Destruídos" + "Destroyed": "Destruídos", + "{label}. Use arrow keys to inspect days.": "{label}. Use as setas para consultar os dias.", + "{n} burn actions": "{n} ações de queima", + "{n} fills · pools + order book": "{n} execuções · pools + livro de ordens", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "144 blocos por dia. Escalas separadas. Toque ou passe o cursor para consultar.", + "About {n}d ago": "Há cerca de {n}d", + "Actions": "Ações", + "Actions across {n} assets": "Ações em {n} ativos", + "Activity charts are unavailable right now.": "Os gráficos de atividade estão indisponíveis no momento.", + "Burns & destructions": "Queimas e destruições", + "Current day · partial": "Dia atual · parcial", + "Ecosystem overview": "Visão geral do ecossistema", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "Queimas de detentores e destruições explícitas de tokens lançados. Exclui tokens LP e a limpeza de mints que falharam. As quantidades ficam separadas por ativo.", + "Last {n} days · approximate": "Últimos {n} dias · aproximados", + "Most active burns": "Queimas mais ativas", + "No burns in this window.": "Nenhuma queima neste período.", + "per day": "por dia", + "Same period · ranked by actions": "Mesmo período · por número de ações", + "Time range": "Período", + "Tokens removed": "Tokens removidos", + "Trading": "Negociação", + "Trading, burns and minting across XCP-69.": "Negociação, queimas e minting no XCP-69." } diff --git a/apps/web/src/locales/pt.status.json b/apps/web/src/locales/pt.status.json index d82b1fde..465b379d 100644 --- a/apps/web/src/locales/pt.status.json +++ b/apps/web/src/locales/pt.status.json @@ -229,7 +229,6 @@ "Every LP token is burned — this liquidity can never be withdrawn.", "Every XCP-69 launch is identical: 100M supply, 69M public sale at 0.01 XCP per 1,000-token lot, 31M reserved for the liquidity pool, 10 XCP per-address cap, an on-chain pre-announcement before minting opens, and a 1,000-block window. There is no fine print to read because there is no fine print. The full parameter set lives on the {link} page.", "Every XCP-69 mint, trade, burn, resting order and launch, newest first.", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", "Every route has a purchase pending in the mempool — check back in a few minutes.", @@ -270,7 +269,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "Hard cap", "Hide filled", "Hide minted", @@ -391,7 +389,6 @@ "Minter outcomes", "Minters", "Minting", - "Minting activity", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", "Minting now", "Minting opens", @@ -431,7 +428,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -781,7 +777,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1065,12 +1060,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} moved", "{n} of {cap}", "{n} of {min} minters", @@ -1283,6 +1276,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/ru.json b/apps/web/src/locales/ru.json index 3f560635..e19c0333 100644 --- a/apps/web/src/locales/ru.json +++ b/apps/web/src/locales/ru.json @@ -77,12 +77,10 @@ "{n} launch": "запусков: {n}", "{n} launches": "запусков: {n}", "{n} mint": "минтов: {n}", - "{n} mint · about {when}": "минтов: {n} · ≈ {when}", "{n} minted": "заминчено: {n}", "{n} minter": "минтеров: {n}", "{n} minters": "минтеров: {n}", "{n} mints": "минтов: {n}", - "{n} mints · about {when}": "минтов: {n} · ≈ {when}", "{n} MINTS for every mint": "{n} MINTS за каждый минт", "{n} MINTS per mint · all-time program total, not your wallet balance.": "{n} MINTS за минт · итог программы за всё время, а не баланс вашего кошелька.", "{n} moved": "переместили: {n}", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "В эскроу до исхода запуска: токены, если он распродастся, полный возврат XCP — если нет.", "Estimated fill": "Ожидаемое исполнение", "Event": "Событие", - "Every launch that conforms to XCP-69, and what has actually been minted.": "Все запуски, соответствующие XCP-69, и то, что действительно было заминчено.", "Every LP token is burned — this liquidity can never be withdrawn.": "Все токены LP сожжены — эту ликвидность нельзя вывести никогда.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "Учитывается каждый минт в запуске по стандарту. Рейтинг строится по числу минтов, поскольку награда начисляется за каждую транзакцию минта.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "Все заминченные токены слиты одной сделкой — пул всё ещё котирует покупку, в нём осталось {left} XCP, а продавцы выходят по {mult}× от минта ({paid} % от уплаченного). Эти {left} XCP невозможно вывести никогда: каждый запуск — постоянный сток для самого XCP.", @@ -554,7 +551,6 @@ "Graveyard": "Кладбище", "Graveyard pages": "Страницы кладбища", "Grid view": "Сетка", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "Сгруппировано по 144 блока — биткоин-сутки. Точно по блокчейну и лишь приблизительно по обычным часам — для блокчейна, который описывает эта страница, так и должно быть.", "guaranteed by consensus, not this website": "гарантирует консенсус, а не этот сайт", "Hard cap": "Хардкап", "held by {n} sellers": "у продавцов ({n})", @@ -712,7 +708,6 @@ "Minters": "Минтеры", "minting": "идёт минт", "Minting": "Идёт минт", - "Minting activity": "Активность минта", "minting is live": "минт открыт", "minting is live — refresh the page": "минт открыт — обновите страницу", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "Минт оплачивается XCP с баланса Counterparty вашего адреса — BTC покрывает только комиссии майнеров. Самый быстрый путь без регистрации — ончейн-автомат (диспенсер Counterparty): отправляете BTC, протокол автоматически выдаёт XCP. {link}. Максимальный минт — 10 XCP; запуск требует 0,5 XCP за имя.", @@ -760,7 +755,6 @@ "No matches": "Ничего не найдено", "No meaningful balance": "Нет существенного баланса", "No mints from that address. Search matches a full address exactly.": "Минтов с этого адреса нет. Поиск работает только по полному адресу.", - "No mints in this window.": "За этот период минтов не было.", "No mints yet — be the first.": "Минтов пока нет — станьте первым.", "No mints yet — the first one will appear here.": "Минтов пока нет — первый появится здесь.", "No mints, trades, or transfers on xcp.fun launches yet.": "Минтов, сделок и переводов по запускам xcp.fun пока нет.", @@ -1198,7 +1192,6 @@ "XCP to unload": "XCP к продаже", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69 — стандарт запуска токенов с фиксированными параметрами, построенный на {pools} Counterparty. Нет ни контракта-фабрики, ни ключа администратора, ни хранения средств платформой на каком-либо этапе: протокол {is} платформа. Каждое действие — создание запуска, минт, обмен — это транзакция, которую вы подписываете в своём кошельке и транслируете в Bitcoin. Этот сайт — интерфейс поверх публичных данных сети; исчезни он завтра, каждый запуск, возврат и пул продолжили бы работать ровно как прежде.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "Запуски и минты XCP-69 в мемпуле биткоина, ещё не подтверждённые.", - "XCP-69 launches by phase, and what has actually been minted.": "Запуски XCP-69 по фазам и то, что действительно было заминчено.", "XCP-69 launches on Counterparty": "Запуски XCP-69 на Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.": "Запуски XCP-69, закрывшиеся ниже софткапа и вернувшие средства участникам.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "Запуски XCP-69, закрывшиеся ниже софткапа. Их временное предложение токенов уничтожено, а XCP каждого участника из эскроу возвращены протоколом.", @@ -1298,5 +1291,26 @@ "No expiry": "Бессрочно", "Burned": "Сожжено", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "Включает токены, отправленные на адрес сжигания, и токены, уничтоженные явно.", - "Destroyed": "Уничтожено" + "Destroyed": "Уничтожено", + "{label}. Use arrow keys to inspect days.": "{label}. Используйте стрелки для просмотра дней.", + "{n} burn actions": "{n} операций сжигания", + "{n} fills · pools + order book": "{n} исполнений · пулы + книга ордеров", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "144 блока в день. Отдельные шкалы. Нажмите или наведите курсор для просмотра.", + "About {n}d ago": "Около {n} дн. назад", + "Actions": "Операции", + "Actions across {n} assets": "Операции с {n} активами", + "Activity charts are unavailable right now.": "Графики активности сейчас недоступны.", + "Burns & destructions": "Сжигания и уничтожения", + "Current day · partial": "Текущий день · неполный", + "Ecosystem overview": "Обзор экосистемы", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "Сжигания держателями и явные уничтожения токенов запусков. Исключены LP-токены и очистка неудавшихся минтов. Количества указаны отдельно для каждого актива.", + "Last {n} days · approximate": "Последние {n} дней · приблизительно", + "Most active burns": "Самые активные сжигания", + "No burns in this window.": "За этот период сжиганий нет.", + "per day": "в день", + "Same period · ranked by actions": "Тот же период · по числу операций", + "Time range": "Период", + "Tokens removed": "Выведено токенов", + "Trading": "Торговля", + "Trading, burns and minting across XCP-69.": "Торговля, сжигания и минтинг в XCP-69." } diff --git a/apps/web/src/locales/ru.status.json b/apps/web/src/locales/ru.status.json index 9a3c0381..5d5ffce9 100644 --- a/apps/web/src/locales/ru.status.json +++ b/apps/web/src/locales/ru.status.json @@ -229,7 +229,6 @@ "Every LP token is burned — this liquidity can never be withdrawn.", "Every XCP-69 launch is identical: 100M supply, 69M public sale at 0.01 XCP per 1,000-token lot, 31M reserved for the liquidity pool, 10 XCP per-address cap, an on-chain pre-announcement before minting opens, and a 1,000-block window. There is no fine print to read because there is no fine print. The full parameter set lives on the {link} page.", "Every XCP-69 mint, trade, burn, resting order and launch, newest first.", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", "Every route has a purchase pending in the mempool — check back in a few minutes.", @@ -270,7 +269,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "Hard cap", "Hide filled", "Hide minted", @@ -392,7 +390,6 @@ "Minter outcomes", "Minters", "Minting", - "Minting activity", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", "Minting now", "Minting opens", @@ -432,7 +429,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -782,7 +778,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1067,12 +1062,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} moved", "{n} of {cap}", "{n} of {min} minters", @@ -1285,6 +1278,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/uk.json b/apps/web/src/locales/uk.json index fb5577ef..12f91538 100644 --- a/apps/web/src/locales/uk.json +++ b/apps/web/src/locales/uk.json @@ -77,12 +77,10 @@ "{n} launch": "запусків: {n}", "{n} launches": "запусків: {n}", "{n} mint": "мінтів: {n}", - "{n} mint · about {when}": "мінтів: {n} · ≈ {when}", "{n} minted": "{n} змінтовано", "{n} minter": "мінтерів: {n}", "{n} minters": "мінтерів: {n}", "{n} mints": "мінтів: {n}", - "{n} mints · about {when}": "мінтів: {n} · ≈ {when}", "{n} MINTS for every mint": "{n} MINTS за кожен мінт", "{n} MINTS per mint · all-time program total, not your wallet balance.": "{n} MINTS за мінт · загальна сума програми за весь час, а не баланс вашого гаманця.", "{n} moved": "{n} перемістили", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "В ескроу до завершення запуску: токени, якщо він розпродається, повне повернення XCP — якщо ні.", "Estimated fill": "Очікуване виконання", "Event": "Подія", - "Every launch that conforms to XCP-69, and what has actually been minted.": "Кожен запуск, що відповідає XCP-69, і те, що насправді змінтовано.", "Every LP token is burned — this liquidity can never be withdrawn.": "Усі LP-токени спалено — цю ліквідність неможливо вивести.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "Враховується кожен мінт у запуску за стандартом. Рейтинг будується за кількістю мінтів, оскільки винагорода нараховується за кожну транзакцію мінту.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "Кожен змінтований токен злито однією угодою — пул усе ще котирує купівлю з {left} XCP у залишку, а продавці виходять за {mult}× від мінту ({paid}% від сплаченого). Ці {left} XCP ніколи не можна вивести: кожен запуск — постійний стік для самого XCP.", @@ -554,7 +551,6 @@ "Graveyard": "Цвинтар", "Graveyard pages": "Сторінки цвинтаря", "Grid view": "Сітка", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "Згруповано по 144 блоки — біткоїн-день. Точно відносно блокчейну й приблизно відносно годинника, і саме так має бути для ланцюга, який описує ця сторінка.", "guaranteed by consensus, not this website": "гарантує консенсус, а не цей сайт", "Hard cap": "Хардкап", "held by {n} sellers": "у продавців: {n}", @@ -712,7 +708,6 @@ "Minters": "Мінтери", "minting": "триває мінт", "Minting": "Триває мінт", - "Minting activity": "Активність мінту", "minting is live": "мінт відкрито", "minting is live — refresh the page": "мінт відкрито — оновіть сторінку", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "Мінт оплачується в XCP із балансу Counterparty вашої адреси — BTC покриває лише комісії майнерів. Найшвидший шлях без реєстрації — ончейн-автомат: надсилаєте BTC, і протокол автоматично видає XCP. {link}. Максимальний мінт — 10 XCP; запуску потрібно 0,5 XCP за ім'я.", @@ -760,7 +755,6 @@ "No matches": "Нічого не знайдено", "No meaningful balance": "Без суттєвого балансу", "No mints from that address. Search matches a full address exactly.": "Мінтів із цієї адреси немає. Пошук потребує повної точної адреси.", - "No mints in this window.": "За цей період мінтів не було.", "No mints yet — be the first.": "Мінтів ще немає — будьте першим.", "No mints yet — the first one will appear here.": "Мінтів поки немає — перший з'явиться тут.", "No mints, trades, or transfers on xcp.fun launches yet.": "Мінтів, угод чи переказів у запусках xcp.fun поки немає.", @@ -1198,7 +1192,6 @@ "XCP to unload": "XCP для продажу назад", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69 — це стандарт запуску токенів із фіксованими параметрами, побудований на {pools} Counterparty. Немає ні контракту-фабрики, ні ключа адміністратора, ні зберігання коштів платформою на жодному етапі: протокол {is} платформою. Кожна дія — створення запуску, мінт, обмін — це транзакція, яку ви підписуєте у власному гаманці й надсилаєте в мережу Bitcoin. Цей сайт — інтерфейс над публічними ончейн-даними; якби він завтра зник, кожен запуск, повернення та пул працювали б далі точно так само.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "Запуски й мінти XCP-69 у мемпулі біткоїна, ще не підтверджені.", - "XCP-69 launches by phase, and what has actually been minted.": "Запуски XCP-69 за фазами і те, що насправді змінтовано.", "XCP-69 launches on Counterparty": "Запуски XCP-69 на Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.": "Запуски XCP-69, що закрилися нижче софткапу й повернули кошти учасникам.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "Запуски XCP-69, що закрилися нижче софткапу. Їхню тимчасову пропозицію токенів знищено, а XCP кожного учасника з ескроу протокол повернув.", @@ -1298,5 +1291,26 @@ "No expiry": "Безстроково", "Burned": "Спалено", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "Включає токени, надіслані на адресу спалювання, і токени, знищені явно.", - "Destroyed": "Знищено" + "Destroyed": "Знищено", + "{label}. Use arrow keys to inspect days.": "{label}. Використовуйте стрілки для перегляду днів.", + "{n} burn actions": "{n} операцій спалювання", + "{n} fills · pools + order book": "{n} виконань · пули + книга ордерів", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "144 блоки на день. Окремі шкали. Натисніть або наведіть курсор для перегляду.", + "About {n}d ago": "Близько {n} дн. тому", + "Actions": "Операції", + "Actions across {n} assets": "Операції з {n} активами", + "Activity charts are unavailable right now.": "Графіки активності зараз недоступні.", + "Burns & destructions": "Спалювання та знищення", + "Current day · partial": "Поточний день · неповний", + "Ecosystem overview": "Огляд екосистеми", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "Спалювання власниками та явні знищення токенів запусків. Виключено LP-токени й очищення невдалих мінтів. Кількості вказано окремо для кожного активу.", + "Last {n} days · approximate": "Останні {n} днів · приблизно", + "Most active burns": "Найактивніші спалювання", + "No burns in this window.": "За цей період спалювань немає.", + "per day": "на день", + "Same period · ranked by actions": "Той самий період · за кількістю операцій", + "Time range": "Період", + "Tokens removed": "Вилучено токенів", + "Trading": "Торгівля", + "Trading, burns and minting across XCP-69.": "Торгівля, спалювання та мінтинг у XCP-69." } diff --git a/apps/web/src/locales/uk.status.json b/apps/web/src/locales/uk.status.json index 9a3c0381..5d5ffce9 100644 --- a/apps/web/src/locales/uk.status.json +++ b/apps/web/src/locales/uk.status.json @@ -229,7 +229,6 @@ "Every LP token is burned — this liquidity can never be withdrawn.", "Every XCP-69 launch is identical: 100M supply, 69M public sale at 0.01 XCP per 1,000-token lot, 31M reserved for the liquidity pool, 10 XCP per-address cap, an on-chain pre-announcement before minting opens, and a 1,000-block window. There is no fine print to read because there is no fine print. The full parameter set lives on the {link} page.", "Every XCP-69 mint, trade, burn, resting order and launch, newest first.", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", "Every route has a purchase pending in the mempool — check back in a few minutes.", @@ -270,7 +269,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "Hard cap", "Hide filled", "Hide minted", @@ -392,7 +390,6 @@ "Minter outcomes", "Minters", "Minting", - "Minting activity", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", "Minting now", "Minting opens", @@ -432,7 +429,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -782,7 +778,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1067,12 +1062,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} moved", "{n} of {cap}", "{n} of {min} minters", @@ -1285,6 +1278,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/zh-hk.json b/apps/web/src/locales/zh-hk.json index 2e6ef827..7c16c342 100644 --- a/apps/web/src/locales/zh-hk.json +++ b/apps/web/src/locales/zh-hk.json @@ -77,12 +77,10 @@ "{n} launch": "{n} 個發射", "{n} launches": "{n} 個發射", "{n} mint": "{n} 筆鑄造", - "{n} mint · about {when}": "{n} 筆鑄造 · 約 {when}", "{n} minted": "已鑄造 {n}", "{n} minter": "{n} 個鑄造者", "{n} minters": "{n} 個鑄造者", "{n} mints": "{n} 筆鑄造", - "{n} mints · about {when}": "{n} 筆鑄造 · 約 {when}", "{n} MINTS for every mint": "每筆鑄造 {n} MINTS", "{n} MINTS per mint · all-time program total, not your wallet balance.": "每筆鑄造 {n} MINTS · 計劃累計總額,不是你的錢包餘額。", "{n} moved": "{n} 個轉出", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "由協議鎖定至發射有結果為止:售罄則得到代幣,否則全額退回 XCP。", "Estimated fill": "預計成交", "Event": "事件", - "Every launch that conforms to XCP-69, and what has actually been minted.": "每一個符合 XCP-69 的發射,以及實際已鑄造的數量。", "Every LP token is burned — this liquidity can never be withdrawn.": "全部 LP 代幣已銷毀 — 這份流動性永遠無法撤出。", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "符合標準的發射上的每一筆鑄造都計入。按鑄造筆數排名,因為獎勵就是按筆發放的。", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "所有鑄造出的代幣在一筆交易裏全部砸出 — 池子仍剩 {left} XCP 在報買價,賣出者以鑄造價的 {mult}× 離場(相當於付出的 {paid}%)。這 {left} XCP 永遠無法取出:每一次發射都是 XCP 本身的永久沉澱池。", @@ -554,7 +551,6 @@ "Graveyard": "墓地", "Graveyard pages": "墓地分頁", "Grid view": "網格視圖", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "按 144 個區塊分組 — 即比特幣的一天。相對鏈上是精確的,相對掛鐘時間是近似的,對於本頁描述的鏈來説這才是正確的方向。", "guaranteed by consensus, not this website": "由共識保證,而非本站", "Hard cap": "硬頂", "held by {n} sellers": "由 {n} 個賣家持有", @@ -712,7 +708,6 @@ "Minters": "鑄造者", "minting": "鑄造中", "Minting": "鑄造中", - "Minting activity": "鑄造動態", "minting is live": "鑄造已開放", "minting is live — refresh the page": "鑄造已開放 — 請刷新頁面", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "鑄造用你地址 Counterparty 餘額中的 XCP 支付 — BTC 只用於礦工費。無需開户的最快途徑是鏈上售賣機:發送 BTC,協議自動發放 XCP。{link}。單地址最多可投入 10 XCP 參與鑄造;發射需要 0.5 XCP 用於註冊名稱。", @@ -760,7 +755,6 @@ "No matches": "無匹配結果", "No meaningful balance": "無可觀餘額", "No mints from that address. Search matches a full address exactly.": "該地址沒有鑄造記錄。搜尋需要完整地址精確匹配。", - "No mints in this window.": "此時間段內沒有鑄造。", "No mints yet — be the first.": "還沒有人鑄造 — 做第一個。", "No mints yet — the first one will appear here.": "還沒有鑄造 — 第一筆會顯示在這裏。", "No mints, trades, or transfers on xcp.fun launches yet.": "在 xcp.fun 的發射上還沒有鑄造、成交或轉賬。", @@ -1198,7 +1192,6 @@ "XCP to unload": "出售的 XCP", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69 是一套建立在 Counterparty {pools}之上的固定參數代幣發射標準。沒有工廠合約,沒有管理員密鑰,任何時候都沒有平台託管:協議{is}平台。每一個操作 — 建立發射、鑄造、兌換 — 都是你在自己錢包裏簽名並廣播到比特幣網絡的交易。本站只是公開鏈上數據之上的一個介面;即使它明天消失,每一次發射、退款和流動性池都會一如既往地運作。", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "位於比特幣記憶池中、尚未確認的 XCP-69 發射和鑄造。", - "XCP-69 launches by phase, and what has actually been minted.": "按階段劃分的 XCP-69 發射,以及實際已鑄造的數量。", "XCP-69 launches on Counterparty": "Counterparty 上的 XCP-69 發射", "XCP-69 launches that closed below their soft cap and refunded participants.": "未達到軟頂而關閉並向參與者退款的 XCP-69 發射。", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "未達到軟頂而關閉的 XCP-69 發射。它們的臨時代幣供應量已被銷毀,每位參與者託管中的 XCP 已由協議退回。", @@ -1298,5 +1291,26 @@ "No expiry": "永不過期", "Burned": "已銷毀", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "包括傳送到銷毀地址的代幣及透過銷毀交易銷毀的代幣。", - "Destroyed": "已銷毀" + "Destroyed": "已銷毀", + "{label}. Use arrow keys to inspect days.": "{label}。使用方向鍵查看每日數據。", + "{n} burn actions": "{n} 次銷燬操作", + "{n} fills · pools + order book": "{n} 筆成交 · 資金池 + 訂單簿", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "每天按144個區塊計算。各圖刻度獨立。點擊或懸停查看詳情。", + "About {n}d ago": "約{n}天前", + "Actions": "操作數", + "Actions across {n} assets": "涉及{n}種資產的操作", + "Activity charts are unavailable right now.": "活動圖表暫時無法顯示。", + "Burns & destructions": "燃燒與銷燬", + "Current day · partial": "當前日 · 尚未結束", + "Ecosystem overview": "生態概覽", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "持有者的發行代幣燃燒及顯式銷燬。不含LP代幣和鑄造失敗後的自動清理。代幣數量按資產分別顯示。", + "Last {n} days · approximate": "最近{n}天 · 約數", + "Most active burns": "銷燬最活躍的資產", + "No burns in this window.": "此期間沒有銷燬。", + "per day": "每日", + "Same period · ranked by actions": "同期 · 按操作數排序", + "Time range": "時間範圍", + "Tokens removed": "移除的代幣", + "Trading": "交易", + "Trading, burns and minting across XCP-69.": "XCP-69的交易、銷燬與鑄造活動。" } diff --git a/apps/web/src/locales/zh-hk.status.json b/apps/web/src/locales/zh-hk.status.json index e7db87e2..99297ca6 100644 --- a/apps/web/src/locales/zh-hk.status.json +++ b/apps/web/src/locales/zh-hk.status.json @@ -76,12 +76,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} MINTS for every mint", "{n} MINTS per mint · all-time program total, not your wallet balance.", "{n} moved", @@ -475,7 +473,6 @@ "escrowed until launch", "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.", "Event", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every LP token is burned — this liquidity can never be withdrawn.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", @@ -532,7 +529,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "guaranteed by consensus, not this website", "Hard cap", "held by {n} sellers", @@ -680,7 +676,6 @@ "Minters", "minting", "Minting", - "Minting activity", "minting is live", "minting is live — refresh the page", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", @@ -729,7 +724,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -1146,7 +1140,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1281,6 +1274,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/zh-tw.json b/apps/web/src/locales/zh-tw.json index 188c6165..534d1249 100644 --- a/apps/web/src/locales/zh-tw.json +++ b/apps/web/src/locales/zh-tw.json @@ -77,12 +77,10 @@ "{n} launch": "{n} 個發射", "{n} launches": "{n} 個發射", "{n} mint": "{n} 筆鑄造", - "{n} mint · about {when}": "{n} 筆鑄造 · 約 {when}", "{n} minted": "已鑄造 {n}", "{n} minter": "{n} 個鑄造者", "{n} minters": "{n} 個鑄造者", "{n} mints": "{n} 筆鑄造", - "{n} mints · about {when}": "{n} 筆鑄造 · 約 {when}", "{n} MINTS for every mint": "每筆鑄造 {n} MINTS", "{n} MINTS per mint · all-time program total, not your wallet balance.": "每筆鑄造 {n} MINTS · 計畫累計總額,不是你的錢包餘額。", "{n} moved": "{n} 個轉出", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "由協議鎖定至發射有結果為止:售罄則得到代幣,否則全額退回 XCP。", "Estimated fill": "預計成交", "Event": "事件", - "Every launch that conforms to XCP-69, and what has actually been minted.": "每一個符合 XCP-69 的發射,以及實際已鑄造的數量。", "Every LP token is burned — this liquidity can never be withdrawn.": "全部 LP 代幣已銷毀 — 這份流動性永遠無法撤出。", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "符合標準的發射上的每一筆鑄造都計入。按鑄造筆數排名,因為獎勵就是按筆發放的。", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "所有鑄造出的代幣在一筆交易裡全部砸出 — 池子仍剩 {left} XCP 在報買價,賣出者以鑄造價的 {mult}× 離場(相當於付出的 {paid}%)。這 {left} XCP 永遠無法取出:每一次發射都是 XCP 本身的永久沉澱池。", @@ -554,7 +551,6 @@ "Graveyard": "墓地", "Graveyard pages": "墓地分頁", "Grid view": "網格檢視", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "按 144 個區塊分組 — 即比特幣的一天。相對鏈上是精確的,相對掛鐘時間是近似的,對於本頁描述的鏈來說這才是正確的方向。", "guaranteed by consensus, not this website": "由共識保證,而非本站", "Hard cap": "硬頂", "held by {n} sellers": "由 {n} 個賣家持有", @@ -712,7 +708,6 @@ "Minters": "鑄造者", "minting": "鑄造中", "Minting": "鑄造中", - "Minting activity": "鑄造動態", "minting is live": "鑄造已開放", "minting is live — refresh the page": "鑄造已開放 — 請重新整理頁面", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "鑄造用你地址 Counterparty 餘額中的 XCP 支付 — BTC 只用於礦工費。無需開戶的最快途徑是鏈上販賣機:發送 BTC,協議自動發放 XCP。{link}。單地址最多可投入 10 XCP 參與鑄造;發射需要 0.5 XCP 用於註冊名稱。", @@ -760,7 +755,6 @@ "No matches": "無匹配結果", "No meaningful balance": "無可觀餘額", "No mints from that address. Search matches a full address exactly.": "該地址沒有鑄造記錄。搜尋需要完整地址精確匹配。", - "No mints in this window.": "此時間段內沒有鑄造。", "No mints yet — be the first.": "還沒有人鑄造 — 做第一個。", "No mints yet — the first one will appear here.": "還沒有鑄造 — 第一筆會顯示在這裡。", "No mints, trades, or transfers on xcp.fun launches yet.": "在 xcp.fun 的發射上還沒有鑄造、成交或轉帳。", @@ -1198,7 +1192,6 @@ "XCP to unload": "出售的 XCP", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69 是一套建立在 Counterparty {pools}之上的固定參數代幣發射標準。沒有工廠合約,沒有管理員金鑰,任何時候都沒有平台託管:協議{is}平台。每一個操作 — 建立發射、鑄造、兌換 — 都是你在自己錢包裡簽名並廣播到比特幣網路的交易。本站只是公開鏈上資料之上的一個介面;即使它明天消失,每一次發射、退款和流動性池都會一如既往地運作。", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "位於比特幣記憶體池中、尚未確認的 XCP-69 發射和鑄造。", - "XCP-69 launches by phase, and what has actually been minted.": "按階段劃分的 XCP-69 發射,以及實際已鑄造的數量。", "XCP-69 launches on Counterparty": "Counterparty 上的 XCP-69 發射", "XCP-69 launches that closed below their soft cap and refunded participants.": "未達到軟頂而關閉並向參與者退款的 XCP-69 發射。", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "未達到軟頂而關閉的 XCP-69 發射。它們的臨時代幣供應量已被銷毀,每位參與者託管中的 XCP 已由協議退回。", @@ -1298,5 +1291,26 @@ "No expiry": "永不過期", "Burned": "已銷毀", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "包括傳送到銷毀地址的代幣和透過銷毀交易銷毀的代幣。", - "Destroyed": "已銷毀" + "Destroyed": "已銷毀", + "{label}. Use arrow keys to inspect days.": "{label}。使用方向鍵查看每日數據。", + "{n} burn actions": "{n} 次銷燬操作", + "{n} fills · pools + order book": "{n} 筆成交 · 資金池 + 訂單簿", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "每天按144個區塊計算。各圖刻度獨立。點擊或懸停查看詳情。", + "About {n}d ago": "約{n}天前", + "Actions": "操作數", + "Actions across {n} assets": "涉及{n}種資產的操作", + "Activity charts are unavailable right now.": "活動圖表暫時無法顯示。", + "Burns & destructions": "燃燒與銷燬", + "Current day · partial": "當前日 · 尚未結束", + "Ecosystem overview": "生態概覽", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "持有者的發行代幣燃燒及顯式銷燬。不含LP代幣和鑄造失敗後的自動清理。代幣數量按資產分別顯示。", + "Last {n} days · approximate": "最近{n}天 · 約數", + "Most active burns": "銷燬最活躍的資產", + "No burns in this window.": "此期間沒有銷燬。", + "per day": "每日", + "Same period · ranked by actions": "同期 · 按操作數排序", + "Time range": "時間範圍", + "Tokens removed": "移除的代幣", + "Trading": "交易", + "Trading, burns and minting across XCP-69.": "XCP-69的交易、銷燬與鑄造活動。" } diff --git a/apps/web/src/locales/zh-tw.status.json b/apps/web/src/locales/zh-tw.status.json index e7db87e2..99297ca6 100644 --- a/apps/web/src/locales/zh-tw.status.json +++ b/apps/web/src/locales/zh-tw.status.json @@ -76,12 +76,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} MINTS for every mint", "{n} MINTS per mint · all-time program total, not your wallet balance.", "{n} moved", @@ -475,7 +473,6 @@ "escrowed until launch", "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.", "Event", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every LP token is burned — this liquidity can never be withdrawn.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", @@ -532,7 +529,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "guaranteed by consensus, not this website", "Hard cap", "held by {n} sellers", @@ -680,7 +676,6 @@ "Minters", "minting", "Minting", - "Minting activity", "minting is live", "minting is live — refresh the page", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", @@ -729,7 +724,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -1146,7 +1140,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1281,6 +1274,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/apps/web/src/locales/zh.json b/apps/web/src/locales/zh.json index 8c16fc9b..59c151f9 100644 --- a/apps/web/src/locales/zh.json +++ b/apps/web/src/locales/zh.json @@ -77,12 +77,10 @@ "{n} launch": "{n} 个发射", "{n} launches": "{n} 个发射", "{n} mint": "{n} 笔铸造", - "{n} mint · about {when}": "{n} 笔铸造 · 约 {when}", "{n} minted": "已铸造 {n}", "{n} minter": "{n} 个铸造者", "{n} minters": "{n} 个铸造者", "{n} mints": "{n} 笔铸造", - "{n} mints · about {when}": "{n} 笔铸造 · 约 {when}", "{n} MINTS for every mint": "每笔铸造 {n} MINTS", "{n} MINTS per mint · all-time program total, not your wallet balance.": "每笔铸造 {n} MINTS · 计划累计总额,不是你的钱包余额。", "{n} moved": "{n} 个转出", @@ -493,7 +491,6 @@ "Escrowed until the launch resolves: tokens if it sells out, full XCP refund if it doesn't.": "由协议锁定至发射有结果为止:售罄则得到代币,否则全额退回 XCP。", "Estimated fill": "预计成交", "Event": "事件", - "Every launch that conforms to XCP-69, and what has actually been minted.": "每一个符合 XCP-69 的发射,以及实际已铸造的数量。", "Every LP token is burned — this liquidity can never be withdrawn.": "全部 LP 代币已销毁 — 这份流动性永远无法撤出。", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.": "符合标准的发射上的每一笔铸造都计入。按铸造笔数排名,因为奖励就是按笔发放的。", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.": "所有铸造出的代币在一笔交易里全部砸出 — 池子仍剩 {left} XCP 在报买价,卖出者以铸造价的 {mult}× 离场(相当于付出的 {paid}%)。这 {left} XCP 永远无法取出:每一次发射都是 XCP 本身的永久沉淀池。", @@ -554,7 +551,6 @@ "Graveyard": "墓地", "Graveyard pages": "墓地分页", "Grid view": "网格视图", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.": "按 144 个区块分组 — 即比特币的一天。相对链上是精确的,相对挂钟时间是近似的,对于本页描述的链来说这才是正确的方向。", "guaranteed by consensus, not this website": "由共识保证,而非本站", "Hard cap": "硬顶", "held by {n} sellers": "由 {n} 个卖家持有", @@ -712,7 +708,6 @@ "Minters": "铸造者", "minting": "铸造中", "Minting": "铸造中", - "Minting activity": "铸造动态", "minting is live": "铸造已开放", "minting is live — refresh the page": "铸造已开放 — 请刷新页面", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.": "铸造用你地址 Counterparty 余额中的 XCP 支付 — BTC 只用于矿工费。无需开户的最快途径是链上售货机:发送 BTC,协议自动发放 XCP。{link}。单地址最多可投入 10 XCP 参与铸造;发射需要 0.5 XCP 用于注册名称。", @@ -760,7 +755,6 @@ "No matches": "无匹配结果", "No meaningful balance": "无可观余额", "No mints from that address. Search matches a full address exactly.": "该地址没有铸造记录。搜索需要完整地址精确匹配。", - "No mints in this window.": "此时间段内没有铸造。", "No mints yet — be the first.": "还没有人铸造 — 做第一个。", "No mints yet — the first one will appear here.": "还没有铸造 — 第一笔会显示在这里。", "No mints, trades, or transfers on xcp.fun launches yet.": "在 xcp.fun 的发射上还没有铸造、成交或转账。", @@ -1198,7 +1192,6 @@ "XCP to unload": "出售的 XCP", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.": "XCP-69 是一套建立在 Counterparty {pools}之上的固定参数代币发射标准。没有工厂合约,没有管理员密钥,任何时候都没有平台托管:协议{is}平台。每一个操作 — 创建发射、铸造、兑换 — 都是你在自己钱包里签名并广播到比特币网络的交易。本站只是公开链上数据之上的一个界面;即使它明天消失,每一次发射、退款和流动性池都会一如既往地运作。", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.": "位于比特币内存池中、尚未确认的 XCP-69 发射和铸造。", - "XCP-69 launches by phase, and what has actually been minted.": "按阶段划分的 XCP-69 发射,以及实际已铸造的数量。", "XCP-69 launches on Counterparty": "Counterparty 上的 XCP-69 发射", "XCP-69 launches that closed below their soft cap and refunded participants.": "未达到软顶而关闭并向参与者退款的 XCP-69 发射。", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.": "未达到软顶而关闭的 XCP-69 发射。它们的临时代币供应量已被销毁,每位参与者托管中的 XCP 已由协议退回。", @@ -1298,5 +1291,26 @@ "No expiry": "永不过期", "Burned": "已销毁", "Includes tokens sent to the burn address and explicitly destroyed tokens.": "包括发送到销毁地址的代币和通过销毁交易销毁的代币。", - "Destroyed": "已销毁" + "Destroyed": "已销毁", + "{label}. Use arrow keys to inspect days.": "{label}。使用方向键查看每日数据。", + "{n} burn actions": "{n} 次销毁操作", + "{n} fills · pools + order book": "{n} 笔成交 · 资金池 + 订单簿", + "144 blocks per day. Separate scales. Tap or hover to inspect.": "每天按144个区块计算。各图刻度独立。点击或悬停查看详情。", + "About {n}d ago": "约{n}天前", + "Actions": "操作数", + "Actions across {n} assets": "涉及{n}种资产的操作", + "Activity charts are unavailable right now.": "活动图表暂时无法显示。", + "Burns & destructions": "燃烧与销毁", + "Current day · partial": "当前日 · 尚未结束", + "Ecosystem overview": "生态概览", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.": "持有者的发行代币燃烧及显式销毁。不含LP代币和铸造失败后的自动清理。代币数量按资产分别显示。", + "Last {n} days · approximate": "最近{n}天 · 约数", + "Most active burns": "销毁最活跃的资产", + "No burns in this window.": "此期间没有销毁。", + "per day": "每日", + "Same period · ranked by actions": "同期 · 按操作数排序", + "Time range": "时间范围", + "Tokens removed": "移除的代币", + "Trading": "交易", + "Trading, burns and minting across XCP-69.": "XCP-69的交易、销毁与铸造活动。" } diff --git a/apps/web/src/locales/zh.status.json b/apps/web/src/locales/zh.status.json index 4e4d6c38..a977b1ba 100644 --- a/apps/web/src/locales/zh.status.json +++ b/apps/web/src/locales/zh.status.json @@ -228,7 +228,6 @@ "Every LP token is burned — this liquidity can never be withdrawn.", "Every XCP-69 launch is identical: 100M supply, 69M public sale at 0.01 XCP per 1,000-token lot, 31M reserved for the liquidity pool, 10 XCP per-address cap, an on-chain pre-announcement before minting opens, and a 1,000-block window. There is no fine print to read because there is no fine print. The full parameter set lives on the {link} page.", "Every XCP-69 mint, trade, burn, resting order and launch, newest first.", - "Every launch that conforms to XCP-69, and what has actually been minted.", "Every mint on a conforming launch, counted. Ranked by mints, because that is the unit the reward is paid in.", "Every minted token dumped in one trade — the pool still quotes a bid with {left} XCP left, and sellers exit at {mult}× mint ({paid}% of what they paid). Those {left} XCP can never be withdrawn: every launch is a permanent sink for XCP itself.", "Every route has a purchase pending in the mempool — check back in a few minutes.", @@ -267,7 +266,6 @@ "Graveyard", "Graveyard pages", "Grid view", - "Grouped by 144 blocks — a Bitcoin day. Exact against the chain, and approximate against a wall clock, which is the right way round for a chain this page is describing.", "Hard cap", "Hide filled", "Hide minted", @@ -387,7 +385,6 @@ "Minter outcomes", "Minters", "Minting", - "Minting activity", "Minting is paid in XCP on your address's Counterparty balance — BTC only covers miner fees. The fastest no-account route is an on-chain dispenser: send BTC, the protocol vends XCP automatically. {link}. A max mint is 10 XCP; a launch needs 0.5 XCP for the name.", "Minting now", "Minting opens", @@ -427,7 +424,6 @@ "No matches", "No meaningful balance", "No mints from that address. Search matches a full address exactly.", - "No mints in this window.", "No mints yet — be the first.", "No mints yet — the first one will appear here.", "No mints, trades, or transfers on xcp.fun launches yet.", @@ -774,7 +770,6 @@ "XCP to unload", "XCP-69 is a fixed-parameter token launch standard built on Counterparty {pools}. There is no factory contract, no admin key, and no platform custody at any point: the protocol {is} the platform. Every action — creating a launch, minting, swapping — is a transaction you sign in your own wallet and broadcast to Bitcoin. This site is an interface over public on-chain data; if it disappeared tomorrow, every launch, refund, and pool would keep working exactly as before.", "XCP-69 launches and mints sitting in the Bitcoin mempool, not yet confirmed.", - "XCP-69 launches by phase, and what has actually been minted.", "XCP-69 launches on Counterparty", "XCP-69 launches that closed below their soft cap and refunded participants.", "XCP-69 launches that closed below their soft cap. Their temporary token supply was destroyed and every participant's escrowed XCP was repaid by the protocol.", @@ -1058,12 +1053,10 @@ "{n} launch", "{n} launches", "{n} mint", - "{n} mint · about {when}", "{n} minted", "{n} minter", "{n} minters", "{n} mints", - "{n} mints · about {when}", "{n} moved", "{n} of {cap}", "{n} of {min} minters", @@ -1280,6 +1273,27 @@ "Finish launching {asset}", "The inscription commit for {asset} is broadcast, but its reveal is not. The launch exists only once the reveal is on-chain, and until then the commit's BTC waits in an output only that reveal can spend.", "The inscription commit for {asset} never made it on-chain, and a coin it spends has since been spent by another confirmed transaction, so it never will. None of its BTC is waiting on a reveal, and you can start a new launch.", - "No expiry" + "No expiry", + "{label}. Use arrow keys to inspect days.", + "{n} burn actions", + "{n} fills · pools + order book", + "144 blocks per day. Separate scales. Tap or hover to inspect.", + "About {n}d ago", + "Actions", + "Actions across {n} assets", + "Activity charts are unavailable right now.", + "Burns & destructions", + "Current day · partial", + "Ecosystem overview", + "Holder burns and explicit destructions of launch tokens. Excludes LP tokens and failed-mint cleanup. Token amounts stay separate by asset.", + "Last {n} days · approximate", + "Most active burns", + "No burns in this window.", + "per day", + "Same period · ranked by actions", + "Time range", + "Tokens removed", + "Trading", + "Trading, burns and minting across XCP-69." ] } diff --git a/tests/stats-activity.test.ts b/tests/stats-activity.test.ts new file mode 100644 index 00000000..c85805d4 --- /dev/null +++ b/tests/stats-activity.test.ts @@ -0,0 +1,112 @@ +import { afterEach, beforeEach, expect, it, vi } from "vitest"; +import { apiReplayDb } from "./helpers/api-replay-db"; +import fixture from "./fixtures/fewgoodman-index-recovery.json"; +import { burnActivityByBucket, statsHeight, tradeActivityByBucket } from "#api/queries/stats"; +import { statsActivity } from "@/lib/stats-activity"; +import type { LaunchStats } from "@/lib/api/launchpad-api"; + +let database: ReturnType; +beforeEach(() => { + database = apiReplayDb(); + const writable = new Set(database.raw.prepare("PRAGMA table_xinfo(launches)").all().filter(c => c.hidden === 0).map(c => c.name)); + for (const [asset, conforming] of [["COIN", 1], ["OTHER", 0]] as const) { + const entries = Object.entries({ ...fixture.launch, asset, tx_hash: asset, tx_index: 100, conforming }) + .filter(([key]) => writable.has(key)); + database.raw.prepare(`INSERT INTO launches (${entries.map(([key]) => key).join(",")}) VALUES (${entries.map(() => "?").join(",")})`) + .run(...entries.map(([, value]) => typeof value === "boolean" ? Number(value) : value)); + } +}); +afterEach(() => { database.raw.close(); vi.unstubAllGlobals(); vi.restoreAllMocks(); }); + +it("counts both trade directions once, retains multiple fills, and bounds the indexed window", async () => { + const insert = database.raw.prepare(`INSERT INTO asset_events + (id,event,address,asset,block_index,token_delta,xcp_delta,kind,primary_actor) + VALUES (?,?, 'trader', ?,?, '1',?, 'buy',?)`); + for (const [id, asset, height, xcp, primary] of [ + ["old", "COIN", 1439, "100", 1], + ["pool1", "COIN", 1440, "-50000000", 1], + ["pool2", "COIN", 1440, "-25000000", 1], + ["book-taker", "COIN", 1583, "70000000", 1], + ["book-maker", "COIN", 1583, "-70000000", 0], + ["next", "COIN", 1584, "1000000", 1], + ["future", "COIN", 1585, "100", 1], + ["excluded", "OTHER", 1440, "100", 1], + ] as const) insert.run(id, id, asset, height, xcp, primary); + expect(await tradeActivityByBucket(database.db, 1440, 1584)).toEqual([ + { bucket: 10, n: 3, xcp: "145000000" }, { bucket: 11, n: 1, xcp: "1000000" }, + ]); +}); + +it("keeps burn quantities exact and excludes pre-relaunch supply and non-launch assets", async () => { + const insert = database.raw.prepare(`INSERT INTO token_burns + (key,tx_hash,tx_index,msg_index,block_index,source,destination,asset,quantity) + VALUES (?, 'tx',?,0,?, 'holder','burn',?,?)`); + for (const [key, tx, height, asset, quantity] of [ + ["burn:1", 101, 1440, "COIN", "9007199254740993"], + ["destroy:2", 102, 1583, "COIN", "2"], + ["old-issuance", 99, 1440, "COIN", "100"], + ["lp", 103, 1440, "LP", "100"], + ["other", 103, 1440, "OTHER", "100"], + ["old-window", 101, 1439, "COIN", "100"], + ["future", 103, 1584, "COIN", "100"], + ] as const) insert.run(key, tx, height, asset, quantity); + expect(await burnActivityByBucket(database.db, 1440, 1583)).toEqual([ + { bucket: 10, asset: "COIN", divisible: 1, n: 2, quantity: "9007199254740995" }, + ]); +}); + +it("uses the stored indexed height", async () => { + expect(await statsHeight(database.db)).toBe(0); + database.raw.prepare("INSERT INTO chain_state(key,value) VALUES ('block_height','1584')").run(); + expect(await statsHeight(database.db)).toBe(1584); +}); + +it("only queries detailed charts on request and anchors them to the indexed tip", async () => { + vi.stubGlobal("caches", { default: { match: async () => undefined, put: async () => {} } }); + const { launchesRoute } = await import("#api/read/launches"); + database.raw.prepare("INSERT INTO chain_state(key,value) VALUES ('block_height','800000')").run(); + const prepare = vi.spyOn(database.db, "prepare"); + const env = { DB: database.db }; + const execution = { waitUntil: () => {}, passThroughOnException: () => {}, props: {} }; + const basic = await launchesRoute.request("https://api.xcp.fun/v2/stats?height=800000", {}, env, execution); + expect(basic.status).toBe(200); + expect((await basic.json()).result.ecosystem).toBeUndefined(); + expect(prepare.mock.calls.some(([sql]) => /FROM (asset_events|token_burns)/.test(sql))).toBe(false); + + const detailed = await launchesRoute.request("https://api.xcp.fun/v2/stats?activity=1&height=99999999", {}, env, execution); + expect(detailed.status).toBe(200); + expect((await detailed.json()).result.ecosystem).toEqual({ height: 800000, trades_daily: [], burns_daily: [] }); + expect(detailed.headers.get("cache-control")).toContain("max-age=300"); +}); + +const stats = { + blocks_per_bucket: 144, daily: [{ bucket: 4, n: 99 }, { bucket: 5, n: 2 }, { bucket: 11, n: 1 }], + ecosystem: { height: 1584, trades_daily: [{ bucket: 5, n: 3, xcp: "145000000" }], + burns_daily: [ + { bucket: 4, asset: "OLD", divisible: 1, n: 9, quantity: "1" }, + { bucket: 5, asset: "COIN", divisible: 1, n: 2, quantity: "9007199254740993" }, + { bucket: 11, asset: "COIN", divisible: 1, n: 1, quantity: "2" }, + { bucket: 11, asset: "TICKET", divisible: 0, n: 4, quantity: "8" }, + { bucket: 12, asset: "FUTURE", divisible: 1, n: 9, quantity: "1" }, + ] }, +} as LaunchStats; + +it("zero-fills aligned buckets and totals only the selected window without mixing token units", () => { + const view = statsActivity(stats, 7)!; + expect(view.series.map(d => d.bucket)).toEqual([5, 6, 7, 8, 9, 10, 11]); + expect(view.series[1]).toEqual({ bucket: 6, mints: 0, fills: 0, xcp: 0n, burns: 0 }); + expect(view.totals).toEqual({ mints: 3, fills: 3, xcp: 145000000n, burns: 7 }); + expect(view.assets).toEqual([ + { asset: "TICKET", divisible: false, n: 4, quantity: 8n }, + { asset: "COIN", divisible: true, n: 3, quantity: 9007199254740995n }, + ]); + expect(statsActivity(stats, 90)!.series).toHaveLength(90); +}); + +it("distinguishes unavailable activity from a verified empty window", () => { + expect(statsActivity({ ...stats, ecosystem: undefined }, 7)).toBeNull(); + expect(statsActivity({ ...stats, ecosystem: { ...stats.ecosystem!, height: 0 } }, 7)).toBeNull(); + const empty = statsActivity({ ...stats, daily: [], ecosystem: { height: 1584, trades_daily: [], burns_daily: [] } }, 7)!; + expect(empty.totals).toEqual({ mints: 0, fills: 0, xcp: 0n, burns: 0 }); + expect(empty.assets).toEqual([]); +});