CLI Reference
This page lists every command of the interfold CLI in release 0.18.0. It also lists update and
uninstall, which only releases after 0.19.0 have. It is for developers who build E3 programs and
for operators who run ciphernodes. Each entry gives the purpose, the usage line, and a table of
flags with their default values. The source of truth is the clap definitions in crates/cli/src.
Commands at a glance
| Task | Commands |
|---|---|
| Install and update | Install script, update, uninstall |
| Project | init, compile, program, print-env |
| Node | ciphernode setup, start, nodes, noir, events query, config get |
| Operator on-chain lifecycle | ciphernode set-bond-owner, propose-bond-owner, accept-bond-owner, bond, tickets, register, deregister, activate, deactivate, status, faucet |
| Keys and secrets | password set, password delete, wallet set, wallet get |
| Network | net get-peer-id |
| Maintenance | node validate, node reset-data, config check, rev, purge-all |
Run interfold <command> --help to print the help text of one command. Run interfold --version to
print the release version.
Global options
These options apply to every interfold command. You can put them before or after the command name.
| Flag | Value | Default | Description |
|---|---|---|---|
-c, --config | <CONFIG> | Discovery order | Path to the configuration file. A relative path starts from the current directory. |
-v, --verbose | Count | WARN | Increases the log level. -v is INFO, -vv is DEBUG, and -vvv is TRACE. |
-q, --quiet | None | Off | Shows errors only. You cannot use it together with -v. |
--name | <NAME> | _default | Selects the node profile nodes.<NAME>. The name _default selects the node key. Logs and telemetry use this name. |
--otel | <OTEL> | None | OpenTelemetry collector gRPC endpoint, for example http://localhost:4317. The value must be a valid URL. |
-h, --help | None | None | Prints help. |
-V, --version | None | None | Prints the version. This flag is available on interfold only. update --version is a different option. |
The node profile also sets the storage paths. Each profile keeps its keys and data in folders named after the profile. See storage paths.
Behavior common to all commands
Configuration file
Most commands need a configuration file. The CLI looks for the file in the order that Node Configuration describes. When the CLI finds no file, only these commands run:
| Command | Behavior without a configuration file |
|---|---|
init | Makes a project. |
rev | Prints the build revision. |
ciphernode setup | Writes a configuration file and stores the password and wallet key. |
start | Runs ciphernode setup with the sepolia profile and stops. Run interfold start again to start the node. |
noir status, noir setup | Use the folder ~/.interfold/noir. |
update, uninstall | Change or remove the binary. These commands do not read the configuration file. |
All other commands stop with this error:
Configuration file not found. Run `interfold ciphernode setup` to create a configuration.init and ciphernode setup do the opposite. They stop with an error when the CLI finds a
configuration file.
When the configuration sets autopassword: true or autowallet: true, every command that loads the
file first creates a missing password or wallet key. update and uninstall do not. See
node keys.
Commands that run inside a running node
interfold start opens a control port on 127.0.0.1 at ctrl_port (default 50505). Before a
command runs, the CLI sends a request to that port and waits up to 1 second. When a node answers,
these read-only commands run inside that node and print its answer:
config getciphernode statusevents querynet get-peer-idnoir statusprint-envrev(without--features)wallet get
All other commands run in the local process.
Exit status
A command that fails prints the error in red and exits with status 1.
Command output uses the e3-console channel and printer task. Normal completion waits for the
printer to drain after its senders close; remote commands can collect those lines instead. This is
not a crash-durable output log, and the channel is unbounded.
Install and update
Install script
The install script at the repository root installs interfold in ~/.local/bin. It supports
Linux on x86_64 and macOS on Apple silicon. On other platforms, build the CLI from source.
curl -fsSL https://raw.githubusercontent.com/theinterfold/interfold/main/install | bash| Flag | Value | Default | Description |
|---|---|---|---|
--version | <TAG> | Latest release | Release tag of interfold to install, for example v0.19.0. A tag without v gets the prefix. |
--dir | <DIR> | ~/.local/bin | Folder to install the binary in. |
-h, --help | None | None | Prints the usage text. |
The environment variables INTERFOLD_VERSION and INTERFOLD_INSTALL_DIR set the same values as
--version and --dir. To pass the flag through the pipe, give it to bash -s --:
curl -fsSL https://raw.githubusercontent.com/theinterfold/interfold/main/install | bash -s -- --version v0.19.0Release 0.19.0 and earlier do not have the update command. On these releases, use the install
script to change the release. For a binary outside ~/.local/bin, give its folder with --dir.
update
Replaces this binary with another release from GitHub. Use an older tag to downgrade. When the
installed version already matches the release, the command does nothing. upgrade is another name
for this command.
interfold update [--version <TAG>]| Flag | Value | Default | Description |
|---|---|---|---|
--version | <TAG> | Latest release | latest, dev, or a release tag. Accepts 0.19.0 and v0.19.0. |
The value dev selects the most recently published release, stable or pre-release.
The command replaces the file that runs, after it resolves symbolic links. It writes the new binary
to a temporary file in the same folder and renames it, so a running node continues to use the old
release until it restarts. When a node answers on the control port, the command prints a reminder to
restart it. When the user cannot write to the folder, the command stops with Permission denied.
Run it with sudo in that case.
uninstall
Removes this binary. It does not remove configuration files, keys, or node data.
interfold uninstallProject commands
These commands make and run an E3 project from the template. For a walkthrough, see Quick Start.
interfold init
Makes a new Interfold project from a template. The command clones the template, pins its Interfold
crates to the cloned commit, runs pnpm install, and makes the first Git commit. It needs git and
pnpm.
interfold init [PATH] [--template <TEMPLATE>] [--skip-cleanup] [--skip-install]| Argument or flag | Value | Default | Description |
|---|---|---|---|
PATH | Path | Current directory | Folder for the new project. A relative path starts from the current directory. |
--template | <TEMPLATE> | https://github.com/theinterfold/interfold.git#v<version>:templates/default | Template repository, in the form git+https://github.com/theinterfold/interfold.git#main:templates/default. |
--skip-cleanup | None | Off | Keeps the working folder when an error occurs. Use it to test the installer. |
--skip-install | None | Off | Does not install JavaScript packages. Use it for offline setup or unpublished release candidates. |
The default template uses the tag of the installed CLI version.
interfold compile
Compiles the E3 program of the project. This command is the same as interfold program compile.
interfold compile [--dev <true|false>]| Flag | Value | Default | Description |
|---|---|---|---|
--dev | true or false | program.dev | Compiles in Dev Mode. The value overrides the config key. |
interfold program
Manages the E3 program of the project. Each subcommand runs in the current directory and builds or
runs the program-runner binary of the project's runner/ crate.
The --dev flag selects the mode. When the flag is absent, the CLI uses program.dev from the
configuration, which defaults to false.
| Subcommand | Purpose | Command |
|---|---|---|
program start [--dev <DEV>] | Starts the program server. In Dev Mode, the program runs without a proving backend, so nothing verifies the result. Otherwise the OpenVM service checks its worker and keys, then proves each round. | cargo run --bin program-runner -- dev or cargo run --release --bin program-runner -- openvm |
program compile [--dev <DEV>] | Compiles the program. Outside Dev Mode, it also builds the OpenVM guest, its keys, the receipt identity, and the worker configuration. | cargo build --bin program-runner or, outside Dev Mode, a build script that ends with cargo build --release |
program cache purge | Deletes .interfold/caches, including the OpenVM guest build and keys. The next compilation takes longer. | None |
Outside Dev Mode, program compile and program start need a program.openvm section with at
least one worker. The CLI refuses the removed program.risc0 section. See
program settings.
interfold print-env
Prints the contract addresses and the RPC URL of one configured chain as environment variables on one line. Use it to give the addresses to a client or a server.
interfold print-env --chain <CHAIN> [--vite]| Flag | Value | Default | Description |
|---|---|---|---|
--chain | <CHAIN> | Required | Chain name from the chains list. |
--vite | None | Off | Adds the prefix VITE_ to each variable name. |
| Variable | Source | Printed when |
|---|---|---|
INTERFOLD_ADDRESS | contracts.interfold | Always |
RPC_URL | rpc_url | Always |
REGISTRY_ADDRESS | contracts.ciphernode_registry | Always |
BONDING_REGISTRY_ADDRESS | contracts.bonding_registry | Always |
E3_PROGRAM_ADDRESS | contracts.e3_program | The key is set |
FEE_TOKEN_ADDRESS | contracts.fee_token | The key is set |
When no chain has the given name, the command prints an empty line.
Node commands
These commands configure and run a ciphernode. For the full procedure, see Running a ciphernode.
interfold ciphernode setup
Makes a configuration file for one ciphernode and stores its password and wallet key. The command runs only when the CLI finds no configuration file.
interfold ciphernode setup [--network sepolia] [-r <RPC_URL>] [--config-dir <PATH>] [--password-stdin] [--private-key-stdin]| Flag | Value | Default | Description |
|---|---|---|---|
--network | sepolia | sepolia | P2P network profile and chain for the file. The value sepolia uses chain ID 11155111. |
-r, --rpc-url | <RPC_URL> | Prompt | Ethereum RPC URL. The scheme must be http, https, ws, or wss. |
--password-stdin | None | Off | Reads the password from the first requested line of standard input. |
--private-key-stdin | None | Off | Reads the wallet key from the next requested line of standard input. |
--config-dir | <PATH> | Prompt | Folder for the configuration file. |
Without a stdin flag, the command uses a hidden prompt for that secret. It rejects secret values in
command arguments. The password must not be blank. The wallet key must contain 32 bytes in
hexadecimal. The RPC prompt proposes wss://ethereum-sepolia-rpc.publicnode.com. Without
--config-dir, the last prompt asks for the configuration folder. The default is interfold in the
operating system configuration folder, for example ~/.config/interfold on Linux. Without a
terminal, the command cannot prompt: give --rpc-url, --config-dir, --password-stdin, and
--private-key-stdin.
The command writes interfold.config.yaml with these values:
node.networkandnode.address, which comes from the private key- One chain named after the network, with
chain_idandrpc_url - A
data_availabilityblock that reads the Sepolia deployment's data from Avail Turing (https://turing-rpc.avail.so/rpc) - The
interfold,ciphernode_registry,bonding_registry, andslashing_managercontracts with their deploy blocks
The contract addresses are the Sepolia deployment that was built into the binary. To compare them
with the current deployment, run interfold config check. The binary has no local deployment, so
the command refuses a local network: for a local chain, start from the project template's
interfold.config.yaml. See data availability.
Use a hidden prompt or pipe secrets from a file or secret manager with --password-stdin and
--private-key-stdin. Do not type secret values into shell commands. When you use both flags, put
the password on the first line and the wallet key on the second line.
interfold start
Starts the ciphernode in the foreground. The node syncs chain events, joins the P2P network, and
serves on committees. With --bootstrap, it only syncs chain events and joins the network, so that
other nodes can find each other through it. Stop it with SIGINT (Ctrl+C) or SIGTERM. The node
then does a controlled shutdown.
interfold start [--peer <PEER>]... [--bootstrap]| Flag | Value | Default | Description |
|---|---|---|---|
--peer | <PEER> | The peers from the profile | libp2p multiaddr of a peer to dial. Repeat the flag for more peers. The node adds these peers to peers from the config. |
--bootstrap | None | Off | Run as a bootstrap node: no committee work, proofs, votes, or transactions, and no memory for the prover. See Run a bootstrap node. |
The command holds a lock on the data folder of the profile, so a second process cannot use the same
data. A data folder keeps the role, full or bootstrap, of the first node that used it, and the
command does not start a node of the other role on it. It also opens the control port and, when
dashboard_port is set, a dashboard at http://127.0.0.1:<dashboard_port>. The node stops with an
error when its chain connection fails or when its event store fails.
interfold nodes
Runs a set of nodes on one host. The set is every profile under the nodes key. The _default
profile is never part of the set. A supervisor process listens on 127.0.0.1:13415 and controls the
node processes.
Each node starts as interfold start --name <id>. The supervisor adds a --peer flag for every
other node in the set, in the form /ip4/127.0.0.1/udp/<quic_port>/quic-v1.
| Subcommand | Arguments and flags | Purpose |
|---|---|---|
nodes up | -d, --detach: runs the supervisor in the background. -e, --exclude <EXCLUDE>: comma-separated profile names to leave out. | Starts all nodes. It fails when a supervisor already runs. With --detach, it waits up to 10 seconds for the supervisor. |
nodes down | None | Stops all nodes and the supervisor. |
nodes ps | None | Lists the status of each node process. |
nodes start <ID> | ID: profile name | Starts one node of the set. |
nodes stop <ID> | ID: profile name | Stops one node of the set. |
nodes status <ID> | ID: profile name | Prints the status of one node. |
nodes restart <ID> | ID: profile name | Stops and starts one node. |
nodes purge | --yes: confirms the deletion. --allow-active-e3s: overrides the key-share and cannot-check refusals. | Deletes .interfold/data and .interfold/config in the current directory. |
Before it deletes anything, nodes purge checks each node whose store, event log, or key file it
would delete. It finds these nodes in the configuration, in .interfold/data, and in
.interfold/config. It refuses in these cases:
- The node runs. The purge takes the lock that
interfold starttakes, and it opens the node's store. Nothing overrides this refusal. - The node holds a key share for an E3 that it has not seen complete.
- The purge cannot check the node. For example, the store is missing at the configured path, or it holds no operator key.
The purge reports every refusal at once. --allow-active-e3s overrides the last two kinds of
refusal together. The purge also refuses when .interfold, .interfold/data, or
.interfold/config is a symbolic link.
Before the first deletion, the purge writes a purge-in-progress file into each node folder that it
empties. When the purge stops part of the way, run it again. The second run finishes the folders
that hold this file. If another file or a link has this name, the purge stops and deletes nothing.
interfold start writes the path of its store next to the key file, as <key file>.store-record.
The record keeps the store of each start, one path per line. For a key file with a record, the purge
locks and checks every recorded store, also when the node ran with another E3_DATA_DIR,
data_dir, or working directory. A recorded store that is no longer there is a refusal that
--allow-active-e3s overrides, unless an earlier purge of the same folders deleted it. To forget a
store that is gone for good, or that belongs to the project that this one was copied from, delete
its line from the record. A key file that no configured node uses is checked through its record.
The purge has limits:
- A key file without a record, as of a node that has not started with this release, is checked through the store at the configured path. A stale copy of a store there passes the check.
- It finds stores only directly inside each node folder in
.interfold/data.
The detached supervisor does not receive the --otel flag. Set otel in the configuration file, or
E3_OTEL, for the nodes that it runs.
interfold nodes purge deletes the key files, the stored wallet keys, and the event history of
every profile under .interfold in the current directory. You cannot undo this action. A deleted
wallet key that you have no copy of is lost, together with control of its on-chain position. To
clear a node's state and keep its identity, use interfold node reset-data.
interfold noir
Manages the Noir prover tools that the node uses to make zero-knowledge proofs: the Barretenberg
binary (bb) and the compiled circuits. The required versions come from
crates/zk/prover/versions.json. For release 0.18.0, they are bb 5.1.0 and circuits 0.18.0.
| Subcommand | Flags | Purpose |
|---|---|---|
noir status | None | Prints the path, version, and install state of bb and the circuits. The last line is Ready or the action to do. |
noir setup | -f, --force: installs bb and the circuits again. --circuits-archive <PATH>: installs the circuits from a local release archive instead of a download. --circuits-configuration <PRESET/COMMITTEE>: selects a required pair from the local archive. Repeat for multiple pairs. --allow-unpinned-archive: installs a local archive that does not have this binary's release pin. | Installs or updates bb and the circuits. When both are current and --force is absent, it does nothing. |
With a configuration file, the tools go to .interfold/noir next to that file. Without one, they go
to ~/.interfold/noir. A custom bb from custom_bb or E3_CUSTOM_BB replaces the downloaded
one.
Circuit downloads require an archive SHA-256 compiled in for the required version from
crates/zk/prover/versions.json or the release build input. noir status reports the required
version and this pin. The installer checks this digest before extraction. It then requires a
nonempty checksums.json that covers every artifact file and verifies each entry. The archive must
contain the full supported preset/committee matrix and the complete artifact inventory used by
release validation. If validation fails, the installed circuits and version record stay unchanged.
--circuits-archive applies the same checks to a local file: the archive must have the release pin
of this binary's circuit version. To install another archive, such as a local build, add
--allow-unpinned-archive; the internal manifest checks still apply. To install a subset from a
local archive, add --circuits-configuration <PRESET/COMMITTEE> for each required pair. For
example, --circuits-configuration insecure-64/minimum selects the development configuration. This
option requires --circuits-archive and cannot reduce the network download requirements.
If circuit replacement or the version update fails, the installer attempts rollback and returns the original installation error. Each rollback failure logs the source and target paths. If the previous circuits cannot be restored, the installer keeps the staging directory and logs its path for recovery.
interfold events query
Reads events from the local event store of the node. The command prints one JSON object for each event. The last line is a JSON cursor that you can use for the next page.
interfold events query [--agg <AGG>] [--since <SINCE>] [--limit <LIMIT>]| Flag | Value | Default | Description |
|---|---|---|---|
--agg | <AGG> | 0 | Aggregate ID to read. |
--since | <SINCE> | 0 | Sequence number to start from. |
--limit | <LIMIT> | 10 | Maximum number of events to read. When the value is above the internal limit, the internal limit applies. |
interfold config get
Prints one resolved configuration value, or all values when you give no parameter.
interfold config get [PARAM]| Argument | Values | Default |
|---|---|---|
PARAM | name, peers, network, network_id, quic_port, ctrl_port, address, autonetkey, autopassword, autowallet, otel, config_file, config_yaml, db_file, key_file, log_file, work_dir, chains, nodes, program | All values |
An unknown parameter causes the error Unknown config parameter. The value of peers includes the
bootstrap peer of the network profile when the config sets no peers.
Operator on-chain lifecycle
Most of these commands send transactions to the BondingRegistry contract of a configured chain.
status only reads, and faucet calls a Faucet contract that the chain entry names. For the
procedures, see Registration and Manage tickets.
Shared flags and values
| Flag | Value | Default | Description |
|---|---|---|---|
--chain | <CHAIN> | The first entry in chains | Chain name from the configuration. Every command in this section accepts it. |
--operator | <ADDRESS> | The configured wallet | Operator position to act on. The usage line of each command shows if it accepts the flag. |
The wallet that wallet set stored signs every transaction. The contract checks that this wallet
can do the action. For example, registerOperatorFor accepts only the bond owner of the operator.
Amounts are decimal token units, for example 1000 or 0.5. You can use _ to group digits. The
number of decimal places must not be more than the decimals of the token. When a command needs a
token allowance, it sends an approve transaction first.
interfold ciphernode set-bond-owner
Authorizes the first bond owner of the operator. The configured wallet is the operator.
interfold ciphernode set-bond-owner --owner <ADDRESS> [--chain <CHAIN>]| Flag | Value | Default | Description |
|---|---|---|---|
--owner | <ADDRESS> | Required | Wallet or Safe that controls the bond. A separate cold owner is the recommended setup. |
interfold ciphernode propose-bond-owner
Proposes to move an operator position to a new bond owner.
interfold ciphernode propose-bond-owner --operator <ADDRESS> --new-owner <ADDRESS> [--chain <CHAIN>]| Flag | Value | Default | Description |
|---|---|---|---|
--operator | <ADDRESS> | Required | Operator position to move. |
--new-owner | <ADDRESS> | Required | Wallet or Safe that can accept ownership. |
interfold ciphernode accept-bond-owner
Accepts a proposed bond owner transfer. The configured wallet must be the proposed owner.
interfold ciphernode accept-bond-owner --operator <ADDRESS> [--chain <CHAIN>]| Flag | Value | Default | Description |
|---|---|---|---|
--operator | <ADDRESS> | Required | Operator position to accept. |
interfold ciphernode bond
Manages the FOLD bond of an operator. The parent command accepts --operator and --chain.
interfold ciphernode bond [--operator <ADDRESS>] [--chain <CHAIN>] <bond|unbond|claim> [FLAGS]| Subcommand | Flags | Purpose |
|---|---|---|
bond | --amount <AMOUNT> (required) | Bonds FOLD to the operator position. It calls bondCiphernodeFor. |
unbond | --amount <AMOUNT> (required) | Puts FOLD from the position in the exit queue. It calls unbondCiphernodeFor. |
claim | --max-ticket <MAX_TICKET>, --max-bond <MAX_BOND>. Default: all. | Claims ticket collateral and FOLD exits that the exit delay released. It calls claimExitsFor. |
interfold ciphernode tickets
Manages the tickets of an operator. The parent command accepts --operator and --chain.
interfold ciphernode tickets [--operator <ADDRESS>] [--chain <CHAIN>] <buy|burn> --amount <AMOUNT>| Subcommand | Flags | Purpose |
|---|---|---|
buy | --amount <AMOUNT> (required) | Deposits collateral to mint tickets. The amount is collateral, not a ticket count. It calls addTicketBalanceFor. |
burn | --amount <AMOUNT> (required) | Burns ticket tokens and puts the collateral in the exit queue. The amount is ticket tokens, not a ticket count. It calls removeTicketBalanceFor. |
The number of available tickets is floor(collateral balance / ticket price). After the
transaction, both subcommands print the new ticket count.
interfold ciphernode register
Registers the operator in the BondingRegistry and the CiphernodeRegistry. It calls
registerOperatorFor, which only the bond owner can call. The FOLD bond must be at least the
required bond before you register.
interfold ciphernode register [--operator <ADDRESS>] [--chain <CHAIN>]interfold ciphernode deregister
Requests deregistration. The bond owner or the operator key can send it. It calls
deregisterOperatorFor, which puts all collateral in the exit queue.
interfold ciphernode deregister [--operator <ADDRESS>] [--chain <CHAIN>]interfold ciphernode activate
Sends refreshOperatorStatus for a registered operator, so that the contract recomputes its
activation state from its registration, release acknowledgement, bans, bond and tickets against the
current requirements. The command prints the Active flag after the transaction. The admission
cooldown is not part of Active; it affects eligibility, which status shows separately. For an
operator that is not registered, the command stops and points to register.
interfold ciphernode activate [--operator <ADDRESS>] [--chain <CHAIN>]interfold ciphernode deactivate
Withdraws tickets, FOLD bond, or both, so that the operator becomes inactive. You must give at least one of the two amount flags.
interfold ciphernode deactivate [--tickets <AMOUNT>] [--bond <AMOUNT>] [--operator <ADDRESS>] [--chain <CHAIN>]| Flag | Value | Default | Description |
|---|---|---|---|
--tickets | <AMOUNT> | None | Ticket-token amount to burn, not a ticket count. It runs the same call as tickets burn. |
--bond | <AMOUNT> | None | FOLD amount to unbond. It runs the same call as bond unbond. |
interfold ciphernode status
Prints the on-chain state of an operator. The command sends no transaction.
interfold ciphernode status [--operator <ADDRESS>] [--no-committees] [--chain <CHAIN>]| Flag | Value | Default | Description |
|---|---|---|---|
--operator | <ADDRESS> | Configured signer | Operator to show. |
--no-committees | None | Off | Do not list the committees. The command then reads no event history. |
The output shows these values:
- The operator key, the bond owner, and a pending bond owner
- The
Registered,Active, andExit pendingflags, andEligible for new committees:eligibilityAtat the latest block time, which also applies the admission cooldown and the admission policy. An operator in the cooldown isActivebut not yet eligible. - The ticket balance and the number of available tickets
- The FOLD bond and the pending exits
- The requirements:
minTickets,ticketPrice, andciphernodeBond - The committees that hold the collateral of the operator, each with its E3 ID, the membership
(
candidate,member, orexpelled), and the E3 stage
A committee stays in the list until releaseCommittee(e3Id) releases it, also after its E3 is
complete or failed. A candidate holds a provisional seat while the sortition of the E3 is open.
To find the committees, the command reads the unresolvedCommitteesOf and committeeObligationAt
views of BondingRegistry: one block read, one call for the number, and one call for each
committee. These calls read no event history. A registry deployed before these views, or one that
holds committees requested before them, does not list every committee. The command then reads the
CommitteeObligationUpdated events of BondingRegistry. The first run reads from the
deploy_block of the contract. When the configuration has no deploy_block for bonding_registry,
the read starts at block 0. The first run sends one eth_getLogs request for each 10,000 blocks (or
the chain's rpc_log_range_blocks), or for each smaller range that the RPC endpoint accepts. Thus
the first run can take some seconds, and longer on an endpoint with a small range limit.
The command saves the result in committee-scans/ in the node data directory, one file for each
operator. A later run reads only the blocks after the saved block: usually one eth_getLogs
request, and three block reads that detect a chain reorganization. After a reorganization of the
saved block, the command reads the full history again. The read stops at the latest block minus the
chain's ingestion_confirmations, so a new committee shows after that number of blocks.
If the read fails, the command shows Committees: unavailable with the error, and it shows all the
other values.
To monitor a node from a script, do not run this command often. Each run reads the chain, and a
hosted RPC endpoint can bill each read. Use --no-committees, or read the heartbeat files that
the node writes (see Watch the node). They need no RPC request.
A running node of an earlier version refuses --no-committees until it restarts on the new
version.
interfold faucet
Testnet only Requests test tokens from the faucet contract of a
chain. The Faucet contract of the repository (contracts/test/Faucet.sol) sends 1000 FOLD and
1000 fee tokens to the configured wallet. It sends each token only when the wallet holds less than
1000 of it.
interfold faucet [--chain <CHAIN>]The chain must have a faucet entry in contracts. If the entry is missing, the command stops with
the error No faucet contract configured for chain '<CHAIN>'. Sepolia publishes a faucet, so
interfold faucet --chain sepolia sends 1000 FOLD and 1000 MockUSDC. Mainnet has no faucet. On
Sepolia, one faucet call provides enough FOLD for the 100 FOLD operator bond. See
Contracts & Addresses.
Keys and secrets
The node stores its password in a key file. It uses the password to encrypt the wallet key and the libp2p key in its data store. See node keys.
interfold password set
Sets the password when no password exists. When the key file already exists, the command stops with
an error. Run interfold password delete first.
interfold password set [--password-stdin]| Flag | Value | Default | Description |
|---|---|---|---|
--password-stdin | None | Off | Reads the password from one line of standard input. |
Without the flag, the hidden prompt asks for the password twice. The password must not be blank. The command rejects password values in command arguments.
interfold password delete
Deletes the key file. The command asks for confirmation and for the current password.
interfold password deleteThe stored wallet key and libp2p key are encrypted with this password. If you delete the password
and set a different one, the node cannot decrypt those keys. Keep a copy of the wallet private key
before you delete the password, and run interfold wallet set again after you set a new one.
interfold wallet set
Stores the wallet private key, encrypted with the password. The command also derives the libp2p keypair from the same private key and stores it. The wallet key gives the node its Ethereum address and its peer ID.
interfold wallet set [--private-key-stdin]| Flag | Value | Default | Description |
|---|---|---|---|
--private-key-stdin | None | Off | Reads the private key from one line of standard input. |
Without the flag, the command asks for the wallet key with a hidden prompt. The key must contain 32 bytes in hexadecimal. The command rejects wallet key values in command arguments.
interfold wallet get
Prints the Ethereum address of the stored wallet key.
interfold wallet getNetwork commands
interfold net get-peer-id
Prints the libp2p peer ID of the node. The peer ID comes from the stored wallet key.
interfold net get-peer-idTo dial extra peers, use interfold start --peer. To set peers permanently, use the peers key.
See network settings.
Maintenance commands
interfold node validate
Checks the stored state of one node without a start. The command checks these items:
- This binary can load the storage schema.
- The event log is intact.
- The snapshot cursor is consistent.
- No committee tickets are orphaned.
Without --repair, the command changes no files. It exits with an error when a check fails.
interfold node validate [--repair]| Flag | Value | Default | Description |
|---|---|---|---|
--repair | None | Off | Repairs a safe log tail, or builds a stale sortition projection again. |
The command takes the same data-folder lock as interfold start. Stop the node before you run it.
Use it before an upgrade and after a crash. See Upgrades.
interfold node reset-data
Deletes the durable protocol state of one node but keeps its identity. Use it when a release raises the storage schema and the binary refuses to load the old data folder.
interfold node reset-data --yes| Flag | Value | Default | Description |
|---|---|---|---|
--yes | None | Off | Confirms the deletion. Without it, the command stops with a message that lists what it deletes. |
--allow-active-e3s | None | Off | Deletes the state even when this node holds a key share for an E3 that it has not seen complete. The node loses that key share. |
--if-schema-older | None | Off | Resets only when the stored state uses an older storage schema than this binary. Otherwise the command changes nothing and exits with success. A package can run it before every start. |
The command first writes an encrypted backup of the wallet key and libp2p key to
identity-backup-<name>-<timestamp>.json next to the database. Then it deletes the key/value store
and the event log, writes the identity back, and reads it again to confirm. The command refuses to
run while the node runs. It also refuses, and deletes nothing, while the node holds a key share for
an E3 that it has not seen complete, including an E3 that shows Failed. See
Reset node state. The command in v0.18.0 and earlier has no
such check. Run the reset with the binary of the new release.
Do not delete the data folder by hand. The wallet key and the libp2p key are in the same store as
the protocol state. If you delete the folder, you lose the identity that holds the bond. Use
interfold node reset-data instead.
interfold config check
Compares the contract addresses in the configuration with the published deployment manifest. See Contracts & Addresses.
interfold config check [--chain <CHAIN>] [--manifest-url <MANIFEST_URL>]| Flag | Value | Default | Description |
|---|---|---|---|
--chain | <CHAIN> | Every chain in the config | Checks only this chain. |
--manifest-url | <MANIFEST_URL> | The manifest.json asset of the latest GitHub release | Reads the manifest from this URL instead. |
The command compares a chain only when its name is a network in the manifest, mainnet or
sepolia. It skips other chains. Each finding has one of these labels:
| Label | Meaning | Fails the command |
|---|---|---|
STALE | An address or the chain_id does not match the manifest. | Yes |
warn | A deploy_block is unset or does not match the manifest. | No |
note | The manifest publishes a contract that the config does not set, or the network is a mock deployment. | No |
The command exits with status 1 when it finds a STALE value. A supervisor or a CI job can use it
as a gate before a restart. It does not compare e3_program, because each application has its own
E3 program.
interfold rev
Prints the Git revision that the binary was built from.
interfold rev [--features]| Flag | Value | Default | Description |
|---|---|---|---|
--features | None | Off | Prints the optional Cargo features of this binary instead, one for each line. The CLI from an interfold-<platform> release archive prints nothing. |
interfold purge-all
Deletes .interfold/data, .interfold/config, and .interfold/caches in the current directory.
This command is nodes purge and program cache purge together, with the same checks as
nodes purge.
interfold purge-all --yes [--allow-active-e3s]| Flag | Value | Default | Description |
|---|---|---|---|
--yes | None | Off | Confirms the deletion. Without it, the command prints what it deletes and stops. |
--allow-active-e3s | None | Off | Overrides the key-share refusal and the refusal for a node that nodes purge cannot check. The chain cannot restore a deleted key share. |
interfold purge-all deletes the key files, the stored wallet keys, and the event history under
.interfold in the current directory. You cannot undo this action.
Hidden and feature-gated items
| Item | Status | Description |
|---|---|---|
interfold nodes daemon | Hidden | The supervisor process. nodes up --detach starts it. Help output does not list it. Do not run it directly. |
test-only-skip-proof-aggregation Cargo feature | Feature-gated | Test and CI builds only. Together with skip_proof_aggregation: true, it skips recursive proof aggregation. interfold rev --features shows it. |
Next steps
Every key in interfold.config.yaml, its default, and the environment overrides.
The procedure that uses these commands to set up and start a node.
OperatorsContracts & AddressesThe contracts that the on-chain commands call, with their addresses.
ReferenceQuick StartMake a project with interfold init and run it locally.