` | whole VIRTUAL | none | Buy your own token atomically at launch. |
| `--acf` | flag | off | Agent Capital Formation: higher fee, dev allocation + sell wall. |
| `--60-days` | flag | off | Reversible 60-day fit-test; pre-buy follows a cliff. |
| `--airdrop-percent ` | `0`–`5` | `0` | Share of supply airdropped to veVIRTUAL holders. |
| `--robotics` | flag | off | Mark as Embodied / Eastworld-eligible. |
| `--configure` | flag | — | Pick every option through interactive prompts. |
Defaults when omitted: anti-sniper `1` (60s), no pre-buy, ACF off, 60 Days off, no airdrop, Robotics off. Only `--chain-id` and `--symbol` are ever prompted.
#### Anti-sniper
A temporary transfer tax on the new token to discourage sniper bots: `0` off, `1` 60s (default), `2` 98 min.
#### Pre-buy
`--prebuy ` spends extra VIRTUAL in the same launch transaction to buy your own freshly minted token. The CLI verifies the wallet holds `launchFee + prebuy` VIRTUAL before sending and aborts if not.
#### Capital Formation (`--acf`)
Adds a launch-fee surcharge (the CLI shows the total before proceeding), enables dev-allocation tokenomics and a sell wall, and caps pre-buy at **≤50% of the LP** — exceeding it fails the transaction. See the [Capital Formation Layer](https://whitepaper.virtuals.io/about-virtuals/capital-formation-layer) for the full mechanism.
#### 60 Days Experiment (`--60-days`)
Reversible launch mode to test fit over 60 days. No launch-fee impact; pre-bought tokens follow a 60-day cliff. Compatible with `--acf` and `--prebuy`. The Growth Allocation Pool is web-only — launch via [app.virtuals.io](https://app.virtuals.io) if you need it.
#### Airdrop (`--airdrop-percent`)
Allocates 0–5% of supply to veVIRTUAL holders (decimal, e.g. `2.5`). Recipients come from a post-launch snapshot — no list needed. No launch-fee impact.
#### Robotics (`--robotics`)
Marks the agent Embodied and Eastworld-eligible (a badge shows on its page). No launch-fee impact. Physical onboarding happens post-launch via [app.virtuals.io](https://app.virtuals.io); there's no CLI command for it.
### Examples
```bash
# Disable anti-sniper
acp agent tokenize --chain-id 8453 --symbol MYAGENT --anti-sniper 0
# Pre-buy 100 VIRTUAL of your own token at launch
acp agent tokenize --chain-id 8453 --symbol MYAGENT --prebuy 100
# Capital Formation with a capped pre-buy
acp agent tokenize --chain-id 8453 --symbol MYAGENT --acf --prebuy 50
# 60 Days Experiment + ACF + pre-buy
acp agent tokenize --chain-id 8453 --symbol MYAGENT --60-days --acf --prebuy 50
# Airdrop 2.5% to veVIRTUAL holders
acp agent tokenize --chain-id 8453 --symbol MYAGENT --airdrop-percent 2.5
# Pick every option interactively
acp agent tokenize --configure
```
### Occupy launchpad
```bash
acp agent tokenize --launchpad occupy --symbol MYAGENT \
--quote-token 0xb20000000000000000000078ee7ce2fE4908108C
```
Occupy differs from the Virtuals launchpad in three ways that change what you pass:
* **No launch fee, one transaction.** A single `launch` call mints the token, opens the Uniswap v4 pool and settles any pre-buy. The agent wallet needs no VIRTUAL and no ETH — but it does need a small balance of **USDC, USDT or VIRTUAL to pay the network fee**, which ACP charges in an ERC-20 rather than ETH. An entirely empty wallet is refused with "Not enough balance to cover the network fee".
* **The curve is quoted against a tokenized equity**, not VIRTUAL. `--quote-token` picks it and is **required with no default**, because the choice decides what your agent's token trades against for the rest of its life.
* **A pre-buy is denominated in the quote asset**, so `--prebuy 5` means five units of the quote asset, not five VIRTUAL.
Occupy runs on EVM chains only; Solana launches go through the Virtuals launchpad. `--acf`, `--60-days`, `--airdrop-percent` and `--robotics` are Virtuals-only and are rejected here rather than silently ignored.
The launch is a single irreversible transaction. `--quote-token`, `--name`,
`--pool-fee` and the fee destination are **permanent properties of the token** —
they cannot be changed afterwards, so a value left unconsidered is baked in for
good. `--anti-sniper` only governs the opening seconds, and `--prebuy` is a
one-off purchase; those two you can reason about as launch-day choices.
| Flag | Default | What it does |
| ------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `--quote-token ` | **required, no default** | **Address**, not a ticker — a ticker is rejected. The asset your token's curve is priced against, and therefore what it trades against for life. Addresses in [the table below](#occupy-quote-assets) |
| `--name ` | the agent's name | Token name on-chain. Occupy names the token independently of the agent, which the Virtuals launchpad does not — `--name` is rejected there |
| `--pool-fee ` | `1%` | **The trading fee every buy and sell of your token pays.** **One of 1%, 2% or 3%** — pass `1`, `2`, `3`, or the raw contract unit `10000`, `20000`, `30000`. Nothing in between. Permanent. See [who gets it](#who-gets-the-trading-fee) |
| `--take-fees` | **off** | Pay your 30% creator share of that fee out to the agent wallet. **Off — the default — leaves it in the pool instead** |
| `--anti-sniper <0\|1>` | `1` (60s) | Opening transfer-tax window that discourages sniper bots — `0` off, `1` 60 seconds. The contract would accept `2` (98 min), but Occupy does not offer it and the API rejects it; it is available on the Virtuals launchpad |
| `--no-thicken-liquidity` | — | Alias for `--take-fees`. `thickenLiquidity` is the on-chain name for the same switch |
| `--prebuy ` | none | Buy your own token at launch, denominated in **quote-asset units, not VIRTUAL** — `--prebuy 5` is 5 units of the quote asset. Requires `--quote-token`, and the wallet must hold that much of it |
`--acf`, `--60-days`, `--airdrop-percent` and `--robotics` are Virtuals-only and
are **rejected** on Occupy rather than silently ignored, so a launch carrying
one fails rather than quietly dropping it.
#### Who gets the trading fee
`--pool-fee` sets what every buy and sell of your token pays — 1% by default.
There are **three rates and nothing between them**. Give a percentage and the conversion is done for you; the contract's own unit is hundredths of a bip, where 1% is `10000`:
| Rate | Pass either |
| ------------ | ------------------------ |
| 1% (default) | `1` or `1%` — or `10000` |
| 2% | `2` or `2%` — or `20000` |
| 3% | `3` or `3%` — or `30000` |
`1.5%` is rejected rather than rounded, and `100`, `200`, `1000` are not percentages at all — they fall below the contract's floor. `AssetConfig` would tolerate any value in `10000`–`30000`, but Occupy offers only these three, so the CLI will not put a launch on a rate the launchpad itself does not offer.
The launchpad then splits that fee three ways. You do not choose the split; it is global configuration on `AssetConfig`, not part of your launch:
| Share | Bips | Goes to |
| -------------- | ---- | ----------------------------------------------------------------------------------------------------------------- |
| `creatorBips` | 3000 | **30% — you, the creator** (or the pool, see below) |
| `taxVaultBips` | 4000 | 40% — the quote asset's tax vault, which Occupy's own interface describes as buying more of the underlying ticker |
| `protocolBips` | 3000 | 30% — Virtuals Protocol |
:::warning
**By default you do not receive your 30% — it stays in the pool.** `--take-fees` is off unless you pass it, and off means your creator cut is left in the pool as permanent liquidity rather than paid out. Pass `--take-fees` to have it paid to the agent wallet as trades happen. This is a permanent choice made at launch, so decide it deliberately rather than taking the default.
:::
Deeper liquidity is a real benefit — it means less price impact on every trade for the life of the token — which is why it is the default. But it is a choice between *your* revenue and *the token's* depth, and it cannot be changed afterwards.
```bash
# Default — your cut deepens the pool
acp agent tokenize --launchpad occupy --symbol MYTOKEN \
--quote-token 0xb20000000000000000000078ee7ce2fE4908108C
# Take your 30% instead, paid to the agent wallet as it accrues
acp agent tokenize --launchpad occupy --symbol MYTOKEN \
--quote-token 0xb20000000000000000000078ee7ce2fE4908108C --take-fees
```
#### Occupy quote assets
These are the assets an Occupy curve can be priced against on **Base (`8453`)**. **WETH, USDC and VIRTUAL are not allow-listed** — an Occupy token trades against a stock, not against a stablecoin or VIRTUAL.
| Symbol | Name | Address | Decimals |
| -------- | ------------------------------------ | -------------------------------------------- | -------- |
| `NVDAc` | NVIDIA Corporation | `0xb20000000000000000000078ee7ce2fE4908108C` | 8 |
| `AAPLc` | Apple Inc. | `0xb200000000000000000000C2e324d24d7eEcd1fb` | 8 |
| `MSFTc` | Microsoft Corporation | `0xB200000000000000000000Ab99cFa739E253872B` | 8 |
| `GOOGLc` | Alphabet Inc. | `0xb2000000000000000000002D0BA3164cc74f58B7` | 8 |
| `AMZNc` | Amazon.com Inc. | `0xb200000000000000000000d9192b6B456483C2E8` | 8 |
| `METAc` | Meta Platforms Inc. | `0xb2000000000000000000008bC8786B856E61707C` | 8 |
| `TSLAc` | Tesla Inc. | `0xb2000000000000000000001e800a7f5189430cD0` | 8 |
| `MSTRc` | Strategy Inc. | `0xb2000000000000000000004884b426556b92883d` | 8 |
| `SNDKc` | Sandisk Corporation | `0xb200000000000000000000397293Cb8cda9a10c5` | 8 |
| `SPCXc` | Space Exploration Technologies Corp. | `0xb2000000000000000000007b9fcbd005511aCBd5` | 8 |
| `wtFGI` | Wrapped FGI Industries Ltd. ST0x | `0x6aed8b1aCfb04F4e0e6db580F12fF41438a394e5` | 18 |
:::warning
**`--quote-token` takes an address, not a ticker.** There is no command that lists these — the table above is the source of truth. The allow-list lives on the `AssetConfig` contract, which exposes a point lookup and no enumeration, so listing it would mean an archive-depth scan of contract logs that public RPCs refuse to serve. It is published here instead. Copy the address from the table.
:::
Decimals differ per asset — the share tokens are 8-decimal, `wtFGI` is 18 — and a pre-buy is converted against the quote asset's own decimals. The CLI reads them off the token, so you never pass them; they are listed here so a pre-buy amount is legible before you send it.
The ticker you want may not be the allow-listed symbol: FGI Industries is listed as **`wtFGI`** (a wrapped ST0x share token), not `FGI`. Match on the table, not on the equity's stock ticker.
Nothing here is taken on trust. When you launch, the backend reads `AssetConfig.assetConfigs()` on chain and rejects anything that is not currently allowed — so a stale row in this table fails your launch with a clear message rather than pricing your curve against the wrong asset. You can make the same check yourself against `AssetConfig` at `0xDd0558558415d9c67eDBCA5e1991997CD9902632` on Base.
If an asset is missing here, [open an issue](https://github.com/Virtual-Protocol/acp-cli/issues) — the list is curated and changes rarely, but it is maintained by hand.
#### Occupy examples
```bash
# Curve priced against NVIDIA
acp agent tokenize --launchpad occupy --symbol MYAGENT \
--quote-token 0xb20000000000000000000078ee7ce2fE4908108C
# Distinct token name, anti-sniper off
acp agent tokenize --launchpad occupy --symbol MYAGENT --name "My Token" \
--quote-token 0xb2000000000000000000001e800a7f5189430cD0 --anti-sniper 0
# Pre-buy 5 shares' worth of the quote asset at launch
acp agent tokenize --launchpad occupy --symbol MYAGENT \
--quote-token 0xb20000000000000000000078ee7ce2fE4908108C --prebuy 5
```
### Verify
```bash
acp agent whoami --json
# → per-chain tokenization status, including tokenAddress once live
```
### Supported chains
```bash
acp chain list --json
# → {"environment":"mainnet"|"testnet","chains":[{"id":8453,"name":"Base"},{"id":4663,"name":"Robinhood Chain"}, …]}
```
| Chain | ID |
| ----------------------- | ------- |
| Base Mainnet | `8453` |
| Robinhood Chain | `4663` |
| Base Sepolia (testnet) | `84532` |
| BNB Smart Chain Testnet | `97` |
| Robinhood Chain Testnet | `46630` |
### Next
* [Trading](/trading) — trade the token and route fees to the wallet.
* [Agent Wallet](/agent-identity/wallet/overview) — where the launch fee is paid from and revenue lands.
## Email CLI Reference
All Agent Email commands are under `acp email` and operate on your active agent.
### Identity
#### Provision Email Identity
```bash
acp email provision --display-name "James Riley"
```
| Flag | Required | Description |
| ---------------- | -------- | ------------------ |
| `--display-name` | Yes | Agent display name |
#### Show Email Identity
```bash
acp email whoami --json
```
Returns the provisioned email address and status.
### Compose & Reply
#### Compose New Email
```bash
acp email compose \
--to "recipient@example.com" \
--subject "Hello" \
--body "Plain text body"
```
| Flag | Required | Description |
| ------------- | -------- | -------------------------------------------- |
| `--to` | Yes | Recipient email address |
| `--subject` | Yes | Email subject |
| `--body` | Yes | Plain text body |
| `--html-body` | No | HTML alternative (sent alongside plain text) |
#### Reply to Thread
```bash
acp email reply --thread-id --body "Reply text"
```
| Flag | Required | Description |
| ------------- | -------- | --------------------- |
| `--thread-id` | Yes | Thread to reply to |
| `--body` | Yes | Plain text reply body |
| `--html-body` | No | HTML alternative |
No recipient is specified — the reply is sent to the latest inbound sender.
### Inbox & Threads
#### List Inbox
```bash
acp email inbox --json
acp email inbox --folder spam --limit 10 --json
```
| Flag | Default | Description |
| ---------- | ------- | ------------------------------------------ |
| `--folder` | `inbox` | `inbox`, `spam`, or `all` |
| `--cursor` | — | Pagination cursor returned as `nextCursor` |
| `--limit` | 20 | 1–100 |
#### View Thread
```bash
acp email thread --thread-id --json
```
Returns all messages in thread ordered chronologically.
### Search
```bash
acp email search --query "invoice" --json
```
| Flag | Required | Description |
| --------- | -------- | ------------ |
| `--query` | Yes | Search query |
### Content Extraction
#### Extract OTP Codes
```bash
acp email extract-otp --message-id --json
```
Returns `{ otp: string | null }` — the detected OTP, or `null` if none was found.
#### Extract Links
```bash
acp email extract-links --message-id --json
```
Returns `{ links: Array<{ url, text, category }> }` — each link categorized as `verification`, `unsubscribe`, `action`, or `other`.
### Attachments
#### Download Attachment
```bash
acp email attachment --attachment-id --output ./downloads
```
| Flag | Required | Description |
| ----------------- | -------- | -------------------------------------- |
| `--attachment-id` | Yes | Attachment ID (from a thread response) |
| `--output` | No | Output directory (default: `.`) |
Two-step under the hood: the CLI first hits `GET /agents/:id/email/attachments/:attachmentId` for metadata (filename, MIME, size), then `GET /agents/:id/email/attachments/:attachmentId/download` for the binary. Bytes stream straight to `