caw CLI lets you manage wallets, addresses, transactions, delegations, policies, and agents from the terminal.
Global options
These options are available on every command.Config file
The CLI stores configuration in~/.cobo-agentic-wallet/ (JSON format). The config file tracks the active profile; per-agent credentials (API key, API URL, wallet UUID) are stored under profiles/profile_<agent_id>/credentials.
Most commands that accept a wallet UUID as a positional argument will fall back to the wallet_uuid from the active profile’s credentials if the argument is omitted.
Output format
All commands output JSON to stdout:Error output
Policy denials are written to stderr with structured context and a non-zero exit code:caw update
Download and install a caw CLI binary from the official download server.
Fetches the binary, verifies its checksum, and replaces the current binary
in-place. —version is required. Use —check to verify a version is available
without installing.
caw version
Print the current version of the caw CLI binary.
caw wallet
Manage Cobo Agentic Wallet wallets and perform on-chain operations.
Local wallet commands (list, current) operate on credentials stored on this
machine. Platform commands (get, balance, rename, archive, pair) call the Cobo
Agentic Wallet service and require an active wallet with valid credentials.
Run ‘caw wallet —help’ for a full list of subcommands.
list
List all wallets stored on this machine. Each wallet corresponds to one
Cobo Agentic Wallet and holds the credentials and metadata needed to call the
Cobo Agentic Wallet service. The active wallet is marked with ‘active’: true.
current
Without —wallet-uuid: shows the currently active wallet.
With —wallet-uuid: switches the active wallet to the given one.
—wallet-uuid is the UUID of the wallet to switch to; obtain it from ‘caw wallet list’.
get
Get details for the active wallet on the Cobo platform.
balance
List all token balances for the active wallet. Optionally filter by
—token-id, —chain-id, or —address to narrow the results.
rename
Rename the active wallet on the Cobo platform.
pair
Initiate pairing and obtain a one-time pairing token (8-digit code) for the
user to enter in the Cobo Agentic Wallet app. Share the code with the user through a
secure channel. Use caw wallet pair-status to monitor whether the user has
completed pairing. To verify pairing completion at any time, run caw status
and check the wallet_paired boolean.
pair-status
Check whether the user has completed the wallet ownership pairing initiated
by caw wallet pair.
archive
Archive a wallet locally. Archived wallets are hidden from ‘caw wallet list’
but no server-side changes are made. Use —list to view all archived wallets,
or —rollback with a wallet UUID to restore one.
caw tx
Manage on-chain transactions for a wallet.
Subcommands let you transfer tokens, submit contract calls, sign messages,
estimate fees, and manage in-flight transactions via cancel (drop) or
replace-by-fee (speedup). All mutating operations are evaluated against
active policies before submission.
transfer
Transfer tokens from a wallet to a destination address.
The transfer is evaluated against all active policies before submission. If a
policy denies the transfer, the command exits non-zero and writes structured
denial details to stderr. If a policy requires manual approval, the transfer is
queued as a pending operation.
Pass —request-id as an idempotency key — retrying with the same value returns
the existing record without re-submitting.
call
Submit a smart contract call from a wallet.
For EVM chains (e.g. SETH, BASE_ETH), provide —contract and —calldata.
EVM addresses must be exactly 42 characters (0x + 40 hex digits).
For Solana (SOL), provide —instructions as a JSON array of SolInstruction
objects and optionally —address-lookup-tables.
Solana addresses must be 43–44 characters (Base58).
The call is evaluated against active policies before submission.
list
List transaction records for the active wallet, newest first.
Filterable by —status, —token-id, —chain-id, —address, and —type.
get
Retrieve the full details of a single transaction record.
Provide either —tx-id (the record UUID from caw tx list or submit response) or
—request-id (the same request_id you passed on the submit call). The wallet is
taken from your active wallet (use ‘caw wallet current’ to check).
The response includes status, amounts, fees, and any policy evaluation results.
estimate-transfer-fee
Estimate the network fee for a token transfer without submitting it and
without running policy checks.
Provide the same flags you intend to use for caw tx transfer. The response
includes the estimated fee amount and the token used to pay it.
estimate-call-fee
Estimate the network fee for a contract call without submitting it.
Provide the same flags you intend to use for caw tx call. —context,
—request-id, —description, and —gasless are not applicable for estimation.
The response includes the estimated fee and the native token used to pay it.
drop
Cancel a transaction that has not yet been confirmed on-chain.
Pre-broadcast transactions (pending screening, authorization, or signature) are
cancelled directly without a fee.
Broadcasting transactions use Replace-By-Fee (RBF): a zero-value replacement is
submitted to the same nonce with a higher fee. The fee is derived automatically
from the original transaction’s recorded fee bumped by —fee-multiplier (default +15%).
—tx-id is the UUID of the transaction to cancel; obtain it from
‘caw tx list’ or the submit response.
speedup
Resubmit a broadcasting transaction to the same nonce with a higher fee (RBF).
The replacement fee is derived automatically from the original transaction’s
recorded fee bumped by —fee-multiplier (default +15%).
Only transactions in the ‘broadcasting’ sub-status can be sped up.
—tx-id is the UUID of the transaction to speed up; obtain it from
‘caw tx list’ or the submit response.
sign-message
Sign a message using a wallet address.
—pact-id is the pact that scopes the signing key and wallet; obtain it from
‘caw pact list’ or a pact submit response.
caw address
Manage on-chain addresses associated with your Cobo Agentic Wallet.
Use the subcommands to list existing addresses or generate new ones for a
specific wallet and chain.
list
List all on-chain addresses associated with the active wallet. Run this
before creating a new address to check whether one already exists for
a given chain. Use ‘caw wallet current’ to check which wallet is active.
create
Generate a new on-chain address for the active wallet on the specified
chain. The response includes a compatible_chains field listing all chain
IDs that share this address (e.g. all EVM chains share one address).
caw meta
Query metadata about supported blockchains, tokens, and current
market prices.
Subcommands:
chains
List all blockchains supported by Cobo for a given wallet type. Results are
paginated.
chain-info
Retrieve detailed information about a specific blockchain by its chain ID.
—chain-id is the Cobo chain identifier, e.g. SETH or BASE_ETH. Use
‘caw meta chains’ to list all supported chain IDs.
tokens
List all token IDs and their metadata supported by Cobo for a given wallet
type. Results are paginated.
search-tokens
Search for token candidates matching a symbol and return matching token IDs
and their metadata across supported chains.
prices
Get current market prices for one or more Cobo asset coins.
—asset-coins is a comma-separated list of Cobo asset coin IDs, e.g. BTC,ETH.
Use ‘caw meta tokens’ to discover supported IDs.
caw faucet
Interact with the Cobo testnet faucet to obtain tokens for development and testing.
Use the tokens subcommand to browse available testnet tokens, then use the deposit
subcommand to request a specific token be sent to an on-chain address.
tokens
List all testnet tokens currently available from the Cobo faucet.
The returned token IDs can be passed to —token-id when running caw faucet deposit
to request a specific token be sent to an address.
deposit
Request a testnet token deposit from the Cobo faucet to an on-chain address.
Example:
caw pending
Manage pending operations that are awaiting approval under your wallet
policies. Pending operations are created automatically when a transaction or
other action requires human or policy approval before it can execute.
Use the subcommands to list, inspect, approve, or reject pending operations.
list
List pending operations that are waiting for approval or are currently
executing. Results are paginated.
get
Retrieve full details of a single pending operation. The response includes
the operation type, current status, policy context, and any available result
payload.
—operation-id is the ID of the pending operation to retrieve; obtain IDs from
‘caw pending list’.
approve
Approve a pending operation, allowing it to proceed to execution. This
action is irreversible — once approved, the operation will begin executing
immediately if all other policy conditions are satisfied.
—operation-id is the ID of the pending operation to approve; obtain IDs from
‘caw pending list’.
reject
Reject a pending operation, preventing it from executing. This action is
irreversible.
—operation-id is the ID of the pending operation to reject; obtain IDs from
‘caw pending list’.
caw node
Manage the local TSS Node process used for threshold signature scheme
operations. Subcommands let you start, stop, restart, and inspect the node,
view its logs, run health checks, and query its status both locally and via
the Cobo API.
status
Show TSS Node status.
Without —scope, returns both local process info and remote API status.
—scope local: show only the local process state (PID, running, binary path)
—scope remote: query only the remote API for the node’s online status
info
Show installation metadata for the local TSS Node. Reports the TSS
directory, binary path, whether the binary and secrets database exist, and the
configured environment (dev or prod). If both the binary and database are
present, the node ID is also retrieved by running the node’s own info
subcommand.
health
Run a suite of health checks on the local TSS Node installation. Verifies
that the binary, secrets database, config file, and key file all exist, that
the key file has permissions 600, and that the node process is currently
running. The node ID is included in the output when the binary and database
are present. Exits with a non-zero status code if any check fails, making
this command suitable for use in scripts and monitors.
start
Start the TSS Node process as a background daemon. If the node is already
running, this command reports its PID and exits without starting a second
instance. The process is launched with a new session (detached from the
terminal), its PID is written to a file for later management, and output is
appended to the log file shown in the result. The command polls briefly to
confirm the process stays alive during startup and returns an error with
recent log output if it exits immediately.
stop
Stop the running TSS Node process. Before stopping, the command checks
whether there are any pending transactions in the configured wallet and refuses
to stop if any are found, to avoid interrupting in-flight signing. The process
receives SIGTERM and is given up to five seconds to exit gracefully before
SIGKILL is sent. The PID file is removed on success.
restart
Restart the TSS Node process. If the node is currently running, it is
stopped gracefully (SIGTERM, then SIGKILL after a timeout) before the new
instance is launched. If the node is not running, it is started directly.
The result includes the new PID and the path to the log file.
logs
View the TSS Node log file. By default, the last 50 lines are printed.
The command exits with an error if no log file exists yet.
caw onboard
Interactive onboarding (default): collects input via prompts while wallet
KeyGen runs in the background. Re-run until wallet_status is active; JSON
output includes prompts for agents to fill in.
bootstrap
Run the MPC wallet bootstrap sequence as a detached background worker.
This command is spawned automatically by caw onboard after provisioning and is
not intended to be called directly. It prepares the TSS cache, waits for the
prime-generation step to complete, creates the MPC wallet record via the Cobo
Agentic Wallet API, and writes the resulting wallet UUID back to the wallet
state file so that subsequent caw onboard poll calls can detect activation.
health
Check whether the Cobo Agentic Wallet backend API is reachable. Does not
require authentication. Useful for verifying network access or environment
configuration before running other commands.
self-test
Run two test transfers against the configured wallet to verify that policies
are working correctly: one transfer that should be blocked by policy, and one
that should be allowed. Exits non-zero if either test produces an unexpected
result.
caw fetch
Perform an HTTP request and automatically handle 402 Payment Required
responses using the x402 or MPP machine-payment protocols.
<pact-id> is the pact UUID used to resolve the paying wallet and the
pact-scoped API key (same behavior as ‘caw tx transfer <pact-id>’). <url> is
the endpoint to fetch. When a 402 is received, caw detects the payment
protocol from the response headers (unless overridden), pays using the wallet
bound to the pact, and retries the request with the payment headers.
Example:
caw payment
Manage Cobo payment features including MPP (Merchant Payment Protocol) sessions and payment gateway configuration.
Use the session subcommand to inspect and manage active or historical payment sessions, and the gateway subcommand to configure payment gateway settings for the active wallet.
session
Manage Micropayment Protocol (MPP) payment sessions. Subcommands let
you list active sessions, close individual or all sessions, and withdraw
deposited funds after a channel is closed on-chain.
list
List currently active MPP payment sessions stored locally. By default only
sessions in active state are shown.
close
Close a single active MPP payment session. By default the session is closed
via protocol negotiation with the relay server. Use —force to bypass the
relay server and submit an on-chain requestClose transaction directly; after a
force-close there is a 15-minute grace period before you can reclaim funds
with ‘caw payment session withdraw’.
The session is closed under the pact that originally opened it (persisted in
active.json). Pass —pact-id to override when that pact has been rotated or
revoked, or to recover a session opened by an older CLI that did not persist
the pact id.
close-all
Close every active MPP payment session found in the local sessions
directory. Each session is closed via protocol negotiation with the relay
server by default. Use —force to bypass the relay server and submit an
on-chain requestClose for all sessions instead.
Each session is closed under the pact that originally opened it. Sessions
that have no persisted pact_id (opened by older CLIs) are skipped unless
—pact-id is provided to apply the same pact to every session. A summary of
closed, close-requested, failed, and skipped sessions is printed on completion.
withdraw
Reclaim deposited funds from an MPP channel that has been closed on-chain
and whose grace period has expired. The session must be in ‘close_requested’
status; use ‘caw payment session close —force’ to initiate an on-chain close
if it is not.
The withdraw is signed under the pact that opened the session. Pass
—pact-id to override when that pact has been rotated, or to recover a
session opened by an older CLI.
gateway
Start a local HTTP proxy that intercepts outgoing requests and automatically
handles payment challenges using the x402 or MPP protocol.
<pact-id> is the pact UUID used to resolve the paying wallet and the
pact-scoped API key (same behavior as ‘caw tx transfer <pact-id>’). All
payments signed by the gateway are authorized under that pact.
Two proxy modes are available. In forward mode the proxy accepts plain HTTP
requests whose URL contains the full target address. In MITM mode the proxy
intercepts HTTPS traffic by acting as a transparent TLS terminator; a CA
certificate is generated on first run and must be trusted by the HTTP client.
Example:
caw export-key
Exports the wallet’s MPC private key through a secure MPC reshare and
local reconstruction, writing derived private keys to a CSV file.
The first invocation creates an export request and prints an authorization URL
that the wallet owner must approve in the Cobo Agentic Wallet app. Re-run the command
after approval; it will detect the approved state, spin up two temporary TSS
recovery nodes, perform the reshare, reconstruct the root private key, derive
keys for all wallet addresses, and write the result to —output-dir.
- —wallet: specify the wallet UUID (from caw wallet list); omit to use the active profile default
- —output-dir: control where the CSV is written; defaults to the profile directory
caw status
Show a compact wallet snapshot: whether the backend is reachable (healthy),
the current wallet lifecycle state (wallet_status, e.g. active or pending),
whether ownership pairing has been completed (wallet_paired boolean),
active pact count, and pending transaction count.
caw util
Utility commands for encoding, decoding, and inspecting data used in
transactions. Intended for development and debugging.
Subcommands:
- abi: ABI encode and decode EVM calldata, and compute function selectors.
- base64: Base64 encode and decode strings.
abi
ABI encoding and decoding utilities for EVM smart-contract calldata.
Subcommands:
- encode: Encode a function call into hex calldata.
- decode: Decode hex calldata back into function name and arguments.
encode
Encode a function call into hex calldata for use with caw tx call —calldata.
Pass numeric arguments as decimal strings (e.g. “1000000”), not raw integers.
Tuple arguments must be encoded as nested JSON arrays.
Token amounts must always be in the token’s smallest unit (e.g. 0.001 WETH = 1000000000000000).
Always verify the result with caw util abi decode before submitting.
Examples:
decode
Decode hex calldata back into function name and arguments, or decode
an eth_call return value using —output-types.
Examples:
selector
Compute the 4-byte function selector from a function signature.
Examples:
call
Send a raw eth_call to an EVM contract and return the hex result.
Use this when you already have ABI-encoded calldata. For a higher-level
command that handles encoding and decoding automatically, use ‘caw util eth-call’.
Example:
base64
Encode and decode data in base64 format.
Use the encode subcommand to convert hex bytes, raw strings, or stdin to a
base64 string. Use the decode subcommand to recover the original bytes from a
base64 string, with output as hex or raw text. Both subcommands support
standard and URL-safe base64 variants via —url.
encode
Encode hex, raw string, or stdin to base64.
Examples:
decode
Decode a base64 string and output as hex or raw.
Examples:
eth-call
Read on-chain contract state by calling a view function: encodes calldata,
calls the contract via eth_call, and decodes the return value automatically.
Use —abi erc20 to query standard ERC-20 methods (name, symbol, decimals,
balanceOf, allowance) without writing a full ABI. —args is a JSON array of
positional arguments; omit for zero-argument methods.
For raw eth_call without encoding/decoding, use ‘caw util abi call’.
Examples:
caw pact
Manage pacts — delegated access agreements that grant an operator agent
permission to act on a wallet owner’s behalf within defined policy limits.
Use submit to request a new pact, status or show to inspect one, and revoke to
terminate an active pact.
list
List pacts accessible to the authenticated principal. Defaults to —status active.
Filter by —status (e.g. pending_approval, completed, expired, revoked) to see other states. Results are paginated.
status
Fetch the current status of a pact by its ID, triggering lazy activation
if the pact is ready to become active.
—pact-id is returned when you run ‘caw pact submit’, or found via ‘caw pact
list’.
show
Show the full detail of a pact, including its spec, status, policies, and
completion conditions.
—pact-id is returned when you run ‘caw pact submit’, or found via ‘caw pact
list’.
events
List all lifecycle events recorded for a pact in chronological order.
Events capture state transitions such as submission, approval, activation,
and revocation.
—pact-id is returned when you run ‘caw pact submit’, or found via ‘caw pact
list’.
submit
Submit a new pact request. A pact grants an agent delegated access to the wallet, scoped by policies (spending caps, chain/token filters, address constraints, approval thresholds) and completion conditions (transaction count, amount spent, or elapsed time) that automatically terminate the delegation when reached.
caw pact submit Flag Reference
Translate the user’s request into caw pact submit flags. Each row maps one aspect of the user’s intent to the corresponding flag and describes how to derive the value.
Least privilege: Default to the narrowest scope — shortest duration, tightest token/chain/contract allowlist, and lowest spend cap that fulfills the user’s intent. Only widen when the user explicitly asks.
Complete Example
User request: “Help me transfer 1000 USDC to 0xABC…123 on Base”
- # Summary — one-line goal
- # Operations — concrete calls/transfers (token, amount, target contract)
- # Risk Controls — per-tx cap, daily cap, etc
Multiple conditions can be set; the pact completes when any one is satisfied (any-of semantics). Once complete, the pact is revoked immediately and no further operations can be executed under it.
Policy Reference (—policies)
Policies constrain operations within a pact via the —policies flag. Each policy targets a specific operation type (transfer, contract_call, or message_sign) and always uses allow effect. Default-deny semantics apply: any operation not matching the when conditions of at least one policy is automatically denied — no implicit pass-through. Always define policies that explicitly cover every operation the agent needs to perform.
Policy Structure
Allowlist Conditions (when)
For transfer policies:
For contract_call policies (EVM):
For contract_call policies (Solana):
Usage Limits (deny_if)
Review Threshold (review_if)
Matching operations require owner approval before execution.
Message Sign Policies
message_sign policies control EIP-712 typed-data signing.
Example — restrict Permit2 signatures to a specific contract: