Every command — including every subcommand — has its own page. Most follow the same layout (Synopsis · Description · Options · Examples · Output · Exit status · See also); pages for commands that take a positional argument add an Arguments section, and a few that need no prose drop Description. Command-group pages list and link their subcommands.
wallet-cli supports two chain families, TRON and EVM, and --network selects one network of one family. Commands fall into these kinds:
Portable — the same command on either family, with the family-specific parts named per family: account balance / info / portfolio, block, tx send / broadcast / status / info / sign, token (all five), contract call / send / deploy, chain node / prices, message sign, typed-data sign.
TRON only — the command implements a TRON protocol feature with no EVM counterpart: account history / activate / set, chain params, contract info / clear-abi / create2 / set-origin-energy-limit / set-user-resource-percent, tx approvals / multisig, and every command in the stake, vote, reward, proposal, witness, permission, asset, exchange and gasfree groups. Run against an EVM network they fail with family_mismatch before any node call.
Service commands — x402 and bai talk to HTTP services rather than to a chain node. The ones that pay (x402 pay / roundtrip, bai recharge) use the selected network's family; the catalog, usage, and report commands take no network. 8004 runs on both families, but only on networks with an ERC-8004 registry — not ethereum or sepolia.
Local — no network at all: create, import, use, current, list, derive, rename, backup, delete, change-password, config, networks, contact, encoding, address. Some of these still accept --network as a display selector (which family's address to print, which key a keystore export takes); no node is contacted either way.
Individual flags are family-scoped the same way. --help tags them (TRON only) / (EVM only), and using one on the other family is a usage error — invalid_option, exit 2.
The catalog is the authority on all of this: wallet-cli --json-schema reports a families array per command.
-o, --output <text|json> result format (default: config.defaultOutput, built-in text)
--network <string> network id or alias, e.g. nile, sepolia, bsc, eip155:11155111
(falls back to config.defaultNetwork)
--account <string> accountId, label, or address (wallet-bound commands; falls back to active)
an address names one chain, so use accountId or label to cross families;
an address matching several accounts that are not interchangeable
signers for the family being acted on is `ambiguous_account`
--timeout <number> per RPC/device call timeout, ms (default: config.timeoutMs, built-in 60000)
-v, --verbose extra diagnostic output
-h, --help / -V, --version
Commands whose schema allows post-broadcast polling take --wait / --wait-timeout <ms> (cap default: config waitTimeoutMs, built-in 60000). The early-exit modes are command-specific too: transaction-building commands may expose --dry-run / --sign-only / --build-only, while a submit-only command such as tx broadcast neither rebuilds nor signs and therefore has no --sign-only / --build-only.
Fee and multi-sig flags are family-scoped, so they are not global:
Flags
Family
Where
Permission group and expiry — see below
TRON
TRON transaction-building commands that sign or can emit unsigned hex; not tx broadcast or GasFree
--fee-limit <sun>
TRON
the commands that spend energy: tx send, contract send / deploy
--permission-id selects the permission group to sign under (0=owner, 1=witness, 2-9=active) and --expiration extends the window for collecting co-signatures. An EVM transaction carries exactly one signature, so neither has a counterpart there: on a portable command they are tagged (TRON only) and refused on EVM with invalid_option.
Where all three early-exit modes exist, they are mutually exclusive, and --expiration is accepted only alongside --sign-only or --build-only. Breaking either rule is a usage error at exit 2. The code depends on where the check runs: on the account, permission, contract, proposal and witness writes it is invalid_value, and which field the message names depends on the rule. Mutual exclusion is attached to the whole object, so it reports --input rather than the flags you passed (invalid --input: choose at most one of --dry-run, --sign-only, --build-only); the --expiration rule is attached to its own field and names it (invalid --expiration: only valid with --sign-only or --build-only). Elsewhere the same conflict reports invalid_option. Branch on the exit code, not on the code string; see machine interface.