Skip to main content

Validator Onboarding

Step-by-step instructions for integrating your validator with shMonad.

Order of Operations

For new validators joining shMonad, follow this sequence:

  1. Get onboarded to shMonad - A coinbase contract will be deployed for you
  2. Update beneficiary address - Change your node.toml beneficiary to the coinbase contract address and apply the config change (no restart needed)
  3. Run the sidecar - Set up the MEV Sidecar to earn MEV rewards
caution

Following the correct order of operations is important to ensure no funds are lost during the transition.

Configure Dedicated Fullnodes

Add FastLane's fullnode identities to your node.toml to enable MEV transaction routing to your validator.

caution

If your node.toml already has an empty assignment like [fullnode_dedicated] identities = [], you must remove or comment out that line before adding the entries below. The TOML array-of-tables syntax ([[fullnode_dedicated.identities]]) is different from the empty inline assignment.

Add to your node.toml
# Remove this line if it exists:
# [fullnode_dedicated] identities = []

# Add FastLane fullnode identities:
[[fullnode_dedicated.identities]]
secp256k1_pubkey = "<FastLane Node 1 pubkey>"

[[fullnode_dedicated.identities]]
secp256k1_pubkey = "<FastLane Node 2 pubkey>"

Both FastLane nodes should be added. After saving, apply the changes without restarting:

Reload config on the fly
monad-debug-node --control-panel-ipc-path /home/monad/monad-bft/controlpanel.sock reload-config
note

You will receive the specific pubkey values during onboarding. Contact the shMonad team if you haven't received them.

MEV Sidecar

To participate in the FastLane MEV program, validators are required to run the MEV Sidecar on the same machine that is running the validator Monad node. Starting from v0.12.6, monad-bft allows external applications to access the content of its local transaction mempool and to communicate transaction ordering preferences. The MEV Sidecar inspects transactions and scores them according to the MEV they hold.

Minimum Version Requirement

The MEV Sidecar requires monad-bft v0.12.6 or later. If you are running an older version, the sidecar will connect but tx_received will remain at 0. Upgrade monad-bft before proceeding.

The MEV Sidecar is provided as a Debian package. This guide assumes a Monad node ≥ v0.12.6 is running and synchronized on the validator's machine, and has been installed following the Monad official instructions.

Security

  • Architecture: The sidecar runs as a separate process alongside monad-bft. If it crashes or is stopped, your validator continues operating normally with no impact to consensus participation.
  • Source code: The sidecar is source-available. You can review the code at github.com/FastLane-Labs/fastlane-sidecar.
  • Network access: The sidecar connects to FastLane infrastructure to receive MEV bundles. It does not modify your validator's consensus behavior.
  • Removal: To stop using the sidecar, simply run sudo systemctl stop fastlane-sidecar && sudo systemctl disable fastlane-sidecar. Change your beneficiary address back to your own wallet if desired.

Installation

Install the latest MEV Sidecar version, v0.0.13.

Add FastLane repository
sudo wget -qO - https://fastlane.xyz/apt/fastlane-apt-key.gpg.bin -O /usr/share/keyrings/fastlane-apt-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/fastlane-apt-keyring.gpg] https://fastlane-apt-repo.s3.amazonaws.com stable main" | sudo tee /etc/apt/sources.list.d/fastlane.list
Create FastLane directory
FASTLANE_HOME=/home/monad/fastlane/
mkdir -p $FASTLANE_HOME
Configure for testnet
echo -e "NETWORK='testnet'" > $FASTLANE_HOME/.env
Configure for mainnet
echo -e "NETWORK='mainnet'" > $FASTLANE_HOME/.env
Install sidecar
sudo apt update && sudo apt install fastlane-sidecar=0.0.13
Verify installation
dpkg -l fastlane-sidecar | grep fastlane-sidecar

Run

Enable and start the service
sudo systemctl enable fastlane-sidecar
sudo systemctl start fastlane-sidecar
Check status
sudo systemctl status fastlane-sidecar
View logs
sudo journalctl -fu fastlane-sidecar

Checking the Installation

Health check
curl http://localhost:8765/health | jq
  • last_received_at - Must be a recent timestamp, indicating the sidecar is functioning properly
  • tx_received - Number of transactions the sidecar received from monad-bft. Must be non-zero to be considered healthy
note

monad-bft gets transactions from the network when the validator is about to become the next leader (as per Monad design), therefore tx_received can show 0 for a few minutes before it starts increasing.

Prometheus Metrics

Prometheus metrics
curl http://localhost:8765/prometheus/metrics

Optional Overrides

The MEV Sidecar works out of the box. This section outlines possible configuration overrides.

Custom Home Directory

Default value is /home/monad/fastlane/. For a custom location, ensure a .env file exists there with the appropriate content (see Installation section) and is accessible by the monad user.

Edit the service configuration
sudo systemctl edit fastlane-sidecar

Add the following in the editor that opens:

Custom home directory override
[Service]
ExecStart=
ExecStart=/usr/bin/fastlane-sidecar \
--log-level info \
--home </your/custom/path> \
--network "${NETWORK}"

EnvironmentFile=
EnvironmentFile=</your/custom/path/>.env

ReadWritePaths=
ReadWritePaths=</your/custom/path/>

Save and exit, then reload:

Reload systemd
sudo systemctl daemon-reload

Custom Health Check Port

The sidecar exposes a health check endpoint on default port 8765. For a custom port:

Edit the service configuration
sudo systemctl edit fastlane-sidecar

Add the following in the editor that opens:

Custom port override
[Service]
ExecStart=
ExecStart=/usr/bin/fastlane-sidecar \
--log-level info \
--network "${NETWORK}" \
--monitoring-port <CUSTOM_PORT>

Save and exit, then reload:

Reload systemd
sudo systemctl daemon-reload

CPU Pinning

Each Monad application is assigned a set of CPUs to optimize performance. By default, the MEV Sidecar reuses the CPUs assigned to the monad-rpc application, as it should be doing very little on a validator node.

For validators with more than 16 CPUs available who prefer to isolate the sidecar:

Edit the service configuration
sudo systemctl edit fastlane-sidecar

Add the following in the editor that opens (replace CPU values as needed):

CPU pinning override
[Service]
AllowedCPUs=16-19
CPUAffinity=16,17,18,19

Save and exit, then reload:

Reload systemd
sudo systemctl daemon-reload