Docs
What it is
Paste any Pons coin. Meet the beast it became. Every Pons coin, by contract address, is one creature: its look is fixed by the address, its stats come from that coin's Pons data snapshotted once a day, and creatures of different coins duel. No wallet, no signing, no contract.
Summon
Paste a Robinhood Chain address (0x + 40 hex characters) on the start page, or open /b/<ca>. From the command line: curl https://gorgodex.world/api/beast/<ca>. A coin we have not seen is fetched once from Pons and its numbers are frozen for the UTC day.
Look
The look never depends on data: same CA, same beast, forever. h = keccak256(lowercase CA), 32 bytes. The only override: after launch, the house coin wears Gorgon's art instead of the hashed species.
| Byte(s) | Trait | Mapping |
|---|---|---|
| h[0] | species | h[0] % 5: 0 Chimerith · 1 Basilith · 2 Stymphal · 3 Scyllan · 4 Minotarch |
| h[1..2] | hue | (h[1]<<8 | h[2]) % 360, applied as a hue rotation on the species sheet |
| h[3] | tone | h[3] % 3: muted, normal, vivid |
| h[4] | marking | h[4] % 4: stripes, spots, runes, plain |
| h[5] | marking density | 0.2 + (h[5]/255) · 0.6 |
| h[6] | eye glow | h[6] % 8, eight fixed colours |
| h[7] | accessory | h[7] % 7: none, horn-crown, collar, chain, scar-plate, back-spines, halo |
| h[8..11] | given name | onset + optional second onset + coda from a fixed 40 x 30 syllable table |
| h[12] | egg pattern | h[12] % 5 (egg stage only) |
Every beast page shows the bytes that chose its traits under "Anatomy".
Stats
All stats are log-normalised 0 to 100 so big coins do not win automatically. L(x, cap) = clamp(round(100 · log10(1+x) / log10(1+cap)), 1, 100).
| Stat | Source | Formula | Anchors |
|---|---|---|---|
| HP (vitality) | tradeCount | L(tradeCount, 20000) | 1 → 7 · 84 → 45 · 1 000 → 70 · 20 000 → 100 |
| ATK (power) | volumeUsd (fallback volumeQuote · quoteUsd) | L(volumeUsd, 3 000 000) | $11 → 17 · $150 → 34 · $20k → 66 · $3M → 100 |
| DEF (hide) | age in days | L(ageDays, 365) | 1 d → 12 · 7 d → 35 · 30 d → 58 · 1 y → 100 |
| SPD (reflex) | idleHours | clamp(100 − 100·log10(1+idleHours)/log10(721), 5, 100) | 0 h → 100 · 1 h → 89 · 24 h → 51 · 30 d → 5 |
| Rarity (label) | marketCapUsd | <10k Common · 10k–100k Uncommon · 100k–1M Rare · 1M–10M Epic · ≥10M Mythic | card frame colour, no duel effect |
| Element (label) | stage | curve → Ember (shows progress %) · graduated → Obsidian | badge only |
Market cap and price are shown as text from the snapshot but feed no stat, so a beast is not a price feed.
Stages & condition
ageDays = (snapshotAt − createdAt)/86400, idleHours = (snapshotAt − lastTradeAt)/3600. Stage is evaluated top-down:
- Apex: Pons stage is graduated.
- Adult: ageDays ≥ 7 and tradeCount ≥ 300.
- Young: ageDays ≥ 1.
- Egg: ageDays < 1. Crack length shows graduation progress.
Condition: awake idle < 72 h; asleep 72 h to 168 h (still duels); petrified ≥ 168 h (duels by hand with SPD near 5; excluded from the arena). An egg that is already idle is a cold egg. A coin that stops trading sleeps, then turns to stone.
Traits
Information, not a verdict. Each tooltip quotes the Pons field.
- Bundle scar: whitelisted > 0.
- Tax mark: creatorTaxBps > 0.
- Buyback sigil: buybackEnabled.
- Stock-fed: quote asset is not ETH.
- Voiced: the coin lists at least one social link.
Duel
Duels are deterministic. Sort the two CAs ascending to get X and Y; seed = keccak256(X + Y + "YYYY-MM-DD"); the PRNG is xorshift128+ seeded from the first 16 seed bytes. The same duel replays identically all day and re-rolls at 00:00 UTC.
- Pools:
hp = 100 + 2 · HP. Three rounds; in each round both act, faster first (SPD + rand·20, tie goes to X). A side at 0 HP stops acting; a KO ends the duel. - Hit:
dmg = max(4, ATK·(0.7+0.6·rand) − DEF·0.45·(0.7+0.6·rand)). Crit ifrand < min(0.25, SPD/400), then ×1.5. Damage is rounded. - Result: KO wins; otherwise the higher remaining percentage wins; equal is a stalemate.
- Rarity and element do not enter.
Worked example
Recorded Pons data, snapshot of 2026-11-03 09:00 UTC. RHIABLO (HP 69 ATK 74 DEF 24 SPD 93, pool 238) vs DEEP (HP 26 ATK 48 DEF 2 SPD 83, pool 152). Sorted by address, DEEP is X and RHIABLO is Y. Seed f215bca6e2580b3e….
- Round 1: RHIABLO hits for 66 (X 86, Y 238)
- Round 1: DEEP hits for 34 (X 86, Y 204)
- Round 2: RHIABLO hits for 63 (X 23, Y 204)
- Round 2: DEEP hits for 35 (X 23, Y 169)
- Round 3: RHIABLO crits for 121 (X 0, Y 169)
Result: RHIABLO wins by KO (DEEP 0% left, RHIABLO 71% left).
Arena
Every day the 16 most active coins fight a bracket. Eligible: age ≥ 1 day, idle < 24 h, at least 20 trades, not petrified. Ranked by 24-hour volume (today's volumeUsd minus yesterday's snapshot). Seeding 1v16, 2v15 and so on; each match is a duel with the suffix #arena-r<round>. Draws go to the higher-ranked coin. With fewer than 16 eligible coins the bracket is 8 or 4; with fewer than 4 there is no arena that day. A seed day (no previous snapshot to compare) is ranked by total volume and labelled so. Results are stored once and never recomputed. Snapshot at 00:00 UTC, arena at 00:10 UTC.
Data & snapshots
Pons fields used: createdAt, lastTradeAt, tradeCount, volumeUsd, marketCapUsd, priceUsd, stage, progress, graduatedAt, whitelisted, creatorTaxBps, buybackEnabled, socials, quote.symbol, artwork. One snapshot per coin per UTC day at 00:00 UTC; a coin pasted for the first time gets a day-0 snapshot immediately, frozen for the day. Later fetches the same day never overwrite it. Not available: holder count, live price.
Gorgodex reads the public Pons API with the user agent gorgodex.world/0.1, at most 3 requests per second, one fetch per coin per day.
API
No key. CORS open. Plain JSON. Rate limits apply per IP (120 requests per minute on /api/, 30 per minute on /og/). Index: /api. Agents: llms.txt.
| Method | Route | Returns |
|---|---|---|
| GET | /api | route list |
| GET | /api/beast/:ca | one beast: look, stage, condition, stats, rarity, element, traits, source fields |
| GET | /api/beast/:ca/history?days=90 | daily stat history |
| GET | /api/duel/:a/:b?date=YYYY-MM-DD | duel result for a UTC day (default today) |
| GET | /api/arena/today | today's bracket and logs |
| GET | /api/arena/:date | bracket of a past day |
| GET | /api/arena/history?limit=60 | champion list |
| GET | /api/dex?species=&stage=&rarity=&condition=&trait=&q=&sort=&cursor= | filterable list, 48 per page |
| GET | /api/stats | live counters |
| GET | /api/health | service health |
| GET | /img/beast/:ca.svg | the creature as an SVG |
| GET | /og/beast/:ca.png | share card (1200x630) |
| GET | /og/duel/:a/:b.png | duel share card |
curl https://gorgodex.world/api/beast/0xebaa0ca1a9d178550fb2f9ca4099a292375a403a
Errors: 400 invalid_address, 404 not_pons, 400 same_coin, 429 busy (retryAfterSec), 503 pons_unavailable (retryAfterSec).
Holders
After $GORGON launches, holders can name and frame the beasts of coins they hold (see Token). There is no signature. Anyone who knows a holder's address can set a name on its behalf; names are cosmetic, moderated by a word list, and removed when the balance drops below the minimum.
Privacy
The server stores counts only: no IP, no user agent, no address except what you type into the holder check. The holder check sends the address to our server, which calls the public RPC; nothing else leaves. No cookies, no wallet connection, no transactions are ever sent.
Limits
Gorgodex depends on the Pons API. If it is unreachable, known beasts are served from their last snapshot with stale: true and a banner; new addresses get an honest 503. Share cards are cached per beast per snapshot day.
Not audited
Not audited. Read the formulas before you trust them. No promise of returns.