Skip to content

Liquidity providers

26 aggregator classes exist in swap-sdk; 21 are registered in TradeManager's constructor. Registration is the only authority on what is live.

This table is a snapshot

Providers get commented out in-place when their upstream API breaks. Read swap-sdk/src/index.ts for current state; counting files in src/aggregators/ overstates coverage.

Registered providers

ProviderEnumSwapBridgeProxiedNotes
1inchone_inchyesyesExcluded from the default swap fan-out. ONE_INCH_KEY, referrer 0x5222…1D35
KyberSwapkyber_swapyesno
OpenOceanopen_oceanyesyesExcluded from both default lists. Also supplies gas prices via Base.getGasPrice
UnizenunizenyesyesyesUNIZEN_API_KEY. Own supported-chain subset (ChainIdUnizen)
SushiSwapsushiswapyesno
OdosodosyesyesTransaction-data endpoint 500s intermittently
OKXokxyesyes
UniswapuniswapyesyesUNISWAP_API_KEY
LiFilifiyesyesnoA meta-aggregator itself
SymbiosissymbiosisyesnoExcluded from the default swap list
Squid Routersquid_routeryesyesyesAxelar-based. Integrator id blazpay-db534a27-…
AcrossacrossyesnoUsually fastest for supported pairs
RelayrelayyesyesyesIntent solver — see the caveat below
Butter Networkbutter_networkyesyesnoExcluded from the default bridge list
NordsternnordsternyesyesnoIntent solver — calldata selector 0x57f96440…
Near 1Clicknear_1clickyesyesNEAR intents
GasZipgas_zipyesyesSmall native top-ups to a fresh chain
RhinoFirhino_fiyesyesMulti-step: quote → commit → calldata
RangorangoyesyesnoMeta-aggregator
deBridgedebridgeyesno
XY Financexy_financeyesyesno
HoudinihoudiniyesnoPrivacy-oriented

Not registered

ProviderEnumWhy
Router Protocol / NitronitroMainnet pathfinder hostnames retired — api-beta.pathfinder.routerprotocol.com is NXDOMAIN
IceCreamSwapicecream_swapaggregator.icecreamswap.com returns 404; endpoint appears removed
Kimakimakima.blazpay.com origin down (Cloudflare 520)
ChangeNowchange_nowCommented out

Kima is the template for self-broadcasting providers

Its aggregator returns tx: null because Kima submits server-side. The frontend records the returned id and polls getTxStatus. Any future provider that broadcasts itself should follow this shape — tx: null plus a metaData payload, and a dedicated sendTransaction<Provider> branch rather than the relayer path.

Default exclusions

Set in bz-backend/services/swap.service.js. The frontend can override.

ListMembersRationale
excludeSwapsymbiosis, one_inch, open_ocean (+ icecream_swap on Polygon)Bridge-oriented or poor same-chain pricing
excludeBridgeicecream_swap, one_inch, butter_network, open_oceanSame-chain only, or excluded by choice

Backend proxy endpoints

Providers needing a secret key or a registered referrer go through bz-backend, so nothing key-bearing ships in a browser bundle.

ProviderEndpointsController
1inchPOST /defi/1inch, POST /defi/1inch/getspenderoneinch.js
OpenOceanPOST /defi/openoceanopenocean.js
UnizenPOST /defi/unizen/{quotes,swap,spender}unizen.controller.js
SquidPOST /defi/squidrouter, GET /defi/squidrouter/statussquidRouter.js
OdosPOST /defi/odos/{quote,assemble}odos.js
AcrossGET /defi/across/{quote,status}across.js
Near 1ClickGET /defi/near-1click/tokens, POST /quote, GET /statusnear1click.js
RelayPOST /defi/relay/quote, GET /defi/relay/statusrelay.js
GasZipGET /defi/gas-zip/{quote,status}gaszip.js
RhinoFiPOST /defi/rhino/quote, POST /commit/:quoteId, GET /calldata/:commitmentId, POST /deposit-addresses, GET /deposit-addresses/:addr/:chainrhino.js
OKXGET /defi/okx/{quote,swap,approve-transaction}okx.js
UniswapPOST /defi/uniswap/{quote,swap}uniswap.js
ChangeNowPOST /defi/change-now/{quotes,swap}changeNow.js
ChangellyPOST /defi/changelly, POST /defi/changelly/transactionchangelly.js

Full request/response detail: provider proxies.

Direct-call providers

Called straight from the SDK with no proxy: LiFi, Butter, KyberSwap, Symbiosis, Nordstern, SushiSwap, Rango, deBridge, XY Finance, Houdini — plus the disabled Nitro and IceCream.

Intent solvers — read before using in automation

Relay and Nordstern deliver zero output in-transaction

Both are intent/solver based: they take the input and a solver fills the order moments later, outside the transaction.

That is fine for an interactive bridge, where the user watches a status poll. It is unusable for automation — the DCA and Autopilot vaults measure the balance delta inside the transaction, see zero, and revert with OutputBelowMinimum.

The execution engine's route probe filters them out by simulating each candidate with estimateGas before selection. Nordstern's giveaway is a 0x57f96440… selector; Relay's is token-transfer calldata.

Status endpoints

routers in swap-sdk/src/utils/constants.ts maps each aggregator to its status API URL. getTxStatus(chainId, hash) on each aggregator returns:

ts
{ status: 'pending' | 'success' | 'failed', hash }

Consumed by GET /defi/txn/:walletAddress and bridgeStatusCron.js.

Fiat ramps

A separate category — not in the AGGREGATORS enum, quoted through services/buy.js.

ProviderStrengthController
OnRamp.moneyIndia — INR via UPI, IMPS, bankonRampController.js
ChangellyBroad fiat + instant crypto-to-cryptochangelly.js, changellyFiat.js
AlchemyPayGlobal cards, strong APACalchemyController.js
TransakGlobal cards and banktransak.js
MoonPayGlobal cardsmoonPay.js

See buy / sell and fiat API.

Other external venues

VenueProductIntegration
Orderly NetworkPerpetualsorderlyController.js, ed25519 request signing
iZiSwapSpot limit orders — unshippediziswap-sdk in defi-dex
HyperliquidCopy trading — not builtExternal copytrade-agent repo
Qube / QubeticsChain-specific bridgequbeBridge.controller.js, POST /defi/bridge/qube
ZeroDevdApp builder smart accounts@zerodev/*, permissionless

Counting honestly

ClaimDefensible?
"26 providers integrated"Yes — 26 aggregator classes exist
"21 live liquidity providers"Yes at time of writing — count the registrations
"20+ providers"Yes, and drift-proof
"25 providers live"No

Marketing materials have said "14", which is badly understated, and other numbers that are overstated. The PROOF_POINTS block in chainSeo.mjs uses 21.

Adding a provider

Checklist: add a liquidity provider. There is also a self-contained integration guide in the SDK repo at swap-sdk/INTEGRATION_GUIDE.md.

Internal + developer documentation. Usage figures are point-in-time snapshots — re-verify before publishing them.