Conduitdocs

fx-capability.md

Generated by scripts/stablefx-probe.ts against live Arc testnet (block 54109049) and the StableFX sandbox API. Every row below is a real HTTP/RPC response, not inferred from documentation.

Confirmed tokens (on-chain decimals/symbol/name read succeeded)

CurrencyAddressSymbolNameDecimals
USDC0x3600000000000000000000000000000000000000USDCUSDC6
EURC0x89B50855Aa3bE2F677cD6303Cec089B5F319D72aEURCEURC6
BRLA0x8629020763F6239643a02e664a25BF4AD7787254BRLABRLA Token18
AUDF0xd2a530170D71a9Cfe1651Fb468E2B98F7Ed7456bAUDFForte AUD6
MXNB0x836F73Fbc370A9329Ba4957E47912DfDBA6BA461MXNBMXNB6
QCAD0x23d7CFFd0876f3ABb6B074287ba2aeefBc83825dQCADQCAD6
KRW10xC5bD9EBB09446F5F94E3b3D899072fC2eC5d3a1atKRW1tKRW118
GBPA0xa42e82b5D25E84d107Cd8549CA432ef489CbaD32GBPAAgant GBP6
ZARU0x47b025D6002234a5038bCD94767bd82b27C2b96FZARUZAR Universal18

StableFX coverage

Observed quote TTL across all successful quotes: ~3.5s average.

FromToQuoted?RateTTL(s)Error
USDCEURCyes1.12223.5—
USDCJPYCno——3008 At least one of the quote currencies is invalid.
USDCJPYno——3008 At least one of the quote currencies is invalid.
USDCBRLAyes0.19743.5—
USDCBRLno——3008 At least one of the quote currencies is invalid.
USDCPHPCno——3008 At least one of the quote currencies is invalid.
USDCPHPno——3008 At least one of the quote currencies is invalid.
USDCAUDFyes0.64253.5—
USDCAUDno——3008 At least one of the quote currencies is invalid.
USDCMXNByes0.05383.5—
USDCQCADyes0.71373.5—
USDCKRW1yes0.00073.5—
USDCKRWno——3008 At least one of the quote currencies is invalid.
USDCGBPAyes1.27273.5—
USDCGBPno——3008 At least one of the quote currencies is invalid.
USDCZARUyes0.05683.5—
USDCZARno——3008 At least one of the quote currencies is invalid.
EURCBRLAno——3008 At least one of the quote currencies is invalid.
EURCAUDFno——3008 At least one of the quote currencies is invalid.
EURCMXNBno——3008 At least one of the quote currencies is invalid.
EURCQCADno——3008 At least one of the quote currencies is invalid.
EURCKRW1no——3008 At least one of the quote currencies is invalid.
EURCGBPAno——3008 At least one of the quote currencies is invalid.
EURCZARUno——3008 At least one of the quote currencies is invalid.
BRLAEURCno——3008 At least one of the quote currencies is invalid.
BRLAAUDFno——3008 At least one of the quote currencies is invalid.
BRLAMXNBno——3008 At least one of the quote currencies is invalid.
BRLAQCADno——3008 At least one of the quote currencies is invalid.
BRLAKRW1no——3008 At least one of the quote currencies is invalid.
BRLAGBPAno——3008 At least one of the quote currencies is invalid.
BRLAZARUno——3008 At least one of the quote currencies is invalid.
AUDFEURCno——3008 At least one of the quote currencies is invalid.
AUDFBRLAno——3008 At least one of the quote currencies is invalid.
AUDFMXNBno——3008 At least one of the quote currencies is invalid.
AUDFQCADno——3008 At least one of the quote currencies is invalid.
AUDFKRW1no——3008 At least one of the quote currencies is invalid.
AUDFGBPAno——3008 At least one of the quote currencies is invalid.
AUDFZARUno——3008 At least one of the quote currencies is invalid.
MXNBEURCno——3008 At least one of the quote currencies is invalid.
MXNBBRLAno——3008 At least one of the quote currencies is invalid.
MXNBAUDFno——3008 At least one of the quote currencies is invalid.
MXNBQCADno——3008 At least one of the quote currencies is invalid.
MXNBKRW1no——3008 At least one of the quote currencies is invalid.
MXNBGBPAno——3008 At least one of the quote currencies is invalid.
MXNBZARUno——3008 At least one of the quote currencies is invalid.
QCADEURCno——3008 At least one of the quote currencies is invalid.
QCADBRLAno——3008 At least one of the quote currencies is invalid.
QCADAUDFno——3008 At least one of the quote currencies is invalid.
QCADMXNBno——3008 At least one of the quote currencies is invalid.
QCADKRW1no——3008 At least one of the quote currencies is invalid.
QCADGBPAno——3008 At least one of the quote currencies is invalid.
QCADZARUno——3008 At least one of the quote currencies is invalid.
KRW1EURCno——3008 At least one of the quote currencies is invalid.
KRW1BRLAno——3008 At least one of the quote currencies is invalid.
KRW1AUDFno——3008 At least one of the quote currencies is invalid.
KRW1MXNBno——3008 At least one of the quote currencies is invalid.
KRW1QCADno——3008 At least one of the quote currencies is invalid.
KRW1GBPAno——3008 At least one of the quote currencies is invalid.
KRW1ZARUno——3008 At least one of the quote currencies is invalid.
GBPAEURCno——3008 At least one of the quote currencies is invalid.
GBPABRLAno——3008 At least one of the quote currencies is invalid.
GBPAAUDFno——3008 At least one of the quote currencies is invalid.
GBPAMXNBno——3008 At least one of the quote currencies is invalid.
GBPAQCADno——3008 At least one of the quote currencies is invalid.
GBPAKRW1no——3008 At least one of the quote currencies is invalid.
GBPAZARUno——3008 At least one of the quote currencies is invalid.
ZARUEURCno——3008 At least one of the quote currencies is invalid.
ZARUBRLAno——3008 At least one of the quote currencies is invalid.
ZARUAUDFno——3008 At least one of the quote currencies is invalid.
ZARUMXNBno——3008 At least one of the quote currencies is invalid.
ZARUQCADno——3008 At least one of the quote currencies is invalid.
ZARUKRW1no——3008 At least one of the quote currencies is invalid.
ZARUGBPAno——3008 At least one of the quote currencies is invalid.
EURCUSDCyes0.89633.5—
BRLAUSDCyes5.07883.5—
AUDFUSDCyes1.54593.5—
MXNBUSDCyes18.5963.5—
QCADUSDCyes1.39223.5—
KRW1USDCyes*1428.57153.5—
GBPAUSDCyes0.79043.5—
ZARUUSDCyes17.51323.5—

*KRW1→USDC row above was originally recorded as refused (code 3005, "quote amount invalid") — that was this probe's own 1000 KRW1 test notional being too small (worth well under $1), not an unsupported pair. Re-confirmed at 100,000 KRW1 (~$70): quotes fine, rate 1428.5715. KRW1 is fully routable and is now registered in CurrencyRegistry.sol, internal/currency/currency.go, and packages/sdk/src/currency.ts — found and fixed after initial publication of this doc, when a mismatch between the on-chain-confirmed currency list and the actually-registered set was caught.

Finding: StableFX quotes are hub-and-spoke through USDC only — every successful quote in this probe has USDC on one leg. Direct cross-partner-currency quotes (e.g. BRLA→EURC, MXNB→QCAD) were refused with the same "invalid currency" error as genuinely unsupported currencies, even though both legs are individually quotable against USDC. Treat this as a real routing constraint, not a permissions gap.

On-chain swap coverage (probed, then removed)

Both Arc DEXes were probed for pools across every currency above. Only USDC/EURC had one. For BRLA, AUDF, MXNB, QCAD, GBPA, ZARU and KRW1 there was no pool on either router, so an on-chain swap route could not settle those pairs at all, and seeding liquidity to work around it was ruled out (spec §VOID).

That made StableFX not merely the primary cross-currency route but the only one. The swap code has since been removed rather than left in place unreachable — ConduitRouter.executeWithAmm, the adapter's swap functions and the SDK's swap are all gone. This section is kept as the record of why.

Recommendation

Primary demo pair: BRLA -> USDC

Reasoning: JPY and PHP are not currently quotable at all on this StableFX sandbox key (refused as "invalid currency", not a permissions error — tried JPYC, JPY, PHPC, PHP explicitly). Of the spec's named preference pairs, the exact named legs (JPY->EUR, JPY->USD, BRL->EUR, PHP->USD) do not exist because StableFX here is USDC hub-and-spoke only (see finding above) — every routable pair has USDC on one leg. Ranking by currency FAMILY (JPY > BRL > PHP > EUR, per the spec's stated order) against whichever leg actually quotes: JPY and PHP are unavailable, so BRL is the highest-ranked family that IS quotable, via BRLA->USDC. This beats the EUR->USD fallback, which the spec lists last precisely because it's the least differentiated pair — BRLA->USDC (Brazilian real into USD) is real cross-currency B2B settlement and also exercises the 18-decimal path (BRLA is 18dp, confirmed on-chain above), which EURC->USDC (6dp both legs) does not.