Subchapter 2.22
plugins/printr.mdMarkdown7 KBView on GitHub
[!IMPORTANT] Complete the Base MCP onboarding flow in
SKILL.mdfirst. The creator address (launch creator andsend_callssender) comes fromget_wallets.
Printr (opens in a new tab) is a cross-chain token launchpad: a creator deploys a token and seeds its initial liquidity in one transaction. This plugin covers the EVM chains Base MCP can submit to. It builds an unsigned EVM transaction over the Printr HTTP API and submits it through Base MCP send_calls; Printr never signs or executes.
| Capability | Execution path |
|---|---|
| Read (quote, token lookup) | Printr HTTP API |
Build (POST /print) | Printr HTTP API |
| Submit (launch) | Base MCP send_calls |
Per-surface HTTP routing and the chat-only fallback are handled centrally, see ../references/custom-plugins.md. If the Printr API is unreachable on the current surface, tell the user and stop; never hand-build the launch calldata.
Base URL: https://api-preview.printr.money/v0. Public (no auth), application/json. Errors return text/plain with a non-2xx status, not a JSON error object; branch on the HTTP status.
Estimate launch cost. No wallet address required.
{
"chains": ["eip155:8453"],
"initial_buy": { "spend_usd": <amount> },
"graduation_threshold_per_chain_usd": <usd>
}chains — CAIP-2 chain IDs (eip155:8453 is Base).initial_buy — a VariableInitialBuy object with exactly one mode (a bare string is rejected):
{ "spend_native": "<wei>" } — native token as an atomic wei string ("0.1" is rejected; use "100000000000000000").{ "spend_usd": <number> } — USD amount.{ "supply_percent": <number> } — percent of supply.graduation_threshold_per_chain_usd — per-chain graduation target, USD integer, min 15000, max 1000000.Returns { "quote": { … } } with per-chain costs (cost_asset_atomic, cost_usd) and the token amount yielded. Surface the total and token amount before building.
Build the token; returns unsigned calldata. Does not deploy.
{
"creator_accounts": ["eip155:8453:0xCreatorAddress"],
"name": "My Token",
"symbol": "MYT",
"description": "A token launched via Printr",
"image": "<raw base64 JPEG/PNG, max 500KB>",
"chains": ["eip155:8453"],
"initial_buy": { "spend_usd": <amount> },
"graduation_threshold_per_chain_usd": <usd>,
"external_links": { "website": "https://…", "twitter": "https://…" }
}creator_accounts — one CAIP-10 address (eip155:<chainId>:0x…) per chain, from get_wallets.name (≤32), symbol (≤10), description (≤500 chars).image — raw base64, max 500KB, no data: prefix (a data-URL yields 400 illegal base64).initial_buy, graduation_threshold_per_chain_usd — same as /print/quote. external_links optional.{
"token_id": "0x…",
"payload": { "to": "eip155:8453:0x…", "calldata": "<base64>", "value": "<decimal wei>", "gas_limit": 2500000, "hash": "<base64>" },
"quote": { … }
}payload.calldata is base64 (not 0x hex) and payload.value is a decimal wei string; both need encoding before send_calls (see ## Submission). Trade page: https://app.printr.money/trade/{token_id}.
Token metadata and launch state; per-chain deployment status (live, pending, failed).
get_wallets → creator EVM address; form eip155:<chainId>:<address>.POST /print/quote → show total cost + token amount; user confirms.POST /print → { token_id, payload }.payload → send_calls (see ## Submission); verify value against the quote and that the balance covers value + gas.send_calls → approval URL; user approves; poll get_request_status → confirmed.https://app.printr.money/trade/{token_id}.Build one send_calls call (EIP-5792 batch of { to, value, data }) from payload. calldata and value are not in wire format and need encoding:
send_calls field | Source | Transform |
|---|---|---|
to | payload.to | Strip the eip155:<chainId>: prefix → raw 0x…. |
data | payload.calldata | Base64-decode → hex → 0x-prefix. |
value | payload.value | Decimal wei → hex (e.g. 5706042678300792 → 0x14459d96e9d078). |
Derive chain from the <chainId> in payload.to: 8453→base, 42161→arbitrum, 10→optimism, 137→polygon, 56→bsc, 43114→avalanche, 1→ethereum.
POST /print returns one creation call per home chain today. If it returns more (e.g. an approval before the creation), batch them in response order, approvals first. Refs: ../references/approval-mode.md, ../references/batch-calls.md.
Launch a memecoin called Doge Supreme (DSUP) on Base
get_wallets → form eip155:8453:<address>.POST /print/quote with chains: ["eip155:8453"] and the user’s initial_buy → show cost + token amount; confirm.data: prefix).POST /print (name Doge Supreme, symbol DSUP, image, chains: ["eip155:8453"]) → { token_id, payload }.payload → send_calls (chain: "base"); user approves; poll get_request_status.https://app.printr.money/trade/{token_id}.What would it cost to launch on Base and Arbitrum?
POST /print/quote with chains: ["eip155:8453", "eip155:42161"] → report per-chain and combined cost. Build nothing.Did my token deploy on every chain?
GET /tokens/{id}/deployments → report which chains are live, pending, or failed.initial_buy, so it is thin, volatile, and may never graduate. Quote first; never propose or silently inflate the initial_buy, the user specifies it.value + gas and cannot be undone. Verify the decoded value against the quote and that the balance covers it before submitting. Never auto-launch, auto-approve, or resubmit; the user confirms name, symbol, chains, and amount, then approves at the approval URL.api-preview.printr.money is Printr’s official public API (no auth), served under /v0. The trade UI is app.printr.money.creator_accounts are CAIP-10 (eip155:<chainId>:0x…); chains and payload.to are CAIP-2 (eip155:<chainId>).