For Validators

BAM (Blockspace Assembly Market) connects supported validator clients to an external scheduler over gRPC. The BAM Node sends pre-sequenced transaction and bundles, executing them in FIFO order with respect to account locks. This design maintains network security while enabling sophisticated transaction ordering strategies.

Access to BAM is fully permissionless, and any validator can join mainnet or testnet by following the instructions below.

Quick Start Guide

Read the Common Configuration Reference before starting either path. It covers the BAM Node endpoints, the on-chain addresses, and the leader-schedule requirement, all of which apply to Jito-Solana (AgaveBAM) and FireBAM alike.

Understanding the Architecture also applies to both paths, as do the Operational Modes, Security & Audits, and Support sections at the end.

Then choose the setup path for your validator client and follow its numbered steps:

Understanding the Architecture

BAM Architecture Overview
BAM Architecture Overview

The BAM system operates within a Trusted Execution Environment (TEE), providing secure transaction scheduling while maintaining validator sovereignty over block production. This applies to both setup paths below.

Common Configuration Reference

These three topics apply to both setup paths. Read them before following either one.

Choose Your Region

Connect to the BAM Node closest to your validator. Both setup paths use these endpoints: Jito-Solana passes one to --bam-url, and FireBAM points its bam tile at the same host with port 50055.

Global Endpoints (Recommended)

Use these global URLs for automatic routing to the nearest BAM scheduler.

NetworkBAM URL
Mainnethttp://mainnet.bam.jito.wtf
Testnethttp://testnet.bam.jito.wtf
Regional Endpoints (Advanced)

Pin your connection to a specific city if you need precise locality or want to benchmark individual schedulers.

NetworkRegionBAM URL
Mainnet๐Ÿ‡ณ๐Ÿ‡ฑ Amsterdamhttp://ams.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡บ๐Ÿ‡ธ Ashburnhttp://iad.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡บ๐Ÿ‡ธ Dallashttp://dfw.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡ฎ๐Ÿ‡ช Dublinhttp://dub.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡ฉ๐Ÿ‡ช Frankfurthttp://fra.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡ญ๐Ÿ‡ฐ Hong Konghttp://hkg.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡ฌ๐Ÿ‡ง Londonhttp://lon.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡บ๐Ÿ‡ธ Los Angeleshttp://lax.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡บ๐Ÿ‡ธ New Yorkhttp://ewr.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡บ๐Ÿ‡ธ Pittsburghhttp://pit.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡บ๐Ÿ‡ธ Salt Lake Cityhttp://slc.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡บ๐Ÿ‡ธ Seattlehttp://sea.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡ฑ๐Ÿ‡น ล iauliaihttp://sqq.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡ธ๐Ÿ‡ฌ Singaporehttp://sin.mainnet.bam.jito.wtf
Mainnet๐Ÿ‡ฏ๐Ÿ‡ต Tokyohttp://tyo.mainnet.bam.jito.wtf
Testnet๐Ÿ‡บ๐Ÿ‡ธ Dallashttp://dfw.testnet.bam.jito.wtf
Testnet๐Ÿ‡ฉ๐Ÿ‡ช Frankfurthttp://fra.testnet.bam.jito.wtf
Testnet๐Ÿ‡บ๐Ÿ‡ธ New Yorkhttp://ewr.testnet.bam.jito.wtf
Testnet๐Ÿ‡บ๐Ÿ‡ธ Salt Lake Cityhttp://slc.testnet.bam.jito.wtf
Testnet๐Ÿ‡บ๐Ÿ‡ธ Seattlehttp://sea.testnet.bam.jito.wtf

Reference Addresses

Both paths configure the same tip programs and Block Engine endpoint โ€” Jito-Solana through CLI flags, FireBAM through [tiles.bundle] in its config file.

โ„น๏ธ
Latest On-Chain Addresses:
For the latest tip payment program and tip distribution program addresses, and merkle root upload authority, see: https://jito-foundation.gitbook.io/mev/mev-payment-and-distribution/on-chain-addresses
โ„น๏ธ
Latest Block Engine Address:
For the latest block-engine-url: https://docs.jito.wtf/lowlatencytxnsend/#api

Leader Schedule Requirement

Your validator needs to be in the leader schedule in order to connect to BAM. BAM will only establish connections with validators that have upcoming leader slots.

Setup Path 1: Jito-Solana (Agave)

Step 1: Install the Jito-Solana Client

The BAM client is integrated into supported Jito-Solana releases as an opt-in feature.

Step 2: Configure Your Validator

Running the BAM validator client is similar to running Jito-Solana, but requires one configuration addition:

# Required BAM configuration flag
--bam-url <BAM_NODE_URL>                    # Connect to BAM scheduler

# Additional important flags for Block Engine integration
--shred-receiver-address <ADDRESS>          # Shred receiver address, described in https://docs.jito.wtf/lowlatencytxnsend/#api
--block-engine-url <BLOCK_ENGINE_URL>       # Block engine endpoint, described in https://docs.jito.wtf/lowlatencytxnsend/#api

Testnet Example

agave-validator \
  --identity /path/to/validator-keypair.json \
  --vote-account /path/to/vote-account-keypair.json \
  --ledger /path/to/ledger \
  --bam-url http://testnet.bam.jito.wtf \
  --shred-receiver-address shredstream.testnet.block-engine.jito.wtf:1002 \
  --block-engine-url https://testnet.block-engine.jito.wtf \
  --rpc-port 8899 \
  --tip-payment-program-pubkey GJHtFqM9agxPmkeKjHny6qiRKrXZALvvFGiKf11QE7hy \
  --tip-distribution-program-pubkey DzvGET57TAgEDxvm3ERUM4GNcsAJdqjDLCne9sdfY4wf \
  --merkle-root-upload-authority 7T4inmPmtNBX3MhLwJ9hFsSMnGJYYkKioVABSNTWVRuS \
  --commission-bps 800 \
  # ... your other testnet configuration

Mainnet Example

agave-validator \
  --identity /path/to/validator-keypair.json \
  --vote-account /path/to/vote-account-keypair.json \
  --ledger /path/to/ledger \
  --bam-url http://mainnet.bam.jito.wtf \
  --shred-receiver-address shredstream.mainnet.block-engine.jito.wtf:1002 \
  --block-engine-url https://mainnet.block-engine.jito.wtf \
  --rpc-port 8899 \
  --tip-payment-program-pubkey T1pyyaTNZsKv2WcRAB8oVnk93mLJw2XzjtVYqCsaHqt \
  --tip-distribution-program-pubkey 4R3gSG8BpU4t19KYj8CfnbtRpnT8gtk4dvTHxVRwc2r7 \
  --merkle-root-upload-authority 8F4jGUmxF36vQ6yabnsxX6AQVXdKBhs8kGSUuRKSg8Xt \
  --commission-bps 800 \
  # ... your other mainnet configuration

Step 3: Enabling Metrics Collection (Recommended)

To enable metrics collection for your BAM validator, export the following environment variable:

Testnet

export SOLANA_METRICS_CONFIG="host=https://metrics.solana.com:8086,db=tds,u=testnet_write,p=c4fa841aa918bf8274e3e2a44d77568d9861b3ea"

Mainnet

export SOLANA_METRICS_CONFIG="host=https://metrics.solana.com:8086,db=mainnet-beta,u=mainnet-beta_write,p=password"
โš ๏ธ
Requires Restart:
This optional metrics collection configuration will require a validator restart to take effect.

Step 4: Runtime Configuration (Optional)

You can enable, update, or disable the BAM configuration during runtime using the agave-validator CLI tool without restarting your validator.

Enable or Update BAM URL

agave-validator --ledger <DIR> set-bam-config --bam-url <bam_url>

Example:

agave-validator --ledger /path/to/ledger set-bam-config --bam-url http://$NETWORK.bam.jito.wtf

Disable BAM

# Disable BAM (leave --bam-url empty)
agave-validator --ledger <DIR> set-bam-config --bam-url

Example:

agave-validator --ledger /path/to/ledger set-bam-config --bam-url
โ„น๏ธ
Runtime Changes:
These commands take effect immediately - no validator restart required. Use the operational modes table below to understand which mode your validator will be in.

Setup Path 2: FireBAM (Firedancer / Frankendancer)

FireBAM is a fork of Firedancer that adds BAM support for Firedancer and Frankendancer validators. The steps below cover the minimum FireBAM-specific setup. For host requirements, complete configuration, monitoring, and recovery procedures, see the full FireBAM setup guide.

Step 1: Build FireBAM

Select the intended release, then clone and prepare the repository:

git clone --recurse-submodules https://github.com/jito-foundation/firebam.git
cd firebam
git checkout RELEASE_TAG
git submodule update --init --recursive
./deps.sh

Build only the binary for your validator mode:

# Firedancer
make -j firedancer

# Frankendancer
make -j fdctl

Use firedancer for Firedancer or fdctl for Frankendancer. The binaries are written to build/native/gcc/bin/.

Step 2: Configure FireBAM

Start with your existing reviewed validator configuration and use the checked-in BAM configuration for your cluster and validator mode as a reference:

Validator mode Mainnet Testnet
Firedancer Link Link
Frankendancer Link Link
โš ๏ธ
Tiles Must Be Enabled at Startup:
The bundle and BAM tiles cannot be added through hot reconfiguration.
[tiles.bundle].enabled = true must be present at startup before bundle functionality can be used.
[tiles.bam].enabled = true must be present at startup before BAM functionality can be used.

Step 3: Start FireBAM

Replace mainnet.toml with the exact path to your reviewed configuration and run only the command for your validator mode:

# Firedancer
sudo -E ./build/native/gcc/bin/firedancer run --config mainnet.toml

# Frankendancer
sudo -E ./build/native/gcc/bin/fdctl run --config mainnet.toml

Run FireBAM under your validator's process supervisor. Do not start a second validator against the same identity, ledger, or accounts directories.

Step 4: Verify FireBAM

Inspect the configured topology using the applicable command:

# Firedancer
./build/native/gcc/bin/firedancer mem --config mainnet.toml | grep -E '(^|[[:space:]])(bam|bam_verif|pack_bam_(ldr|res)|bank_bam|bam_status|bam_ctrl|bam_fee_cfg)([[:space:]]|$)'

# Frankendancer
./build/native/gcc/bin/fdctl mem --config mainnet.toml | grep -E '(^|[[:space:]])(bam|bam_verif|pack_bam_(ldr|res)|bank_bam|bam_status|bam_ctrl|bam_fee_cfg)([[:space:]]|$)'

Confirm the running validator's BAM configuration:

# Firedancer
./build/native/gcc/bin/firedancer get-bam --config mainnet.toml

# Frankendancer
./build/native/gcc/bin/fdctl get-bam --config mainnet.toml

Run only the command for your validator mode. It should report the expected enabled, url, and sni values. If HTTP metrics are enabled, check BAM health and pack progress:

curl -s http://127.0.0.1:7999/metrics | grep -E '^(bam_|pack_bam_)'

When BAM is connected and healthy, bam_enabled, bam_healthy, and bam_stream_live should each be 1.

Step 5: Runtime BAM Control (Optional)

The BAM endpoint and enable state can be changed without restarting only if the validator started with [tiles.bam].enabled = true:

# Firedancer
./build/native/gcc/bin/firedancer set-bam --config mainnet.toml --enable --url http://mainnet.bam.jito.wtf:50055
./build/native/gcc/bin/firedancer set-bam --config mainnet.toml --disable

# Frankendancer
./build/native/gcc/bin/fdctl set-bam --config mainnet.toml --enable --url http://mainnet.bam.jito.wtf:50055
./build/native/gcc/bin/fdctl set-bam --config mainnet.toml --disable

Always pass the same configuration file used to start the validator. See the full FireBAM setup guide for testnet endpoints, identity changes, metric definitions, and troubleshooting.

Operational Modes

Your validator operates in one of these modes depending on your configuration:

ModeDescriptionSchedulerBundle/Txn Source
Normal AgaveStandard Solana validator behaviorInternal Agave SchedulerTPU ingestion
Block-EngineJito MEV-enhanced operationInternal with Block EngineJito Block Engine & TPU
BAMExternal scheduler delegationExternal BAM SchedulerBAM Node via gRPC

๐Ÿ”’ Security & Audits

โ„น๏ธ
Professional Audits:
BAM undergoes rigorous security review by leading blockchain security firms to ensure validator safety and network integrity.

Support