# ArcPad — developer context (paste this into your AI to build on ArcPad)
You are helping me build on **ArcPad**, a permissionless memecoin launchpad on
**Arc** (Circle's stablecoin-native Layer-1, chain ID **5042**). ArcPad is just
one public contract — anyone can launch a token by calling it, from any app,
bot, or script. Launches automatically show up on ArcPad's feed, chart, holders
and analytics (its indexer reads the on-chain event).
## Contract
- **ArcCurvePad** (Arc mainnet, chain 5042):
`0x24196CD6e534cfCE8F480B53E70809b68Ea86F29`
- Function:
```
createToken(
string name,
string symbol,
TokenMeta meta, // struct: string imageURI, string website, string twitter, string telegram
bytes32 salt // random 32 bytes — prevents pool-init griefing
) payable returns (address)
```
- `msg.value` = the dev buy in native USDC (0 for none).
- Set a **generous gas limit (~3,000,000)**: a launch deploys the token, creates
the Uniswap V3 pool and mints the locked position. Too low reverts out-of-gas.
- Fees: the creator earns **0.5% of buys**, claimable in USDC forever. Liquidity
is locked permanently.
## Minimal ABI (JS)
```js
const ABI = [
"function createToken(string name, string symbol, (string imageURI, string website, string twitter, string telegram) meta, bytes32 salt) payable returns (address)",
];
```
## RPC
Use an Arc RPC of your choice (find the official one when it is public). In the
examples below, replace `RPC_URL` with your Arc RPC endpoint. The chain ID is
`5042`; native gas token is USDC (18 decimals).
## Example — one HTML file (browser, injected wallet)
```html
Wallet: not connected
```
## Example — Telegram bot (Node, ethers)
```js
import { Wallet, JsonRpcProvider, Contract, parseEther, hexlify, randomBytes } from "ethers";
const PAD = "0x24196CD6e534cfCE8F480B53E70809b68Ea86F29";
const RPC = process.env.RPC_URL || "RPC_URL"; // <-- your Arc RPC
const ABI = [
"function createToken(string name, string symbol, (string imageURI, string website, string twitter, string telegram) meta, bytes32 salt) payable returns (address)",
];
const wallet = new Wallet(process.env.PRIVATE_KEY, new JsonRpcProvider(RPC));
const pad = new Contract(PAD, ABI, wallet);
// /launch Name | SYMBOL | imageURL | devBuyUSDC
const tx = await pad.createToken(
"My Coin", "MYC",
{ imageURI: "https://…", website: "", twitter: "", telegram: "" },
hexlify(randomBytes(32)),
{ value: parseEther("1"), gasLimit: 3000000n },
);
await tx.wait();
```
## Public API (no key, CORS-open)
- `GET /api/tokens` — paginated launches (limit, after, sort, q).
- `GET /api/token/{address}/meta` — name, symbol, pool, creator, image, price.
- `GET /api/token/{address}/stats?range=` — price/volume stats.
- `GET /api/token/{address}/activity` — recent trades + 24h volume.
- `GET /api/token/{address}/live` — SSE stream of trades/price/candles/holders.
- `GET /api/holders?token=0x…` — holders.
- `GET /api/live?after=` — global buy/sell/launch tape.
- `GET /api/stats` — site-wide analytics.
- `GET /api/leaderboard?range=` — top wallets by points.
- `GET /api/status` — indexer health.
## Claiming
- Creators: `ArcFeeLocker` (`0x69A615DD32B89fE40D87b2e3123baE4162f2d450`):
`claim(asset)` per asset, or `collectAndClaim(positionId)` (harvest + pay).
- Holders (holder-rewards launches): the token is an `ArcRewardToken`; call
`claim()`.
## Monetizing on top
You can charge your own fee on top (ArcPad's 1% is fixed on-chain). Simplest: a
flat fee per launch (e.g. 0.25 USDC) collected by your bot/UI, or a small wrapper
contract that takes your fee then calls `createToken`. See arcpad.meme/docs
section "Monetizing your integration".
## What I want you to build
(Describe your idea here — e.g. "a Telegram bot that launches a coin when the
community votes", "a simple web launcher with a flat $0.25 fee", etc.)