Jupiter vs 1inch: Cross-Chain Routing for Arb Bots
Building a jupiter vs 1inch arbitrage bot? Compare Metis and Pathfinder routing on quote latency, slippage, gasless Fusion fills, and API rate limits.
A cross-chain arb bot that quotes both Solana and an EVM chain lives or dies on two aggregators: Jupiter on Solana and 1inch on Ethereum, Arbitrum, Base, and the rest of the EVM set. They solve the same problem — find the best price across fragmented liquidity — but the machinery underneath is different enough that you cannot write one abstraction and expect it to behave. Metis (Jupiter's router) and Pathfinder (1inch's router) have different latency profiles, different failure modes, and completely different ideas about who pays gas. If you treat them as interchangeable behind a getQuote() interface, your fill rate on one leg will quietly rot.
Here's what actually matters when you're wiring both into the same bot.
Quote latency: the number that sets your edge
On Solana, a Jupiter Quote API call typically returns in 40–120 ms from a well-placed server, and the quote is a snapshot of on-chain reserves as of a recent slot. Metis does a two-phase search — it prunes the DEX graph, then runs a split-route optimizer across pools like Orca Whirlpools, Raydium CLMM, and Meteora DLMM. The output is a route plan plus a swapTransaction you sign. Because Solana blocks are ~400 ms, a 100 ms quote is fresh enough that you're mostly racing other bots, not the clock.
1inch Pathfinder is a heavier search. On mainnet with deep liquidity, /quote and /swap calls from the public API commonly land in 200–500 ms, and Pathfinder splits across dozens of protocols with multi-hop paths that can span three or four pools. That latency is fine for a manual swap. For an arb bot it's a problem, because the EVM state you quoted against may have moved by the time your transaction is mined 12 seconds later. The mitigation is to quote aggressively, but that runs straight into rate limits (below).
Practical consequence: your Solana leg can be near-just-in-time, but your EVM leg needs a staleness buffer baked into the spread threshold. I usually widen the required edge on the 1inch side by the expected price drift over one to two blocks, estimated from recent volatility, rather than trusting a quote that's already 400 ms old. This is the same class of latency-vs-freshness tradeoff that shows up when you compare Meteora DLMM and Orca Whirlpools for an LP bot — the routing math is only as good as the state it ran against.
Slippage models are not the same field
Both APIs take a slippage parameter, but they mean subtly different things.
- Jupiter enforces
slippageBpsat the program level — the swap instruction reverts on-chain if the out-amount falls below the minimum. You can also hand it a computedminOutAmountdirectly and skip Jupiter's slippage entirely, which is what you want in a bot: compute your own floor from your own price feed, don't let the aggregator pick it. - 1inch returns
toAmountand you setslippage(a percentage) on the/swapbuild. The router contract enforces the min return, but on EVM you're also exposed to sandwich MEV between quote and inclusion, so your effective slippage is worse than the number suggests unless you route privately.
That private-routing point is where the two chains diverge hard. On Solana you fight MEV with priority fees and Jito bundles; on EVM 1inch gives you Fusion.
Gasless fills: Fusion changes the arb math
1inch Fusion (and Fusion+) turns a swap into a Dutch-auction intent. You sign an order, resolvers compete to fill it, and the resolver pays gas. For an arb bot this is genuinely useful for two reasons: your EVM leg no longer needs the chain's native gas token pre-funded on every wallet, and the fill is submitted through a private channel, so the sandwich risk on that leg drops sharply.
The catch is that Fusion is an auction, not an instant swap. The price starts favorable to you and decays over the auction window until a resolver finds it profitable. So you trade execution certainty for gaslessness and MEV protection. For a latency-sensitive arb where you need both legs to land in a tight window, a decaying auction on one side introduces timing risk you have to model. A rough decision rule I use:
# EVM leg execution mode for a cross-chain arb
def evm_leg_mode(edge_bps, native_gas_funded, urgency):
if urgency == "must_land_this_block":
return "classic_swap" # pay gas, deterministic inclusion
if not native_gas_funded or edge_bps < 25:
return "fusion" # resolver eats gas, MEV-protected
return "classic_swap_private_rpc" # gas + private tx, tight timing
Jupiter has no direct Fusion equivalent — there's no gasless resolver network on Solana. What you get instead is cheap base fees plus a priority-fee auction and optional Jito bundles for atomic landing. If your strategy needs the Solana buy and the EVM sell to be near-atomic, understand that these are two different inclusion mechanisms with no shared guarantee. The Solana-side landing question is worth its own study; the tradeoffs in bloXroute versus Jito for MEV bundle landing apply directly to how you get the Jupiter leg included on time.
API rate limits will shape your architecture
This is the boring detail that decides whether your bot works at scale.
- Jupiter runs a free public tier that's fine for testing but throttles hard under real polling, plus paid tiers and self-hostable infrastructure. Many serious Solana bots self-host the Jupiter API or run their own routing so they aren't sharing a rate bucket with the whole ecosystem. If you're quoting a dozen pairs several times a second, the hosted free endpoint is not it.
- 1inch gates the Dev Portal API by API key with per-second and monthly caps that vary by plan. Pathfinder quotes are expensive to serve, so the limits bite quickly. You cannot brute-force freshness by polling
/quotein a tight loop — you'll get 429s and your effective quote age gets worse, not better.
The architectural answer on both sides is the same: keep a local order-book / pool-state cache, price most opportunities off your own state, and only hit the aggregator to confirm and build the transaction on candidates that already look profitable. Treat the aggregator call as the last mile, not the scanner. This is one of the first things I flag in a strategy consultation — teams burn their rate budget scanning when they should be scanning locally and quoting selectively.
A concrete side-by-side
| Jupiter (Metis) | 1inch (Pathfinder / Fusion) | |
|---|---|---|
| Typical quote latency | 40–120 ms | 200–500 ms |
| State freshness vs inclusion | ~400 ms blocks, near-JIT | ~12 s blocks, quote drifts |
| Slippage control | On-chain min-out, or your own minOutAmount |
slippage %, MEV-exposed unless Fusion |
| Gasless option | None (priority fee / Jito) | Fusion Dutch auction, resolver pays gas |
| Rate limits | Public tier throttles; self-host common | API-key tiers, 429s under tight polling |
What I'd actually build
Quote Solana off a self-hosted Jupiter route API or your own pool state, compute your own min-out, and land via priority fees or a Jito bundle when atomicity matters. On the EVM side, default to Fusion for anything that isn't time-critical to shed gas funding and sandwich risk, and fall back to a classic swap through a private RPC only when you need deterministic same-block inclusion. Keep the two legs decoupled with an inventory buffer on each chain so you're not forced into a synchronous cross-chain fill that neither aggregator can guarantee.
Two mistakes I see constantly: assuming Fusion's auction fill is instant, and polling both aggregators as your scanner. Both come from copying single-chain patterns into a cross-chain bot. If you're wiring Metis and Pathfinder into one system and want the routing, inventory, and landing logic pressure-tested before it touches mainnet, a code review and architecture audit is the cheapest way to catch the leg that's silently losing money.
Need a bot like this built?
We design, build and run trading bots on Solana, Hyperliquid and Polymarket.
Start a projectMore from the blog
Public vs Paid RPC: How to Run a Fair Benchmark
A fair comparison of public and paid RPC endpoints must account for quotas, workload, freshness and support guarantees.
Read articleRPC Benchmark Percentiles Explained: p50, p95 and p99
Why averages hide the latency spikes that break trading bots, wallets and production blockchain applications.
Read articleHyperliquid REST vs WebSocket Benchmark: What to Measure
A benchmark plan for Hyperliquid market data that separates request latency from streaming freshness and recovery.
Read article