# Indexing Slyng coins

For explorers, wallets, trackers and aggregators. Everything here is readable from the chain
with no key, no API and no permission from us.

Written to be sent as-is. If you are reading it because you want a coin's page to say
**Launched on Slyng**, § 2 is the only part you strictly need.

---

## 1. What Slyng is

A token launchpad on **Robinhood Chain** (chain ID **4663**). A creator opens a coin; its whole
supply starts on a constant-product bonding curve held by the launchpad; when enough quote
accumulates the coin graduates into a Uniswap v4 pool whose liquidity is minted into a contract
with no withdrawal path.

Every coin is a plain fixed-supply ERC-20. Nothing about indexing one is special.

---

## 2. How to tell a coin was launched on Slyng

**Read one field.** Every coin records its launchpad on the token contract:

```solidity
address public immutable launchpad;   // LaunchToken.sol
```

It is set to `msg.sender` in the constructor — the launchpad that minted it — and it is
`immutable`, so there is no setter, no proxy and no owner path that can change it afterwards.

```
launchpad() == <SLYNG_LAUNCHPAD_ADDRESS>   →  the coin was launched on Slyng
```

**This is worth preferring over a hardcoded list**, because it cannot be faked in either
direction: a coin minted somewhere else cannot claim us, and one of ours cannot be made to
disown us. A clone can copy our name and logo onto a website; it cannot make a token return
our address from an immutable.

If you would rather watch events, `TokenCreated` (§ 4) is emitted once per coin by the same
address.

---

## 3. Addresses

| | Address |
|---|---|
| Chain | Robinhood Chain, id `4663` |
| RPC | `https://rpc.mainnet.chain.robinhood.com` |
| **Launchpad** | `NOT DEPLOYED YET` — this table is filled in on the day, and this file is the canonical place to check |
| Name to display | `Slyng` |
| Logo | `https://slyng.tech/logo.png` |
| Site | `https://slyng.tech` |
| A coin's page | `https://slyng.tech/token/<address>` |

---

## 4. Events

All emitted by the launchpad.

```solidity
event TokenCreated(
    address indexed token,
    address indexed creator,
    address indexed quote,
    string  name,
    string  symbol,
    uint256 lockupSeconds,
    uint256 creatorUnlockAt,
    uint256 graduationTarget
);

event Bought(address indexed token, address indexed buyer,  uint256 quoteIn,  uint256 tokensOut, uint256 fee);
event Sold  (address indexed token, address indexed seller, uint256 tokensIn, uint256 quoteOut,  uint256 fee);
event Graduated(address indexed token, uint256 lpQuote, uint256 tokenReserve, uint256 graduationFee);
```

**One caution specific to this chain:** `eth_getLogs` here silently truncates above roughly one
million blocks — it returns a short result rather than an error. Chunk your backfill. We use
200,000.

---

## 5. Reading a coin's state

`Launchpad.curves(address token)` returns, in order:

```
quoteReserve, tokenReserve, graduationTarget, virtualQuote, lpQuote,
quote, creator, createdAt, exists, graduated
```

Useful derivations:

- **Liquidity / raised** — `quoteReserve`. It is zeroed at graduation, when trading moves to
  Uniswap v4; a graduated coin's depth is the pool's, not ours.
- **Price and market cap** — the curve is constant-product over `quoteReserve + virtualQuote`
  and `tokenReserve`. `Launchpad.tokensToQuote(token, amount)` gives what the curve would
  actually pay for `amount`, which is the honest number on a curve where selling moves the
  price against you.
- **Supply** — always exactly 1,000,000,000 with 18 decimals. It is a `constant`; there is no
  mint function anywhere.
- **Holders** — from ERC-20 `Transfer` logs, as with any token.

---

## 6. Things worth surfacing, because they are enforced rather than claimed

Each of these is a property of deployed bytecode, and each is checkable without trusting us:

- **The creator cannot sell before their time gate opens.** Enforced in the token itself, on
  every transfer out of the creator's address — `creatorUnlocked()`, `creatorUnlockAt()`,
  `creatorLockRemaining()`. Not in the launchpad and not in our interface, because either
  could be sidestepped by trading elsewhere.
- **Graduated liquidity cannot be withdrawn by anyone**, including us. The locker has no owner
  and no path that reduces liquidity.
- **Tokens have no owner at all** — no mint, no pause, no blacklist, no upgrade path.
- **The creator got no free allocation.** Any coins they hold were bought on the same curve as
  everyone else, capped at 5%.

If you show a "verified" or "safe" badge, these are the specific claims behind ours, and you
are welcome to check every one before repeating any of them.

---

## 7. Token list

`https://slyng.tech/tokenlist.json` — tokenlists.org schema, **graduated coins only**, since a
coin still on its curve does not trade anywhere a wallet could route to. Each entry carries:

```json
"extensions": {
  "launchpad": "Slyng",
  "launchpadUrl": "https://slyng.tech",
  "launchpadAddress": "0x..."
}
```

Coins whose name or symbol falls outside the schema's own regexes are omitted rather than
included, so one bad coin cannot invalidate the document for everybody.

---

## 8. Metadata feed — including coins still on the curve

`https://slyng.tech/api/coins` — every coin this launchpad has minted, curve and graduated
alike, with the presentation the chain has no room for: image, description and links.

The token list above is a *tradability* document and excludes bonding coins by design, so until
this existed there was nowhere for a machine to read a bonding coin's artwork from. That is why
a coin of ours renders as an anonymous ERC-20 in an app that has indexed it correctly.

```
GET /api/coins                       newest 50, add ?limit= (max 200) and ?offset=
GET /api/coins?addresses=0x..,0x..   exactly those, up to 100
```

```json
{
  "chainId": 4663,
  "launchpad": "0xCe0ABC33eC4264377045Ae17F9B887DB33Cc95B4",
  "total": 1,
  "count": 1,
  "metadataAvailable": true,
  "coins": [
    {
      "address": "0x066FFa6AAF8B54C6094d1Ed1bE818AFA5e0f290E",
      "name": "SLYNG",
      "symbol": "SLYNG",
      "decimals": 18,
      "totalSupply": "1000000000000000000000000000",
      "creator": "0x6D3e4eC533d34dD87DB1117D0b3B650EBb45E2a2",
      "createdAt": 1789435818,
      "quote": { "address": null, "symbol": "ETH", "decimals": 18 },
      "graduated": false,
      "creatorUnlockAt": 1792027818,
      "rugProtected": true,
      "url": "https://slyng.tech/token/0x066FFa6AAF8B54C6094d1Ed1bE818AFA5e0f290E",
      "logoURI": "https://…",
      "description": null,
      "links": { "website": null, "x": null, "telegram": null }
    }
  ],
  "next": null
}
```

Four things worth knowing:

- **`quote.address` is `null` for native ETH**, which is how the contract spells it.
- **An address we did not mint comes back in `unknown`**, not as an error and not silently
  dropped — so this doubles as an attribution check alongside `launchpad()` on the token.
- **`metadataAvailable: false` means the presentation fields are absent**, not that the coins
  have none. That response is sent `no-store`; do not cache "no logo" from it.
- **A coin moderated off our own site is omitted.** It still exists on chain and you will still
  see it in `TokenCreated`; what you will not get from us is its artwork.

Cached 120s at the edge. CORS is open. If you would rather have this in another shape — a
different envelope, cursors, webhooks on `TokenCreated` — say so and we will add it.

---

## 9. Contact

`https://x.com/SlyngTech` · `https://slyng.tech`

If something here is wrong, missing, or would be easier for you in another shape, say so and we
will change it. Being easy to index is the entire point of this file.
