SolanaMevBotSolanaMevBot

Circular Config

Full reference for routing.circular_api on the onchain bot

Circular config

routing.circular_api lets the bot fetch candidate mints, pools, fee recommendations, and tip recommendations from Circular/Finder instead of manually maintaining routing.mint_config_list.

Before you enable it

routing.circular_api.enabled = true changes how routing is built. The bot will reject several mixed modes at startup.

  • Leave routing.mint_config_list empty when Circular is enabled.
  • Do not set [routing.markets] when Circular is enabled.
  • Set [bot].skip_ata_creation = true.
  • If [bot].merge_mints = true, you must also set [bot].auto_merge = true.
  • Do not configure [third_party] while Circular is enabled.
  • TipStrategy::Circular in [spam], [jito], or [[sending_venders.sending_vender]] only works when Circular is enabled.
  • Circular routing supports SOL as the base mint, or USDC only when enable_sol_pool = false, enable_usdc_pool = true, and enable_usd1_pool = false.

Example

[routing.circular_api]
enabled = true
refresh_interval_secs = 5

enable_sol_pool = true
enable_usdc_pool = true
enable_usd1_pool = true

# api_key = "your-circular-key"

max_tokens_list = 5
max_time_range = 3600
threshold_max_time_range = 3600

min_profit_token = 50
min_transactions_token = 10
min_profit_pool = 5

threshold_amount = 1000
threshold_provider = "JITO"
threshold_bot = "SMB"

fees_percentiles = "p75"
tips_percentiles = "p90"
percentiles_provider = "ALL"
percentiles_bot = "SMB"
percentiles_time_range = 3600

amm = [
  { address = "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", max_pools_list = 4 },
  { address = "cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG", max_pools_list = 2 },
  { address = "pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA", max_pools_list = 2 },
  { address = "CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C", max_pools_list = 2 },
  { address = "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8", max_pools_list = 2 },
]

exclude_tokens = [
  "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "So11111111111111111111111111111111111111112",
]

default_process_delay = 400
default_bundle_group = 1

Connection and polling

  • enabled: turns Circular/Finder routing on.
  • refresh_interval_secs: how often the bot refreshes Circular results. Default is 120. Runtime clamps it to at least 1.
  • api_url: preferred override for the finder base URL. The bot queries <api_url>/finder.
  • base_url: fallback override for the finder base URL when api_url is unset.
  • api_key: explicit API key. If no key is present, the bot still runs but uses public Circular fee mode.

The finder timeout can also be overridden with CIRCULAR_FINDER_TIMEOUT_SECS and defaults to 15.

Base pool selection

  • enable_sol_pool: include SOL/X pool discovery. Default true.
  • enable_usdc_pool: include USDC/X pool discovery. Default true.
  • enable_usd1_pool: include USD1/X pool discovery. Default true.
  • token: optional single-mint finder token parameter. If unset, the bot uses the current base mint.

When Circular is enabled, the bot queries the enabled base pools and merges the returned candidates before building routing configs.

Token filters

  • max_tokens_list: max number of routed tokens after merge. Default 5, capped at 50. Setting 0 clears the merged response and produces no routes.
  • max_time_range: token analysis window in seconds. Default 300.
  • min_profit_token / max_profit_token: token net-profit bounds in USD. Default minimum is 50.
  • min_transactions_token / max_transactions_token: token transaction-count bounds.
  • min_market_cap_token / max_market_cap_token: token market-cap bounds in USD.
  • min_volume_token / max_volume_token: total volume bounds in USD.
  • min_volume_arbitrage_token / max_volume_arbitrage_token: arbitrage volume bounds in USD.
  • min_volume_trade_token / max_volume_trade_token: trade volume bounds in USD.
  • min_liquidity_token / max_liquidity_token: liquidity bounds in USD.
  • min_revenues_token / max_revenues_token: gross revenue bounds in USD.
  • min_pool_token: minimum number of pools required per returned mint.
  • min_profit_pool: per-pool profit floor in USD. Pools below this are discarded before the mint config is built.
  • exclude_tokens: tokens to exclude from the final routing set.
  • only_include_tokens: forwarded to Finder as tokensOnly.
  • wallets: optional signer filter forwarded to Finder.

If exclude_tokens contains SOL, USDC, or USD1, those mints can still be used as query bases when their enable_*_pool flag is on, then filtered out from the final token list afterward.

Threshold and percentile controls

  • threshold_max_time_range: threshold-analysis window in seconds. Default 3600.
  • threshold_amount: legacy fallback for threshold profits. Default 1000.
  • threshold_provider: threshold provider enum. Supported values: FAST, TEMPORAL, JITO, NEXTBLOCK, BLOX, ASTRALANE, FLASHBLOCK, NODEONE, RAZOR, SENDER, STELLIUM, RPC, SMB, ALL. Default is JITO.
  • threshold_bot: bot family for threshold calculation. Supported values: SMB, NOTARB, ALL.
  • threshold_profits: explicit threshold profit override in USD. If set, it wins over threshold_amount.
  • threshold_revenues: explicit threshold revenue override in USD.
  • threshold_transactions: explicit threshold transaction-count override.
  • fees_percentiles: fee percentile selector. Default p75.
  • tips_percentiles: tip percentile selector. Default p90.
  • percentiles_provider: provider used for percentile lookup.
  • percentiles_bot: bot family used for percentile lookup.
  • percentiles_time_range: percentile-analysis window in seconds.

Runtime behavior when Circular omits percentile data:

  • If Circular returns a fee or tip amount but the percentile label is empty, the bot still uses the returned amount. It only skips the informational log line that prints Circular fees percentile ... or Circular tips percentile ....
  • If Circular returns no fee amount or returns 0, the bot falls back to the minimum configured compute-unit-price floor collected from [spam].compute_unit_price.min and any [[sending_venders.sending_vender]].compute_unit_price.min. If none are set, the fallback is 0.
  • If Circular returns no tip amount or returns 0, the bot falls back to [jito].tip_config.min, or 1000 lamports if that minimum is unset.

If Circular returns a threshold block and is_arbitrage_recommended is false, the bot skips the entire refresh cycle for that tick.

AMM filters and generated routing defaults

  • amm: optional Finder AMM filter list.
  • amm[].name: symbolic AMM name.
  • amm[].address: AMM program id.
  • amm[].max_pools_list: max pools kept for that AMM. The bot caps each entry at 5.
  • required_amms: list of AMM program ids that must be present for each mint before the bot will send transactions. When routes need trimming to fit size limits, non-required pools are removed first.
  • default_process_delay: default process_delay assigned to generated mint configs. Default 400.
  • default_bundle_group: default bundle_group assigned to generated mint configs. If omitted, runtime falls back to bundle group 1.

If amm is omitted or empty, the bot requests this default AMM set, each with max_pools_list = 2:

  • PUMP_AMM
  • METEORA_DLMM
  • RAYDIUM_CPMM
  • RAYDIUM_CLMM
  • RAYDIUM_V4
  • WHIRLPOOL

Supported AMM identifiers

The bot currently maps Circular AMMs into these onchain routing buckets:

  • PUMP_AMM / PUMP
  • METEORA_DLMM
  • METEORA / METEORA_DAMM
  • METEORA_DAMMV2 / METEORA_DAMM_V2
  • RAYDIUM_V4
  • RAYDIUM_CPMM / RAYDIUM_CP
  • RAYDIUM_CLMM
  • PANCAKESWAP / PANCAKE_SWAP
  • BYREAL
  • WHIRLPOOL
  • HUMIDIFI
  • VERTIGO
  • HEAVEN
  • FUTARCHY

You can use either the symbolic name above or the AMM program id in amm and required_amms.

On this page