Configuration
Config.toml
## ===================================================================
## BOT SETTINGS
## ===================================================================
## Configures general bot settings.
##
## Settings:
## - RPC URL: RPC url for fetching onchain related data (NOT for sending)
## - Auto Restart: auto restart interval (in minutes). 0 => run indefinitely
## - Debug Mode: if true, enables debug mode with verbose error logging
## - Slot Memo: if true, prepends the slot the tx landed to memo message
## - Close Unused ATAs: if true, closes unused ATAs at start-up not in the current mint list (that have 0 balance) to reclaim rent-exempt SOL.
## - FOMO API Key: optional API key. If present, waives the FOMO Platform Fee of 3.75%.
##
## For more info, visit: https://discord.gg/RaEa694AH5
[bot]
rpc_url = "https://solana-rpc.publicnode.com"
auto_restart = 10
debug_mode = false
slot_memo = false
close_unused_atas = true
fomo_api_key = ""
## ===================================================================
## AUTO STANDBY
## ===================================================================
## Automatically pauses bot when market sentiment is below a set threshold.
## Note: Market sentiment is calculated based on the number of arbitrage transactions in the last X hours
## and is only checked when the bot starts or restarts, not continuously
##
## Settings:
## - Enabled: if true, enables auto standby mode
## - Min Market Sentiment: minimum sentiment level to keep bot active
## • Options: 0 (ngmi, < 168 txs/min), 1 (meh, ≥ 168 txs/min), 2 (neutral, ≥ 243 txs/min), 3 (wagmi, ≥ 278 txs/min)
## - Window: time window for sentiment calculation
## • Options: 1hr, 6hr, 12hr
## - Custom Threshold: set a custom txs/min threshold vs. using sentiment levels (0 = disabled)
## • If > 0, bypasses min_market_sentiment and uses this 'txs per minute' threshold instead
[auto_standby]
enabled = true
min_market_sentiment = 1
window = "6hr"
custom_threshold = 0
## ===================================================================
## MARKETS
## ===================================================================
## Configures market settings across all strategies.
##
## Settings:
## - Skip Pools Without ALUTs: if true, skips pools with no found ALUTs
## - Enabled DEXes: list of enabled DEXes. DEX availability varies by onchain provider.
[markets]
skip_pools_without_aluts = false
enabled_dexes = [
"pump_swap",
"meteora_dlmm",
"meteora_damm_v2",
"raydium_amm",
"raydium_clmm",
"raydium_cpmm",
"whirlpool"
]
## ===================================================================
## REBALANCER
## ===================================================================
## Converts WSOL to SOL when SOL balance drops below a certain threshold.
##
## Settings:
## - Enabled: if true, enables the rebalancer
## - Min SOL Balance: minimum SOL balance (in lamports) before triggering a rebalance
## - Min WSOL Balance: minimum WSOL balance (in lamports) to wrap back after unwrapping
## • If 0, will just create WSOL ATA
## - CU Price TX: compute unit price for the rebalance transaction
##
## Note: Triggers when SOL < min_sol_balance and total balance (SOL + WSOL) covers min_sol_balance + min_wsol_balance.
[rebalancer]
enabled = true
min_sol_balance = 100_000_000 # 0.1 SOL
min_wsol_balance = 0
cu_price_tx = 100_000
## ===================================================================
## FLASHLOANS
## ===================================================================
## Enables flashloan support across all strategies.
## Uses onchain provider's (i.e. SMB & NotArb) in-house flashloan programs
##
## Note: enabling flashloans will override min/max trade size settings in Searcher
[flashloans]
enabled = true
## ===================================================================
## OPTIMAL PRIORITY FEE
## ===================================================================
## Configures optimal priority fee settings across all strategies.
##
## Settings:
## - Enabled: if true, overrides compute_unit_price across ALL strategies and triggers
## - Use Recommended: if true, uses recommended fee computed from FOMO's Loot API. Else uses specified percentile
## - Percentile: percentile to use for fee calculation (e.g., 60 -> 60%)
## - Update Interval: interval (in seconds) to update priority fee data
##
## Note: when using multiple mint triggers, generally you want to manually set CU price per trigger.
[optimal_priority_fee]
enabled = false
use_recommended = true
percentile = 65
update_interval = 45
## ===================================================================
## DURABLE NONCES
## ===================================================================
## Great for spamming multiple senders per opportunity: the first tx processed
## by leader (success or fail) consumes the nonce, automatically invalidating
## the rest — meaning only ONE sender can land per opportunity.
##
## How it works:
## 1. Bot creates and manages a nonce-account pool automatically
## 2. Each account requires a small rent-exempt SOL deposit + tx fees
## 3. When nonce is consumed, it's recycled for next opportunity
##
## Settings:
## - Enabled: if true, enables durable nonces
## - Num Accounts: number of nonce accounts to create/manage
## - Close Unused Nonces: if true (and nonces disabled), closes existing nonce accounts at start-up to reclaim SOL
## - Nonce Seed: overrides default seed for nonce account creation
## • Only needed when running multiple bot instances on same wallet (use unique seed per instance)
## • Leave empty to use default seed (recommended)
##
## Recommendations:
## - Spam: 4+ nonce accounts
##
## Note: if all nonces are in-use, txs will not be sent. Ensure enough nonces for your use-case.
[durable_nonces]
enabled = false
num_accounts = 4
close_unused_nonces = true
nonce_seed = ""
## ===================================================================
## SPAM STRATEGY
## ===================================================================
## Continuously sends transactions onchain to calculate the most optimal
## trade size and executes any profitable opportunities.
##
## How it works:
## 1. Fetches mints matching your trigger criteria (see SPAM MINT TRIGGERS below)
## 2. Builds and sends transaction(s) every process_delay cycle
## 3. Onchain program calculates optimal trade size and executes if profitable
## 4. Refreshes mints after refresh_interval (unless stay_on_winner extends it)
##
## Settings:
## - Onchain Program: the onchain program(s) to use for tx execution. Options: smb, notarb
## • If multiple set, opportunity will be sent to each one.
## - Memo: optional memo to add to txs
## - Disable Durable Nonces: disables the use of durable nonces on this strategy
## - Disable Set Loaded Accounts: if true, skips adding SetLoadedAccountsDataSizeLimit instruction to transactions
## - Refresh Interval: cycle (in minutes) to search/refresh mint(s)
## - Stagger TXs: if true (and multiple onchain programs), fires sequentially instead of parallel
## • Stagger interval = trigger's process_delay / number of programs
## • Example: 400ms trigger process delay + 2 programs → each fires 200ms apart
## - Max Compute Unit Limit: max compute unit limit per transaction
## - Max Markets Per TX: max number of markets to include per transaction (Recommended: 4)
## - Stay On Winner: extends cycle when wallet has ≥ min_wins in current interval
## • Example: min_wins = 2, refresh_interval = 1min, and wallet lands 3 txs → continues spamming instead of rotating mints
##
## Base Mints:
## - Enable/disable each base mint to control which market pairs are used
## - Supported: SOL, USDC, USD1
##
## For more info, visit: https://fomo-mev.gitbook.io/docs/bot/configuration
[strategy.spam]
enabled = true
onchain_program = ["notarb"]
memo = ""
disable_durable_nonces = false
disable_set_loaded_accounts = false
refresh_interval = 1
stagger_txs = false
max_compute_unit_limit = 409_690
max_markets_per_tx = 4
stay_on_winner = { enabled = true, min_wins = 2 }
[[strategy.spam.base_mint]] # WSOL
enabled = true
base_mint = "So11111111111111111111111111111111111111112"
[[strategy.spam.base_mint]] # USDC
enabled = true
base_mint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
[[strategy.spam.base_mint]] # USD1
enabled = true
base_mint = "USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB"
## ===================================================================
## SPAM MINT TRIGGERS
## Powered by FOMO's Loot API
## ===================================================================
## Defines filter criteria for finding mints to arb. Each trigger can have
## different thresholds (aggressive vs conservative) and its own sender configs.
##
## How it works:
## 1. Triggers are processed in order (top to bottom)
## 2. Each trigger filters mints by ROI, volume, txs, market cap, etc.
## 3. Matching mints are executed using senders with the same trigger_id
##
## Settings:
## - First Match Only: if true, stops after first trigger finds mint(s). Else runs all matching triggers.
## - Max Mint Count Per Trigger: max mints returned per trigger
## - Aggregation Window: lookback window (seconds) for calculating metrics
## - From Wallets: only include mints traded by these wallets (leave empty for all)
## - From Bots: only include mints traded by these bots (leave empty for all)
## - Exclude Mints: mints to always exclude (e.g., stables)
##
## Trigger Settings:
## - id: unique identifier for this trigger (any string you want, e.g. "aggressive", "conservative", "my-custom-trigger")
## • Must have at least one sender with matching trigger_id.
## - Process Delay: delay (in ms) between sending each transaction for this trigger.
## - rank_by: how to rank mints (momentum, roi, volume, etc.)
## - min_roi/min_volume/min_txs: minimum thresholds
## - min/max_market_cap: market cap range filter
## - markets_per_mint: filter criteria for pools (liquidity, volume, txs)
##
## Tips:
## - Order triggers aggressive → conservative (strictest filters first)
## - With first_match_only = true, first matching trigger wins
## - Min 1 required, Max 6 enabled triggers allowed
## - Each trigger_id must have at least one matching sender
##
## For more info, visit: https://fomo-mev.gitbook.io/docs/bot/configuration
[strategy.spam.mints.fomo]
enabled = true
first_match_only = true
max_mint_count_per_trigger = 1
aggregation_window = 300
from_wallets = []
from_bots = []
exclude_mints = [
"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
"USD1ttGY1N17NEEHLmELoaybftRBUSErhqYiQzvEmuB"
]
## ===================================================================
## SPAM MINT TRIGGER: AGGRESSIVE
## ===================================================================
## For list of all available senders, visit: https://fomo-mev.gitbook.io/docs/bot/senders
[[strategy.spam.mints.fomo.trigger]]
enabled = true
id = "aggressive"
process_delay = 200
rank_by = "momentum"
min_roi = 100
min_volume = 10_000
min_txs = 300
min_market_cap = 0
max_market_cap = 100_000_000
markets_per_mint = { min_liquidity_usd = 500, min_vol = 0, min_txs = 0, rank_by = "liquidity" }
[[strategy.spam.sender]]
type = "rpc"
enabled = true
trigger_id = "aggressive" # must match the trigger id set in the trigger config
skip_durable_nonce = false
compute_unit_price = 100_000
max_compute_unit_price = 250_000
use_different_tx_per_sender = false
no_failure_mode = true
send_urls = [
"https://beta.helius-rpc.com/?api-key=********************"
]
[[strategy.spam.sender]]
type = "helius"
enabled = true
trigger_id = "aggressive" # must match the trigger id set in the trigger config
api_key = ""
skip_durable_nonce = false
compute_unit_price = 100_000
max_compute_unit_price = 250_000
use_different_tx_per_region = false
tip_amount = { strategy = "random", from = 1_000_000, to = 2_500_000 }
no_failure_mode = false
swqos_only = false
regions = ["fra"]
## ===================================================================
## SPAM MINT TRIGGER: MODERATE
## ===================================================================
## For list of all available senders, visit: https://fomo-mev.gitbook.io/docs/bot/senders
[[strategy.spam.mints.fomo.trigger]]
enabled = true
id = "moderate"
process_delay = 400
rank_by = "momentum"
min_roi = 100
min_volume = 5_000
min_txs = 200
min_market_cap = 0
max_market_cap = 100_000_000
markets_per_mint = { min_liquidity_usd = 500, min_vol = 0, min_txs = 0, rank_by = "liquidity" }
[[strategy.spam.sender]]
type = "rpc"
enabled = true
trigger_id = "moderate" # must match the trigger id set in the trigger config
skip_durable_nonce = false
compute_unit_price = 60_000
max_compute_unit_price = 150_000
use_different_tx_per_sender = false
no_failure_mode = true
send_urls = [
"https://beta.helius-rpc.com/?api-key=********************"
]
[[strategy.spam.sender]]
type = "helius"
enabled = true
trigger_id = "moderate" # must match the trigger id set in the trigger config
api_key = ""
skip_durable_nonce = false
compute_unit_price = 60_000
max_compute_unit_price = 150_000
use_different_tx_per_region = false
tip_amount = { strategy = "random", from = 1_000_000, to = 2_500_000 }
no_failure_mode = false
swqos_only = false
regions = ["fra"]
## ===================================================================
## SPAM MINT TRIGGER: CONSERVATIVE
## ===================================================================
## For list of all available senders, visit: https://fomo-mev.gitbook.io/docs/bot/senders
[[strategy.spam.mints.fomo.trigger]]
enabled = true
id = "conservative"
process_delay = 200
rank_by = "momentum"
min_roi = 20
min_volume = 1_000
min_txs = 100
min_market_cap = 0
max_market_cap = 100_000_000
markets_per_mint = { min_liquidity_usd = 500, min_vol = 0, min_txs = 0, rank_by = "liquidity" }
[[strategy.spam.sender]]
type = "rpc"
enabled = true
trigger_id = "conservative" # must match the trigger id set in the trigger config
skip_durable_nonce = false
compute_unit_price = 8_000
max_compute_unit_price = 100_000
use_different_tx_per_sender = false
no_failure_mode = true
send_urls = [
"https://beta.helius-rpc.com/?api-key=********************"
]
[[strategy.spam.sender]]
type = "helius"
enabled = true
trigger_id = "conservative" # must match the trigger id set in the trigger config
api_key = ""
skip_durable_nonce = false
compute_unit_price = 8_000
max_compute_unit_price = 100_000
use_different_tx_per_region = false
tip_amount = { strategy = "random", from = 10_000_000, to = 15_000_000 }
no_failure_mode = false
swqos_only = false
regions = ["fra"]Last updated