Skip to main content

Currency Pairs

StableFX supports 6 major currency pairs, covering the most liquid forex markets. All pairs are settled in stablecoins (USDC) on-chain.

Supported Pairs

PairBase CurrencyQuote CurrencyDescription
EUR/USDEuro (EUR)US Dollar (USD)Most traded pair globally
GBP/USDBritish Pound (GBP)US Dollar (USD)"Cable" -- high liquidity
USD/JPYUS Dollar (USD)Japanese Yen (JPY)Major Asian pair
USD/CHFUS Dollar (USD)Swiss Franc (CHF)"Swissy" -- safe-haven pair
AUD/USDAustralian Dollar (AUD)US Dollar (USD)Commodity-linked pair
USD/CADUS Dollar (USD)Canadian Dollar (CAD)Oil-correlated pair

FOREX_CURRENCY_PAIRS Constant

The FOREX_CURRENCY_PAIRS constant is a read-only array containing all supported pair identifiers.

import { FOREX_CURRENCY_PAIRS } from '@one_deploy/sdk';

console.log(FOREX_CURRENCY_PAIRS);
// ['EUR/USD', 'GBP/USD', 'USD/JPY', 'USD/CHF', 'AUD/USD', 'USD/CAD']

// Type: readonly ['EUR/USD', 'GBP/USD', 'USD/JPY', 'USD/CHF', 'AUD/USD', 'USD/CAD']

You can use this constant to validate user input, populate selection UIs, or iterate over all pairs:

import { FOREX_CURRENCY_PAIRS } from '@one_deploy/sdk';

function isValidPair(pair: string): boolean {
return (FOREX_CURRENCY_PAIRS as readonly string[]).includes(pair);
}

// Iterate
FOREX_CURRENCY_PAIRS.forEach((pair) => {
console.log(`Fetching data for ${pair}...`);
});

ForexCurrencyPair Type

import type { ForexCurrencyPair } from '@one_deploy/sdk';

interface ForexCurrencyPair {
/** The pair identifier, e.g. "EUR/USD". */
pair: string;

/** ISO 4217 code for the base currency. */
baseCurrency: string;

/** ISO 4217 code for the quote currency. */
quoteCurrency: string;

/** Human-readable name for the pair. */
displayName: string;

/** Number of decimal places for price display. */
pricePrecision: number;

/** Minimum trade size in base currency units. */
minTradeSize: number;

/** Maximum trade size in base currency units. */
maxTradeSize: number;

/** Whether this pair is currently active for trading. */
isActive: boolean;
}

Pair Configuration Details

PairPrice PrecisionMin TradeMax Trade
EUR/USD51001,000,000
GBP/USD51001,000,000
USD/JPY31001,000,000
USD/CHF51001,000,000
AUD/USD51001,000,000
USD/CAD51001,000,000
Price Precision

Most pairs use 5 decimal places (e.g. EUR/USD = 1.08765). USD/JPY uses 3 decimal places (e.g. 149.852) because the yen is quoted differently in traditional forex markets.

Working with Currency Pairs

Displaying All Pairs

import React from 'react';
import { View, Text, FlatList, StyleSheet } from 'react-native';
import { FOREX_CURRENCY_PAIRS } from '@one_deploy/sdk';
import type { ForexCurrencyPair } from '@one_deploy/sdk';

interface PairListProps {
pairs: ForexCurrencyPair[];
onSelectPair: (pair: string) => void;
}

function PairList({ pairs, onSelectPair }: PairListProps) {
return (
<FlatList
data={pairs}
keyExtractor={(item) => item.pair}
renderItem={({ item }) => (
<View style={styles.pairRow}>
<View>
<Text style={styles.pairName}>{item.pair}</Text>
<Text style={styles.pairDescription}>{item.displayName}</Text>
</View>
<View style={styles.pairMeta}>
<Text style={styles.metaText}>
Precision: {item.pricePrecision}
</Text>
<Text style={styles.metaText}>
Min: ${item.minTradeSize.toLocaleString()}
</Text>
<Text style={[styles.status, item.isActive && styles.active]}>
{item.isActive ? 'Active' : 'Inactive'}
</Text>
</View>
</View>
)}
/>
);
}

const styles = StyleSheet.create({
pairRow: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
padding: 12,
borderBottomWidth: 1,
borderColor: '#2a2a4e',
},
pairName: { fontSize: 16, fontWeight: '700', color: '#ffffff' },
pairDescription: { fontSize: 12, color: '#8888aa', marginTop: 2 },
pairMeta: { alignItems: 'flex-end' },
metaText: { fontSize: 12, color: '#aaaacc' },
status: { fontSize: 11, color: '#666', marginTop: 4 },
active: { color: '#44cc88' },
});

Validating Pair Selection

import { FOREX_CURRENCY_PAIRS } from '@one_deploy/sdk';

type ForexPairId = (typeof FOREX_CURRENCY_PAIRS)[number];
// Type: 'EUR/USD' | 'GBP/USD' | 'USD/JPY' | 'USD/CHF' | 'AUD/USD' | 'USD/CAD'

function getPairPrecision(pair: ForexPairId): number {
// USD/JPY uses 3 decimal places; all others use 5
return pair === 'USD/JPY' ? 3 : 5;
}

function formatPrice(pair: ForexPairId, price: number): string {
const precision = getPairPrecision(pair);
return price.toFixed(precision);
}

// Examples
console.log(formatPrice('EUR/USD', 1.08765)); // "1.08765"
console.log(formatPrice('USD/JPY', 149.852)); // "149.852"

Pair Selection with State

import React, { useState } from 'react';
import { View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import { FOREX_CURRENCY_PAIRS } from '@one_deploy/sdk';

type ForexPairId = (typeof FOREX_CURRENCY_PAIRS)[number];

function PairSelector() {
const [selected, setSelected] = useState<ForexPairId>('EUR/USD');

return (
<View style={styles.container}>
<Text style={styles.header}>Select Currency Pair</Text>
<View style={styles.grid}>
{FOREX_CURRENCY_PAIRS.map((pair) => (
<TouchableOpacity
key={pair}
style={[
styles.chip,
selected === pair && styles.chipSelected,
]}
onPress={() => setSelected(pair)}
>
<Text
style={[
styles.chipText,
selected === pair && styles.chipTextSelected,
]}
>
{pair}
</Text>
</TouchableOpacity>
))}
</View>
<Text style={styles.selected}>Selected: {selected}</Text>
</View>
);
}

const styles = StyleSheet.create({
container: { padding: 16 },
header: { fontSize: 16, fontWeight: '700', color: '#fff', marginBottom: 12 },
grid: { flexDirection: 'row', flexWrap: 'wrap', gap: 8 },
chip: {
paddingHorizontal: 16,
paddingVertical: 8,
borderRadius: 20,
borderWidth: 1,
borderColor: '#444',
backgroundColor: '#1a1a2e',
},
chipSelected: { borderColor: '#4488ff', backgroundColor: '#1a2a4e' },
chipText: { color: '#aaa', fontSize: 14 },
chipTextSelected: { color: '#4488ff', fontWeight: '600' },
selected: { color: '#888', marginTop: 16, fontSize: 13 },
});

Next Steps