Remedies for humans, keyed by the error codes defined in the machine interface (the single authority on what each code is — this page only covers what to do). For a code not covered here, the maintained discovery index is wallet-cli --json-schema | jq '.errorCodes'; still fall back to the exit-code class if a runtime envelope carries a code outside that catalog.
The command was malformed — a flag is unknown, missing, conflicting, or has a bad value. All of those exit 2, but the codes differ: invalid_option for an unknown or wrongly-combined flag, missing_option for an absent required one, invalid_value for a bad value, and usage_error only when the parser itself rejects the line.
- Re-run with
--helpon the exact subcommand:wallet-cli tx send --help. - Common conflicts:
--amountvs--raw-amount;--tokenvs--contractvs--asset-id;--dry-runvs--sign-only(this one reportsinvalid_option, still exit 2). Two*-stdinflags in one run is not in this class — it issecret_source_errorat exit 1. - Common conflicts continued:
--constructor-argsvs--constructor-params, and--artifactvs--codevs--code-fileoncontract deploy. invalid_valueonconfig: check the allowed keys and values (defaultOutputistextorjson). Readable keys aredefaultNetwork,defaultOutput,timeoutMs,waitTimeoutMs,networks,aliases,tronlinkSecretId,tronlinkSecretKey,tronlinkChannel,gasfreeApiKey,gasfreeApiSecret, plus thenetworks.<id>.{httpEndpoint|apiKeyHeader|apiKey}paths;networksandaliasesare read-only, everything else is writable.
The command, the account, or the transaction does not belong to the selected network's chain family — for example stake freeze --network sepolia, or a TRON-only watch-only account used on an EVM network.
- Check which family the command serves:
wallet-cli <command> --helpnames it, and the command reference lists every TRON-only command. - Check which network you actually selected — with
--networkomitted it isconfig.defaultNetwork.wallet-cli config defaultNetworkshows it. - If the account is the mismatch: a seed or private-key account works on both families, but a watch-only or Ledger account has one address and one family.
wallet-cli list -o jsonshows each account'saddressesand itsfamily.
A flag that belongs to the other chain family. --asset-id, --fee-limit, --permission-id, --expiration, --transaction and --tx-stdin are TRON's; --gas-limit, --max-fee, --priority-fee and --nonce are EVM's. --help tags each one (TRON only) / (EVM only).
--max-fee / --priority-fee additionally need an EIP-1559 chain; on a network that still prices in gasPrice they are refused with the same code.
EVM-only, both about a transaction that cannot go where you are sending it.
chain_id_mismatch— the signed transaction was built for another chain. The chain id is inside the transaction and is what the signature commits to, so it cannot be retargeted; rebuild it against the network you want. This check runs before signing too, so you cannot sign a mainnet transaction by pointingtx signat a testnet.nonce_too_low— the account has already mined a transaction at that nonce. Rebuild without--nonceto take the account's pending nonce, or pass the correct one.
A nonce that is ahead of the account's next one is only a meta.warnings entry in tx broadcast --dry-run, which compares it against the account's nonce read from the node (and degrades to a skipped check with a warning if that read fails). On a real broadcast the node decides: if it rejects the gap, that comes back as nonce_too_high at exit 1; if it accepts, the transaction sits queued until the gap is filled.
create (and other password-setting commands) rejected the master password. It must be at least 8 characters and include an uppercase letter, a lowercase letter, a digit, and a special character (!@#$%^&*()-_=+[]{};:,.?). The error message names the specific rule you missed.
A credential, secret, or signing-device approval was needed but none was available.
tty_required— no terminal is attached (CI, pipes). For commands with a stdin path, provide the matching*-stdinflag (--password-stdin,--tx-stdin).import mnemonic,import private-key, andchange-passwordare interactive-only — they must run in a real TTY; there is no non-interactive alternative.auth_required— software signing needs the master password, or Ledger signing needs the right app/device state. Signing commands never prompt, so an attached terminal does not help: pass--password-stdin. For Ledger, unlock the device and open the TRON or Ethereum app that matches the account family.auth_failed— the password was wrong (decryption failed); re-enter it.
The node or the Ledger device didn't answer within --timeout (default 60000 ms).
- Check basic connectivity to the network; if you are behind a proxy, verify the CLI's traffic actually goes through it.
- Raise the bound:
--timeout 120000. - Ledger: confirm the device is unlocked and the app matching the account's family is open (TRON app or Ethereum app), then retry.
- If this happened on
tx send: the transaction may still have been submitted. Recover the txid if you have it and checktx statusbefore resending.
The node accepted the connection but rejected the request. The message carries the node's reason — a TRON API call (TRON getTransaction failed: Transaction not found) or a JSON-RPC method (eth_estimateGas failed: …).
- Transaction not found: wrong
--txid, wrong--network(a Nile txid queried on mainnet), or the tx hasn't propagated yet — retry after a few seconds. - Insufficient balance / bandwidth / energy: fund the account, or stake for resources (
stake freeze) — see Networks for how resources work; on Nile use the faucet. - TRC20 send reverting: raise
--fee-limit(default 100000000 SUN) only after confirming the recipient/contract is correct. eth_estimateGasfailed: the node simulated the transaction and it reverted — most often an unfunded account, or a call the contract rejects. Fix the cause;--gas-limitproceeds without an estimate, but a transaction that reverts in simulation will usually revert on chain too, paying the gas anyway.
An unexpected failure. The message is intentionally generic (secret-redaction). Re-run with --verbose for stderr diagnostics; if reproducible, file an issue with the command shape (never include secrets).
tx statussayspendingfor a long time — the tx is seen, but no execution result/receipt is available yet; keep polling. If it never leavespending/not_foundpast your deadline, the outcome is unknown, not failed. Reconcile it on the intended network, preferably with an explorer or archival endpoint, before any resend.- *"only one -stdin flag can consume stdin per run" — pipe one secret per invocation; for send-with-password use
--password-stdinand let the mnemonic/key live in the encrypted store. - Forgot the master password — there is no recovery; restore from your BIP39 mnemonic (
import mnemonic) into a fresh wallet and set a new password. account historyfails while other queries work — history requires a TronGrid endpoint; plain node RPC is not enough. It is also TRON-only: on an EVM network it fails withfamily_mismatch.listdoes not show an account I know exists — text output shows one chain family at a time and warns how many it left out. Pass--networkfor the other family, or-o json, which lists every account with every address.tx statusreturnsnot_foundon EVM for a transaction that definitely happened — public RPC endpoints often prune history. The warning inmeta.warningssays so; try an archival endpoint (config networks.<id>.httpEndpoint).- A command exits 0 with
command: "migration"instead of doing anything — persisted wallet data was upgraded first and the original command was deliberately not run. Re-run it. See startup wallet-data upgrades.