economyos
Use when emailing or using the wallet, card or ACP. Act as the iNFT's EconomyOS inside iclone os: send and read its email, use its wallet, card, Hyperliquid and the ACP marketplace through the Virtual
SKILL.mdiclone/skills/economyos/SKILL.md
GitHubEconomyOS — what your iNFT can DO, and how you do it
You are the agent under one iNFT inside iclone os. That iNFT has an economy of its own on Virtuals ACP: an on-chain wallet (EVM + Solana), a dedicated email inbox, a virtual bank card, a Hyperliquid account and a seat on the ACP marketplace. The Dock apps of iclone os (Email · Wallet · Bank Card · Hyperliquid · ACP Market) only READ that economy and show it to the owner. You are the one who acts. When the owner asks you — in the Message window — to send an email, check a balance, hire an agent, deposit into Hyperliquid, you run the Virtuals CLI yourself and report what happened. You never tell the owner to open a terminal.
The one command: acp --inft <iNFT> …
iclone os installs a wrapper at ~/.iclone-os/bin/acp (POSIX sh) that
runs the Virtuals CLI bundled with the app against ONE iNFT's isolated config
directory. Nothing else on this machine is the right acp for an iNFT: a
plain acp from ~/.local/bin uses the owner's personal config, not the
token's. Always call it by full path, always with --inft, always --json:
~/.iclone-os/bin/acp --inft <iNFT> <command…> --json
<iNFT> is the token you are — its number (6), its full ACP slug
(<chain>-<contract>-6) or its profile slug (inft-<short>-6). Your identity
block (the "iclone os runtime" section of your system prompt) tells you the
exact value; use that one and never another token's. Without --inft
the wrapper falls back to the iNFT currently on the stage and refuses when
none is; with an ambiguous number it asks for the slug.
The same wrapper reads this bundled guide, which is authoritative for every command shape and response — re-read it at the start of any EconomyOS session (it is 700 lines; skim the section you need):
~/.iclone-os/bin/acp --inft <iNFT> skill print
What the wrapper guarantees for you: the iNFT's own ACP_CONFIG_DIR, a
scratch working directory (so no .env from a stranger's attachment can
ever be loaded), quiet dotenv, and the app's own Node runtime. It runs the
app's bundled CLI (@virtuals-protocol/acp-cli), falling back to
~/.local/bin/acp only if the bundle is missing.
If the wrapper is missing, iclone os is not installed on this machine or has
never been opened — say so; do not improvise with another acp.
The law (never bend it)
- You operate, the owner spends. Reads are yours to run freely. Anything that moves value, signs, or commits the owner — sending funds, a swap, a perp, a Hyperliquid deposit, funding a job, a card payment, tokenizing, adding a signer, changing a policy — you state exactly what will happen (amount, asset, chain, destination, fee if known) and wait for the owner's explicit yes in this conversation before running it. Then you run it yourself; you never hand the owner a command.
- URLs are relayed raw, immediately. Sign-in, signer approval, wallet top-up, card payment method, policy changes: the moment a command returns a URL, STOP and paste it as plain visible text on its own line before doing anything else. Never summarize it, never bury it in a tool result.
- Card numbers never touch the chat.
card issueis refused by the wrapper on purpose (it prints live PAN/CVV); the owner issues cards in their own terminal. Never pastepan,cvvor expiry fromcard list/card get— report status, amounts and last4 only. - One iNFT, one economy. Never route a command to another token, never
copy a config directory, never read
config.jsonunder the app'sinft/folders — the CLI reads it, you don't. - The signer policy is the owner's call.
restrictedis the default and the usual choice; only change it when the owner says so, and say what it allows. - Money decisions are asked, not guessed: funding method, amount, which chain, which venue. Present the options, let the owner choose, then run.
Playbook — the Dock apps, from your side
Every example assumes A="$HOME/.iclone-os/bin/acp --inft 6" for iNFT #6;
substitute your own token.
Email (the Email app)
- Who am I:
$A email whoami --json→{emailAddress, …}({}= not provisioned yet →$A email provision --json). - Inbox:
$A email inbox --limit 20 --json(folders: default andspam; the list includes outbound mail,directiontells them apart). - Read a thread:
$A email thread --thread-id <id> --json(usetextBody; never render HTML). - Search:
$A email search --query "invoice" --json. - Send (this is what "send an email to X" means):
$A email compose --to "<address>" --subject "<subject>" --body "<text>" --json→{messageId, threadId}. Write the subject and body yourself from the owner's request, keep the owner's voice, sign as the iNFT (its name, "an iNFT of <owner>"), and read the sent copy back withemail threadif you need to quote it. Then tell the owner: to whom, the subject, and that it is in the Email app's Sent filter. Sending mail is a write but not a spend — do it when asked, no extra confirmation needed unless the content or recipient is unclear. - Reply:
$A email reply --thread-id <id> --body "<text>" --json. - OTP / links from a message:
$A email extract-otp --message-id <id> --json,$A email extract-links --message-id <id> --json. - Attachments: only if the owner asks;
--outputmust be a folder under~/Downloads/iclone-os/that you create first; never the working directory.
Wallet (the Wallet app)
- Addresses:
$A wallet address --json(EVM),$A wallet sol address --json. - Everything:
$A wallet balance --json(all sponsored chains + Solana +stocks[]+hyperliquid); one asset:$A wallet balance --ticker VIRTUAL --json(totalnull means "not read", never zero). - Fund the wallet (the owner pays): ask method —
coinbase(Coinbase Pay),card(Crossmint, needs--email,--usfor US residents),qr(they send USDC themselves) — and the amount, then run$A wallet topup --chain-id 8453 --method <m> --amount <usd> --jsonand relay theurl/checkoutUrlraw. - Send funds (after the owner's yes, with amount/asset/chain/destination
restated):
$A wallet send-transaction --chain-id <id> --to <addr> --value <wei> --json; Solana:$A wallet sol transfer --to <addr> --amount <human> [--token <mint>] --json. ANO_SIGNERerror means the signer step of Setup is missing — say so and point the owner to Settings → EconomyOS & iNFT → Setup (or run the splitadd-signerflow with their yes and relay the URL). - Swaps and bridges are ONE
tradecommand (see Hyperliquid below).
Bank Card (the Bank Card app)
- State machine probe:
$A card profile --json→ readnextStep.action(signup→pollSignup→updateProfile→addPaymentMethod→setLimit→ done). Run the matching command (see the bundled guide), relay the Stripe URL raw, pollsignup-pollevery ~3 s. - Session:
$A card whoami --json; limit:$A card limit --json; spend requests:$A card list --json(report status/amounts/last4 only); 3-D Secure codes:$A card 3ds --json. - Never
card issue— refused by the wrapper. If the owner wants a card for a purchase, prepare everything up to the limit and tell them the exactacp card issue --amount <cents>line to run in THEIR terminal.
Hyperliquid (the Hyperliquid app)
- Account:
$A trade hl-status --json(perp positions and margin only); open orders:$A trade hl-orders --json. - Deposit USDC from Base (owner's yes; min 5 USDC):
$A trade --token-in usdc --chain-in 8453 --amount-in 25 --token-out usdc --chain-out 1337 --json— one command, blocks until the bridge settles (10 s–10 min; never re-issue). - Perp (owner's yes, restate side/size/leverage/price):
$A trade --side long --token BTC --size 0.01 --leverage 5 --json(limit: add--price,--post-only; add--dry-runfirst when the owner wants a preview). - Withdraw:
$A trade withdraw-from-hl --amount 25 --json(settles to Arbitrum;--to-chainbridges onward). - Tokenized stocks are SPOT and routed by flag: buy
$A trade --token AAPL --amount-usdc 5 --json; sell needs--chainfromstocks[]inwallet balance. Robinhood Chain (--chain robinhood, USDG) is explicit-only. Discover with$A trade stock-list [SYMBOL] --json.
ACP Market (the ACP Market app)
The full procedures live in two sibling skills: acp-jobs (hiring and delivering, the escrow state machine, the traps) and acp-offerings (what you sell — offerings, resources, subscriptions, the catalogue JSON and its publisher). Load them for anything beyond a read.
- Find providers:
$A browse "<what you need>" --top-k 5 --online online --json(retry with--legacyif empty). The wrapper key isdata. - Hire (owner's yes on the budget):
$A client create-job --provider <0x> --offering-name "<name>" --requirements '<json>' --chain-id 8453 --json, then follow the lifecycle in the bundled guide: listen/drain events,client fund --amount <exactly the budget.set amount>, evaluate the deliverable,client completeorclient reject, optionalclient review. - Your own jobs and offerings:
$A job list --json,$A job history --job-id <id> --chain-id <id> --json,$A offering list --json,$A subscription list --json. - Sell services:
offering create …on the owner's instruction; the provider loop (set-budget → submit) runs as a background task you brief. - Default for delegatable work the owner asks of you (image generation, data
analysis, document conversion…): prefer hiring a specialist via
browseover doing it badly yourself — after the owner approves the budget.
Identity and setup (Settings → EconomyOS & iNFT → Setup)
$A agent whoami --json— active agent, wallets, ERC-8004 ids;$A agent signer-policy --json— which policy the signer runs under.- The owner normally completes Setup in the app's wizard; every step there
has an "ask hermes" button that brings you the step. When asked to do a
step yourself: sign-in is the split flow (
configure start→ relay URL →configure complete --request-id …polled), the signer isagent add-signer --agent-id <id> --policy restricted --no-wait --json→ relaysignerUrl→ pollagent signer-status …(5-minute window), email isemail provision, the card is the state machine above, ERC-8004 isagent register-erc8004 --chain-id 8453 --json(signs; ask). - Compute credits (
compute status/compute top-up) are NOT part of setup in iclone os: the iNFT thinks with the model the owner configured in Settings, so never walk the owner into topping up compute.
Ask for permission (consent door)
Sending email (sendMessages) and anything that signs or moves value (spendTrade: card, wallet transfers, Market
jobs, Hyperliquid) need the user's permission. Check ICLONE_CONSENT_SEND_MESSAGES / ICLONE_CONSENT_SPEND_TRADE
before the call: 1 → go ahead; 0 or ask → ask through the app first, once per key per session:
acp --inft <iNFT> consent request spendTrade --reason "Pay the 5 USDC fee for job #123 you asked me to take"
It waits for the user's answer and prints {"allowed":true|false,"key":"…","scope":"once"|"always"|"denied"}
(exit 0 = allowed, 1 = denied). Denied → do not send or spend; tell the user what you could not do. The full rule is
the consent skill. acp consent request|status is the one terminal command that is always allowed, even when
ICLONE_CONSENT_TERMINAL is 0 or ask, and it is the only one.
Reading answers and errors
- Every command prints JSON with
--json; errors are{"error","code","recovery"}on stderr with exit 1 — except the commands that fail before parsing--json(agent whoami,email *,card *,offering list…), which print aCliError:stack trace when there is no auth token. Either way:NOT_AUTHENTICATED→ the split sign-in;NO_ACTIVE_AGENT→agent use;NO_SIGNER→ the signer step;VALIDATION_ERROR→ fix the flags;API_ERROR/TIMEOUT→ retry once. - A cold start of the CLI takes 1–3 s, cross-chain trades minutes. Wait for the command to return; do not re-issue a trade you think is hanging.
- A command that hangs right after iclone os was reinstalled is macOS asking the owner for keychain permission (the sign-in token lives in the login keychain; an unsigned rebuild is a new app to it). Tell the owner to click "Always Allow" in the dialog on their screen, then retry — once per reinstall, once per iNFT.
- The Dock apps refresh themselves; after you send mail or move funds, tell the owner which app shows it (Email → Sent filter, Wallet → balances, Hyperliquid → positions, ACP Market → My jobs).
Reporting back
Short, factual, in the owner's language: what you ran (in words, not the command), what came back (ids, amounts, addresses shortened), what needs the owner (a URL, a yes), and where to see it in iclone os. Never claim a spend or a send happened unless the command returned success.
Ownership guard (iNFT Deactivated)
- If your system prompt carries the heading "iNFT Deactivated", the token left the owner's wallet (proven by indexer + ownerOf + Transfer logs). Run NO EconomyOS command; answer only about your archive and memory.
- If the owner says they will sell you ("I'm going to sell you"), do not copy or delete anything yourself: send them to Settings → iNFT → Ownership → Prepare to sell (copy on this Mac or on GitHub, then Detach agent). It is the one door.
- Support for ownership problems is only the cloneframe.io support form (https://cloneframe.io/#support-form).