Troubleshooting¶
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.
usage_error / invalid_value (exit 2)¶
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.
family_mismatch (exit 2)¶
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.
invalid_option: "a tron option on this command" (exit 2)¶
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.
chain_id_mismatch / nonce_too_low (exit 1)¶
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.
weak_password (exit 2)¶
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.
tty_required / auth_required (exit 2 / exit 1)¶
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.
timeout (exit 1)¶
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.
rpc_error (exit 1)¶
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.
internal_error (exit 1)¶
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).
Not an error code, but frequently asked¶
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.