Become an Amplifier Verifier

πŸ’‘

The Axelar Virtual Machine (AVM) and Amplifier are currently under active development, so these instructions are likely to change. Please check back frequently for updates.

By running a verifier for a chain integration with Axelar’s Amplifier, you will be responsible for voting on the validity of transactions on the Axelar network and signing command batches for a given chain.

Running a verifier requires three components:

  1. tofnd - threshold signing service
  2. ampd - core daemon that subscribes to Axelar chain events and exposes a gRPC server
  3. One handler binary per chain you want to support (e.g. evm-handler, solana-handler)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Axelar Node β”‚
β”‚ (JSON-RPC :26657, gRPC :9090) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ ampd β”‚
β”‚ tofnd │◄─────────│ - subscribes to chain events β”‚
β”‚ :50051 β”‚ β”‚ - broadcasts transactions β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ - gRPC server for handlers :9090 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ gRPC
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ β”‚ β”‚ β”‚ β”‚
β”Œβ”€β”€β”€β–Όβ”€β”€β”€β” β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β”€β” β”Œβ”€β”€β–Όβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”
β”‚ evm β”‚ β”‚ solana β”‚ β”‚ sui β”‚ β”‚stellarβ”‚ β”‚ xrpl β”‚
β”‚handlerβ”‚ β”‚handler β”‚ β”‚handlerβ”‚ β”‚handlerβ”‚ β”‚handlerβ”‚
β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ β”‚ β”‚ β”‚ β”‚
EVM RPC Solana Sui RPC Stellar XRPL RPC
RPC RPC

Handlers are separate processes that connect to ampd’s gRPC server. If a handler crashes, it does not affect ampd or other handlers.

There are three ways to set up and run a verifier:

  • Option 1: Source β€” Clone and build directly from the GitHub source code.
  • Option 2: Binaries β€” Download prebuilt binaries from the GitHub releases page.
  • Option 3: Docker β€” Use Docker to run tofnd, ampd, and handlers.

ampd needs access to a locally running tofnd instance in order to onboard as a verifier or run the daemon. See the tofnd repository for more information.

Install tofnd from source by cloning and building the tofnd repository.

Terminal window
git clone git@github.com:axelarnetwork/tofnd.git --recursive
cd tofnd
cargo build --release --locked

This will create a binary in the target/release directory. You can move this binary to a location in your PATH or run it directly from the target/release directory.

Create a default mnemonic and configuration in ~/.tofnd/, then back it up and delete it.

Terminal window
tofnd -m create
mv ~/.tofnd/export ~/.tofnd/export-new-location

Now run tofnd.

Terminal window
tofnd

Download the tofnd binary depending on the type of machine you have:

Create a default mnemonic and configuration in ~/.tofnd/, then back it up and delete it.

Terminal window
~/Downloads/tofnd*-v1.0.1 -m create
mv ~/.tofnd/export ~/.tofnd/export-new-location

Now run tofnd.

Terminal window
tofnd

Pull and run the latest version of tofnd from Docker:

Terminal window
docker pull axelarnet/tofnd:v1.0.1
docker run -p 50051:50051 --env MNEMONIC_CMD=auto --env NOPASSWORD=true --env ADDRESS=0.0.0.0 -v tofnd:/.tofnd axelarnet/tofnd:v1.0.1

Leave this process running in the background, and perform additional commands in a new terminal window or shell.

πŸ’‘

Note: If you are running a validator as well, you should use a different node for your verifier (the Axelar node that ampd connects to) on both testnet and mainnet than the one being run for your validator node to prevent loss of rewards in case the verifier fails. This node can use the everything pruning config to reduce resource use.

πŸ’‘

Note: You also must run different tofnd instances for vald (for your validator) and ampd (for your verifier). You cannot use the same tofnd instance for both.

Install ampd from source by cloning and building the axelar-amplifier repository.

Terminal window
cargo build --release -p ampd

Download the ampd binary depending on the type of machine you have:

From Docker, pull and run the 1.14.2 version of ampd:

Terminal window
docker pull axelarnet/axelar-ampd:v1.14.2
docker run axelarnet/axelar-ampd:v1.14.2 verifier-address

πŸ’‘

The address for your verifier node will also be the address that rewards are sent to (this will change in the future). You should make sure to claim and move any available rewards regularly to mitigate any associated risks.

This will allow you to begin commands with ampd. If you set up ampd through source or Docker, you can skip this step.

  1. Add a symbolic link named ampd in your binaries folder:

    Terminal window
    sudo ln -s ~/Downloads/ampd-*-v1.14.2 /usr/local/bin/ampd
  2. Make the binary executable:

    Terminal window
    chmod a+x ~/Downloads/ampd-*-v*
  3. Restart your terminal.

  4. Run ampd --version to make sure that the right version of ampd is being used. It should be 1.14.2.

    πŸ’‘

    ampd releases can be found here.

πŸ’‘

Replace ampd-darwin-arm64-v1.14.2 with the ampd binary you downloaded.

  1. Add an alias to ampd at the end of the .bashrc file on your machine:

    Terminal window
    echo "alias ampd=~/Downloads/ampd-darwin-arm64-v1.14.2" >> ~/.bashrc
  2. Reload the file to apply all changes:

    Terminal window
    source ~/.bashrc
  3. Restart your terminal.

  4. Run ampd --version to make sure that the right version of ampd was installed on your machine. It should be 1.14.2.

πŸ’‘

Replace ampd-darwin-arm64-v1.14.2 with the ampd binary you downloaded.

  1. Add an alias to ampd at the end of the .zshrc file on your machine:

    Terminal window
    echo "ampd=~/Downloads/ampd-darwin-arm64-v1.14.2" >> ~/.zshrc
  2. Save and close the file.

  3. Reload the file to apply all changes:

    Terminal window
    source ~/.zshrc
  4. Restart your terminal.

  5. Run ampd --version to make sure that the right version of ampd was installed on your machine. It should be 1.14.2.

Create an ampd configuration file at ~/.ampd/config.toml.

This configuration file tells ampd how to connect to your local tofnd, how to talk to the Axelar network, and which chains to support via the gRPC server that handlers connect to.

tm_jsonrpc="http://devnet-amplifier.axelar.dev:26657"
tm_grpc="tcp://devnet-amplifier.axelar.dev:9090"
[service_registry]
cosmwasm_contract="axelar1c9fkszt5lq34vvvlat3fxj6yv7ejtqapz04e97vtc9m5z9cwnamq8zjlhz"
[broadcast]
chain_id="devnet-amplifier"
gas_price="0.007uaxl"
tx_fetch_interval="1000ms"
tx_fetch_max_retries="15"
batch_gas_limit="20000000"
tx_confirmation_buffer_size="10"
tx_confirmation_queue_cap="1000"
[tofnd_config]
key_uid="axelar"
party_uid="ampd"
url="http://127.0.0.1:50051"
timeout="3s"
[grpc]
ip_addr="127.0.0.1"
port=9090
global_concurrency_limit=1024
concurrency_limit_per_connection=32
request_timeout="30s"
# Add a [[grpc.blockchain_service.chains]] entry for each chain you support.
# Contract addresses for devnet can be found at:
# https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/axelar-chains-config/info/devnet-amplifier.json
[[grpc.blockchain_service.chains]]
chain_name="ethereum-sepolia"
voting_verifier="axelar1e6jnuljng6aljk0tjct6f0hl9tye6l0n9p067pwx2374h82dmr0s9qcqy9"
multisig_prover="axelar1g0ufaefvqkfvhxacsns63s3p8raf9a0k8agg3r4tfhx3k6gcz0dq0ynmcx"
multisig="axelar19jxy26z0qnnspa45y5nru0l5rmy9d637z5km2ndjxthfxf5qaswst9290r"
[[grpc.blockchain_service.chains]]
chain_name="avalanche"
voting_verifier="axelar1ty7mx0cllgz8xuvhn2j7e3qy8999ssgmjtktyqetl335em0g88lq6rjhl2"
multisig_prover="axelar1e3uxqmkxfxkk3qk2aqfnsc7uk2ld57r37t6p33v8xlzw7ptfz34s3xu7w6"
multisig="axelar19jxy26z0qnnspa45y5nru0l5rmy9d637z5km2ndjxthfxf5qaswst9290r"
# replace with your Axelar testnet node
tm_jsonrpc="http://127.0.0.1:26657"
tm_grpc="tcp://127.0.0.1:9090"
[service_registry]
cosmwasm_contract="axelar1rpj2jjrv3vpugx9ake9kgk3s2kgwt0y60wtkmcgfml5m3et0mrls6nct9m"
[broadcast]
chain_id="axelar-testnet-lisbon-3"
gas_price="0.007uaxl"
tx_fetch_interval="1000ms"
tx_fetch_max_retries="15"
batch_gas_limit="20000000"
tx_confirmation_buffer_size="10"
tx_confirmation_queue_cap="1000"
[tofnd_config]
key_uid="axelar"
party_uid="ampd"
url="http://127.0.0.1:50051"
timeout="3s"
[grpc]
ip_addr="127.0.0.1"
port=9090
global_concurrency_limit=1024
concurrency_limit_per_connection=32
request_timeout="30s"
# Add a [[grpc.blockchain_service.chains]] entry for each chain you support.
# Contract addresses can be found at:
# https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/axelar-chains-config/info/testnet.json
[[grpc.blockchain_service.chains]]
chain_name="flow"
voting_verifier="axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04"
multisig_prover="axelar1rsuejfntt4rs2y8dn4dd3acszs00zyg9wpnsc6fmhevcp6plu5qspzn7e0"
multisig="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5"
[[grpc.blockchain_service.chains]]
chain_name="sui"
voting_verifier="axelar1sykyha8kzf35kc5hplqk76kdufntjn6w45ntwlevwxp74dqr3rvsq7fazh"
multisig_prover="axelar1v8jrupu2rqpskwgtr69max0ajul92q8z5mdxd505m2hu3xc5jzcqm8zyc6"
multisig="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5"
[[grpc.blockchain_service.chains]]
chain_name="stellar-2025-q4"
voting_verifier="axelar18y8p7dxesmxttvdzp5sqjksqrnh9xg32gtfqnkkucvv9de38f69qfn6ph3"
multisig_prover="axelar1aux2l6er84m6gtayqdwqhz4rl0txqdlj3v7szr72j7etve3jmpks7x4euy"
multisig="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5"
# Continue adding for each supported chain.
# See the ampd v1.14.2 release guide for a full list of testnet chain entries:
# https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/releases/ampd/2025-12-19-ampd-v1.14.2.md
# replace with your Axelar mainnet node
tm_jsonrpc="http://127.0.0.1:26657"
tm_grpc="tcp://127.0.0.1:9090"
[service_registry]
cosmwasm_contract="axelar1rpj2jjrv3vpugx9ake9kgk3s2kgwt0y60wtkmcgfml5m3et0mrls6nct9m"
[broadcast]
chain_id="axelar-dojo-1"
gas_price="0.007uaxl"
tx_fetch_interval="1000ms"
tx_fetch_max_retries="15"
batch_gas_limit="20000000"
tx_confirmation_buffer_size="10"
tx_confirmation_queue_cap="1000"
[tofnd_config]
key_uid="axelar"
party_uid="ampd"
url="http://127.0.0.1:50051"
timeout="3s"
[grpc]
ip_addr="127.0.0.1"
port=9090
global_concurrency_limit=1024
concurrency_limit_per_connection=32
request_timeout="30s"
# Add a [[grpc.blockchain_service.chains]] entry for each chain you support.
# Contract addresses can be found at:
# https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/axelar-chains-config/info/mainnet.json
[[grpc.blockchain_service.chains]]
chain_name="flow"
voting_verifier="axelar1kkqdsqvwq9a7p9fj0w89wpx2m2t0vrxl782aslhq0kdw2xxd2aesv3un04"
multisig_prover="axelar1rsuejfntt4rs2y8dn4dd3acszs00zyg9wpnsc6fmhevcp6plu5qspzn7e0"
multisig="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5"
[[grpc.blockchain_service.chains]]
chain_name="sui"
voting_verifier="axelar1sykyha8kzf35kc5hplqk76kdufntjn6w45ntwlevwxp74dqr3rvsq7fazh"
multisig_prover="axelar1v8jrupu2rqpskwgtr69max0ajul92q8z5mdxd505m2hu3xc5jzcqm8zyc6"
multisig="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5"
[[grpc.blockchain_service.chains]]
chain_name="stellar"
voting_verifier="axelar1dalnx2yvmu3g3aau8m7fj426fk9u8dnzlr5azvqmr4x82rtclats8lhjmu"
multisig_prover="axelar1wdgp5xyqjyv5zsq86n6pah2lsmd46mn0gt4055mvvk6mezn9skqs6p93dg"
multisig="axelar14a4ar5jh7ue4wg28jwsspf23r8k68j7g5d6d3fsttrhp42ajn4xq6zayy5"
# Continue adding for each supported chain.
# See the ampd v1.14.2 release guide for a full list of mainnet chain entries:
# https://github.com/axelarnetwork/axelar-contract-deployments/blob/main/releases/ampd/2025-12-19-ampd-v1.14.2.md

See the ampd README on GitHub for the full config reference. Contract addresses for all chains can be found in the axelar-contract-deployments repository.

πŸ’‘

If you get a transport error with an ampd command, make sure that you have tofnd running in the background.

Handlers are separate binaries that connect to ampd’s gRPC server. Each handler requires a config directory with two files:

  1. Base config (config.toml) - ampd connection and chain name
  2. Chain-specific config - RPC URL and chain-specific parameters
BinaryChainsDocker Image
evm-handlerFlow, Hedera, Berachain, Plume, Monad, Hyperliquid, etc.axelarnet/axelar-ampd-evm-handler
solana-handlerSolanaaxelarnet/axelar-ampd-solana-handler
sui-handlerSuiaxelarnet/axelar-ampd-sui-handler
stellar-handlerStellaraxelarnet/axelar-ampd-stellar-handler
xrpl-handlerXRPLaxelarnet/axelar-ampd-xrpl-handler

Prebuilt binaries are available on the GitHub Releases page. Handler releases are tagged as <handler>-v* (e.g. evm-handler-v0.1.1, solana-handler-v0.1.6).

Create a config directory per chain handler:

~/.ampd/
β”œβ”€β”€ config.toml # ampd config (see above)
β”œβ”€β”€ state.json # ampd state (auto-created)
β”œβ”€β”€ flow/
β”‚ β”œβ”€β”€ config.toml # base handler config
β”‚ └── evm-handler-config.toml # EVM-specific config
β”œβ”€β”€ sui/
β”‚ β”œβ”€β”€ config.toml # base handler config
β”‚ └── sui-handler-config.toml # Sui-specific config
β”œβ”€β”€ stellar/
β”‚ β”œβ”€β”€ config.toml # base handler config
β”‚ └── stellar-handler-config.toml # Stellar-specific config
└── xrpl/
β”œβ”€β”€ config.toml # base handler config
└── xrpl-handler-config.toml # XRPL-specific config

Each handler’s config.toml contains:

ampd_url = "http://127.0.0.1:9090"
chain_name = "<chain_name>" # must match a chain in ampd's grpc.blockchain_service.chains

EVM (evm-handler-config.toml):

rpc_url = "<your_rpc_url>"
finalization = "RPCFinalizedBlock" # or "ConfirmationHeight"

Sui (sui-handler-config.toml):

rpc_url = "<your_rpc_url>"

Stellar (stellar-handler-config.toml):

rpc_url = "<your_rpc_url>"

XRPL (xrpl-handler-config.toml):

rpc_url = "<your_rpc_url>"

Solana (solana-handler-config.toml):

rpc_url = "<your_rpc_url>"
domain_separator = "<domain_separator>" # hex, 32 bytes, from MultisigProver config

Start each handler, pointing to its config directory:

Terminal window
evm-handler --config-dir ~/.ampd/flow/
sui-handler --config-dir ~/.ampd/sui/
stellar-handler --config-dir ~/.ampd/stellar/
xrpl-handler --config-dir ~/.ampd/xrpl/

For each handler, mount its config directory and run:

Terminal window
docker run -d \
--name flow-handler \
--restart unless-stopped \
-v ~/.ampd/flow:/config \
axelarnet/axelar-ampd-evm-handler:v0.1.1 \
--config-dir /config
Terminal window
docker run -d \
--name sui-handler \
--restart unless-stopped \
-v ~/.ampd/sui:/config \
axelarnet/axelar-ampd-sui-handler:v0.1.1 \
--config-dir /config

Replace the image tag and handler type as needed. Ensure handlers can reach ampd’s gRPC server. If running all containers on the same machine, use a shared Docker network or --network host.

πŸ’‘

Handler processes should be configured with automatic restart policies. The daemon can run without handlers connected, but handlers will crash if they cannot reach ampd. Both ampd and each handler should be orchestrated as separate services with auto-restart (e.g. Restart=always with systemd).

Prior to running the ampd daemon, you will need to set up your wallet with funds.

  1. Determine your verifier address:

    Terminal window
    ampd verifier-address

    πŸ’‘

    If you get a security warning while trying to run ampd on an Apple Silicon Mac, you can disable the gatekeeper for a single binary with sudo xattr -d com.apple.quarantine ~/Downloads/ampd-darwin-arm64-v1.14.2 or disable gatekeeper globally with sudo spctl --master-disable.

  2. Fund your verifier address.

    1. Fill out the Amplifier Verifier Onboarding Form for your address to be whitelisted or to receive funds.
  1. Bond your verifier:

    Terminal window
    ampd bond-verifier validators 100 uamplifier
    Terminal window
    ampd bond-verifier amplifier 100000000000 uaxl
    Terminal window
    ampd bond-verifier amplifier 50000000000 uaxl

    Bonded verifiers will stay bonded until they unbond or are removed by governance. The bond for testnet is 100000000000uamplifier (100k AXL). The bond for mainnet is 50000000000uamplifier (50k AXL).

  2. Register your public keys. Register both ecdsa (for EVM/Sui/Stellar/XRPL chains) and ed25519 (for Solana):

    Terminal window
    ampd register-public-key ecdsa
    ampd register-public-key ed25519
  3. Register support for desired chains, enabling ampd to participate in voting and signing for your supported chains.

    Terminal window
    ampd register-chain-support validators ethereum-sepolia avalanche
    Terminal window
    ampd register-chain-support amplifier flow sui stellar-2025-q4
    Terminal window
    ampd register-chain-support amplifier flow sui stellar

    Multiple chain names can be passed, separated by a space (ampd register-chain-support [service name] [chains]...). Note that any chain you want to support here must have a corresponding [[grpc.blockchain_service.chains]] entry in your ampd config.toml and a running handler.

  4. Authorize your verifier.

    This is dependent on the environment, and can be done via governance, or by the network operators.

  5. Run the ampd daemon.

    Running ampd without any command will run the daemon. Then start your handler processes as described in Set up handlers.

As you move towards testnet and mainnet, you should switch to running your own full Axelar node and your own full node or light client for any chains you are voting on.

For more info about the available commands and options, run:

Terminal window
ampd --help

If you have any feedback or would like to report a bug, please file an issue in the Axelar Developer Support repository.

Edit on GitHub