Skip to main content

DEX

Super AI Chain ships Uniswap V2, Uniswap V3, the Universal Router (v1.6.0), and Permit2 — all deployed from the official audited bytecode. The pair/pool init code hashes are byte-for-byte identical to Ethereum mainnet, so any Uniswap interface fork, SDK, router, or aggregator works by configuring the chain ID and addresses — no SDK hash patching required.

The Universal Router is the canonical swap entrypoint: it aggregates V2 + V3 liquidity in a single execute call and supports gasless ERC20 approvals via Permit2 (sign once, no per-swap approve transaction).

Contracts

ContractAddressExplorer
v2Factory0xbc2FDEd5A1eb9570DC07Bd612c6A2a11aD5584BEview ↗
v2Router020x97E36Bb18B91063f3Db6F9D68E12712792a91cc3view ↗
v3Factory0x72A19e1D0E9412a93FEddA95d97Ab7dfa2ae92e3view ↗
v3PositionManager0x8D1A0Cc629bF35220D12B65abf7DCA1f172D611eview ↗
v3Router0x88554F2c4Aa6AC5cBd361268742EF77a4b1c1e58view ↗
v3Quoter0x44522A5eda8500d3A80BC97c5480E0279A25bf3eview ↗
universalRouter0xAbe4C84F49378A1f9f6f156C0f9457Be867c7F1Eview ↗
permit20xF9633dB82BE2bbb028D7EB647e1AfB4EaF9c60fDview ↗

The Universal Router needs two init-code hashes to compute pair/pool addresses on the fly. They are part of the deployment record (not addresses, so they are not in the table above):

FieldValue
pairInitCodeHash (V2)0x96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f
poolInitCodeHash (V3)0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54

Tokens:

ContractAddressExplorer
WSUP0x1C92f577bc06A15a03AF3c1420ef13d2f648D6E0view ↗
tUSDT0x9a7a9bceA6499cf0bC015f80A39dfD48DC1c7497view ↗
tUSDC0x7c64cA79320501Cb2d2739f9E16897B52B1fBB28view ↗
tBUSD0x7dBACea11D2cAb75d88473973C4C07522cc3484Bview ↗

Swap with the SDK (Universal Router + Permit2)

@superaichain/sdk wraps the whole flow — best-route quoting (single hop or two hops via WSUP), the one-time Permit2 approval, the EIP-712 signature, and the execute call:

import { SuperClient } from '@superaichain/sdk';
import { parseUnits } from 'viem';
import { privateKeyToAccount } from 'viem/accounts';

const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`);
const client = SuperClient.testnet({ account });
const { stables } = client.addresses;

// Inspect the route the SDK picked (V2/V3, single or multi-hop).
const route = await client.swap.routeExactIn({
tokenIn: stables.WSUP,
tokenOut: stables.tUSDT,
amountIn: parseUnits('1', 18),
});
console.log(route.label, route.amountOut); // e.g. "V3(3000)" 998312...

// Execute via the Universal Router. The SDK approves Permit2 + signs once,
// reuses the allowance afterwards, and applies 0.5% slippage by default.
const { hash, amountOutMin } = await client.swap.exactInUniversal({
tokenIn: stables.WSUP,
tokenOut: stables.tUSDT,
amountIn: parseUnits('1', 18),
slippageBps: 50,
});
console.log('swap tx', hash, 'min out', amountOutMin);

Python (superaichain) mirrors the same flow:

from superaichain import SuperClient

client = SuperClient.testnet(private_key=PRIVATE_KEY)
stables = client.addresses["stables"]
res = client.swap.exact_in_universal(
stables["WSUP"], stables["tUSDT"], 10**18, slippage_bps=50
)
print(res["hash"], res["amountOutMin"])

V2 vs V3

V2V3
Liquidityfull-rangeconcentrated
Fee tiers0.30% fixed0.05% / 0.30% / 1%
Best forsimple poolscapital-efficient LPs

Try it

Open the Swap UI to swap, add liquidity, and inspect pools.

Next steps