跳至主要内容

货币对

StableFX 支持 6 种主要货币对,涵盖流动性最高的外汇市场。所有货币对均以链上稳定币(USDC)结算。

支持的货币对

货币对基础货币报价货币描述
EUR/USD欧元 (EUR)美元 (USD)全球交易量最大的货币对
GBP/USD英镑 (GBP)美元 (USD)"Cable" -- 高流动性
USD/JPY美元 (USD)日元 (JPY)主要亚洲货币对
USD/CHF美元 (USD)瑞士法郎 (CHF)"Swissy" -- 避险货币对
AUD/USD澳元 (AUD)美元 (USD)与商品挂钩的货币对
USD/CAD美元 (USD)加元 (CAD)与石油相关的货币对

FOREX_CURRENCY_PAIRS 常量

FOREX_CURRENCY_PAIRS 常量是一个只读数组,包含所有支持的货币对标识符。

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']

你可以使用此常量来验证用户输入、填充选择 UI 或遍历所有货币对:

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 类型

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;
}

货币对配置详情

货币对价格精度最小交易量最大交易量
EUR/USD51001,000,000
GBP/USD51001,000,000
USD/JPY31001,000,000
USD/CHF51001,000,000
AUD/USD51001,000,000
USD/CAD51001,000,000
价格精度

大多数货币对使用 5 位小数(例如 EUR/USD = 1.08765)。USD/JPY 使用 3 位小数(例如 149.852),因为日元在传统外汇市场中的报价方式不同。

使用货币对

显示所有货币对

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' },
});

验证货币对选择

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"

带状态的货币对选择

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 },
});

后续步骤