Appearance
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
| Provider | Enum | Swap | Bridge | Proxied | Notes |
|---|---|---|---|---|---|
| 1inch | one_inch | yes | — | yes | Excluded from the default swap fan-out. ONE_INCH_KEY, referrer 0x5222…1D35 |
| KyberSwap | kyber_swap | yes | — | no | |
| OpenOcean | open_ocean | yes | — | yes | Excluded from both default lists. Also supplies gas prices via Base.getGasPrice |
| Unizen | unizen | yes | yes | yes | UNIZEN_API_KEY. Own supported-chain subset (ChainIdUnizen) |
| SushiSwap | sushiswap | yes | — | no | |
| Odos | odos | yes | — | yes | Transaction-data endpoint 500s intermittently |
| OKX | okx | yes | — | yes | |
| Uniswap | uniswap | yes | — | yes | UNISWAP_API_KEY |
| LiFi | lifi | yes | yes | no | A meta-aggregator itself |
| Symbiosis | symbiosis | — | yes | no | Excluded from the default swap list |
| Squid Router | squid_router | yes | yes | yes | Axelar-based. Integrator id blazpay-db534a27-… |
| Across | across | — | yes | no | Usually fastest for supported pairs |
| Relay | relay | yes | yes | yes | Intent solver — see the caveat below |
| Butter Network | butter_network | yes | yes | no | Excluded from the default bridge list |
| Nordstern | nordstern | yes | yes | no | Intent solver — calldata selector 0x57f96440… |
| Near 1Click | near_1click | — | yes | yes | NEAR intents |
| GasZip | gas_zip | — | yes | yes | Small native top-ups to a fresh chain |
| RhinoFi | rhino_fi | — | yes | yes | Multi-step: quote → commit → calldata |
| Rango | rango | yes | yes | no | Meta-aggregator |
| deBridge | debridge | — | yes | no | |
| XY Finance | xy_finance | yes | yes | no | |
| Houdini | houdini | — | yes | no | Privacy-oriented |
Not registered
| Provider | Enum | Why |
|---|---|---|
| Router Protocol / Nitro | nitro | Mainnet pathfinder hostnames retired — api-beta.pathfinder.routerprotocol.com is NXDOMAIN |
| IceCreamSwap | icecream_swap | aggregator.icecreamswap.com returns 404; endpoint appears removed |
| Kima | kima | kima.blazpay.com origin down (Cloudflare 520) |
| ChangeNow | change_now | Commented 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.
| List | Members | Rationale |
|---|---|---|
excludeSwap | symbiosis, one_inch, open_ocean (+ icecream_swap on Polygon) | Bridge-oriented or poor same-chain pricing |
excludeBridge | icecream_swap, one_inch, butter_network, open_ocean | Same-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.
| Provider | Endpoints | Controller |
|---|---|---|
| 1inch | POST /defi/1inch, POST /defi/1inch/getspender | oneinch.js |
| OpenOcean | POST /defi/openocean | openocean.js |
| Unizen | POST /defi/unizen/{quotes,swap,spender} | unizen.controller.js |
| Squid | POST /defi/squidrouter, GET /defi/squidrouter/status | squidRouter.js |
| Odos | POST /defi/odos/{quote,assemble} | odos.js |
| Across | GET /defi/across/{quote,status} | across.js |
| Near 1Click | GET /defi/near-1click/tokens, POST /quote, GET /status | near1click.js |
| Relay | POST /defi/relay/quote, GET /defi/relay/status | relay.js |
| GasZip | GET /defi/gas-zip/{quote,status} | gaszip.js |
| RhinoFi | POST /defi/rhino/quote, POST /commit/:quoteId, GET /calldata/:commitmentId, POST /deposit-addresses, GET /deposit-addresses/:addr/:chain | rhino.js |
| OKX | GET /defi/okx/{quote,swap,approve-transaction} | okx.js |
| Uniswap | POST /defi/uniswap/{quote,swap} | uniswap.js |
| ChangeNow | POST /defi/change-now/{quotes,swap} | changeNow.js |
| Changelly | POST /defi/changelly, POST /defi/changelly/transaction | changelly.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.
| Provider | Strength | Controller |
|---|---|---|
| OnRamp.money | India — INR via UPI, IMPS, bank | onRampController.js |
| Changelly | Broad fiat + instant crypto-to-crypto | changelly.js, changellyFiat.js |
| AlchemyPay | Global cards, strong APAC | alchemyController.js |
| Transak | Global cards and bank | transak.js |
| MoonPay | Global cards | moonPay.js |
See buy / sell and fiat API.
Other external venues
| Venue | Product | Integration |
|---|---|---|
| Orderly Network | Perpetuals | orderlyController.js, ed25519 request signing |
| iZiSwap | Spot limit orders — unshipped | iziswap-sdk in defi-dex |
| Hyperliquid | Copy trading — not built | External copytrade-agent repo |
| Qube / Qubetics | Chain-specific bridge | qubeBridge.controller.js, POST /defi/bridge/qube |
| ZeroDev | dApp builder smart accounts | @zerodev/*, permissionless |
Counting honestly
| Claim | Defensible? |
|---|---|
| "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.