Configuration reference
Every runner option and env var in one list.
The engine reads its configuration from environment variables. loadConfig() validates them at startup and fails fast if anything required is missing.
Rule: the engine config is intentionally small. It wires the runner to a network, a signer, and a set of plugins. Everything a strategy needs (which vault, which market) lives in the plugin, not here.
loadConfig() calls import "dotenv/config", so a .env file in the project root is picked up automatically. Empty values are treated as unset: a VAR= line behaves exactly like the variable being absent, so the default still applies. Run show-config to print the resolved values (secrets masked) before starting the daemon.
Required
| Var | Controls | Default |
|---|---|---|
RUNNER_PLUGINS | CSV of plugin names to load, e.g. "my-strategy,other-strategy". Split on ,, trimmed, empties dropped. This is config.pluginNames. Empty throws config: RUNNER_PLUGINS is empty. | none — required |
OPERATOR_PRIVATE_KEY | The operator key: an Ed25519 keypair in bech32 form (suiprivkey1...). Read directly by the signer loader, never into config and never printed. | none — required |
Optional, with defaults
| Var | Controls | Default | ||||
|---|---|---|---|---|---|---|
SUI_NETWORK | Which network: testnet \ | mainnet \ | devnet. Anything else throws `config: SUI_NETWORK must be testnet\ | mainnet\ | devnet`. Selects the network config and the default RPC. | testnet |
SUI_RPC_URL | Fullnode RPC URL. | the Mysten public fullnode for SUI_NETWORK | ||||
LOG_LEVEL | Log verbosity: debug \ | info \ | warn \ | error. Consumed by the logger; show-config only echoes it. | info | |
HEALTH_PORT | Port for the healthcheck HTTP server (daemon only). 0 disables the server. | 3030 | ||||
HEALTH_HOST | Interface the healthcheck binds (daemon only). Set 0.0.0.0 when the probe comes from outside the host (Kubernetes, Fly, Railway). | 127.0.0.1 |
Advanced overrides
These default to the values baked into the selected network and are rarely needed.
| Var | Controls | Default |
|---|---|---|
PREDICT_PACKAGE_ID | Overrides the Predict package ID. | getNetworkConfig(network).predictPackageId |
PREDICT_OBJECT_ID | Overrides the Predict shared object ID. | getNetworkConfig(network).predictObjectId |
Plugin-specific vars
The engine imposes no shape on a plugin's own settings — a plugin reads its env directly and validates it. Which vault a plugin operates is one of those settings. The example ladder uses VAULT_ID (and OTHER_VAULT_ID for the chaos control-group, which runs on a second vault):
VAULT_ID=0x... # the vault this plugin operatesFor running several plugins that each drive a distinct vault, the engine also recognizes a namespaced convention, PLUGIN_<NAME_UPPER_SNAKE>_<KEY> (e.g. PLUGIN_MY_STRATEGY_VAULT_ID). When plugins reports a factory-error, a missing PLUGIN_<NAME>_VAULT_ID is the hint it prints.
State backend
State is in-memory by default and lost on restart. To persist ctx.state, export a stateFactory from src/plugins/index.ts; this is a code export, not an env var. show-config reports custom (from src/plugins/index.ts) when one is set, otherwise in-memory (default — lost on restart).