Quickstart
Run Fynd
Get Fynd running locally. This guide covers building, running, and tuning the solver. No code changes required.
Prerequisites
Rust 1.92+ (install via rustup)
A Tycho API key (get one here)
1. Build
git clone https://github.com/propeller-heads/fynd.git
cd fynd
cargo build --releaseThe release binary will be at target/release/fynd.
2. Set Environment Variables
export TYCHO_API_KEY=your-api-key
export RUST_LOG=info3. Run
All on-chain protocols are fetched from Tycho RPC by default, so --protocols is optional. The --tycho-url also defaults to the Fynd endpoint for the selected chain.
To run on a different chain, use --chain:
--rpc-url defaults to the public endpoint https://eth.llamarpc.com. For production, pass a dedicated endpoint:
You can also specify protocols explicitly:
See the full list of available protocols.
Once running, Fynd:
Connects to Tycho's Streams and syncs all protocol states
Builds routing graphs and computes derived data (spot prices, pool depths and token gas prices)
Starts the HTTP API on
http://localhost:3000
Wait for the /v1/health endpoint to return healthy before sending orders.
3.1 Including RFQ Protocols
Include RFQ (Request-for-Quote) protocols alongside on-chain protocols. Use the all_onchain keyword to combine auto-fetched on-chain protocols with specific RFQ protocols:
Or specify both on-chain and RFQ protocols explicitly:
Limitations:
RFQ protocols cannot run alone. At least one on-chain protocol is required.
Environment variables:
RFQ protocols require API keys passed via environment variables. Check the RFQ protocol docs for the specific variables each protocol needs.
3.2 Check Solver Health
Returns "healthy":true when ready to receive requests.
4. Request a quote
Get the quote for 1 WETH -> USDC (or any pair/amount you want):
The response includes the optimal route, amounts, gas estimates, and the net output after gas costs.
4.1 - Optional request fields
Overrides the default solve timeout (configured via global config see configuration section).
Return early after N solver pools respond. If set to null - it will wait for all solver pools respond until timeout.
Discard routes above this gas limit
Full interface details: API Specifications
5. Configuration
Tune Fynd with the following flags:
Required
--tycho-api-key
TYCHO_API_KEY
Tycho API key
Optional
--rpc-url
RPC_URL
https://eth.llamarpc.com
Ethereum RPC endpoint. Use a dedicated endpoint in production.
--tycho-url
TYCHO_URL
(chain-specific)
Tycho URL. Defaults to the Fynd endpoint for the selected chain (e.g. tycho-fynd-ethereum.propellerheads.xyz).
--chain
--
Ethereum
Target chain
-p, --protocols
--
(all on-chain)
Protocols to index (comma-separated). If omitted, all on-chain protocols are fetched from Tycho RPC. Use all_onchain to combine auto-fetched protocols with explicit entries (e.g. all_onchain,rfq:bebop).
--http-host
HTTP_HOST
0.0.0.0
HTTP bind address
--http-port
HTTP_PORT
3000
API port
--min-tvl
--
10.0
Minimum pool TVL in native token (ETH)
--tvl-buffer-ratio
--
1.1
Hysteresis buffer for TVL filtering. Components are added when TVL >= min_tvl and removed when TVL drops below min_tvl / tvl_buffer_ratio.
--traded-n-days-ago
--
3
Only include tokens traded within this many days.
--worker-router-timeout-ms
--
100
Default solve timeout (ms)
--worker-router-min-responses
--
0
Early return threshold (0 = wait for all pools)
-w, --worker-pools-config
WORKER_POOLS_CONFIG
worker_pools.toml
Worker pools config file path
--blacklist-config
BLACKLIST_CONFIG
blacklist.toml
Blacklist config file path
--disable-tls
--
false
Disable TLS for Tycho connection
--gas-refresh-interval-secs
--
30
Gas price refresh interval
--reconnect-delay-secs
--
5
Reconnect delay on connection failure
--gas-price-stale-threshold-secs
--
(disabled)
Health returns 503 when gas price exceeds this age. Disabled by default.
Run cargo run --release -- serve --help for the full list.
5.1 - Worker pools file (worker_pools.toml)
worker_pools.toml)Worker pools control solver thread count and routing strategies. The default config ships with two pools:
Both pools solve every incoming order in parallel. Fynd picks the best result across pools within the timeout.
Worker Pool Configuration:
algorithm
"most_liquid"
Algorithm used for the pool
num_workers
CPU count
Number of OS threads dedicated to this pool
task_queue_capacity
1000
Maximum number of orders that can be queued simultaneously
min_hops
1
Minimum number of hops required for routing
max_hops
3
Maximum number of hops permitted for routing
timeout_ms
100
Maximum time in milliseconds allowed per order processing in this pool
max_routes
(no limit)
Maximum number of candidate routes to evaluate per order
Tuning tips:
More workers = more orders can be solved concurrently. Each worker is a dedicated OS thread, so avoid exceeding your CPU core count across all pools.
Lower
max_hops= faster solves but may miss better multi-hop routes.Higher
max_hops= explores deeper routes but takes longer. Pair with a highertimeout_ms.The "fast + deep" pattern (default config) gives quick responses from the 2-hop pool while the 3-hop pool searches for better routes in the background.
To use a custom config file:
5.2 Blacklist (blacklist.toml)
blacklist.toml)Exclude specific components from routing, useful for components with known simulation issues ( e.g., rebasing tokens on UniswapV3 pools):
6. Logging and Monitoring
Logs
Control log verbosity with RUST_LOG:
Prometheus Metrics
Metrics are exposed at http://localhost:9898/metrics (always on). Scrape this endpoint with Prometheus or any compatible tool. Available metrics: solve duration, response counts, failure types, and pool performance.
7. Validating and Executing the Solutions
With Fynd running, you can validate and execute swaps using fynd-swap-cli — a CLI binary included in the repository at tools/fynd-swap-cli/. It supports dry-run simulation (no funds or private key required) and on-chain execution.
See Executing the solutions for the full walkthrough.
Last updated