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_listempty 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::Circularin[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, andenable_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 = 1Connection and polling
enabled: turns Circular/Finder routing on.refresh_interval_secs: how often the bot refreshes Circular results. Default is120. Runtime clamps it to at least1.api_url: preferred override for the finder base URL. The bot queries<api_url>/finder.base_url: fallback override for the finder base URL whenapi_urlis 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. Defaulttrue.enable_usdc_pool: include USDC/X pool discovery. Defaulttrue.enable_usd1_pool: include USD1/X pool discovery. Defaulttrue.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. Default5, capped at50. Setting0clears the merged response and produces no routes.max_time_range: token analysis window in seconds. Default300.min_profit_token/max_profit_token: token net-profit bounds in USD. Default minimum is50.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 astokensOnly.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. Default3600.threshold_amount: legacy fallback for threshold profits. Default1000.threshold_provider: threshold provider enum. Supported values:FAST,TEMPORAL,JITO,NEXTBLOCK,BLOX,ASTRALANE,FLASHBLOCK,NODEONE,RAZOR,SENDER,STELLIUM,RPC,SMB,ALL. Default isJITO.threshold_bot: bot family for threshold calculation. Supported values:SMB,NOTARB,ALL.threshold_profits: explicit threshold profit override in USD. If set, it wins overthreshold_amount.threshold_revenues: explicit threshold revenue override in USD.threshold_transactions: explicit threshold transaction-count override.fees_percentiles: fee percentile selector. Defaultp75.tips_percentiles: tip percentile selector. Defaultp90.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
amountbut thepercentilelabel is empty, the bot still uses the returned amount. It only skips the informational log line that printsCircular fees percentile ...orCircular tips percentile .... - If Circular returns no fee
amountor returns0, the bot falls back to the minimum configured compute-unit-price floor collected from[spam].compute_unit_price.minand any[[sending_venders.sending_vender]].compute_unit_price.min. If none are set, the fallback is0. - If Circular returns no tip
amountor returns0, the bot falls back to[jito].tip_config.min, or1000lamports 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 at5.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: defaultprocess_delayassigned to generated mint configs. Default400.default_bundle_group: defaultbundle_groupassigned to generated mint configs. If omitted, runtime falls back to bundle group1.
If amm is omitted or empty, the bot requests this default AMM set, each with max_pools_list = 2:
PUMP_AMMMETEORA_DLMMRAYDIUM_CPMMRAYDIUM_CLMMRAYDIUM_V4WHIRLPOOL
Supported AMM identifiers
The bot currently maps Circular AMMs into these onchain routing buckets:
PUMP_AMM/PUMPMETEORA_DLMMMETEORA/METEORA_DAMMMETEORA_DAMMV2/METEORA_DAMM_V2RAYDIUM_V4RAYDIUM_CPMM/RAYDIUM_CPRAYDIUM_CLMMPANCAKESWAP/PANCAKE_SWAPBYREALWHIRLPOOLHUMIDIFIVERTIGOHEAVENFUTARCHY
You can use either the symbolic name above or the AMM program id in amm and required_amms.