Files
nexcurrency/lib/assets.ts
2026-03-07 16:34:10 +01:00

134 lines
5.3 KiB
TypeScript

export type AssetType = "fiat" | "crypto";
export interface AssetDefinition {
code: string;
name: string;
type: AssetType;
symbol?: string;
providerId?: string;
popular?: boolean;
decimals?: number;
}
export const POPULAR_CODES = [
"USD",
"EUR",
"GBP",
"PLN",
"CHF",
"JPY",
"BTC",
"ETH",
"LTC",
"XMR",
"SOL",
"USDT"
] as const;
export const POPULAR_CODE_SET = new Set<string>(POPULAR_CODES);
export const FALLBACK_FIAT_CURRENCIES: Record<string, { name: string; symbol?: string }> = {
USD: { name: "US Dollar", symbol: "$" },
EUR: { name: "Euro", symbol: "EUR" },
GBP: { name: "British Pound", symbol: "GBP" },
PLN: { name: "Polish Zloty", symbol: "PLN" },
CHF: { name: "Swiss Franc", symbol: "CHF" },
JPY: { name: "Japanese Yen", symbol: "JPY" },
CAD: { name: "Canadian Dollar", symbol: "CAD" },
AUD: { name: "Australian Dollar", symbol: "AUD" },
NZD: { name: "New Zealand Dollar", symbol: "NZD" },
SEK: { name: "Swedish Krona", symbol: "SEK" },
NOK: { name: "Norwegian Krone", symbol: "NOK" },
DKK: { name: "Danish Krone", symbol: "DKK" },
CZK: { name: "Czech Koruna", symbol: "CZK" },
HUF: { name: "Hungarian Forint", symbol: "HUF" },
RON: { name: "Romanian Leu", symbol: "RON" },
BGN: { name: "Bulgarian Lev", symbol: "BGN" },
CNY: { name: "Chinese Yuan", symbol: "CNY" },
HKD: { name: "Hong Kong Dollar", symbol: "HKD" },
SGD: { name: "Singapore Dollar", symbol: "SGD" },
INR: { name: "Indian Rupee", symbol: "INR" },
KRW: { name: "South Korean Won", symbol: "KRW" },
TRY: { name: "Turkish Lira", symbol: "TRY" },
BRL: { name: "Brazilian Real", symbol: "BRL" },
MXN: { name: "Mexican Peso", symbol: "MXN" },
ZAR: { name: "South African Rand", symbol: "ZAR" },
AED: { name: "UAE Dirham", symbol: "AED" },
SAR: { name: "Saudi Riyal", symbol: "SAR" },
ILS: { name: "Israeli New Shekel", symbol: "ILS" },
THB: { name: "Thai Baht", symbol: "THB" },
MYR: { name: "Malaysian Ringgit", symbol: "MYR" },
IDR: { name: "Indonesian Rupiah", symbol: "IDR" }
};
export const CRYPTO_ASSETS: AssetDefinition[] = [
{ code: "BTC", name: "Bitcoin", type: "crypto", providerId: "bitcoin", symbol: "BTC", popular: true, decimals: 8 },
{ code: "ETH", name: "Ethereum", type: "crypto", providerId: "ethereum", popular: true, decimals: 8 },
{ code: "LTC", name: "Litecoin", type: "crypto", providerId: "litecoin", popular: true, decimals: 8 },
{ code: "XMR", name: "Monero", type: "crypto", providerId: "monero", popular: true, decimals: 8 },
{ code: "SOL", name: "Solana", type: "crypto", providerId: "solana", popular: true, decimals: 8 },
{ code: "USDT", name: "Tether", type: "crypto", providerId: "tether", popular: true, decimals: 8 },
{ code: "BNB", name: "BNB", type: "crypto", providerId: "binancecoin", decimals: 8 },
{ code: "XRP", name: "XRP", type: "crypto", providerId: "ripple", decimals: 8 },
{ code: "USDC", name: "USD Coin", type: "crypto", providerId: "usd-coin", decimals: 8 },
{ code: "ADA", name: "Cardano", type: "crypto", providerId: "cardano", decimals: 8 },
{ code: "DOGE", name: "Dogecoin", type: "crypto", providerId: "dogecoin", decimals: 8 },
{ code: "TRX", name: "TRON", type: "crypto", providerId: "tron", decimals: 8 },
{ code: "DOT", name: "Polkadot", type: "crypto", providerId: "polkadot", decimals: 8 },
{ code: "AVAX", name: "Avalanche", type: "crypto", providerId: "avalanche-2", decimals: 8 },
{ code: "LINK", name: "Chainlink", type: "crypto", providerId: "chainlink", decimals: 8 },
{ code: "TON", name: "Toncoin", type: "crypto", providerId: "the-open-network", decimals: 8 },
{ code: "NEAR", name: "NEAR Protocol", type: "crypto", providerId: "near", decimals: 8 },
{ code: "ATOM", name: "Cosmos", type: "crypto", providerId: "cosmos", decimals: 8 },
{ code: "BCH", name: "Bitcoin Cash", type: "crypto", providerId: "bitcoin-cash", decimals: 8 },
{ code: "ALGO", name: "Algorand", type: "crypto", providerId: "algorand", decimals: 8 },
{ code: "MATIC", name: "Polygon", type: "crypto", providerId: "matic-network", decimals: 8 },
{ code: "ETC", name: "Ethereum Classic", type: "crypto", providerId: "ethereum-classic", decimals: 8 }
];
export function buildFiatAssets(
fiatCurrencies?: Record<string, string>
): AssetDefinition[] {
const source = fiatCurrencies && Object.keys(fiatCurrencies).length > 0
? fiatCurrencies
: Object.fromEntries(
Object.entries(FALLBACK_FIAT_CURRENCIES).map(([code, value]) => [code, value.name])
);
return Object.entries(source)
.map(([code, name]) => {
const fallback = FALLBACK_FIAT_CURRENCIES[code];
return {
code,
name: fallback?.name ?? name,
type: "fiat" as const,
symbol: fallback?.symbol,
popular: POPULAR_CODE_SET.has(code)
};
})
.sort((a, b) => a.code.localeCompare(b.code));
}
export function buildAllAssets(fiatCurrencies?: Record<string, string>): AssetDefinition[] {
return [...buildFiatAssets(fiatCurrencies), ...CRYPTO_ASSETS].sort((a, b) => {
if (a.popular && !b.popular) {
return -1;
}
if (!a.popular && b.popular) {
return 1;
}
if (a.type !== b.type) {
return a.type === "fiat" ? -1 : 1;
}
return a.code.localeCompare(b.code);
});
}
export function isPopularCode(code: string): boolean {
return POPULAR_CODE_SET.has(code);
}