1use crate::amount::*;
9use crate::u256::{u64_to_u256, U256};
10
11#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
16pub enum FormatStyle {
17 PrefixAttached,
20 SuffixAttached,
23 PrefixSpaced,
25 SuffixSpaced,
28}
29
30impl Default for FormatStyle {
31 fn default() -> Self {
32 Self::PrefixAttached
33 }
34}
35
36pub trait Currency: Copy + Clone + PartialEq + Eq + PartialOrd + Ord + core::hash::Hash {
38 type Backing: Backing;
41
42 const BASE: Self::Backing;
50
51 const CODE: &'static str;
59
60 const SYMBOL: &'static str;
72
73 const PROPER_NAME: &'static str;
78
79 const STYLE: FormatStyle;
82
83 const IS_ISO: bool;
85
86 const IS_CRYPTO: bool;
91
92 fn decimal_digits() -> usize {
94 let mut base = Self::BASE;
95 let mut digits = 0;
96 while base > 1.into() {
97 base /= 10.into();
98 digits += 1;
99 }
100 digits
101 }
102}
103
104#[macro_export]
133macro_rules! define_currency {
134 (
135 $currency_name:ident,
136 $base_type:ty,
137 $base:expr,
138 $symbol:expr,
139 $proper_name:expr,
140 $style:ident,
141 $is_iso:expr,
142 $is_crypto:expr
143 ) => {
144 #[doc = concat!($proper_name, " (", $symbol, ")")]
145 #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
146 pub struct $currency_name;
147
148 impl $crate::currency::Currency for $currency_name {
149 type Backing = $base_type;
150 const BASE: Self::Backing = $base;
151 const CODE: &'static str = stringify!($currency_name);
152 const SYMBOL: &'static str = $symbol;
153 const PROPER_NAME: &'static str = $proper_name;
154 const STYLE: $crate::currency::FormatStyle = $crate::currency::FormatStyle::$style;
155 const IS_ISO: bool = $is_iso;
156 const IS_CRYPTO: bool = $is_crypto;
157 }
158 };
159}
160
161define_currency!(USDC, u64, 1_000000, "USDC", "USD Coin", SuffixAttached, false, true);
162
163define_currency!(BTC, u64, 1_00000000, "BTC", "Bitcoin", SuffixSpaced, false, true);
164define_currency!(ETH, U256, u64_to_u256(1_000000000000000000), "ETH", "Ethereum", SuffixSpaced, false, true);
165
166define_currency!(SOL, u64, 1_000000000, "SOL", "Solana", SuffixSpaced, false, true);
167define_currency!(ALGO, u64, 1_000000, "ALGO", "Algorand", SuffixSpaced, false, true);
168define_currency!(ORCA, u64, 1_000000, "ORCA", "Orca", SuffixSpaced, false, true);
169define_currency!(AVAX, u64, 1_000000000, "AVAX", "Avalanche", SuffixSpaced, false, true);
170define_currency!(ZEC, u64, 1_00000000, "ZEC", "Zcash", SuffixSpaced, false, true);
171define_currency!(XMR, u64, 1_000000000000, "XMR", "Monero", SuffixSpaced, false, true);
172define_currency!(DOGE, u64, 1_000000, "DOGE", "Dogecoin", SuffixSpaced, false, true);
173define_currency!(LTC, u64, 1_000000, "LTC", "Litecoin", SuffixSpaced, false, true);
174define_currency!(MATIC, u64, 1_000000000000000000, "MATIC", "Polygon", SuffixSpaced, false, true);
175define_currency!(XLM, u64, 1_0000000, "XLM", "Stellar", SuffixSpaced, false, true);
176define_currency!(TAO, u128, 1000000000u128, "TAO", "Bittensor", SuffixSpaced, false, true);
177define_currency!(NEAR, u64, 1_000000000000000000, "NEAR", "Near Protocol", SuffixSpaced, false, true);
178
179define_currency!(ADA, u64, 1_000000, "ADA", "Cardano", SuffixSpaced, false, true);
180define_currency!(BOOK, u64, 1_000000, "BOOK", "$BOOK", SuffixSpaced, false, true);
181
182define_currency!(DOT, u128, 10000000000u128, "DOT", "Polkadot", SuffixSpaced, false, true);
183define_currency!(KSM, u128, 1000000000000u128, "KSM", "Kusama", SuffixSpaced, false, true);
184
185define_currency!(AAVE, U256, ETH::BASE, "AAVE", "Aave Token", SuffixSpaced, false, true);
186
187define_currency!(USD, u64, 1_00, "$", "United States Dollar", PrefixAttached, true, false);
188define_currency!(BAM, u64, 1_00, "KM", "Bosnia and Herzegovina Convertible Mark", SuffixSpaced, true, false);
189define_currency!(AED, u64, 1_00, "Dh", "United Arab Emirates Dirham", SuffixSpaced, true, false);
190define_currency!(AFN, u64, 1_00, "Af", "Afgan Afghani", SuffixSpaced, true, false);
191define_currency!(ALL, u64, 1_00, "Lek", "Albanien Lek", SuffixSpaced, true, false);
192define_currency!(AMD, u64, 1_00, "֏", "Armenian Dram", PrefixAttached, true, false);
193define_currency!(ANG, u64, 1_00, "ƒ", "Netherlands Antillean Guilder", PrefixAttached, true, false);
194define_currency!(AOA, u64, 1_00, "Kz", "Angolan Kwanza", SuffixSpaced, true, false);
195define_currency!(ARS, u64, 1_00, "$", "Argentine Peso", PrefixAttached, true, false);
196define_currency!(AUD, u64, 1_00, "$", "Australian Dollar", PrefixAttached, true, false);
197define_currency!(AWG, u64, 1_00, "ƒ", "Aruban Florin", PrefixAttached, true, false);
198define_currency!(AZN, u64, 1_00, "₼", "Azerbaijani Manat", PrefixAttached, true, false);
199define_currency!(BBD, u64, 1_00, "$", "Barbados Dollar", PrefixAttached, true, false);
200define_currency!(BDT, u64, 1_00, "৳", "Bangladeshi Taka", PrefixAttached, true, false);
201define_currency!(BGN, u64, 1_00, "Lev", "Bulgarian Lev", SuffixSpaced, true, false);
202define_currency!(BHD, u64, 1_000, "BD", "Bahraini Dinar", SuffixSpaced, true, false);
203define_currency!(BIF, u64, 1_00, "Fr", "Burundian Franc", SuffixSpaced, true, false);
204define_currency!(BMD, u64, 1_00, "$", "Berumdian Dollar", PrefixAttached, true, false);
205define_currency!(BND, u64, 1_00, "$", "Brunei Dollar", PrefixAttached, true, false);
206define_currency!(BOB, u64, 1_00, "Bs", "Boliviano", SuffixSpaced, true, false);
207define_currency!(BOV, u64, 1_00, "BOV", "Bolivian Mvdol", SuffixSpaced, true, false);
208define_currency!(BRL, u64, 1_00, "R$", "Brazilian Real", SuffixSpaced, true, false);
209define_currency!(BSD, u64, 1_00, "$", "Bahamian Dollar", PrefixAttached, true, false);
210define_currency!(BTN, u64, 1_00, "Nu", "Bhutanese Ngultrum", SuffixSpaced, true, false);
211define_currency!(BWP, u64, 1_00, "P", "Botswanna Pula", SuffixSpaced, true, false);
212define_currency!(BYN, u64, 1_00, "Rbl", "Belarusian Ruble", SuffixSpaced, true, false);
213define_currency!(BZD, u64, 1_00, "$", "Belize Dollar", PrefixAttached, true, false);
214define_currency!(CAD, u64, 1_00, "$", "Canadian Dollar", PrefixAttached, true, false);
215define_currency!(CDF, u64, 1_00, "Fr", "Congloese Franc", SuffixSpaced, true, false);
216define_currency!(CHE, u64, 1_00, "CHE", "WIR Euro", SuffixSpaced, true, false);
217define_currency!(CHF, u64, 1_00, "Fr", "Swiss Franc", SuffixSpaced, true, false);
218define_currency!(CHW, u64, 1_00, "CHW", "WIR Franc", SuffixSpaced, true, false);
219define_currency!(CLF, u64, 1_00, "CLF", "Unidad de Fomento", SuffixSpaced, true, false);
220define_currency!(CLP, u64, 1_00, "$", "Chilean Peso", PrefixAttached, true, false);
221define_currency!(COP, u64, 1_00, "$", "Colombian Peso", PrefixAttached, true, false);
222define_currency!(COU, u64, 1_00, "COU", "Unidad de Valor Real (UVR)", SuffixSpaced, true, false);
223define_currency!(CRC, u64, 1_00, "₡", "Costa Rican Colon", PrefixAttached, true, false);
224define_currency!(CUC, u64, 1_00, "CUC", "Cuban Convertible Peso", SuffixSpaced, true, false);
225define_currency!(CUP, u64, 1_00, "$", "Cuban Peso", PrefixAttached, true, false);
226define_currency!(CVE, u64, 1_00, "$", "Cape Verdean Escudo", PrefixAttached, true, false);
227define_currency!(CZK, u64, 1_00, "Kč", "Czech Koruna", SuffixSpaced, true, false);
228define_currency!(DJF, u64, 1_00, "Fr", "Dijiboutian Franc", SuffixSpaced, true, false);
229define_currency!(DKK, u64, 1_00, "kr", "Danish Krone", SuffixSpaced, true, false);
230define_currency!(DOP, u64, 1_00, "$", "Dominican Peso", PrefixAttached, true, false);
231define_currency!(DZD, u64, 1_00, "DA", "Algerian Dinar", SuffixSpaced, true, false);
232define_currency!(EGP, u64, 1_00, "LE", "Egyptian Pound", SuffixSpaced, true, false);
233define_currency!(ERN, u64, 1_00, "Nkf", "Eritrean Nakfa", SuffixSpaced, true, false);
234define_currency!(ETB, u64, 1_00, "Br", "Ethiopian Birr", SuffixSpaced, true, false);
235define_currency!(EUR, u64, 1_00, "€", "Euro", SuffixAttached, true, false);
236define_currency!(FJD, u64, 1_00, "$", "Fiji Dollar", PrefixAttached, true, false);
237define_currency!(FKP, u64, 1_00, "£", "Falkland Islands Pound", PrefixAttached, true, false);
238define_currency!(GBP, u64, 1_00, "£", "Pound Sterling", PrefixAttached, true, false);
239define_currency!(GEL, u64, 1_00, "₾", "Georgian Iari", PrefixAttached, true, false);
240define_currency!(GHS, u64, 1_00, "₵", "Ghanaian Cedi", PrefixAttached, true, false);
241define_currency!(GIP, u64, 1_00, "£", "Gibralter Pound", PrefixAttached, true, false);
242define_currency!(GMD, u64, 1_00, "D", "Gambian Dalasi", SuffixSpaced, true, false);
243define_currency!(GNF, u64, 1_00, "Fr", "Guinean Franc", SuffixSpaced, true, false);
244define_currency!(GTQ, u64, 1_00, "Q", "Guatemalan Quetzal", SuffixSpaced, true, false);
245define_currency!(HKD, u64, 1_00, "$", "Hong Kong Dollar", PrefixAttached, true, false);
246define_currency!(HNL, u64, 1_00, "L", "Honduran Lempira", SuffixSpaced, true, false);
247define_currency!(HTG, u64, 1_00, "G", "Haitian Gourde", SuffixSpaced, true, false);
248define_currency!(HUF, u64, 1_00, "Ft", "Hungarian Forint", SuffixSpaced, true, false);
249define_currency!(IDR, u64, 1_00, "Rp", "Indonesian Rupiah", SuffixSpaced, true, false);
250define_currency!(ILS, u64, 1_00, "₪", "Israeli New Shekel", PrefixAttached, true, false);
251define_currency!(INR, u64, 1_00, "₹", "Indian Rupee", PrefixAttached, true, false);
252define_currency!(IQD, u64, 1_000, "ID", "Iraqi Dinar", SuffixSpaced, true, false);
253define_currency!(IRR, u64, 1, "Rl", "Iranian Rial", SuffixSpaced, true, false);
254define_currency!(ISK, u64, 1_00, "kr", "Icelandic Króna", SuffixSpaced, true, false);
255define_currency!(JMD, u64, 1_00, "$", "Jamaican Dollar", PrefixAttached, true, false);
256define_currency!(JOD, u64, 1_00, "JD", "Jordanian Dinar", SuffixSpaced, true, false);
257define_currency!(JPY, u64, 1_00, "¥", "Japanese Yen", SuffixAttached, true, false);
258define_currency!(KES, u64, 1_00, "Sh", "Kenyan Shilling", SuffixSpaced, true, false);
259define_currency!(KGS, u64, 1_00, "som", "Kyrgyzstani Som", SuffixSpaced, true, false);
260define_currency!(KHR, u64, 1_00, "CR", "Cambodian Riel", SuffixSpaced, true, false);
261define_currency!(KMF, u64, 1_00, "Fr", "Comoro Franc", SuffixSpaced, true, false);
262define_currency!(KPW, u64, 1_00, "₩", "North Korean Won", SuffixSpaced, true, false);
263define_currency!(KRW, u64, 1_00, "₩", "South Korean Won", SuffixSpaced, true, false);
264define_currency!(KWD, u64, 1_000, "KD", "Kuwaiti Dinar", SuffixSpaced, true, false);
265define_currency!(KYD, u64, 1_00, "$", "Caymen Islands Dollar", PrefixAttached, true, false);
266define_currency!(KZT, u64, 1_00, "₸", "Kazakhstani Tenge", PrefixAttached, true, false);
267define_currency!(LAK, u64, 1_00, "₭", "Lao Kip", PrefixAttached, true, false);
268define_currency!(LBP, u64, 1_00, "LL", "Lebanese Pound", SuffixSpaced, true, false);
269define_currency!(LKR, u64, 1_00, "Re", "Sri Lankan Rupee", SuffixSpaced, true, false);
270define_currency!(LRD, u64, 1_00, "$", "Liberian Dollar", PrefixAttached, true, false);
271define_currency!(LSL, u64, 1_00, "L", "Lesotho Loti", SuffixSpaced, true, false);
272define_currency!(LYD, u64, 1_000, "LD", "Libyan Dinar", SuffixSpaced, true, false);
273define_currency!(MAD, u64, 1_00, "DH", "Moroccan Dirham", SuffixSpaced, true, false);
274define_currency!(MDL, u64, 1_00, "Leu", "Moldovan Leu", SuffixSpaced, true, false);
275define_currency!(MGA, u64, 5, "Ar", "Malagasy Ariary", SuffixSpaced, true, false);
276define_currency!(MKD, u64, 1_00, "DEN", "Macedonian Denar", SuffixSpaced, true, false);
277define_currency!(MMK, u64, 1_00, "K", "Myanmar Kyat", SuffixSpaced, true, false);
278define_currency!(MNT, u64, 1_00, "₮", "Mongolian Tögrög", PrefixAttached, true, false);
279define_currency!(MOP, u64, 1_00, "MOP$", "Macanese Pataca", SuffixSpaced, true, false);
280define_currency!(MRU, u64, 5, "UM", "Mauritanian Ouguiya", SuffixSpaced, true, false);
281define_currency!(MUR, u64, 1_00, "Re", "Mauritian Rupee", SuffixSpaced, true, false);
282define_currency!(MVR, u64, 1_00, "Rf", "Maldivian Rufiyaa", SuffixSpaced, true, false);
283define_currency!(MWK, u64, 1_00, "K", "Malawian Kwacha", SuffixSpaced, true, false);
284define_currency!(MXN, u64, 1_00, "$", "Mexican Peso", SuffixSpaced, true, false);
285define_currency!(MXV, u64, 1_00, "MXV", "Mexican Unidad de Inversion (UDI)", SuffixSpaced, true, false);
286define_currency!(MYR, u64, 1_00, "RM", "Malaysian Ringgit", SuffixSpaced, true, false);
287define_currency!(MZN, u64, 1_00, "Mt", "Mozambican Metical", SuffixSpaced, true, false);
288define_currency!(NAD, u64, 1_00, "$", "Namibian Dollar", PrefixAttached, true, false);
289define_currency!(NGN, u64, 1_00, "₦", "Nigerian Naira", SuffixSpaced, true, false);
290define_currency!(NIO, u64, 1_00, "C$", "Nicaraguan Córdoba", SuffixSpaced, true, false);
291define_currency!(NOK, u64, 1_00, "kr", "Norwegian Krone", SuffixSpaced, true, false);
292define_currency!(NPR, u64, 1_00, "Re", "Nepalese Rupee", SuffixSpaced, true, false);
293define_currency!(NZD, u64, 1_00, "$", "New Zealand Dollar", PrefixAttached, true, false);
294define_currency!(OMR, u64, 1_000, "RO", "Omani Rial", SuffixSpaced, true, false);
295define_currency!(PAB, u64, 1_00, "B/", "Panamanian Balboa", SuffixSpaced, true, false);
296define_currency!(PEN, u64, 1_00, "S/", "Peruvian Sol", SuffixSpaced, true, false);
297define_currency!(PGK, u64, 1_00, "K", "Papua New Guinean Kina", SuffixSpaced, true, false);
298define_currency!(PHP, u64, 1_00, "₱", "Philippine Peso", PrefixAttached, true, false);
299define_currency!(PKR, u64, 1_00, "Re", "Pakistani Rupee", SuffixSpaced, true, false);
300define_currency!(PLN, u64, 1_00, "zł", "Polish Złoty", SuffixSpaced, true, false);
301define_currency!(PYG, u64, 1_00, "₲", "Paraguayan Guarani", SuffixSpaced, true, false);
302define_currency!(QAR, u64, 1_00, "QR", "Qatari Riyal", SuffixSpaced, true, false);
303define_currency!(RON, u64, 1_00, "Leu", "Romanian Leu", SuffixSpaced, true, false);
304define_currency!(RSD, u64, 1_00, "DIN", "Serbian Dinar", SuffixSpaced, true, false);
305define_currency!(CNY, u64, 1_0, "¥", "Chinese Yuan", PrefixAttached, true, false);
306define_currency!(RUB, u64, 1_00, "₽", "Russian Ruble", PrefixAttached, true, false);
307define_currency!(RWF, u64, 1_00, "Fr", "Rwandan Franc", SuffixSpaced, true, false);
308define_currency!(SAR, u64, 1_00, "Rl", "Saudi Riyal", SuffixSpaced, true, false);
309define_currency!(SBD, u64, 1_00, "$", "Solomon Islands Dollar", PrefixAttached, true, false);
310define_currency!(SCR, u64, 1_00, "Re", "Seychelles Rupee", SuffixSpaced, true, false);
311define_currency!(SDG, u64, 1_00, "LS", "Sudanese Pound", SuffixSpaced, true, false);
312define_currency!(SEK, u64, 1_00, "kr", "Swedish Krona", SuffixSpaced, true, false);
313define_currency!(SGD, u64, 1_00, "$", "Singapore Dollar", PrefixAttached, true, false);
314define_currency!(SHP, u64, 1_00, "£", "Saint Helena Pound", PrefixAttached, true, false);
315define_currency!(SLE, u64, 1_00, "Le", "Sierra Leonean Leone", SuffixSpaced, true, false);
316define_currency!(SOS, u64, 1_00, "Sh", "Somali Shilling", SuffixSpaced, true, false);
317define_currency!(SRD, u64, 1_00, "$", "Surinamese Dollar", PrefixAttached, true, false);
318define_currency!(SSP, u64, 1_00, "SSP", "South Sudanese Pound", SuffixSpaced, true, false);
319define_currency!(STN, u64, 1_00, "Db", "São Tomé and Príncipe Dobra", SuffixSpaced, true, false);
320define_currency!(SYP, u64, 1_00, "LS", "Syrian Pound", SuffixSpaced, true, false);
321define_currency!(SZL, u64, 1_00, "L", "Swazi Lilangeni", SuffixSpaced, true, false);
322define_currency!(THB, u64, 1_00, "฿", "Thai Baht", PrefixAttached, true, false);
323define_currency!(TJS, u64, 1_00, "SM", "Tajikistani Somoni", SuffixSpaced, true, false);
324define_currency!(TMT, u64, 1_00, "m", "Turkmenistan Manat", SuffixSpaced, true, false);
325define_currency!(TND, u64, 1_000, "DT", "Tunisian Dinar", SuffixSpaced, true, false);
326define_currency!(TOP, u64, 1_00, "T$", "Tongan Paʻanga", SuffixSpaced, true, false);
327define_currency!(TRY, u64, 1_00, "₺", "Turkish Lira", SuffixAttached, true, false);
328define_currency!(TTD, u64, 1_00, "$", "Trinidad and Tobago Dollar", PrefixAttached, true, false);
329define_currency!(TWD, u64, 1_00, "$", "New Taiwan Dollar", PrefixAttached, true, false);
330define_currency!(TZS, u64, 1_00, "Sh", "Tanzanian Shilling", SuffixSpaced, true, false);
331define_currency!(UAH, u64, 1_00, "₴", "Ukrainian Hryvnia", SuffixAttached, true, false);
332define_currency!(UGX, u64, 1, "Sh", "Ugandan Shilling", SuffixSpaced, true, false);
333define_currency!(UYU, u64, 1_00, "$", "Uruguayan Peso", PrefixAttached, true, false);
334define_currency!(UZS, u64, 1_00, "soum", "Uzbekistan Sum", SuffixSpaced, true, false);
335define_currency!(VED, u64, 1_00, "Bs.D", "Venezuelan Digital Bolívar", SuffixSpaced, true, false);
336define_currency!(VES, u64, 1_00, "Bs.S", "Venezuelan Sovereign Bolívar", SuffixSpaced, true, false);
337define_currency!(VND, u64, 1_0, "₫", "Vietnamese đồng", SuffixSpaced, true, false);
338define_currency!(VUV, u64, 1_00, "VT", "Vanuatu Vatu", SuffixSpaced, true, false);
339define_currency!(WST, u64, 1_00, "$", "Samoan Tālā", PrefixAttached, true, false);
340define_currency!(XAF, u64, 1_00, "Fr", "Central African CFA Franc", SuffixSpaced, true, false);
341define_currency!(XAG, u64, 1_00, "t oz", "Silver (Troy Ounce)", SuffixSpaced, true, false);
342define_currency!(XAU, u64, 1_00, "t oz", "Gold (Troy Ounce", SuffixSpaced, true, false);
343define_currency!(XCD, u64, 1_00, "$", "East Caribbean Dollar", SuffixSpaced, true, false);
344define_currency!(XOF, u64, 1_00, "Fr", "West African CFA Franc", SuffixSpaced, true, false);
345define_currency!(XPD, u64, 1_00, "t oz", "Palladium (Troy Ounce)", SuffixSpaced, true, false);
346define_currency!(XPF, u64, 1_00, "Fr", "CFP Franc", SuffixSpaced, true, false);
347define_currency!(XPT, u64, 1_00, "t oz", "Platinum (Troy Ounce)", SuffixSpaced, true, false);
348define_currency!(YER, u64, 1_00, "Rl", "Yemeni Rial", SuffixSpaced, true, false);
349define_currency!(ZAR, u64, 1_00, "R", "South African Rand", SuffixSpaced, true, false);
350define_currency!(ZMW, u64, 1_00, "K", "Zambian Kwacha", SuffixSpaced, true, false);