Skip to main content
SODAX swaps are intents, not bridges. Your user signs one transaction on Optimism that locks the input and declares what they want on the destination network. Solvers fill it; the SODAX relayer carries proof between Optimism, 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 an ERC-20 token.

What this looks like on Optimism

  • Source: the intent transaction is an ordinary EVM transaction on OP Mainnet. ChainKeys.OPTIMISM_MAINNET ('0xa.optimism') identifies the network everywhere in the SDK.
  • Reach: any solver-compatible asset on any SODAX network is a valid destination, 166 assets today. The on-Optimism asset list only bounds what users hold on Optimism itself, not what they can swap into.
  • Tokens: standard ERC-20 contracts at their OP Mainnet addresses; native ETH uses the zero address. Read addresses from the SDK config rather than typing them.
  • Settlement: output lands on the destination network at dstAddress. Swaps into Optimism settle as ordinary ETH or ERC-20 balances; the recipient needs no setup.

Approvals

swap() does not approve the input token for you. ETH is the native token and needs no approval. Every ERC-20 does: SODAX’s asset manager on Optimism pulls it through the token’s ERC-20 interface, so check the allowance first and approve when it falls short.
params is the same intent params object you pass to swap().

Quoting

The solver API quotes both directions:
getQuote deducts any configured partner fee before quoting, so quoted_amount is the net output the user actually receives.

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.
The user also pays Optimism’s network fee for the intent transaction, in ETH. On OP Mainnet that fee has two main parts: execution gas, priced like Ethereum gas, and an L1 data fee that covers publishing the transaction to Ethereum and moves with Ethereum’s gas price. sodax.swaps.estimateGas returns gas units for the execution part only, so budget some ETH beyond gas × gasPrice. Details: Transaction fees on OP Mainnet.

Executing

Prefer swap(). It creates the intent on Optimism, verifies it landed, submits it to the relay, waits for the packet on the hub, and notifies the solver. The Quickstart has the complete call. Track progress with getStatus(request), and cancel unfilled intents with cancelIntent. Limit orders (intents without deadlines) work from Optimism too, via createLimitOrder. Orchestrating manually with createIntent and submitIntent works the same as on any EVM network: Optimism 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.