Appearance
Address book
The deployed contracts behind Textile FX. More corridors and chains are coming, and this page grows as they go live.
| Chain | Live corridors |
|---|---|
| BNB Smart Chain (56) | cNGN ↔ USDT |
| Ethereum (1) | WETH ↔ USDT, wBRL ↔ USDT, BRS ↔ USDT |
| Base (8453) | cNGN ↔ USDC, TESOURO ↔ USDC, ZARU ↔ USDC |
| Celo (42220) | cNGN ↔ USDT, USDC ↔ USDT, wARS ↔ USDT, wBRL ↔ USDT, IDRX ↔ USDT, wCOP ↔ USDT, wMXN ↔ USDT, CELO ↔ USDT, WETH ↔ USDT, USAT ↔ USDT, G$ ↔ USDT, cNGN ↔ G$ |
| Polygon (137) | TESOURO ↔ USDT |
| BNB Smart Chain testnet (97) | cNGN ↔ USDT, sandbox only |
| Base Sepolia (84532) | cNGN ↔ USDC, ZARU ↔ USDC, sandbox only |
Always verify against this page before interacting with a contract directly. Anything else claiming to be Textile FX is not ours.
BNB Smart Chain (chain 56)
The live cNGN ↔ USDT corridor.
Settlement
| Contract | Address |
|---|---|
| LimitOrderReactor | 0xe03261c0436DB575F92F09EdDF3591E2566B7D97 |
| Fee controller (0.01% / 1 bps taker fee) | 0xBDA5e4d85674Fc3A4566B1080A3c59Dc2526c057 |
| Permit2 (canonical) | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
Operator Vault
| Contract | Address |
|---|---|
| OperatorVaultFactory | 0xe869402211F13a7Ecee3c5153B6E7136243D1Bf0 |
| VaultOrderExecutor | 0x23d61C82e1c38a6f115d4f5a8807f88d271E05b4 |
Tokens
Both tokens are existing assets on BSC, not issued by Textile.
| Token | Address |
|---|---|
| cNGN | 0xa8AEA66B361a8d53e8865c62D142167Af28Af058 |
| USDT (BSC-USD) | 0x55d398326f99059fF775485246999027B3197955 |
BNB Smart Chain testnet (chain 97)
The sandbox cNGN ↔ USDT corridor for integration testing. Test tokens only, no value. See Testnet for how to get set up.
Settlement
The cNGN ↔ USDT corridor settles through this reactor. The fee controller here charges 5 bps (0.05%), not the 1 bps used on BSC mainnet — same address book entry, different deployed rate.
| Contract | Address |
|---|---|
| LimitOrderReactor | 0x65B2f3847b391783e15554D5f2826FBaF318a7Df |
| Fee controller (0.05% / 5 bps taker fee) | 0x65DED1F0270Dd86e9A920dd79caDDB50B67CbdC5 |
| Permit2 (canonical) | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
Tokens
Both are real testnet tokens: cNGN from the cNGN faucet, USDT from the BNB Chain faucet. USDT is 18 decimals on BSC (like mainnet).
| Token | Address |
|---|---|
| cNGN | 0x8a078b182bA9649c03982c2a80CDcc81cdc99dA8 |
| USDT | 0x337610d27c682E347C9cD60BD4b3b107C9d34dDd |
Base (chain 8453)
The live cNGN ↔ USDC, TESOURO ↔ USDC, and ZARU ↔ USDC corridors. Base settles against USDC, not USDT. cNGN is the Compliant Naira token (6 decimals). TESOURO is Etherfuse's tokenized Brazilian Tesouro bond (6 decimals), a different contract from the Polygon one. ZARU is ZAR Universal, a South African rand stablecoin (18 decimals). USDC is Circle's native USDC on Base (6 decimals).
Settlement
| Contract | Address |
|---|---|
| LimitOrderReactor | 0xEb5A29F869FF084B3Fce18d3487a38A56feDC59E |
| Fee controller (0.05% / 5 bps taker fee) | 0x9100D2290fB1eF5AEC1f572a95C1778bF66c8868 |
| Permit2 (canonical) | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
Tokens
Tokens are existing assets on Base, not issued by Textile.
| Token | Address |
|---|---|
| cNGN | 0x46C85152bFe9f96829aA94755D9f915F9B10EF5F |
| TESOURO | 0x7ceE47e7B7CD04CF984e8Dd86C42595B5771A9B2 |
| ZARU | 0xE205b4e7Ac03E3f7b2060C3EDf2171AA7126C0d5 |
| USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
Base Sepolia (chain 84532)
The sandbox cNGN ↔ USDC and ZARU ↔ USDC corridors for integration testing. Test tokens only, no value. See Testnet for how to get set up.
Settlement
The fee controller charges 5 bps (0.05%), same as BSC testnet.
| Contract | Address |
|---|---|
| LimitOrderReactor | 0x3a6e177120c72fB8A95546605D4921FaDDFAe4D9 |
| Fee controller (0.05% / 5 bps taker fee) | 0x350DD0564EadbE4bd6582111507f57E964eC79af |
| Permit2 (canonical) | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
Tokens
All three are real testnet tokens: cNGN from the cNGN faucet, USDC from Circle's faucet, and a testnet ZARU. cNGN and USDC are 6 decimals, ZARU is 18.
| Token | Address |
|---|---|
| cNGN | 0xe2387F04d3858e7Cb64Ef5Ed6617f9B2fcEEAfa2 |
| ZARU | 0x47b025D6002234a5038bCD94767bd82b27C2b96F |
| USDC | 0x036CbD53842c5426634e7929541eC2318f3dCF7e |
Ethereum (chain 1)
The live WETH ↔ USDT, wBRL ↔ USDT, and BRS ↔ USDT corridors. WETH is canonical wrapped ether (18 decimals). wBRL is a wrapped Brazilian real (18 decimals), at the same address as on Celo. BRS is a Brazilian real stablecoin (6 decimals). USDT is Tether (6 decimals).
Settlement
| Contract | Address |
|---|---|
| LimitOrderReactor | 0x26A1aedaa26aFFc4fd9F910acFcA754A31bC43c6 |
| Fee controller (0.05% / 5 bps taker fee) | 0x7b54a3e2837b8c18462457fE3ca294cc37100647 |
| Permit2 (canonical) | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
Tokens
Tokens are existing assets on Ethereum, not issued by Textile.
| Token | Address |
|---|---|
| WETH | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| wBRL | 0xD76f5Faf6888e24D9F04Bf92a0c8B921FE4390e0 |
| BRS | 0x0000006238e3C7797Ae71827da303560bae1B125 |
| USDT | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
Celo (chain 42220)
The live cNGN ↔ USDT, USDC ↔ USDT, wARS ↔ USDT, wBRL ↔ USDT, IDRX ↔ USDT, wCOP ↔ USDT, wMXN ↔ USDT, CELO ↔ USDT, WETH ↔ USDT, USAT ↔ USDT, G$ ↔ USDT, cNGN ↔ G$ corridors. cNGN is the Compliant Naira token (6 decimals). USDC and USDT are the standard Circle and Tether stables (6 decimals). wARS (Argentine peso), wBRL (Brazilian real), wCOP (Colombian peso), and wMXN (Mexican peso) are wrapped local currencies, all 18-decimal ERC-20s. IDRX is the Indonesian rupiah stablecoin (2 decimals). CELO is the chain's native asset through its ERC-20 interface (18 decimals). WETH is wrapped ether over Celo's native bridge (18 decimals). USAT is Tether America's dollar stablecoin (6 decimals). G$ is GoodDollar (18 decimals); the app writes it as GD.
Settlement
| Contract | Address |
|---|---|
| LimitOrderReactor | 0xa9AA0a64769cBed4d3B1Ceb4Df01CdE915C235b3 |
| Fee controller (0.01% / 1 bps taker fee) | 0x7b005466F905DD882A959888154587fA76cd3Ea7 |
| Permit2 (canonical) | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
Operator Vault
| Contract | Address |
|---|---|
| OperatorVaultFactory | 0x88104decA449C797632AfdcA77A3140b24cD844A |
| VaultOrderExecutor | 0x01b006d5c687bde182aa36F542f1f014144742e2 |
Tokens
Tokens are existing assets on Celo, not issued by Textile.
Polygon (chain 137)
The live TESOURO ↔ USDT corridor. TESOURO is Etherfuse's tokenized Brazilian Tesouro bond (6 decimals). USDT is Tether (6 decimals).
Settlement
| Contract | Address |
|---|---|
| LimitOrderReactor | 0xF3ffCF21E621552CFcCC724B965e901cDF0D83fe |
| Fee controller (0.03% / 3 bps taker fee) | 0x6Fb6C3E4650268b868476A729B6997C733F9a859 |
| Permit2 (canonical) | 0x000000000022D473030F116dDEE9F6B43aC78BA3 |
Operator Vault
| Contract | Address |
|---|---|
| OperatorVaultFactory | 0x5a527d072C23d6Dac7DED486dE57ba941938ca35 |
| VaultOrderExecutor | 0x1680649095EfF961E14E7888bAc3B2439db2D993 |
Tokens
Both tokens are existing assets on Polygon, not issued by Textile. Tether upgraded USDT in place to USDT0, so wallets and explorers may show that symbol for the same address.
| Token | Address |
|---|---|
| TESOURO | 0xd574b191B5a00262Ff19953d3CE25543AB7C8098 |
| USDT | 0xc2132D05D31c914a87C6611C10748AEb04B58e8F |
Third-party contracts the app calls
These aren't Textile contracts. They belong to Tether and Uniswap. The Textile FX app sends you to them for two optional steps around a swap: moving USDT between chains, and swapping USDC ↔ USDT on the same chain. Each one is its own transaction from your wallet, separate from the swap. The swap still settles only through the reactor listed above for that chain.
USDT0 bridge (LayerZero)
USDT0 is Tether's LayerZero OFT for USDT. The app uses it to bring USDT from another chain into Celo before a swap, and to send USDT from Celo to another chain after one. Every contract here is a Legacy Mesh deployment: it locks and unlocks existing USDT and takes 0.03% (3 bps) per send. LayerZero also charges a messaging fee, paid in the source chain's gas token as value on the send call.
| Chain | OFT (you call send) | USDT (you approve the OFT) |
|---|---|---|
| Celo (42220) | 0xf10E161027410128E63E75D0200Fb6d34b2db243 | 0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e |
| Ethereum (1) | 0x1F748c76dE468e9D11bd340fA9D5CBADf315dFB0 | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
| Tron | TFG4wBaDQ8sHWWP1ACeSGnoNR6RRzevLPt | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t |
The live routes are Ethereum → Celo and Tron → Celo for funding a swap, and Celo → Ethereum and Celo → Tron for paying out after one. Sends from Tron need a Tron wallet, not an EVM one: TronLink in the browser, or WalletConnect for custody, MPC and mobile wallets. Ethereum's USDT won't change a non-zero allowance to another non-zero value, so on every chain, if your allowance is too low, the app first sets it to zero and then approves the amount you're sending.
Uniswap USDC ↔ USDT
If you want to pay or get paid in the other stable from the one a corridor uses (USDC on a USDT corridor, say), the app swaps between the two on Uniswap v3 on the same chain, before or after the FX swap. You approve the token to SwapRouter02 and call exactInputSingle. The quote comes from QuoterV2 through a read-only eth_call, so the wallet never sends a transaction to the quoter.
These are Uniswap's canonical v3 deployments. Ethereum and Polygon share the same router and quoter addresses. On BSC, both stables use 18 decimals; everywhere else they use 6. Polygon's USDC is native Circle USDC, not bridged USDC.e. Base's USDT is the canonical bridged USDT.
Custody wallet allowlist
If your custody or MPC wallet only lets you call allowlisted contracts, these are the addresses it has to allow, grouped by what you want to do. Allowlist the token contracts too: every flow starts with an ERC-20 approve sent to the token itself.
Swap. For each chain you trade on, allowlist the sell token and that chain's LimitOrderReactor. You approve the reactor, then call executeBatch on it. On BNB Smart Chain, Celo and Polygon, also allowlist the VaultOrderExecutor. When a quote fills from an Operator Vault, the quote's spender is the executor instead of the reactor, and you approve it and call fill on it. Always approve the address the quote names.
You only allowlist a token you sell. The token you buy arrives in your wallet without your wallet calling it. You'll still want to add it as an asset in your custody platform so its balance shows up, and you'll need it allowed once you move it on.
Limit orders. Allowlist Permit2 (0x000000000022D473030F116dDEE9F6B43aC78BA3). You approve the sell token to it once, and canceling an order is a call to Permit2.
Bridge. Allowlist USDT and the USDT0 OFT on the chain you send from. You don't need anything on the receiving chain, because LayerZero delivers the USDT to your wallet there. The send call carries the LayerZero fee as native value (ETH on Ethereum, CELO on Celo), so the policy has to allow a contract call that sends value.
Uniswap hop. Allowlist USDC, USDT and SwapRouter02 on that chain.
For example, to bridge USDT from Ethereum and swap it for cNGN on Celo:
| Chain | Allowlist |
|---|---|
| Ethereum | USDT 0xdAC17F958D2ee523a2206206994597C13D831ec7, USDT0 OFT 0x1F748c76dE468e9D11bd340fA9D5CBADf315dFB0 |
| Celo | USDT 0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e, LimitOrderReactor 0xa9AA0a64769cBed4d3B1Ceb4Df01CdE915C235b3, VaultOrderExecutor 0x01b006d5c687bde182aa36F542f1f014144742e2 |
To sell cNGN on Celo as well, add cNGN (0xF6829D7393dAe24509eb1E52eE8e572e2E271a4f). To send USDT from Celo back to Ethereum or Tron, add the Celo OFT (0xf10E161027410128E63E75D0200Fb6d34b2db243).
Next
- Settlement for what these contracts do
- Protocol overview for the mechanics