The xe binary is a unified CLI for both node operation and client interaction. xe node runs the daemon; every other subcommand is a client that talks to a node's HTTP API (XE_NODE, default https://ldn.core.test.network). ./xe --help prints the same list.
Commands
Node:
node [flags] Start a node daemon (flags below)
Wallet:
wallet create Create a new wallet and show its 24-word recovery phrase
wallet restore Restore a wallet from its recovery phrase, read from stdin
(prompt or pipe, never an argument); refuses to overwrite
wallet phrase Show the recovery phrase of the current wallet
wallet balance Show wallet balance
Transactions:
send <addr> <amount> [--asset XE|XUSD] [--memo "text"]
Send funds; --memo attaches up to 64 bytes of UTF-8
receive Receive all pending sends
faucet Request testnet XE from the faucet service (1,000 XE per
account per rolling 24 h; arrives pending — run receive)
mint <amount> Mint XUSD — authorized sys.minter wallet only (ops/bootstrap)
burn <amount> [--yes] [--memo "text"]
Permanently destroy XE from your wallet (irreversible)
Compute:
providers List compute providers
lease [--vcpus N] [--memory MB] [--disk GB] [--duration SECS] [--provider ADDR]
Create a lease (defaults 1 vCPU, 1024 MB, 1 GB, 300 s)
lease status <hash> Check lease status
lease renew <hash> <additional-seconds>
Operator only: renew from the node's wallet (XE_API_ADMIN_TOKEN)
vm <hash> Get VM info
ssh <hash> SSH into a leased VM through the gateway
Messaging (off-chain, funds-free):
directory register [--watch]
Register this wallet's account against the node so others
can message it; --watch stays resident and re-registers
every 20 minutes (entries expire at 30)
chat send <addr> <message>
Send a signed, PoW-solved chat message; prints its id
chat read [--since <unix-ns>] [--follow] [--json]
Read this wallet's messages (ownership-proofed); --follow
polls for new ones, --json prints one envelope per line
Reputation:
reputation <addr> Show reputation aggregate for an account
Tools:
keygen Generate an ed25519 SSH keypair for lease access
verify-genesis [flags] Print the network_id and genesis hashes this binary runs
with; --genesis-dir/--genesis/--statechain-genesis verify a
supplied bundle instead; --json; --expect-network-id,
--expect-ledger-hash, --expect-statechain-hash exit non-zero
on mismatch
sign-block Sign a block from stdin; seed from XE_SEED
version Print version
help Print usagexe faucet talks to the standalone faucet service (XE_FAUCET, default
https://faucet.test.network). It sends 1,000 testnet XE per account per
rolling 24 hours from a pre-funded wallet; the grant lands as a pending send, so
claim it with xe receive.
xe sign-block takes no seed argument — the binary rejects one because a
positional seed leaks via ps, /proc, and shell history. Set XE_SEED
instead. wallet restore reads the phrase from stdin for the same reason.
Environment Variables
| Variable | Default | Description |
|---|---|---|
XE_NODE | https://ldn.core.test.network | Node API URL for every client command |
XE_WALLET | ~/.xe/wallet.seed | Wallet seed file |
XE_SEED | (none) | Hex seed for sign-block (required — the command takes no seed argument) |
XE_FAUCET | https://faucet.test.network | Faucet service URL |
XE_API_ADMIN_TOKEN | (none) | Node: enables the operator-only API endpoints when set. Client: sent as the bearer token by lease renew |
XE_SSH_HOST | ldn.test.network | SSH gateway hostname |
XE_SSH_PORT | 2222 | SSH gateway port |
XE_VM_MOCK | (unset) | Node: use the mock VM manager instead of Lima/QEMU (development only) |
Node Flags
Flags accept either -name or --name.
Network and genesis
| Flag | Default | Description |
|---|---|---|
--port | 9000 | libp2p TCP port |
--dial | (none) | Comma-separated bootstrap peer multiaddrs |
--data | ./data | Data directory (bound to one network) |
--genesis-dir | (embedded) | Directory holding ledger-genesis.json and statechain-genesis.json; joins that network without a rebuild |
--genesis / --statechain-genesis | (embedded) | The two genesis files individually; must be used together |
--max-conns-per-ip | 8 | Max inbound connections per source IP |
--max-inbound-conns | 0 (= 256) | Max simultaneous inbound connections; negative = no split |
--no-discovery | false | Disable ambient DHT peer discovery; peer only with the --dial list |
--discovery-peers | 0 (= 24) | Peer count at which ambient discovery stops dialling |
--disable-mdns | false | Disable mDNS LAN discovery |
API, UI and operator listeners
| Flag | Default | Description |
|---|---|---|
--api | true | Enable/disable HTTP API server |
--api-port | 8080 | HTTP API port |
--api-bind | 127.0.0.1 | API bind address |
--cors-origin | (none) | Allowed CORS origin |
--ui | false | Enable embedded web UI (requires --api) |
--ui-port | 8000 | Web UI port |
--ui-bind | 127.0.0.1 | Web UI bind address |
--ui-dir | (embedded) | Dev override: serve UI from filesystem |
--ui-faucet | (none) | Base URL of a faucet service; the UI proxies /faucet/* to it (empty = faucet button hidden) |
--wallet | true | Expose /wallet/ in the embedded UI; --wallet=false serves 404 |
--metrics-addr | 127.0.0.1:9095 | Operator listener for /metrics, /health, /ready; empty disables it |
--ready-min-peers | 1 | Connected-peer floor below which /ready reports not ready (0 declares a standalone node) |
--ready-finality-stall | 90s | How long the final-height watermark may stay flat, with a backlog, before /ready fails |
Provider mode
| Flag | Default | Description |
|---|---|---|
--provide | false | Enable provider mode (requires KVM; auto-accepts matching leases) |
--vcpus | 2 | vCPUs to offer |
--memory | 2048 | Memory in MB |
--disk | 20 | Disk in GB |
--price-multiplier | 1000 | Provider price multiplier ×1000 (1000 = baseline); non-default values are flagged as simulation-only pending anti-cheat gates |
--ssh-port | 0 | SSH gateway port (0 = disabled) |
--limactl-path | (PATH) | Path to limactl |
--min-lease-duration | (none) | Policy: minimum lease duration as a Go duration (e.g. 1h); empty = no limit |
--max-lease-duration | (none) | Policy: maximum lease duration (e.g. 720h); empty = no limit |
--min-lease-cost | 0 | Policy: minimum cost in whole XUSD (0 = no min) |
--max-lease-cost | 0 | Policy: maximum cost in whole XUSD (0 = no max) |
--max-concurrent-leases | 0 | Policy: max active leases (0 = capacity-bound only) |
The lease-duration flags are duration strings, not numbers — passing 0 fails
validation and stops the node at startup. Leave them unset for no limit.
Logging
| Flag | Default | Description |
|---|---|---|
--log-level | info | debug, info, warn or error |
--log-file | (stderr) | Write to a size-bounded rotating file instead of stderr |
--log-max-size / --log-max-files | (see --help) | Rotation size in MB and number of rotated files kept |
--log-json | false | Emit logs as JSON |