Launchpad SDK
Two ways to drive the Robinhood Chain launchpad from code: a single-file SDK you drop into any project (Python with requests, or dependency-free JavaScript), or the launchpad service of the full cymetica-eventtrader package. Both wrap the endpoints on the REST API page, so the surface is identical. Reads need no auth; writes return unsigned transactions that you sign — the SDK never sees a key unless you pass one to the optional local-signing helper.
Download
Python: pip install requests (and web3 only if you want sign_and_send). JavaScript: nothing — native fetch, Node 18+ or the browser; pass an ethers v6 Signer to sendWith to broadcast.
Python — quickstart
from eventtrader_launchpad import EventTraderLaunchpad
lp = EventTraderLaunchpad() # https://cymetica.com, no key
cfg = lp.config() # factory, RPC, fees, ABIs
hot = lp.list_tokens(sort="volume", limit=5) # a list of token rows
token = lp.get_token(hot[0]["address"])
print(token["symbol"], token["page_url"])
risk = lp.holders(token["address"]) # rug-check before buying
print("top-10 hold", risk["top10_concentration_pct"], "%")
# Quote a 0.01 ETH buy → unsigned tx to sign with YOUR wallet
q = lp.trade_quote(token["address"], side="buy", amount=0.01, slippage_bps=100)
print(q["quote"]["tokens_out"], q["unsigned_transactions"][0])
Launch a token ($0)
prep = lp.prepare_launch(
"Night Owl", "OWL",
description="Nocturnal alpha",
image_url="https://example.com/owl.png",
website="https://owl.example", twitter="https://x.com/owl",
creator_tax_bps=0, share_fees_with_holders=False,
)
tx = prep["unsigned_transaction"] # {chain_id, to, value_wei, data, gas_hint, function}
# Option A — sign locally with web3.py (your key never leaves this process)
receipt = lp.sign_and_send(tx, private_key=os.environ["MY_KEY"])
print(receipt["tx_hash"], receipt["token_address"], receipt["page_url"])
# Option B — hand `tx` to any wallet: it is plain {to, value, data, chainId}
Sell (approve, then sell)
q = lp.trade_quote(token["address"], side="sell", amount=1_000_000) # tokens
for unsigned in q["unsigned_transactions"]: # 1/2 approve, 2/2 sell
lp.sign_and_send(unsigned, private_key=os.environ["MY_KEY"])
Creator links, gas-free
from eth_account import Account
from eth_account.messages import encode_defunct
m = lp.socials_message(token["address"], website="https://owl.example",
twitter="https://x.com/owl")
sig = Account.sign_message(encode_defunct(text=m["message"]),
private_key=os.environ["MY_KEY"]).signature.hex()
lp.set_socials(token["address"], wallet=m["creator_address"], signature=sig,
timestamp=m["timestamp"], website="https://owl.example",
twitter="https://x.com/owl")
JavaScript — quickstart
import { EventTraderLaunchpad } from './eventtrader-launchpad.js';
import { ethers } from 'ethers';
const lp = new EventTraderLaunchpad();
const tokens = await lp.listTokens({ sort: 'volume', limit: 5 }); // an array
const token = await lp.getToken(tokens[0].address);
const q = await lp.tradeQuote(token.address, { side: 'buy', amount: 0.01 });
const signer = new ethers.Wallet(process.env.MY_KEY,
new ethers.JsonRpcProvider('https://rpc.mainnet.chain.robinhood.com'));
const r = await lp.sendWith(signer, q.unsigned_transactions[0]);
console.log(r.hash, r.status);
// Launch
const prep = await lp.prepareLaunch({ name: 'Night Owl', symbol: 'OWL',
website: 'https://owl.example' });
const launched = await lp.sendWith(signer, prep.unsigned_transaction);
console.log(launched.tokenAddress, launched.pageUrl);
In the browser, signer can be await new ethers.BrowserProvider(window.ethereum).getSigner() — the same non-custodial flow the launchpad page uses.
Method reference
| Python | JavaScript | REST |
|---|---|---|
config() | config() | GET /config |
list_tokens(sort, limit, offset, chain_id, creator) | listTokens({sort, limit, offset, chainId, creator}) | GET /tokens |
screener(limit, include_external, chain_id) | screener({limit, includeExternal, chainId}) | GET /screener |
get_token(address) | getToken(address) | GET /tokens/{address} |
get_token_onchain(address, chain_id) | getTokenOnchain(address, chainId) | GET /tokens/{address}/onchain |
trades(address, limit) | trades(address, limit) | GET /tokens/{address}/trades |
holders(address, limit) | holders(address, limit) | GET /tokens/{address}/holders |
fee_boost(wallet) | feeBoost(wallet) | GET /boost/{wallet} |
trader_rewards(wallet) | traderRewards(wallet) | GET /rewards/{wallet} |
backing(address) | backing(address) | GET /backing/{address} |
prepare_launch(name, symbol, …) | prepareLaunch({name, symbol, …}) | POST /launch/prepare |
trade_quote(address, side, amount, slippage_bps) | tradeQuote(address, {side, amount, slippageBps}) | GET /tokens/{address}/quote |
socials_message(address, …) | socialsMessage(address, {…}) | GET /tokens/{address}/socials/message |
set_socials(address, wallet, signature, timestamp, …) | setSocials(address, {wallet, signature, timestamp, …}) | POST /tokens/{address}/socials |
sign_and_send(tx, private_key) | sendWith(signer, tx) | — local signing helper |
All paths are relative to https://cymetica.com/api/v1/launchpad/onchain. Errors raise EventTraderLaunchpadError with .status and .code (e.g. UNKNOWN_TOKEN, GRADUATED, QUOTE_UNAVAILABLE).
Full package (async, typed)
The same service ships inside the platform SDKs as client.launchpad:
# pip install cymetica-eventtrader
from event_trader import EventTrader
async with EventTrader() as client:
hot = await client.launchpad.list_tokens(sort="volume", limit=5)
q = await client.launchpad.trade_quote(hot[0]["address"], side="buy", amount=0.01)
prep = await client.launchpad.prepare_launch("Night Owl", "OWL", website="https://owl.example")
// npm install cymetica-eventtrader
import { EventTrader } from "cymetica-eventtrader";
const client = new EventTrader();
const hot = await client.launchpad.listTokens({ sort: "volume", limit: 5 }); // array
const q = await client.launchpad.tradeQuote(hot[0].address, { side: "buy", amount: 0.01 });
const prep = await client.launchpad.prepareLaunch({ name: "Night Owl", symbol: "OWL" });