Before starting any node, make sure the Nova artifacts and Solidity verifiers exist. Run these commands from the repo root:
-
Download artifacts using
circuit-setupCLI:cargo install --path circuit-setup zerc20-circuit-setup download --version <VERSION> --base-url <ARTIFACTS_URL>
This downloads all circuit artifacts (
*_nova_pp.bin,*_nova_vp.bin,*_decider_pp.bin,*_decider_vp.bin,*_groth16_pk.bin,*_groth16_vk.bin) intonova_artifacts/and verifies SHA256 hashes against the manifest.See
circuit-setup/README.mdfor more details on available commands (generate, upload, test, generate-verifier). -
Generate and copy the Solidity verifiers into the contracts package:
zerc20-circuit-setup generate-verifier ./scripts/copy_nova_verifiers.sh
The first command generates verifier contracts from the downloaded artifacts. The script copies every
*_verifier.soland*.solintocontracts/src/verifiers/, creating the folder if needed.
Follow these steps to bring up the indexer, crosschain job, and decider-prover, then exercise the CLI end-to-end:
-
Prepare token metadata Use a token configuration file from
config/deployed/for your target environment (e.g.,config/deployed/mainnet/orconfig/deployed/testnet/). Alternatively, copyconfig/tokens.example.jsonand fill it with your own deployed contracts. -
Configure root environment Copy
.env.exampleat the repo root to.env, then set the following environment variables:ALCHEMY_KEY- Alchemy API key for RPC accessINFURA_KEY- Infura API key for RPC fallback accessROOT_SUBMITTER_PRIVATE_KEY- Key for submitting roots on-chainRELAY_PRIVATE_KEY- Key for cross-chain relay operationsFEE_MANAGER_PRIVATE_KEY- Key for fee manager operationsTOKENS_FILE_PATH- Path to token configuration file
These keys must control accounts with enough ETH on the EVM chains listed in your tokens configuration.
# Example: Point to mainnet token configuration TOKENS_FILE_PATH=./config/deployed/mainnet/tokens.json -
Start indexer and crosschain job
From the repo root, start the dockerized services:docker compose up -d
Health check the indexer at
curl http://localhost:8080/healthz. -
Start the decider-prover PostgreSQL The decider-prover requires its own PostgreSQL instance. Start it with:
docker compose -f docker-compose.decider.yml up -d
This runs PostgreSQL on port 5433 (separate from the indexer's database on 5432).
-
Run the decider-prover In
decider-prover/, copy.env.exampleto.env, then start the server:cargo run -r
Health check at
curl http://localhost:8081/healthz.Note: The decider-prover must run directly on the host, not in Docker. It crashes during proof generation when containerized.
-
Exercise the CLI Use the CLI to send transfers and receive funds; see
cli/README.mdfor commands and options.
If you only need to deploy contracts and do a quick on-chain smoke test (Hub + Verifier/zERC20 + Liquidity/Adaptor),
follow contracts/README.md.