currencies_core/
currency.rs

1//! Home of the [`Currency`] trait, all built-in currencies such as [`USD`], [`AAVE`], [`ETH`],
2//! etc., the [`define_currency!`](`crate::define_currency`) macro, and related/supporting
3//! types.
4//!
5//! All representable currencies from the ISO-4217 list are included here, as well as several
6//! cryptocurrencies.
7
8use crate::amount::*;
9use crate::u256::{u64_to_u256, U256};
10
11/// Determines how an [`Amount`] in this [`Currency`] should be displayed when it is sent to a
12/// [`core::fmt::Debug`] or [`core::fmt::Display`] impl.
13///
14/// See individual variants for a concise description.
15#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
16pub enum FormatStyle {
17    /// Specifies that the symbol should prefix the amount with no space, like "$40.00". Common
18    /// for major English-speaking locales.
19    PrefixAttached,
20    /// Specifies that the symbol should suffix the amount with no space, like  "40.00€".
21    /// Commonly used in non-English locales.
22    SuffixAttached,
23    /// Specifies that the symbol should prefix the amount with a space, like "$ 40.00". Generally not used.
24    PrefixSpaced,
25    /// Specifies that the symbol should suffix the amount with a space, like "40.00 AUD".
26    /// Commonly used by currencies that use a multi-character or alphabetic symbol.
27    SuffixSpaced,
28}
29
30impl Default for FormatStyle {
31    fn default() -> Self {
32        Self::PrefixAttached
33    }
34}
35
36/// Uniquely defines a particular currency, such as [`USD`], [`BTC`], or [`ETH`].
37pub trait Currency: Copy + Clone + PartialEq + Eq + PartialOrd + Ord + core::hash::Hash {
38    /// Represents the underlying (signed or un-signed) primitive integer type used to
39    /// represent [`Amount`]s of this [`Currency`].
40    type Backing: Backing;
41
42    /// Determines the numerical base of an [`Amount`] of this [`Currency`].
43    ///
44    /// For base ten currencies, this should be a `1` followed by a number of zeroes
45    /// corresponding with the number of supported digits to the right of the decimal place.
46    ///
47    /// Some very rare currencies use a base other than 10, such as Malagasy ariary. For these
48    /// you should use an appropriate base.
49    const BASE: Self::Backing;
50
51    /// Specifies a 3-4 digit acronym or "code" that can be used as a short name for this
52    /// [`Currency`]. For ISO-supported currencies, this will be equal to the ISO-4217
53    /// alphabetic code, which can be found here: <https://en.wikipedia.org/wiki/ISO_4217>.
54    ///
55    /// For cryptocurrencies and other currencies not named in ISO-4217, this should be a short
56    /// globally unique code that is specific to the currency, for example `BTC` for Bitcoin,
57    /// `ETH` for Ethereum, etc..
58    const CODE: &'static str;
59
60    /// Specifies the monetary _symbol_, such as `$`, that is commonly associated with this
61    /// [`Currency`].
62    ///
63    /// It is worth noting that such symbols can be multiple characters long, are not globally
64    /// unique (actually many currencies use the `$` symbol and there are plenty examples of
65    /// the same symbol being used for many currencies), and are not governed or defined by
66    /// ISO-4217 or any other ISO. They also do not have to be symbols, they could be a word or
67    /// several words long.
68    ///
69    /// The symbol is used when formatted values of an [`Amount`] using this [`Currency`] are
70    /// displayed.
71    const SYMBOL: &'static str;
72
73    /// Specifies a long-hand / "proper" name for this [`Currency`], for example "United States
74    /// Dollar".
75    ///
76    /// For currencies governed by ISO-4217, this corresponds with the "entity" field.
77    const PROPER_NAME: &'static str;
78
79    /// Specifies how an [`Amount`] of this [`Currency`] should be displayed when it is
80    /// represented textually via [`core::fmt::Display`] and [`core::fmt::Debug`].
81    const STYLE: FormatStyle;
82
83    /// Set to `true` if this [`Currency`] is governed by ISO-4217. Otherwise `false`.
84    const IS_ISO: bool;
85
86    /// Set to `true` if this [`Currency`] is a cryptocurrency. Otherwise `false`.
87    ///
88    /// This is provided separately from `IS_ISO` to prepare for a future where one or more
89    /// cryptocurrencies are included in ISO-4217.
90    const IS_CRYPTO: bool;
91
92    /// Returns the number of digits to the right of the decimal point for this [`Currency`].
93    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/// Shorthand for defining a new [`Currency`]. All ISO-4217 currencies already have an entry.
105///
106/// Example:
107///
108/// ```ignore
109/// define_currency!(USD, u64, 1_00, "$", "United States Dollar", PrefixAttached, true, false);
110/// ````
111///
112/// where:
113/// - the first argument should be an ident specifying the (programmatic and short-hand) name
114///   of the currency
115/// - the second argument specifies the "backing" type used  to store [`Amount`]s of this
116///   [`Currency`].
117/// - the third argument should be an expression resolving to a number that specifies the
118///   underlying base of this [`Currency`]. Typically this is a `1` followed by a number of
119///   zeroes exactly corresponding with the number of digits this [`Currency`] will support
120///   after the decimal point.
121/// - the fourth argument should be a string literal such as "$" or "ETH" specifying the
122///   _symbol_ that will be used when working with [`Amount`]s of this [`Currency`].
123/// - the fifth argument should be a string literal containing a verbose/proper name for this
124///   [`Currency`] such as "United States Dollar".
125/// - the sixth argument should be a variant name from [`FormatStyle`], minus the leading
126///   `FormatStyle::` portion, as that is implied, and determines how [`Amount`]s of this
127///   [`Currency`] should be displayed.
128/// - the seventh argument should be a boolean expression specifying whether or not this
129///   [`Currency`] is part of ISO-4217.
130/// - the eighth and final argument should be a boolean expression specifying whether or not
131///   this [`Currency`] is a cryptocurrency.
132#[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);