EventTrader
AI-Native Trading
PAPER
Menu
Dark Mode
Plain English Mode
PAPER TRADING MODE — Enable real trading on your Account page
Back

How-to · AI agents · Arc

Launch a token with an AI agent on Arc

Nine steps from a prompt to a live token on Arc (chain id 5042), Circle's USDC-gas public chain. Your agent builds the transaction through EventTrader's public MCP tools, your own wallet signs it, and you keep 100% of the LP fees forever — Arc launches are platform-fee-free. Creation costs $0 — you pay only chain gas, in USDC. Nothing here is custodial: EventTrader never sees a key and never signs anything for you.

Which chain? This guide covers both launchpads EventTrader runs. Pick the one your token belongs on before step 1.
ChainChain idGas assetPlatform feeGuide
Robinhood Chain4663ETH25 bps (80% to creator)/guides/agent-token-launch
Arc5042USDC0 bps (100% of LP fees to creator)/guides/agent-token-launch?chain=arc

What you need

Chain details your agent will need
FieldValue
Chain id5042
RPChttps://rpc.mainnet.arc.io
Explorerhttps://explorer.arc.io
CurrencyUSDC
MCP endpointhttps://cymetica.com/mcp/v1
Live factory + fee factsGET https://cymetica.com/api/v1/launchpad/onchain/config

1Connect your agent to EventTrader

Point the agent at the MCP server. In Claude Desktop that is one block in claude_desktop_config.json; Claude Code takes the same server with claude mcp add. Any agent that can POST JSON-RPC can skip the config and call the endpoint directly.

{
  "mcpServers": {
    "cymetica": {
      "command": "uvx",
      "args": ["cymetica-eventtrader-mcp"]
    }
  }
}

Or, without any package, list the tools with a single request:

curl -s https://cymetica.com/mcp/v1 -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

You should see launchpad_list_tokens, launchpad_launch_token and launchpad_trade_quote in the list.

2Give the agent a wallet with gas

The agent needs a key it can sign with, and that address needs USDC on Arc — the same USDC pays gas and any dev buy, there is no separate gas token. Two common setups:

Never paste a private key into a chat. Keep keys in the agent's environment or signer, not in prompts. EventTrader's tools return unsigned transactions precisely so no key ever has to travel.

3Decide the token

These are the inputs the launch tool accepts. Everything is fixed at creation and cannot be edited afterwards, so decide them before step 4.

ParameterRuleNotes
name1–64 charactersRequired
symbol1–16 charactersRequired, upper-cased for you
descriptionup to 2000 charactersShown on the token card
image_urlhttps URL, up to 500 charactersLogo on the card
dev_buy0–10 USDCYour transparent first buy, sent as the transaction value, in the chain's native currency (USDC on Arc). Capped by the anti-snipe rule like everyone else. dev_buy_eth is the legacy alias for this same field — kept for backward compatibility, same 0–10 ETH range on Robinhood Chain
creator_tax_bps0 up to the live cap (read it from /config)Extra fee on every curve trade, paid to you, locked forever. 100 = 1%
share_fees_with_holderstrue / false (tool default false)ALL creator fees go to holders who stake, forever. You can never claim them yourself. The web launcher ticks this on by default; the tool leaves it off unless you pass true, so say which you want
website, twitter, telegram, discordhttps URLsAt launch: locked on the token contract (needs socials_supported: true in /config). Any time after launch: set or edit them gas-free with the creator wallet's signature via launchpad_set_token_socials (or GET /tokens/<address>/socials/message → personal_sign → POST /tokens/<address>/socials)
creator_wallet0x addressSend creator earnings somewhere other than the launching wallet. Also requires the upgraded factory
partnerpartner slug (e.g. coinpedia)Launching from a partner surface (like Coinpedia's launcher)? Pass its slug to attribute the launch to that partner. Same factory, same curve, same token — only the rev-share attribution differs. Requires launch_wallet. Fail-soft: an unknown partner just comes back attributed:false and never blocks your launch
launch_wallet0x addressOnly needed with partner: the wallet you will sign the launch with, so the indexer can attribute the launch to the partner when it sees your createToken on-chain (48h window)
chain_id5042Always pass it explicitly

Supply is always 1,000,000,000 tokens, all of it on the bonding curve. The curve graduates to a Uniswap v3 pool with permanently locked liquidity once it has raised 10,000 USDC, and the token is then also listed on the EventTrader orderbook.

4Ask the agent to build the transaction

Hand the agent a prompt like this. The bracketed values are yours to fill in.

Prompt · Build my launchConnect to the EventTrader MCP server at https://cymetica.com/mcp/v1. First read https://cymetica.com/api/v1/launchpad/onchain/config and tell me the live factory generation and the max creator tax for chain 5042 (Arc). Then call launchpad_launch_token with chain_id 5042, name "[NAME]", symbol "[SYMBOL]", description "[ONE SENTENCE]", image_url "[URL]", dev_buy [0.5], creator_tax_bps [100] and share_fees_with_holders [true]. Show me the unsigned transaction it returns and the options it echoed back, and do not sign anything until I say go.

The equivalent raw call, if your agent speaks JSON-RPC directly:

curl -s https://cymetica.com/mcp/v1 -H 'Content-Type: application/json' -d '{
  "jsonrpc": "2.0", "id": 1, "method": "tools/call",
  "params": {
    "name": "launchpad_launch_token",
    "arguments": {
      "chain_id": 5042,
      "name": "Rocket Token", "symbol": "RKT",
      "description": "The first token my agent launched.",
      "dev_buy": 0.5,
      "creator_tax_bps": 100,
      "share_fees_with_holders": true
    }
  }
}'

The tool answers with everything the signer needs. Like every MCP tool, the payload arrives as a JSON string inside the MCP envelope — parse result.content[0].text, then read its result field:

// raw JSON-RPC reply (MCP envelope)
{ "jsonrpc": "2.0", "id": 1,
  "result": { "isError": false,
              "content": [ { "type": "text", "text": "{\"success\":true,\"tool\":\"launchpad_launch_token\",\"result\":{…},\"latency_ms\":10}" } ] } }

// result.content[0].text, parsed — the object your signer uses is its "result":
{
  "success": true,
  "tool": "launchpad_launch_token",
  "result": {
    "unsigned_transaction": {
      "chain_id": 5042,
      "to": "0xB744…e203",          // the live Arc factory — must equal factory_address in /config for chain 5042
      "value_wei": "500000000000000000", // your dev buy (0.5 USDC, 18-decimal native units); "0" with no dev buy
      "data": "0x8be3c921…",           // encoded factory call
      "gas_hint": 3600000,             // 3200000 for a plain launch, 3600000 when any option is set
      "function": "createTokenV2"      // "createToken" when no tax / sharing / links were requested
    },
    "options": { "creator_tax_bps": 100, "share_fees_with_holders": true, "socials": {}, "creator_wallet": null },
    "chain":   { "chain_id": 5042, "rpc_url": "https://rpc.mainnet.arc.io", "currency": "USDC" },
    "fees":    { "creation_fee": "0", "curve_fee_bps": 0, "creator_share_bps": 10000 }
  }
}

Claude Desktop and most agent frameworks unwrap the envelope for you. If you call the endpoint yourself, the unwrap is one line: json.loads(reply["result"]["content"][0]["text"])["result"]. The same shape applies to launchpad_list_tokens and launchpad_trade_quote.

The tool checks the live factory before encoding, so the call it returns is always one the chain will accept. If you asked for an option the current factory cannot do, you get an error code instead of a transaction that would revert (see Errors).

5Review before anyone signs

Make the agent read the transaction back to you and confirm each of these. This is the same review step the web launcher shows humans.

6Sign and broadcast from your own wallet

The transaction is ordinary EVM calldata. Any signer works; the fields map one-to-one.

Fees on Arc. Blocks arrive roughly every 0.5 s and the base fee moves with EIP-1559, same as any modern L2/L1 — a legacy transaction priced at a stale eth_gasPrice can still be rejected with max fee per gas less than block base fee if you fetch it too early. Unlike Robinhood Chain, priority tips on Arc are not zero: don't hardcode maxPriorityFeePerGas — use the node's suggested priority fee (eth_maxPriorityFeePerGas, or w3.eth.max_priority_fee in web3.py) and add the usual ~25% headroom to the base fee. Budget gas_hint × maxFeePerGas + value — the node refuses the send if the wallet cannot cover that maximum.

# Python (web3.py) — the agent runs this with ITS key, never with yours
import json
from web3 import Web3
tx_meta = json.loads(reply["result"]["content"][0]["text"])["result"]   # unwrap the MCP envelope
w3 = Web3(Web3.HTTPProvider(tx_meta["chain"]["rpc_url"]))
acct = w3.eth.account.from_key(AGENT_PRIVATE_KEY)      # from the agent's env, not the prompt
utx = tx_meta["unsigned_transaction"]
base_fee = w3.eth.get_block("latest")["baseFeePerGas"]
tip = w3.eth.max_priority_fee                          # Arc: tips are NOT zero — ask the node
max_fee = (base_fee + tip) * 5 // 4                     # +25% headroom; charged at base fee + tip
need = utx["gas_hint"] * max_fee + int(utx["value_wei"])
assert w3.eth.get_balance(acct.address) >= need, "top up the wallet first"
tx = {
    "chainId": utx["chain_id"], "to": utx["to"], "data": utx["data"],
    "value": int(utx["value_wei"]), "gas": utx["gas_hint"],
    "nonce": w3.eth.get_transaction_count(acct.address),
    "maxFeePerGas": max_fee, "maxPriorityFeePerGas": tip, "type": 2,
}
signed = acct.sign_transaction(tx)
raw = getattr(signed, "raw_transaction", None) or signed.rawTransaction   # web3.py 7 / 6
tx_hash = w3.eth.send_raw_transaction(raw)
receipt = w3.eth.wait_for_transaction_receipt(tx_hash)
print(receipt.status, tx_hash.hex())
// JavaScript (ethers v6) — MetaMask or any browser wallet
const provider = new ethers.BrowserProvider(window.ethereum);
const signer = await provider.getSigner();
const utx = res.unsigned_transaction;                       // res = parsed tool result (see step 4)
const fee = await provider.getFeeData();                    // Arc: use the node's suggested tip, not 0
const tx = await signer.sendTransaction({
  to: utx.to, data: utx.data, value: BigInt(utx.value_wei), gasLimit: utx.gas_hint,
  maxFeePerGas: fee.maxFeePerGas, maxPriorityFeePerGas: fee.maxPriorityFeePerGas,
});
const receipt = await tx.wait();

If you are signing by hand, tell the agent to stop after step 5 and paste the to, data and value fields into your wallet's raw-transaction screen, or let the web launcher at /launchpad/arc do the same thing with a click.

7Verify the launch

// Event emitted by the factory (identical on every factory generation)
event LaunchCreated(address indexed token, address indexed curve, address indexed creator, string name, string symbol)
// topics[0] = keccak256("LaunchCreated(address,address,address,string,string)")
//           = 0x0b6f3e5d73693a196bb5efee504ff46042d1036f826b445548a5e56225faec1f
// topics[1] = token, topics[2] = bonding curve, topics[3] = your wallet; data = (name, symbol)

# Python: pick the factory log out of the receipt
LAUNCH_TOPIC = "0x0b6f3e5d73693a196bb5efee504ff46042d1036f826b445548a5e56225faec1f"
log = next(l for l in receipt["logs"] if l["topics"][0].hex().lower().removeprefix("0x") == LAUNCH_TOPIC[2:])
token = "0x" + log["topics"][1].hex()[-40:]
curve = "0x" + log["topics"][2].hex()[-40:]
Prompt · Confirm it is liveFetch the receipt for transaction [TX HASH] on Arc, decode the LaunchCreated event and give me the token and curve addresses. Then call launchpad_list_tokens with chain_id 5042 and confirm my token appears with its price_eth, total_eth_raised and graduation_threshold_eth (these fields are in USDC on Arc).

Anti-snipe: for the first 40 blocks every wallet, yours included, is capped at 2% of supply. A dev buy larger than the cap is trimmed to it, not rejected.

8Earn and claim

Arc launches are platform-fee-free: there is no curve trading fee and no 80/20 split. The creator keeps 100% of the locked pool's LP fees after graduation, plus any creator tax you set on the curve.

9Let the agent trade

launchpad_trade_quote returns an on-chain quote plus the unsigned buy or sell transaction for any live curve, yours or anyone else's. Same pattern: the agent quotes, you or its wallet sign.

{"name": "launchpad_trade_quote",
 "arguments": {"token_address": "0x…", "side": "buy", "amount": 0.05, "slippage_bps": 100}}

Before trading someone else's launch, have the agent run the token through the screener: holder concentration and creator-share flags catch the obvious rugs.

Error codes the tool can return

CodeMeaningFix
INVALID_NAME / INVALID_SYMBOLLength rules in step 3Shorten
INVALID_DEV_BUYNot a number, or outside 0–10 USDCUse a decimal USDC amount
INVALID_SOCIALA link is not http(s)Use full URLs
INVALID_TAX / TAX_ABOVE_CAPTax not an integer, or above the live factory capRead max_creator_tax_bps from /config
INVALID_CREATOR_WALLETNot a 0x addressChecksum or lowercase 40-hex address
OPTIONS_UNSUPPORTEDThe live factory cannot do the option you asked for at launch (on-chain social links / payout wallet need the V2.1 factory)Retry without that option; add the links after launch with launchpad_set_token_socials (creator signature, no gas)
NO_CHAINNo launchpad enabled for that chain idUse 5042
SERVICE_ERRORTransientRetry in a minute
Non-custodial by design. EventTrader builds calldata and reads the chain. It never holds your key, never signs, and never takes a creation fee. Your token's liquidity is locked forever by the contracts themselves, not by a promise.

EventTrader is an independent platform built on Arc, a public blockchain developed by Circle, and is not affiliated with, sponsored by, or endorsed by Circle Internet Group, Inc. Launching and trading tokens involves real money and real risk; nothing on this page is financial advice.

Open the launcher → AI agents for beginners Launchpad screener