> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sodax.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> SODAX is mainnet-only (no testnet chains or RPC endpoints exist) with a hub-and-spoke architecture; Sonic is the hub. SODAX is non-custodial protocol/software: it routes and settles; independent solvers on the marketplace fill — never say 'our solver', 'the SODAX solver', that SODAX trades, takes custody, or fills orders. For frontend/React integrations, prefer @sodax/dapp-kit hooks over calling @sodax/sdk directly. SDK operations — the methods that build, submit or await a transaction, and the API/quote calls — return Result<T, E> ({ ok: true, value } or { ok: false, error }): check result.ok, never wrap them in try/catch or branch on error.message; discriminate on the narrow error.code union instead. Synchronous config getters (getPartnerFee, getSupportedSwapTokens, getVault, ...) return their value directly, not a Result.

# Swaps on BNB Chain

> Intent-based cross-network swaps from a BNB Chain perspective: one signed EVM transaction, solver-filled, settled across networks.

SODAX swaps are intents, not bridges. Your user signs one transaction on BNB Chain that locks the input and declares what they want on the destination network. Solvers fill it; the SODAX relayer carries proof between BNB Chain, the hub (Sonic), and the destination. If nothing fills, the intent can be cancelled and funds recovered.

From your side it is one SDK call. From your user's side it is one wallet prompt, plus an approval the first time they swap a BEP-20 token.

## What this looks like on BNB Chain

* **Source**: the intent transaction is an ordinary EVM transaction on BNB Smart Chain. `ChainKeys.BSC_MAINNET` (`'0x38.bsc'`) identifies the network everywhere in the SDK.
* **Reach**: any solver-compatible asset on any SODAX network is a valid destination, <span data-sodax-config="count" data-metric="swap-tokens">166</span> assets today. The [on-BNB Chain asset list](/bnb-chain/networks-and-assets) only bounds what users hold on BNB Chain itself, not what they can swap into.
* **Tokens**: BEP-20 tokens, which are ERC-20 contracts at their BNB Smart Chain addresses; native BNB uses the zero address. Read addresses and decimals from the SDK config rather than typing them.
* **Settlement**: output lands on the destination network at `dstAddress`. Swaps into BNB Chain settle as ordinary BNB or BEP-20 balances; the recipient needs no setup.

<h2 id="approvals">
  Approvals
</h2>

`swap()` does not approve the input token for you. BNB is the native token and needs no approval. Every BEP-20 token does: SODAX's asset manager on BNB Chain pulls it through the token's ERC-20 interface, so check the allowance first and approve when it falls short.

```typescript theme={null}
const allowance = await sodax.swaps.isAllowanceValid({ params, walletProvider });
if (!allowance.ok) throw allowance.error;

if (!allowance.value) {
  const approval = await sodax.swaps.approve({ params, walletProvider });
  if (!approval.ok) throw approval.error;
  // wait for the approval to be mined before calling swap()
}
```

`params` is the same intent params object you pass to `swap()`.

## Quoting

The solver API quotes both directions:

```typescript theme={null}
const quoteResult = await sodax.swaps.getQuote({
  token_src: usdt.address,            // USDT on BNB Chain (18 decimals)
  token_dst: usdcArb.address,         // USDC on Arbitrum (6 decimals)
  token_src_blockchain_id: ChainKeys.BSC_MAINNET,
  token_dst_blockchain_id: ChainKeys.ARBITRUM_MAINNET,
  amount: 100n * 10n ** BigInt(usdt.decimals), // 100 USDT
  quote_type: 'exact_input',          // the only supported quote type
});
```

`getQuote` deducts any configured partner fee before quoting, so `quoted_amount` is the net output the user actually receives.

<h2 id="decimals-across-networks">
  Decimals across networks
</h2>

On BNB Chain, USDC and USDT use 18 decimals. On most other SODAX networks they use 6. A swap between them crosses that boundary, so keep each amount in its own token's units:

* `amount` and `inputAmount` use the input token's decimals: 100 USDT on BNB Chain is `100n * 10n ** 18n`.
* `quoted_amount` is in the destination token's smallest unit: for USDC on Arbitrum, 6 decimals. Derive `minOutputAmount` from `quoted_amount`, never from the input amount.
* For display, format each side with its own token's `decimals`.

The same applies in the other direction: 100 USDC swapped from Base into USDT on BNB Chain quotes an output with 18 decimals.

## Fees

Using SODAX is free to integrate. Two fees can apply to a trade:

* **Base fee**: a fixed 0.1% of the input, taken by the protocol. Not configurable; compute it ahead of time with `getSolverFee(inputAmount)`.
* **Your fee**: optional platform fee on top, set by you and paid to you. It is the only fee you control. Configure it at SDK setup and check it with `getPartnerFee(inputAmount)`. See [Monetize SDK](/developers/how-to/monetize_sdk).

The user also pays BNB Chain's network fee for the intent transaction, in BNB, like any other BNB Smart Chain transaction.

## Executing

Prefer `swap()`. It creates the intent on BNB Chain, verifies it landed, submits it to the relay, waits for the packet on the hub, and notifies the solver. The [Quickstart](/bnb-chain/quickstart#4-quote-and-swap) has the complete call. Track progress with `getStatus(request)`, and cancel unfilled intents with `cancelIntent`. Limit orders (intents without deadlines) work from BNB Chain too, via `createLimitOrder`.

Orchestrating manually with `createIntent` and `submitIntent` works the same as on any EVM network: BNB Chain intents need no relay extra data.

## Error handling

Operations return `Result<T>` instead of throwing. The core methods (`swap`, `createIntent`, `postExecution`) return a typed `SodaxError` union you can `switch` on by `error.code`.

***

Full reference, including raw mode, limit orders, cancellation, and the complete error-code table: [Swaps](/developers/packages/foundation/sdk/functional-modules/swaps).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.