Validator Guide
Complete onboarding guide for X1/Tachyon validators — build, configure, and run the AXIO-enabled validator to receive MEV bundles and earn tip revenue.
Validator Onboarding Guide
This guide covers building, configuring, and running the AXIO-enabled validator to receive MEV bundles and earn tip revenue.
Overview
AXIO is an MEV infrastructure layer for the X1/Tachyon network. It runs an off-chain auction engine that evaluates, simulates, and ranks MEV bundles from searchers, then delivers winning bundles to validators for direct block inclusion.
What you get:
- Auction-winning bundles delivered via WebSocket in real time
- Direct block injection — bundles bypass RPC and enter the banking stage as a priority lane before mempool transactions
- Tip revenue from searchers, deposited into 8 rotating on-chain PDA vaults and auto-distributed to your validator identity
- Zero changes to your consensus behavior — AXIO only adds an optional bundle channel
Revenue model:
- Searchers attach tips to every bundle
- The on-chain tip program distributes tips per the fee split: 40% validator, 25% reserve injection, 15% staker yield, 20% treasury
- A permissionless crank bot triggers distribution every 25-40 seconds — no manual claiming required
Testnet performance:
- 94.7% bundle landing rate
- 1.83ms average end-to-end latency (p99: 3.32ms)
- 0 slot budget overruns
Prerequisites
Hardware
Same as standard X1/Tachyon validator requirements:
| Component | Minimum | Recommended |
|---|---|---|
| CPU | 24 cores | 32 cores |
| RAM | 256 GB | 256 GB |
| Storage | 2 TB NVMe SSD | 2 TB NVMe SSD |
| Network | 1 Gbps | 1 Gbps |
AXIO adds a receiver thread and executor validation — 32 cores recommended.
Network
Your validator must reach the AXIO relay endpoint:
| Environment | Relay URL |
|---|---|
| Testnet | wss://relay.axio.fortiblox.com/v1/relay |
| Mainnet | TBD |
Outbound port 443 (WSS) must be open. The validator initiates the connection; no inbound ports are required for AXIO.
Software
- Rust 1.78+ (stable toolchain)
- Standard Tachyon build dependencies:
build-essential,pkg-config,libssl-dev,libudev-dev,protobuf-compiler,clang,cmake - Git
Step 1: Build the AXIO Validator
Clone
git clone https://github.com/fortiblox/axio-validator.git
cd axio-validatorBuild
cargo build --releaseThe build produces target/release/tachyon-validator — a drop-in replacement for the standard Tachyon binary with the forti-bundle crate compiled in.
What forti-bundle Does
The forti-bundle crate adds three components to the validator:
-
BundleReceiver — A dedicated thread (
fortiBundleRecv) that maintains a persistent WebSocket connection to the AXIO relay. It authenticates with your validator identity and auth token, receivesbundle_deliverymessages, validates them, and pushes them into a crossbeam channel. -
FortiBlockBuilder — Integrates into the banking stage consume loop. It drains the bundle channel before mempool transactions (priority lane), sorts bundles by EV score descending, and fills remaining block capacity with normal mempool transactions.
-
BundleExecutor — Enforces atomic execution (all transactions in a bundle succeed or none are included). For multi-tx bundles, uses sequential execution with full state carryover via
AccountOverrides.
The integration is non-invasive: if the relay is unreachable or no bundles are available, the validator builds blocks normally from the mempool.
Step 2: Configure
CLI Flags
| Flag | Required | Default | Description |
|---|---|---|---|
--forti-enabled | Yes | false | Enable AXIO bundle integration |
--forti-relay-url | Yes | ws://localhost:4002/v1/relay | AXIO relay WebSocket URL |
--forti-auth-token | Yes | (empty) | Authentication token (provided by AXIO team) |
--forti-mev-commission-bps | No | 500 (5%) | Your MEV commission in basis points |
Environment Variables
# .env file (chmod 600!)
FORTI_ENABLED=true
FORTI_RELAY_URL=wss://relay.axio.fortiblox.com/v1/relay
FORTI_AUTH_TOKEN=your-auth-token-here
FORTI_MEV_COMMISSION_BPS=500Docker
For Docker deployments, use the AXIO lite image:
# docker-compose.yml
services:
validator:
build:
context: .
dockerfile: lite/Dockerfile
environment:
- FORTI_ENABLED=true
- FORTI_RELAY_URL=wss://relay.axio.fortiblox.com/v1/relay
- FORTI_AUTH_TOKEN=${FORTI_AUTH_TOKEN}
volumes:
- ./validator-keypair.json:/config/identity.json:ro
- ./ledger:/ledger
ports:
- "8899:8899" # RPC
- "8001:8001" # GossipStep 3: Run
Start the Validator
./target/release/tachyon-validator \
--identity /config/identity.json \
--ledger /ledger \
--rpc-port 8899 \
--forti-enabled \
--forti-relay-url wss://relay.axio.fortiblox.com/v1/relay \
--forti-auth-token "$FORTI_AUTH_TOKEN" \
--forti-mev-commission-bps 500 \
# ... other standard validator flagsVerify Bundle Reception
Check logs for the fortiBundleRecv thread:
# Successful connection
grep "fortiBundleRecv" validator.log | head -5
# Should show: "Connected to relay", "Registered as validator"
# Bundle delivery
grep "BundleDelivery" validator.log | tail -5
# Should show: "Received bundle <id> with <n> transactions"Verify Tip Collection
# Check tip vault balances
solana balance 7dWho2FmC68LZBirmAf68GsrEJSFjpaVTF5pYPqVDCug --url https://x1-testnet.xen.networkStep 4: Monitor
Key Metrics
| Metric | Where | Healthy |
|---|---|---|
| Relay connection | Logs: fortiBundleRecv | Connected, heartbeats every 10s |
| Bundles received | Prometheus: forti_bundles_received_total | > 0 |
| Bundles included | Prometheus: forti_bundles_included_total | Landing rate > 90% |
| Tip revenue | On-chain tip vault balances | Increasing |
| Slot budget | Prometheus: forti_slot_budget_usage | < 95% |
Grafana Dashboard
Import the AXIO validator dashboard from /monitoring/grafana/axio-validator.json for real-time monitoring.
Operational Notes
Safe Restarts
Never restart during or near your leader slots. Wait for a safe window after your last leader slot in the current epoch. The sequence:
- Check leader schedule:
solana leader-schedule | grep <your-identity> - Wait for your last leader slot to pass
- Gracefully stop the validator
- Restart and verify relay reconnection
Bundle Bot Restarts
If you restart the validator, any connected bots will lose their WebSocket connections. After every validator restart:
- Kill all bot processes
- Wait for the validator to fully sync
- Relaunch bots
Failover
If the AXIO relay is unreachable, the validator automatically falls back to building blocks from the mempool. No manual intervention needed. When the relay comes back online, the fortiBundleRecv thread reconnects automatically with exponential backoff.