Swiss army knife CLI for Axelar development.
# 1. Clone the contract deployments repo as a sibling
git clone https://github.com/axelarnetwork/axelar-contract-deployments.git
cd axelar-contract-deployments && npm install && cd ..
# 2. Configure
cp axe/.env.example axe/.env
# Edit .env with your chain details, keys, and mnemonics
# 3. Build and install
cd axe
cargo build && cp target/debug/axe ~/.cargo/bin/axe
# 4. Initialize and deploy
axe deploy init
axe deploy runworkspace/
├── axe/
└── axelar-contract-deployments/
| Command | Description | Relayer |
|---|---|---|
axe deploy init |
Initialize a new chain deployment from .env |
- |
axe deploy run |
Run all deployment steps sequentially | - |
axe deploy status |
Show deployment progress | - |
axe deploy reset |
Reset all steps to pending | - |
axe test gmp |
End-to-end GMP loopback test | no |
axe test its |
Deploy + transfer an interchain token | no |
axe test load-test |
Cross-chain load test | yes |
axe decode calldata |
Decode raw EVM calldata | - |
axe decode tx |
Fetch & decode an EVM or Solana transaction | - |
axe decode sol-activity |
Recent Solana program activity | - |
axe decode evm-activity |
Recent EVM contract events | - |
axe deploy run # runs all 23 steps sequentially
axe deploy status # shows progress
axe deploy reset # start overaxe test gmpSends a loopback GMP message on a deployed EVM chain and relays it through the full Amplifier pipeline end-to-end.
cargo run --no-default-features --features testnet -- test gmp --config ../axelar-contract-deployments/axelar-chains-config/info/testnet.json --source-chain solana --destination-chain solanaSends a GMP message from Solana and manually relays it through the full Amplifier pipeline end-to-end: callContract → verify_messages → vote → end_poll → route_messages → construct_proof → approve on Solana gateway (init verification session → verify all 12 signatures → approve message). Requires MNEMONIC env var with a funded Cosmos wallet.
Build with the matching feature flag for the target network (devnet-amplifier, stagenet, testnet).
axe test itsDeploys an interchain token locally, deploys it remotely to a destination chain via the ITS Hub, then sends a cross-chain transfer and verifies the balance on the destination. Relays through the full Amplifier pipeline (verify → vote → route → execute on hub).
The axe test load-test command sends cross-chain transactions through the Axelar Amplifier pipeline and verifies them end-to-end. It supports two modes: burst (send N transactions as fast as possible) and sustained (send at a fixed TPS rate for a fixed duration).
Send a fixed number of transactions all at once. All keys are funded upfront and all transactions are fired in parallel.
axe test load-test --num-txs 50 ...Send transactions at a controlled rate for a set duration. Use --tps and --duration-secs together:
axe test load-test --tps 10 --duration-secs 300 ...
# sends 10 tx/s for 5 minutes = 3000 transactions totalHow it works:
- A pool of
tps × key_cyclewallets is derived and funded upfront (e.g. 30 wallets for 10 TPS with a 3s cycle). - Each second,
tpstransactions are fired using the next batch of keys from the pool. - Keys rotate on a configurable cycle (default 3 seconds): second 1 uses keys 0–9, second 2 uses keys 10–19, second 3 uses keys 20–29, second 4 reuses keys 0–9, etc. This ensures each key has time for its previous transaction to land before its nonce is reused.
- Use
--key-cycle Nto control the cycle length. Higher values use more wallets and reduce per-address mempool pressure on chains with aggressive mempool limits (e.g.--key-cycle 6doubles the wallet pool). - Concurrent send + verify: In sustained mode, the Amplifier verification pipeline starts immediately as transactions confirm — it does not wait for the send phase to finish. Both phases run concurrently with live progress on separate lines:
\ [42/300s] fired: 420/3000 src-confirmed: 410 failed: 2 (target: 10 tx/s) - voted: 350/410 routed: 280/410 approved: 120/410 executed: 80/410 - The final summary shows end-to-end latency (avg/min/max), throughput, per-phase step and cumulative timing, pipeline counts, and any stuck transactions.
- A JSON report is written to
axe-load-test-logs/axe-load-test-<timestamp>.jsonafter each run for post-mortem analysis.
Protocols supported in sustained mode: GMP and ITS, both directions (Sol → EVM and EVM → Sol).
ITS note: Token deployment happens once upfront (cached across runs). Each pool key is pre-funded with enough tokens for its share of the total transfers before the send phase begins.
GMP (default): Sends ABI-encoded string payloads via callContract through a deployed SenderReceiver contract. The contract address is cached after first deploy and reused across runs.
ITS (--protocol its): Deploys an interchain token on the source chain, deploys the remote counterpart on the destination via the ITS Hub, then sends InterchainTransfer transactions. Supports both EVM → Sol and Sol → EVM directions.
Verification: Polling covers the full pipeline: voted → routed → approved → executed (GMP), or voted → hub-approved → second-leg discovery → routed → approved → executed (ITS). In sustained mode, verification runs concurrently with sending. In burst mode, it runs after all sends complete. Inactivity timeout is 200 seconds — the poller resets the timeout each time any transaction makes progress.
axe test load-test \
--source-chain solana-18 \
--destination-chain avalanche-fuji \
--config ../axelar-contract-deployments/axelar-chains-config/info/devnet-amplifier.jsonaxe test load-test \
--source-chain avalanche-fuji \
--destination-chain solana-18 \
--num-txs 50 \
--config ../axelar-contract-deployments/axelar-chains-config/info/devnet-amplifier.jsonaxe test load-test \
--source-chain solana-18 \
--destination-chain avalanche-fuji \
--protocol its \
--config ../axelar-contract-deployments/axelar-chains-config/info/devnet-amplifier.jsonaxe test load-test \
--source-chain avalanche-fuji \
--destination-chain solana-18 \
--protocol its \
--config ../axelar-contract-deployments/axelar-chains-config/info/devnet-amplifier.jsonaxe test load-test \
--source-chain solana-18 \
--destination-chain avalanche-fuji \
--tps 10 \
--duration-secs 300 \
--config ../axelar-contract-deployments/axelar-chains-config/info/devnet-amplifier.jsonaxe test load-test \
--source-chain avalanche-fuji \
--destination-chain solana-18 \
--tps 5 \
--duration-secs 120 \
--config ../axelar-contract-deployments/axelar-chains-config/info/devnet-amplifier.jsonaxe test load-test \
--source-chain avalanche-fuji \
--destination-chain solana-18 \
--protocol its \
--tps 3 \
--duration-secs 180 \
--config ../axelar-contract-deployments/axelar-chains-config/info/devnet-amplifier.jsonOn stagenet/testnet/mainnet the relayer requires gas payment. Build with the appropriate feature flag:
# Build (use cargo build, not cargo install — see note below)
cargo build --no-default-features --features stagenet
cp target/debug/axe ~/.cargo/bin/axe
# Burst
axe test load-test \
--source-chain flow \
--destination-chain solana-stagenet-3 \
--num-txs 100 \
--config ../axelar-contract-deployments/axelar-chains-config/info/stagenet.json
# Sustained with larger wallet pool for Flow
EVM_PRIVATE_KEY=0x... axe test load-test \
--source-chain flow \
--destination-chain solana-stagenet-3 \
--tps 2 \
--duration-secs 120 \
--key-cycle 6 \
--config ../axelar-contract-deployments/axelar-chains-config/info/stagenet.json \
--source-rpc https://your-flow-rpc-endpoint
# ITS sustained
axe test load-test \
--source-chain flow \
--destination-chain solana-stagenet-3 \
--protocol its \
--tps 3 \
--duration-secs 120 \
--config ../axelar-contract-deployments/axelar-chains-config/info/stagenet.jsonNote:
cargo install --path .does a clean compile which triggers a known borsh derive bug insolana-axelar-std. Usecargo build(incremental) + manual copy instead.
Run axe test load-test --help for all options.
axe decode calldata 0x0f4433d3... # auto-detects function from 4-byte selector
axe decode calldata 0x00000000... # auto-detects ITS payload typeDecodes EVM calldata against a built-in ABI database (Gateway, ITS, ITS Factory, GMP SDK). Recursively decodes nested bytes fields (multicall batches, ITS payloads inside GMP calls). Whitespace in hex input is stripped automatically.
axe decode tx 0xabc123... # auto-discovers configs from sibling repo
axe decode tx 0xabc123... --chain avalanche # skip brute-forcing, target one chain
axe decode tx 0xabc123... --config path/to.json # use a specific config fileFetches a transaction by hash from all EVM chains in parallel, then decodes the calldata and all event logs. Chains configs are auto-discovered from the sibling axelar-contract-deployments repo (mainnet, testnet, stagenet, devnet-amplifier).
Set ALCHEMY_TOKEN to use Alchemy RPCs for supported chains (faster and more reliable than public RPCs):
export ALCHEMY_TOKEN=your_token_here
axe decode tx 0xabc123...axe decode sol-activity --program gateway --network devnet-amplifier --limit 5
axe decode sol-activity --network testnet # all programs on testnet
axe decode sol-activity --program its --network devnet-amplifier --json # machine-readable JSONShows recent transactions for Axelar Solana programs (Gateway, ITS, GasService, Memo). Auto-discovers program addresses from the sibling axelar-contract-deployments config files. Decodes instruction names, args, and CPI events. Use --json for structured output consumable by LLMs for debugging.
axe decode evm-activity --contract gateway --network devnet-amplifier --chain avalanche-fuji --limit 5
axe decode evm-activity --contract its --network testnet --chain flow --jsonShows recent events from Axelar EVM contracts (Gateway, ITS, GasService) using eth_getLogs. Auto-discovers contract addresses from config files. Decodes event names and parameters using the embedded ABI database.
See LLM-GUIDE.md for a complete guide on using axe for debugging cross-chain messages with AI assistants.
All config lives in .env — see .env.example for the full template.
| Variable | Used by |
|---|---|
CHAIN, ENV, chain metadata |
init |
DEPLOYER_PRIVATE_KEY, GATEWAY_DEPLOYER_PRIVATE_KEY, etc. |
deploy |
MNEMONIC |
test gmp, test its (Amplifier routing) |
ITS_* vars |
deploy (ITS steps), test its |
TARGET_JSON |
all commands (reads chain config) |
ALCHEMY_TOKEN (optional) |
decode tx (archive RPCs) |