Validator Onboarding
Step-by-step instructions for integrating your validator with shMonad.
Order of Operations
For new validators joining shMonad, follow this sequence:
- Get onboarded to shMonad - A coinbase contract will be deployed for you
- Update beneficiary address - Change your
node.tomlbeneficiary to the coinbase contract address and apply the config change (no restart needed) - Run the sidecar - Set up the MEV Sidecar to earn MEV rewards
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.
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.
# 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:
monad-debug-node --control-panel-ipc-path /home/monad/monad-bft/controlpanel.sock reload-config
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.
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.
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
FASTLANE_HOME=/home/monad/fastlane/
mkdir -p $FASTLANE_HOME
echo -e "NETWORK='testnet'" > $FASTLANE_HOME/.env
echo -e "NETWORK='mainnet'" > $FASTLANE_HOME/.env
sudo apt update && sudo apt install fastlane-sidecar=0.0.13
dpkg -l fastlane-sidecar | grep fastlane-sidecar
Run
sudo systemctl enable fastlane-sidecar
sudo systemctl start fastlane-sidecar
sudo systemctl status fastlane-sidecar
sudo journalctl -fu fastlane-sidecar
Checking the Installation
curl http://localhost:8765/health | jq
last_received_at- Must be a recent timestamp, indicating the sidecar is functioning properlytx_received- Number of transactions the sidecar received from monad-bft. Must be non-zero to be considered healthy
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
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.
sudo systemctl edit fastlane-sidecar
Add the following in the editor that opens:
[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:
sudo systemctl daemon-reload
Custom Health Check Port
The sidecar exposes a health check endpoint on default port 8765. For a custom port:
sudo systemctl edit fastlane-sidecar
Add the following in the editor that opens:
[Service]
ExecStart=
ExecStart=/usr/bin/fastlane-sidecar \
--log-level info \
--network "${NETWORK}" \
--monitoring-port <CUSTOM_PORT>
Save and exit, then reload:
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:
sudo systemctl edit fastlane-sidecar
Add the following in the editor that opens (replace CPU values as needed):
[Service]
AllowedCPUs=16-19
CPUAffinity=16,17,18,19
Save and exit, then reload:
sudo systemctl daemon-reload