sliders-upConfiguration

circle-exclamation

Below is a list of available config options for running the FOMO bot.

Important: Spam will continuously poll for new mints every 10secs. Once mint(s) are found, the bot will spam that mint for whatever duration (in minutes) is set for refresh_interval. During that time, a background task will update the markets and relative accounts for that mint every 10secs. I.e. markets will be updated with latest data for that mint, so no edge is lost - and won't be spamming old, degraded pools.

circle-info

Note: only mint (1) trigger is required. Max. 6.

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