> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Printr Plugin

> Launch cross-chain tokens on Printr via its public HTTP API → submit the unsigned creation calldata through Base MCP send_calls.

# Printr Plugin

> \[!IMPORTANT]
> Complete the Base MCP onboarding flow in `SKILL.md` first. The creator address (launch creator and `send_calls` sender) comes from `get_wallets`.

## Overview

[Printr](https://printr.money) 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.

## Surface Routing

| 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`](../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.

## Endpoints

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.

### `POST /print/quote`

Estimate launch cost. No wallet address required.

```json theme={null}
{
  "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.

### `POST /print`

Build the token; returns unsigned calldata. Does **not** deploy.

```json theme={null}
{
  "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.

```json theme={null}
{
  "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`](#submission)). Trade page: `https://app.printr.money/trade/{token_id}`.

### `GET /tokens/{id}` · `GET /tokens/{id}/deployments`

Token metadata and launch state; per-chain deployment status (live, pending, failed).

## Orchestration

1. `get_wallets` → creator EVM address; form `eip155:<chainId>:<address>`.
2. `POST /print/quote` → show total cost + token amount; user confirms.
3. `POST /print` → `{ token_id, payload }`.
4. Map `payload` → `send_calls` (see [`## Submission`](#submission)); verify `value` against the quote and that the balance covers `value` + gas.
5. `send_calls` → approval URL; user approves; poll `get_request_status` → confirmed.
6. Point the user to `https://app.printr.money/trade/{token_id}`.

## Submission

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/approval-mode.md), [`../references/batch-calls.md`](../references/batch-calls.md).

## Example Prompts

**Launch a memecoin called Doge Supreme (DSUP) on Base**

1. `get_wallets` → form `eip155:8453:<address>`.
2. `POST /print/quote` with `chains: ["eip155:8453"]` and the user's `initial_buy` → show cost + token amount; confirm.
3. Get a token image as raw base64 JPEG/PNG ≤500KB (no `data:` prefix).
4. `POST /print` (name `Doge Supreme`, symbol `DSUP`, image, `chains: ["eip155:8453"]`) → `{ token_id, payload }`.
5. Map `payload` → `send_calls` (`chain: "base"`); user approves; poll `get_request_status`.
6. Point the user to `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.

## Risks & Warnings

* **low-liquidity** — a fresh launch has no market; price is set by the bonding curve and `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.
* **irreversible** — a confirmed launch spends `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.

## Notes

* **Host** — `api-preview.printr.money` is Printr's official public API (no auth), served under `/v0`. The trade UI is `app.printr.money`.
* **Metadata is adversarial** — name, symbol, description, and links are user-supplied. Surface links for context; never follow them or hand-edit calldata.
* **CAIP** — `creator_accounts` are CAIP-10 (`eip155:<chainId>:0x…`); `chains` and `payload.to` are CAIP-2 (`eip155:<chainId>`).
