Skip to content

Address book ​

The deployed contracts behind Textile FX. More corridors and chains are coming, and this page grows as they go live.

ChainLive 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 ​

ContractAddress
LimitOrderReactor0xe03261c0436DB575F92F09EdDF3591E2566B7D97
Fee controller (0.01% / 1 bps taker fee)0xBDA5e4d85674Fc3A4566B1080A3c59Dc2526c057
Permit2 (canonical)0x000000000022D473030F116dDEE9F6B43aC78BA3

Operator Vault ​

ContractAddress
OperatorVaultFactory0xe869402211F13a7Ecee3c5153B6E7136243D1Bf0
VaultOrderExecutor0x23d61C82e1c38a6f115d4f5a8807f88d271E05b4

Tokens ​

Both tokens are existing assets on BSC, not issued by Textile.

TokenAddress
cNGN0xa8AEA66B361a8d53e8865c62D142167Af28Af058
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.

ContractAddress
LimitOrderReactor0x65B2f3847b391783e15554D5f2826FBaF318a7Df
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).

TokenAddress
cNGN0x8a078b182bA9649c03982c2a80CDcc81cdc99dA8
USDT0x337610d27c682E347C9cD60BD4b3b107C9d34dDd

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 ​

ContractAddress
LimitOrderReactor0xEb5A29F869FF084B3Fce18d3487a38A56feDC59E
Fee controller (0.05% / 5 bps taker fee)0x9100D2290fB1eF5AEC1f572a95C1778bF66c8868
Permit2 (canonical)0x000000000022D473030F116dDEE9F6B43aC78BA3

Tokens ​

Tokens are existing assets on Base, not issued by Textile.

TokenAddress
cNGN0x46C85152bFe9f96829aA94755D9f915F9B10EF5F
TESOURO0x7ceE47e7B7CD04CF984e8Dd86C42595B5771A9B2
ZARU0xE205b4e7Ac03E3f7b2060C3EDf2171AA7126C0d5
USDC0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913

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.

ContractAddress
LimitOrderReactor0x3a6e177120c72fB8A95546605D4921FaDDFAe4D9
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.

TokenAddress
cNGN0xe2387F04d3858e7Cb64Ef5Ed6617f9B2fcEEAfa2
ZARU0x47b025D6002234a5038bCD94767bd82b27C2b96F
USDC0x036CbD53842c5426634e7929541eC2318f3dCF7e

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 ​

ContractAddress
LimitOrderReactor0x26A1aedaa26aFFc4fd9F910acFcA754A31bC43c6
Fee controller (0.05% / 5 bps taker fee)0x7b54a3e2837b8c18462457fE3ca294cc37100647
Permit2 (canonical)0x000000000022D473030F116dDEE9F6B43aC78BA3

Tokens ​

Tokens are existing assets on Ethereum, not issued by Textile.

TokenAddress
WETH0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
wBRL0xD76f5Faf6888e24D9F04Bf92a0c8B921FE4390e0
BRS0x0000006238e3C7797Ae71827da303560bae1B125
USDT0xdAC17F958D2ee523a2206206994597C13D831ec7

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 ​

ContractAddress
LimitOrderReactor0xa9AA0a64769cBed4d3B1Ceb4Df01CdE915C235b3
Fee controller (0.01% / 1 bps taker fee)0x7b005466F905DD882A959888154587fA76cd3Ea7
Permit2 (canonical)0x000000000022D473030F116dDEE9F6B43aC78BA3

Operator Vault ​

ContractAddress
OperatorVaultFactory0x88104decA449C797632AfdcA77A3140b24cD844A
VaultOrderExecutor0x01b006d5c687bde182aa36F542f1f014144742e2

Tokens ​

Tokens are existing assets on Celo, not issued by Textile.

TokenAddress
cNGN0xF6829D7393dAe24509eb1E52eE8e572e2E271a4f
USDC0xcebA9300f2b948710d2653dD7B07f33A8B32118C
wARS0x0DC4F92879B7670e5f4e4e6e3c801D229129D90D
wBRL0xD76f5Faf6888e24D9F04Bf92a0c8B921FE4390e0
wCOP0x8a1D45e102e886510e891d2Ec656a708991e2D76
wMXN0x337E7456B420bD3481e7FA61fA9850343d610d34
IDRX0x18Bc5bcC660cf2B9cE3cd51a404aFe1a0cBD3C22
CELO0x471EcE3750Da237f93B8E339c536989b8978a438
WETH0xD221812de1BD094f35587EE8E174B07B6167D9Af
USAT0xD2ab3C9A02DBBAB236BfEC45D1d755DF4267F771
G$0x62B8B11039FcfE5aB0C56E502b1C372A3d2a9c7A
USDT0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e

Polygon (chain 137) ​

The live TESOURO ↔ USDT corridor. TESOURO is Etherfuse's tokenized Brazilian Tesouro bond (6 decimals). USDT is Tether (6 decimals).

Settlement ​

ContractAddress
LimitOrderReactor0xF3ffCF21E621552CFcCC724B965e901cDF0D83fe
Fee controller (0.03% / 3 bps taker fee)0x6Fb6C3E4650268b868476A729B6997C733F9a859
Permit2 (canonical)0x000000000022D473030F116dDEE9F6B43aC78BA3

Operator Vault ​

ContractAddress
OperatorVaultFactory0x5a527d072C23d6Dac7DED486dE57ba941938ca35
VaultOrderExecutor0x1680649095EfF961E14E7888bAc3B2439db2D993

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.

TokenAddress
TESOURO0xd574b191B5a00262Ff19953d3CE25543AB7C8098
USDT0xc2132D05D31c914a87C6611C10748AEb04B58e8F

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.

ChainOFT (you call send)USDT (you approve the OFT)
Celo (42220)0xf10E161027410128E63E75D0200Fb6d34b2db2430x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e
Ethereum (1)0x1F748c76dE468e9D11bd340fA9D5CBADf315dFB00xdAC17F958D2ee523a2206206994597C13D831ec7
TronTFG4wBaDQ8sHWWP1ACeSGnoNR6RRzevLPtTR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t

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.

ChainSwapRouter02QuoterV2 (read only)USDCUSDT
BNB Smart Chain (56)0xB971eF87ede563556b2ED4b1C0b0019111Dd85d20x78D78E420Da98ad378D7799bE8f4AF69033EB0770x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d0x55d398326f99059fF775485246999027B3197955
Ethereum (1)0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc450x61fFE014bA17989E743c5F6cB21bF9697530B21e0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB480xdAC17F958D2ee523a2206206994597C13D831ec7
Base (8453)0x2626664c2603336E57B271c5C0b26F421741e4810x3d4e44Eb1374240CE5F1B871ab261CD16335B76a0x833589fCD6eDb6E08f4c7C32D4f71b54bdA029130xfde4C96c8593536E31F229EA8f37b2ADa2699bb2
Celo (42220)0x5615CDAb10dc425a742d643d949a7F474C01abc40x82825d0554fA07f7FC52Ab63c961F330fdEFa8E80xcebA9300f2b948710d2653dD7B07f33A8B32118C0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e
Polygon (137)0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc450x61fFE014bA17989E743c5F6cB21bF9697530B21e0x3c499c542cEF5E3811e1192ce70d8cC03d5c33590xc2132D05D31c914a87C6611C10748AEb04B58e8F

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:

ChainAllowlist
EthereumUSDT 0xdAC17F958D2ee523a2206206994597C13D831ec7, USDT0 OFT 0x1F748c76dE468e9D11bd340fA9D5CBADf315dFB0
CeloUSDT 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 ​