Vald (Validator Daemon) is a long-running process that runs alongsideDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/axelarnetwork/axelar-core/llms.txt
Use this file to discover all available pages before exploring further.
axelard on validator nodes. While axelard handles consensus and on-chain state, vald watches for cross-chain events — such as new EVM gateway transactions or multisig keygen sessions — and participates in threshold signing by relaying signing requests to the tofnd daemon. Vald connects to the axelard node via CometBFT RPC and broadcasts transactions back to the chain using a dedicated broadcaster account.
Architecture Overview
axelard CometBFT RPC, processes the following event types:
ChainAdded— a new EVM chain has been registeredConfirmTokenStarted— a token confirmation has been initiatedConfirmKeyTransferStarted— a key transfer confirmation has been initiatedConfirmGatewayTxsStarted— gateway transaction confirmations have been initiatedKeygenStarted— a multisig keygen session has begunSigningStarted— a multisig signing session has begun
tofnd over gRPC and then broadcasts the threshold signature result back to axelard.
Starting Vald
Key Flags
The bech32 validator operator address (
axelarvaloper1...). Vald uses this to identify which signing sessions belong to this validator.Name or address of the broadcaster key in the local keyring. This account signs and broadcasts transactions on behalf of the validator. Falls back to the
broadcast.broadcaster-account key in vald.toml (under [broadcast]).Hostname of the
tofnd threshold signing daemon. Defaults to localhost.Port of the
tofnd daemon. Defaults to 50051.Timeout for the initial gRPC connection to
tofnd. Defaults to 15s.CometBFT RPC endpoint of the local
axelard node. Defaults to tcp://localhost:26657.Network chain ID. Defaults to
axelar.Multiplier applied to the simulated gas estimate. Defaults to
4. Vald simulates each transaction before broadcasting.Gas price used when broadcasting. Defaults to
0.007uaxl.Keyring backend for the broadcaster key:
os, file, test, or memory. Defaults to file.vald.toml Configuration
Vald reads~/.axelar/config/vald.toml for detailed configuration. Below are all fields from ValdConfig:
ValdConfig Fields
Maximum number of messages merged into a single transaction batch when the broadcaster queue is under high load. Increasing this also requires increasing
MaxUnpackAnySubCalls in the application.Minimum number of pending broadcast requests before vald starts merging them into batches. Below this threshold, messages are broadcast individually.
Maximum number of blocks behind the latest tip for a cached block height to remain valid. If vald falls further behind, it discards the stored height and starts from the latest block.
Maximum number of retry attempts when fetching blocks from the CometBFT node via block event subscription.
Backoff duration between retry attempts for block event fetching.
Maximum age of the latest block for vald to consider the node in sync. If the latest block is older than this, vald waits for the node to catch up. Should be set well above the expected block time.
Duration after which vald panics if no new block has been seen. This is a safety mechanism to detect and recover from stalled states. Once at least one block has been observed, vald will crash if no new block arrives within this window.
BroadcastConfig Fields
These live under the[broadcast] section in vald.toml:
Keyring key name used as the broadcaster account when
--from is not passed on the command line. Read directly by vald from the config file; set to the name of your broadcaster key (e.g. "broadcaster").Maximum number of retry attempts for a failed broadcast. All broadcasts go through a serialized queue, so retries block other broadcasts.
Base sleep duration for exponential backoff between broadcast retries.
Maximum time to wait for a broadcasted transaction to be included in a block.
How often vald polls the node to check whether a broadcasted transaction has been included in a block.
TssConfig (tofnd connection)
Under the[tss] section:
Hostname of the tofnd daemon. Can be overridden by
--tofnd-host.Port of the tofnd daemon. Can be overridden by
--tofnd-port.Timeout for establishing the gRPC connection to tofnd.
Example vald.toml
EVM Chain Configuration
Each EVM chain that vald monitors needs an entry in[[axelar_bridge_evm]]:
The chain name as registered on Axelar (case-insensitive internally). Examples:
Ethereum, avalanche, Polygon.JSON-RPC HTTP(S) endpoint for the chain. Vald calls
eth_getBlockByNumber, eth_getTransactionReceipt, and related methods.Whether vald should activate the bridge listener for this chain. Set to
false to configure the chain entry without monitoring it.Override the finality strategy for this chain. Options depend on the chain (e.g.,
confirmation_depth). Leave unset to use the on-chain default.tofnd Integration
tofnd is the threshold signing daemon that holds key shares and performs distributed key generation (DKG) and signing operations. Vald connects to it over gRPC and delegates all cryptographic operations to it.
Start tofnd
Tofnd must be running and reachable on the configured host/port before vald starts. Refer to the tofnd documentation for installation and startup instructions.
Proxy Registration
Validators broadcast transactions through a designated proxy (broadcaster) account so that the validator’s private key does not need to be kept online. The proxy must be registered on-chain before vald can operate.<proxy-address> is the axelar1... address of the broadcaster account that vald will use to sign and submit transactions. --from should be your validator’s key (the axelarvaloper1... operator key).Keygen Opt-In
Validators must explicitly opt into future multisig keygen rounds. The sender should be the proxy (broadcaster) address:Running Vald as a systemd Service
Create/etc/systemd/system/vald.service:
Vald State File
Vald persists the last processed block height to~/.axelar/vald/state.json. On restart, vald reads this file and resumes from where it left off (or from the latest block if the stored height is too far behind, as controlled by max_blocks_behind_latest).
Recovery from tofnd Key Loss
If tofnd key material needs to be recovered, the Docker entrypoint supports this through theRECOVERY_FILE environment variable. Set RECOVERY_FILE to the path of a JSON recovery file inside the container, and the entrypoint will pass it to the startup sequence automatically: