From 95c7d0b42ea02b9553b6ae48676a86a737c2e5e8 Mon Sep 17 00:00:00 2001 From: ok300 <106775972+ok300@users.noreply.github.com> Date: Mon, 24 Jun 2024 06:32:38 +0000 Subject: [PATCH] `sdk-common`: extract FiatAPI (#1020) * sdk-common: extract FiatAPI * Cargo fmt * CurrencyInfo: use empty vec instead of Optional for localizedName, localeOverrides --- libs/sdk-bindings/src/breez_sdk.udl | 4 +- .../assets/json/currencies.json | 4560 ++++++++--------- libs/{sdk-core => sdk-common}/src/fiat.rs | 31 +- libs/sdk-common/src/lib.rs | 2 + libs/sdk-core/src/binding.rs | 55 +- libs/sdk-core/src/breez_services.rs | 12 +- libs/sdk-core/src/bridge_generated.rs | 166 +- libs/sdk-core/src/lib.rs | 2 - libs/sdk-core/src/models.rs | 11 - libs/sdk-core/src/test_utils.rs | 9 +- libs/sdk-flutter/lib/bridge_generated.dart | 26 +- .../main/java/com/breezsdk/BreezSDKMapper.kt | 24 +- .../sdk-react-native/ios/BreezSDKMapper.swift | 16 +- libs/sdk-react-native/src/index.ts | 4 +- tools/sdk-cli/Cargo.lock | 1 - 15 files changed, 2494 insertions(+), 2429 deletions(-) rename libs/{sdk-core => sdk-common}/assets/json/currencies.json (94%) rename libs/{sdk-core => sdk-common}/src/fiat.rs (77%) diff --git a/libs/sdk-bindings/src/breez_sdk.udl b/libs/sdk-bindings/src/breez_sdk.udl index 8a0e544a0..f7f5555c1 100644 --- a/libs/sdk-bindings/src/breez_sdk.udl +++ b/libs/sdk-bindings/src/breez_sdk.udl @@ -364,8 +364,8 @@ dictionary CurrencyInfo { u32? spacing; Symbol? symbol; Symbol? uniq_symbol; - sequence? localized_name; - sequence? locale_overrides; + sequence localized_name; + sequence locale_overrides; }; dictionary FiatCurrency { diff --git a/libs/sdk-core/assets/json/currencies.json b/libs/sdk-common/assets/json/currencies.json similarity index 94% rename from libs/sdk-core/assets/json/currencies.json rename to libs/sdk-common/assets/json/currencies.json index c741142ae..612cc0707 100644 --- a/libs/sdk-core/assets/json/currencies.json +++ b/libs/sdk-common/assets/json/currencies.json @@ -1,2281 +1,2281 @@ -{ - "AED": { - "name": "UAE Dirham", - "fractionSize": 2, - "symbol": { - "grapheme": "د.إ", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": null - }, - "AFN": { - "name": "Afghani", - "fractionSize": 2, - "symbol": { - "grapheme": "؋", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": "؋", - "template": "1 $", - "rtl": true - } - }, - "ALL": { - "name": "Lek", - "fractionSize": 2, - "symbol": { - "grapheme": "L", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Lek", - "template": "$1", - "rtl": false - } - }, - "AMD": { - "name": "Armenian Dram", - "fractionSize": 2, - "symbol": { - "grapheme": "դր.", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "դր.", - "template": "1 $", - "rtl": false - } - }, - "ANG": { - "name": "Netherlands Antillean Guilder", - "fractionSize": 2, - "symbol": { - "grapheme": "ƒ", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "NAƒ", - "template": "$1", - "rtl": false - } - }, - "AOA": { - "name": "Kwanza", - "localized_name": [ - { - "locale": "en", - "name": "Angolan Kwanza" - }, - { - "locale": "es", - "name": "Kwanza Angoleño" - } - ], - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "ARS": { - "name": "Peso Argentino", - "localized_name": [ - { - "locale": "en", - "name": "Argentine Peso" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "AUD": { - "name": "Australian Dollar", - "localized_name": [ - { - "locale": "es", - "name": "Dólar Australiano" - }, - { - "locale": "pt", - "name": "Dólar Australiano" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "A$", - "template": "$1", - "rtl": false - } - }, - "AWG": { - "name": "Aruban Florin", - "fractionSize": 2, - "symbol": { - "grapheme": "ƒ", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Afl", - "template": "$1", - "rtl": false - } - }, - "AZN": { - "name": "Azerbaijan Manat", - "fractionSize": 2, - "symbol": { - "grapheme": "₼", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₼", - "template": "$1", - "rtl": false - } - }, - "BAM": { - "name": "Convertible Mark", - "fractionSize": 2, - "symbol": { - "grapheme": "KM", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "KM", - "template": "$1", - "rtl": false - } - }, - "BBD": { - "name": "Barbados Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "BDT": { - "name": "Taka", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "BGN": { - "name": "Bulgarian Lev", - "fractionSize": 2, - "symbol": { - "grapheme": "лв", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "лв", - "template": "$1", - "rtl": false - } - }, - "BHD": { - "name": "Bahraini Dinar", - "fractionSize": 3, - "symbol": { - "grapheme": ".د.ب", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".د.ب", - "template": "1 $", - "rtl": true - } - }, - "BIF": { - "name": "Burundi Franc", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "BMD": { - "name": "Bermudian Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "BD$", - "template": "$1", - "rtl": false - } - }, - "BND": { - "name": "Brunei Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "BOB": { - "name": "Boliviano", - "fractionSize": 2, - "symbol": { - "grapheme": "Bs.", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Bs.", - "template": "$1", - "rtl": false - } - }, - "BOV": { - "name": "Mvdol", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "BRL": { - "name": "Real", - "localized_name": [ - { - "locale": "en", - "name": "Brazilian Real" - }, - { - "locale": "es", - "name": "Real Brasileño" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "R$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "R$", - "template": "$1", - "rtl": false - } - }, - "BSD": { - "name": "Bahamian Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "BTN": { - "name": "Ngultrum", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "BWP": { - "name": "Pula", - "fractionSize": 2, - "symbol": { - "grapheme": "P", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "P", - "template": "$1", - "rtl": false - } - }, - "BYN": { - "name": "Belarusian Ruble", - "fractionSize": 2, - "symbol": { - "grapheme": "p.", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "р.", - "template": "1 $", - "rtl": false - } - }, - "BYR": { - "name": "Belarussian Ruble", - "fractionSize": 0, - "symbol": { - "grapheme": "p.", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "р.", - "template": "1 $", - "rtl": false - } - }, - "BZD": { - "name": "Belize Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "BZ$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "BZ$", - "template": "$1", - "rtl": false - } - }, - "CAD": { - "name": "Canadian Dollar", - "localized_name": [ - { - "locale": "es", - "name": "Dólar Canadiense" - }, - { - "locale": "pt", - "name": "Dólar Canadense" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "CA$", - "template": "$1", - "rtl": false - } - }, - "CDF": { - "name": "Congolese Franc", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "CHE": { - "name": "WIR Euro", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "CHF": { - "name": "Swiss Franc", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "CHW": { - "name": "WIR Franc", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "CLF": { - "name": "Unidad de Fomento", - "fractionSize": 4, - "symbol": null, - "uniqSymbol": null - }, - "CLP": { - "name": "Peso Chileno", - "localized_name": [ - { - "locale": "en", - "name": "Chilean Peso" - }, - { - "locale": "pt", - "name": "Peso Chileno" - } - ], - "fractionSize": 0, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "CNY": { - "name": "Yuan Renminbi", - "fractionSize": 2, - "symbol": { - "grapheme": "元", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "元", - "template": "1 $", - "rtl": false - } - }, - "COP": { - "name": "Peso Colombiano", - "localized_name": [ - { - "locale": "en", - "name": "Colombian Peso" - }, - { - "locale": "pt", - "name": "Peso Colombiano" - } - ], - "fractionSize": 0, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "COU": { - "name": "Unidad de Valor Real", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "CRC": { - "name": "Cost Rican Colon", - "fractionSize": 2, - "symbol": { - "grapheme": "₡", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₡", - "template": "$1", - "rtl": false - } - }, - "CUC": { - "name": "Peso Convertible", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "CUP": { - "name": "Peso Cubano", - "localized_name": [ - { - "locale": "en", - "name": "Cuban Peso" - }, - { - "locale": "pt", - "name": "Peso Cubano" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "$MN", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "$MN", - "template": "$1", - "rtl": false - } - }, - "CVE": { - "name": "Cabo Verde Escudo", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "CZK": { - "name": "Czech Koruna", - "fractionSize": 2, - "symbol": { - "grapheme": "Kč", - "template": "1 $", - "rtl": false, - "position": 1 - }, - "uniqSymbol": { - "grapheme": "Kč", - "template": "1 $", - "rtl": false - } - }, - "DJF": { - "name": "Djibouti Franc", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "DKK": { - "name": "Danish Krone", - "fractionSize": 2, - "symbol": { - "grapheme": "kr.", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": null - }, - "DOP": { - "name": "Peso Dominicano", - "localized_name": [ - { - "locale": "en", - "name": "Dominican Peso" - }, - { - "locale": "pt", - "name": "Peso Dominicano" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "RD$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "RD$", - "template": "$1", - "rtl": false - } - }, - "DZD": { - "name": "Algerian Dinar", - "fractionSize": 2, - "symbol": { - "grapheme": ".د.ج", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".د.ج", - "template": "1 $", - "rtl": true - } - }, - "EEK": { - "name": "Estonian Kroon", - "fractionSize": 2, - "symbol": { - "grapheme": "kr", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "EGP": { - "name": "Egyptian Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": ".ج.م", - "template": "1 $", - "rtl": true - } - }, - "ERN": { - "name": "Nakfa", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "ETB": { - "name": "Ethiopian Birr", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "EUR": { - "name": "Euro", - "fractionSize": 2, - "spacing": 1, - "symbol": { - "grapheme": "€", - "position": 1, - "rtl": false - }, - "uniqSymbol": { - "grapheme": "€", - "rtl": false - }, - "localeOverrides": [ - { - "locale": "de-AT", - "symbol": { - "position": 0 - } - }, - { - "locale": "el-CY", - "spacing": 0, - "symbol": { - "position": 0 - } - }, - { - "locale": "en", - "spacing": 0, - "symbol": { - "position": 0 - } - }, - { - "locale": "nl", - "symbol": { - "position": 0 - } - }, - { - "locale": "tr", - "spacing": 0, - "symbol": { - "position": 0 - } - } - ] - }, - "FJD": { - "name": "Fiji Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "FJ$", - "template": "$1", - "rtl": false - } - }, - "FKP": { - "name": "Falkland Islands Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "GBP": { - "name": "Pound Sterling", - "localized_name": [ - { - "locale": "es", - "name": "Libra Esterlina" - }, - { - "locale": "pt", - "name": "Libra Esterlina" - } - ], - "fractionSize": 2, - "spacing": 0, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - } - }, - "GEL": { - "name": "Lari", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "GGP": { - "name": "Guernsey Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "GHC": { - "name": "Ghanaian Cedi", - "fractionSize": 2, - "symbol": { - "grapheme": "¢", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "¢", - "template": "$1", - "rtl": false - } - }, - "GHS": { - "name": "Ghana Cedi", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "GIP": { - "name": "Gibraltar Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "GMD": { - "name": "Dalasi", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "GNF": { - "name": "Guinean Franc", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "GTQ": { - "name": "Quetzal", - "fractionSize": 2, - "symbol": { - "grapheme": "Q", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Q", - "template": "$1", - "rtl": false - } - }, - "GYD": { - "name": "Guyana Dollar", - "localized_name": [ - { - "locale": "es", - "name": "Dólar Guyanés" - }, - { - "locale": "pt", - "name": "Dólar Guianês" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "GY$", - "template": "$1", - "rtl": false - } - }, - "HKD": { - "name": "Hong Kong Dollar", - "localized_name": [ - { - "locale": "es", - "name": "Dólar de Hong Kong" - }, - { - "locale": "pt", - "name": "Dólar de Hong Kong" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "HK$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "HK$", - "template": "$1", - "rtl": false - } - }, - "HNL": { - "name": "Lempira", - "fractionSize": 2, - "symbol": { - "grapheme": "L", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "L", - "template": "$1", - "rtl": false - } - }, - "HRK": { - "name": "Kuna", - "fractionSize": 2, - "symbol": { - "grapheme": "kn", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "kn", - "template": "$1", - "rtl": false - } - }, - "HTG": { - "name": "Gourde", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "HUF": { - "name": "Forint", - "fractionSize": 0, - "symbol": { - "grapheme": "Ft", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Ft", - "template": "$1", - "rtl": false - } - }, - "IDR": { - "name": "Rupiah", - "fractionSize": 2, - "symbol": { - "grapheme": "Rp", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Rp", - "template": "$1", - "rtl": false - } - }, - "ILS": { - "name": "New Israeli Shekel", - "fractionSize": 2, - "symbol": { - "grapheme": "₪", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₪", - "template": "$1", - "rtl": false - } - }, - "IMP": { - "name": "Manx Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "INR": { - "name": "Indian Rupee", - "fractionSize": 2, - "symbol": { - "grapheme": "₹", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₹", - "template": "$1", - "rtl": false - } - }, - "IQD": { - "name": "Iraqi Dinar", - "fractionSize": 3, - "symbol": { - "grapheme": ".د.ع", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".د.ع", - "template": "1 $", - "rtl": true - } - }, - "IRR": { - "name": "Iranian Rial", - "fractionSize": 0, - "symbol": { - "grapheme": "﷼", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": "﷼", - "template": "1 $", - "rtl": true - } - }, - "ISK": { - "name": "Iceland Krona", - "fractionSize": 2, - "symbol": { - "grapheme": "kr", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "JEP": { - "name": "Jersey Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "JMD": { - "name": "Jamaican Dollar", - "localized_name": [ - { - "locale": "es", - "name": "Dólar Jamaiquino" - }, - { - "locale": "pt", - "name": "Dólar Jamaicano" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "J$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "J$", - "template": "$1", - "rtl": false - } - }, - "JOD": { - "name": "Jordanian Dinar", - "fractionSize": 3, - "symbol": { - "grapheme": ".د.إ", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": null - }, - "JPY": { - "name": "円", - "localized_name": [ - { - "locale": "en", - "name": "Yen" - }, - { - "locale": "es", - "name": "Yen" - }, - { - "locale": "pt", - "name": "Iene" - } - ], - "fractionSize": 0, - "symbol": { - "grapheme": "¥", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "¥", - "template": "$1", - "rtl": false - } - }, - "KES": { - "name": "Kenyan Shilling", - "fractionSize": 2, - "symbol": { - "grapheme": "KSh", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "KSh", - "template": "$1", - "rtl": false - } - }, - "KGS": { - "name": "Som", - "fractionSize": 2, - "symbol": { - "grapheme": "сом", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "сом", - "template": "$1", - "rtl": false - } - }, - "KHR": { - "name": "Riel", - "fractionSize": 2, - "symbol": { - "grapheme": "៛", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "៛", - "template": "$1", - "rtl": false - } - }, - "KMF": { - "name": "Comorian Franc", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "KPW": { - "name": "North Korean Won", - "fractionSize": 0, - "symbol": { - "grapheme": "₩", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "KRW": { - "name": "원", - "localized_name": [ - { - "locale": "en", - "name": "Won" - }, - { - "locale": "es", - "name": "Won" - }, - { - "locale": "pt", - "name": "Won" - } - ], - "fractionSize": 0, - "symbol": { - "grapheme": "₩", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₩", - "template": "$1", - "rtl": false - } - }, - "KWD": { - "name": "Kuwaiti Dinar", - "fractionSize": 3, - "symbol": { - "grapheme": ".د.ك", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".د.ك", - "template": "1 $", - "rtl": true - } - }, - "KYD": { - "name": "Cayman Islands Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "CI$", - "template": "$1", - "rtl": false - } - }, - "KZT": { - "name": "Tenge", - "fractionSize": 2, - "symbol": { - "grapheme": "₸", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₸", - "template": "$1", - "rtl": false - } - }, - "LAK": { - "name": "Lao Kip", - "fractionSize": 2, - "symbol": { - "grapheme": "₭", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₭", - "template": "$1", - "rtl": false - } - }, - "LBP": { - "name": "Lebanese Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": ".ل.ل", - "template": "1 $", - "rtl": true - } - }, - "LKR": { - "name": "Sri Lanka Rupee", - "fractionSize": 2, - "symbol": { - "grapheme": "₨", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "LRD": { - "name": "Liberian Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "L$", - "template": "$1", - "rtl": false - } - }, - "LSL": { - "name": "Loti", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "LTL": { - "name": "Lithuanian Litas", - "fractionSize": 2, - "symbol": { - "grapheme": "Lt", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Lt", - "template": "$1", - "rtl": false - } - }, - "LVL": { - "name": "Latvian Lats", - "fractionSize": 2, - "symbol": { - "grapheme": "Ls", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Ls", - "template": "1 $", - "rtl": false - } - }, - "LYD": { - "name": "Libyan Dinar", - "fractionSize": 3, - "symbol": { - "grapheme": ".د.ل", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".د.ل", - "template": "1 $", - "rtl": true - } - }, - "MAD": { - "name": "Moroccan Dirham", - "fractionSize": 2, - "symbol": { - "grapheme": ".د.م", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".د.م", - "template": "1 $", - "rtl": true - } - }, - "MDL": { - "name": "Moldovan Leu", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "MGA": { - "name": "Malagasy Ariary", - "fractionSize": 1, - "symbol": null, - "uniqSymbol": null - }, - "MKD": { - "name": "Denar", - "fractionSize": 2, - "symbol": { - "grapheme": "ден", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "ден", - "template": "$1", - "rtl": false - } - }, - "MMK": { - "name": "Kyat", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "MNT": { - "name": "Tugrik", - "fractionSize": 2, - "symbol": { - "grapheme": "₮", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₮", - "template": "$1", - "rtl": false - } - }, - "MOP": { - "name": "Pataca", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "MRU": { - "name": "Ouguiya", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "MUR": { - "name": "Mauritius Rupee", - "fractionSize": 2, - "symbol": { - "grapheme": "₨", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "MVR": { - "name": "Rufiyaa", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "MWK": { - "name": "Malawi Kwacha", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "MXN": { - "name": "Peso Mexicano", - "localized_name": [ - { - "locale": "en", - "name": "Mexican Peso" - }, - { - "locale": "pt", - "name": "Peso Mexicano" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "MXV": { - "name": "Mexican Unidad de Inversion (UDI)", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "MYR": { - "name": "Malaysian Ringgit", - "fractionSize": 2, - "symbol": { - "grapheme": "RM", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "RM", - "template": "$1", - "rtl": false - } - }, - "MZN": { - "name": "Metical", - "localized_name": [ - { - "locale": "en", - "name": "Mozambique Metical" - }, - { - "locale": "es", - "name": "Metical Mozambiqueño" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "MT", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "MT", - "template": "$1", - "rtl": false - } - }, - "NAD": { - "name": "Namibia Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "N$", - "template": "$1", - "rtl": false - } - }, - "NGN": { - "name": "Naira", - "fractionSize": 2, - "symbol": { - "grapheme": "₦", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₦", - "template": "$1", - "rtl": false - } - }, - "NIO": { - "name": "Cordoba Oro", - "fractionSize": 2, - "symbol": { - "grapheme": "C$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "C$", - "template": "$1", - "rtl": false - } - }, - "NOK": { - "name": "Norwegian Krone", - "fractionSize": 2, - "symbol": { - "grapheme": "kr", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": null - }, - "NPR": { - "name": "Nepalese Rupee", - "fractionSize": 2, - "symbol": { - "grapheme": "₨", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "NZD": { - "name": "New Zealand Dollar", - "localized_name": [ - { - "locale": "es", - "name": "Dólar Neozelandés" - }, - { - "locale": "pt", - "name": "Dólar Neozelandês" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "NZ$", - "template": "$1", - "rtl": false - } - }, - "OMR": { - "name": "Rial Omani", - "fractionSize": 3, - "symbol": { - "grapheme": "﷼", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".ر.ع", - "template": "1 $", - "rtl": true - } - }, - "PAB": { - "name": "Balboa", - "fractionSize": 2, - "symbol": { - "grapheme": "B/.", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "B/.", - "template": "$1", - "rtl": false - } - }, - "PEN": { - "name": "Sol", - "fractionSize": 2, - "symbol": { - "grapheme": "S/", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "S/", - "template": "$1", - "rtl": false - } - }, - "PGK": { - "name": "Kina", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "PHP": { - "name": "Piso", - "localized_name": [ - { - "locale": "en", - "name": "Philippine Peso" - }, - { - "locale": "es", - "name": "Peso Filipino" - }, - { - "locale": "pt", - "name": "Peso Filipino" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "₱", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₱", - "template": "$1", - "rtl": false - } - }, - "PKR": { - "name": "Pakistan Rupee", - "fractionSize": 2, - "symbol": { - "grapheme": "₨", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "PLN": { - "name": "Zloty", - "fractionSize": 2, - "symbol": { - "grapheme": "zł", - "position": 1, - "rtl": false - }, - "uniqSymbol": { - "grapheme": "zł", - "rtl": false - } - }, - "PYG": { - "name": "Guaraní", - "localized_name": [ - { - "locale": "en", - "name": "Guarani" - }, - { - "locale": "pt", - "name": "Guarani" - } - ], - "fractionSize": 0, - "symbol": { - "grapheme": "Gs", - "template": "1$", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Gs", - "template": "1$", - "rtl": false - } - }, - "QAR": { - "name": "Qatari Rial", - "fractionSize": 2, - "symbol": { - "grapheme": "﷼", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".ر.ق", - "template": "1 $", - "rtl": true - } - }, - "RON": { - "name": "Romanian Leu", - "fractionSize": 2, - "symbol": { - "grapheme": "lei", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "lei", - "template": "$1", - "rtl": false - } - }, - "RSD": { - "name": "Serbian Dinar", - "fractionSize": 2, - "symbol": { - "grapheme": "Дин.", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Дин.", - "template": "$1", - "rtl": false - } - }, - "RUB": { - "name": "Russian Ruble", - "fractionSize": 2, - "symbol": { - "grapheme": "₽", - "template": "1 $", - "rtl": false, - "position": 1 - }, - "uniqSymbol": { - "grapheme": "₽", - "template": "1 $", - "rtl": false - } - }, - "RUR": { - "name": "Russian Ruble", - "fractionSize": 2, - "symbol": { - "grapheme": "₽", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₽", - "template": "1 $", - "rtl": false - } - }, - "RWF": { - "name": "Rwanda Franc", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "SAR": { - "name": "Saudi Riyal", - "fractionSize": 2, - "symbol": { - "grapheme": "﷼", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".ر.س", - "template": "1 $", - "rtl": true - } - }, - "SBD": { - "name": "Solomon Islands Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "SI$", - "template": "$1", - "rtl": false - } - }, - "SCR": { - "name": "Seychelles Rupee", - "fractionSize": 2, - "symbol": { - "grapheme": "₨", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "SDG": { - "name": "Sudanese Pound", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "SEK": { - "name": "Swedish Krona", - "fractionSize": 2, - "symbol": { - "grapheme": "kr", - "template": "1 $", - "rtl": false, - "position": 1 - }, - "uniqSymbol": null - }, - "SGD": { - "name": "Singapore Dollar", - "fractionSize": 2, - "spacing": 0, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "S$", - "template": "$1", - "rtl": false - } - }, - "SHP": { - "name": "Saint Helena Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "SLL": { - "name": "Leone", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "SOS": { - "name": "Somali Shilling", - "fractionSize": 2, - "symbol": { - "grapheme": "S", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "S", - "template": "$1", - "rtl": false - } - }, - "SRD": { - "name": "Surinam Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "SSP": { - "name": "South Sudanese Pound", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "STN": { - "name": "Dobra", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "SVC": { - "name": "El Salvador Colon", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "C", - "template": "$1", - "rtl": false - } - }, - "SYP": { - "name": "Syrian Pound", - "fractionSize": 2, - "symbol": { - "grapheme": "£", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": ".ل.س", - "template": "1 $", - "rtl": true - } - }, - "SZL": { - "name": "Lilangeni", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "THB": { - "name": "Baht", - "fractionSize": 2, - "symbol": { - "grapheme": "฿", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "฿", - "template": "$1", - "rtl": false - } - }, - "TJS": { - "name": "Somoni", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "TMT": { - "name": "Turkmenistan New Manat", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "TND": { - "name": "Tunisian Dinar", - "fractionSize": 3, - "symbol": { - "grapheme": ".د.ت", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".د.ت", - "template": "1 $", - "rtl": true - } - }, - "TOP": { - "name": "Pa’anga", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "TRL": { - "name": "Turkish Lira", - "fractionSize": 2, - "symbol": { - "grapheme": "₤", - "template": "$1", - "rtl": false - }, - "uniqSymbol": null - }, - "TRY": { - "name": "Turkish Lira", - "fractionSize": 2, - "symbol": { - "grapheme": "₺", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₺", - "template": "$1", - "rtl": false - } - }, - "TTD": { - "name": "Trinidad and Tobago Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "TT$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "TT$", - "template": "$1", - "rtl": false - } - }, - "TWD": { - "name": "New Taiwan Dollar", - "fractionSize": 0, - "symbol": { - "grapheme": "NT$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "NT$", - "template": "$1", - "rtl": false - } - }, - "TZS": { - "name": "Tanzanian Shilling", - "fractionSize": 0, - "symbol": { - "grapheme": "TSh", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "TSh", - "template": "$1", - "rtl": false - } - }, - "UAH": { - "name": "Hryvnia", - "fractionSize": 2, - "symbol": { - "grapheme": "₴", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "₴", - "template": "$1", - "rtl": false - } - }, - "UGX": { - "name": "Uganda Shilling", - "fractionSize": 0, - "symbol": { - "grapheme": "USh", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "USh", - "template": "$1", - "rtl": false - } - }, - "USD": { - "name": "US Dollar", - "localized_name": [ - { - "locale": "es", - "name": "Dólar Americano" - }, - { - "locale": "pt", - "name": "Dólar Americano" - } - ], - "fractionSize": 2, - "spacing": 0, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - } - }, - "USN": { - "name": "US Dollar (Next day)", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "UYI": { - "name": "Uruguay Peso en Unidades Indexadas (UI)", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "UYU": { - "name": "Peso Uruguayo", - "localized_name": [ - { - "locale": "en", - "name": "Uruguayan Peso" - }, - { - "locale": "pt", - "name": "Peso Uruguaio" - } - ], - "fractionSize": 0, - "symbol": { - "grapheme": "$U", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "$U", - "template": "$1", - "rtl": false - } - }, - "UZS": { - "name": "Uzbekistan Sum", - "fractionSize": 2, - "symbol": { - "grapheme": "so’m", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "so’m", - "template": "$1", - "rtl": false - } - }, - "VEF": { - "name": "Bolívar", - "localized_name": [ - { - "locale": "en", - "name": "Venezuelan Bolivar" - }, - { - "locale": "pt", - "name": "Bolívar Venezuelano" - } - ], - "fractionSize": 2, - "symbol": { - "grapheme": "Bs", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Bs", - "template": "$1", - "rtl": false - } - }, - "VES": { - "name": "Bolivar Soberano", - "fractionSize": 2, - "symbol": { - "grapheme": "Bs", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Bs", - "template": "$1", - "rtl": false - } - }, - "VND": { - "name": "Dong", - "fractionSize": 0, - "symbol": { - "grapheme": "₫", - "template": "1 $", - "rtl": false, - "position": 1 - }, - "uniqSymbol": { - "grapheme": "₫", - "template": "1 $", - "rtl": false - } - }, - "VUV": { - "name": "Vatu", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "WST": { - "name": "Tala", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "XAF": { - "name": "CFA Franc BEAC", - "fractionSize": 0, - "symbol": { - "grapheme": "FCFA", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "FCFA", - "template": "1 $", - "rtl": false - } - }, - "XCD": { - "name": "East Caribbean Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "EC$", - "template": "$1", - "rtl": false - } - }, - "XDR": { - "name": "SDR (Special Drawing Right)", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "XOF": { - "name": "CFA Franc BCEAO", - "fractionSize": 0, - "symbol": { - "grapheme": "CFA", - "template": "1 $", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "CFA", - "template": "1 $", - "rtl": false - } - }, - "XPF": { - "name": "CFP Franc", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "XSU": { - "name": "Sucre", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "XUA": { - "name": "ADB Unit of Account", - "fractionSize": 0, - "symbol": null, - "uniqSymbol": null - }, - "YER": { - "name": "Yemeni Rial", - "fractionSize": 2, - "symbol": { - "grapheme": "﷼", - "template": "1 $", - "rtl": true - }, - "uniqSymbol": { - "grapheme": ".ر.ي", - "template": "1 $", - "rtl": true - } - }, - "ZAR": { - "name": "Rand", - "fractionSize": 2, - "symbol": { - "grapheme": "R", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "R", - "template": "$1", - "rtl": false - } - }, - "ZMW": { - "name": "Zambian Kwacha", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - }, - "ZWD": { - "name": "Zimbabwe Dollar", - "fractionSize": 2, - "symbol": { - "grapheme": "Z$", - "template": "$1", - "rtl": false - }, - "uniqSymbol": { - "grapheme": "Z$", - "template": "$1", - "rtl": false - } - }, - "ZWL": { - "name": "Zimbabwe Dollar", - "fractionSize": 2, - "symbol": null, - "uniqSymbol": null - } +{ + "AED": { + "name": "UAE Dirham", + "fractionSize": 2, + "symbol": { + "grapheme": "د.إ", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": null + }, + "AFN": { + "name": "Afghani", + "fractionSize": 2, + "symbol": { + "grapheme": "؋", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": "؋", + "template": "1 $", + "rtl": true + } + }, + "ALL": { + "name": "Lek", + "fractionSize": 2, + "symbol": { + "grapheme": "L", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Lek", + "template": "$1", + "rtl": false + } + }, + "AMD": { + "name": "Armenian Dram", + "fractionSize": 2, + "symbol": { + "grapheme": "դր.", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "դր.", + "template": "1 $", + "rtl": false + } + }, + "ANG": { + "name": "Netherlands Antillean Guilder", + "fractionSize": 2, + "symbol": { + "grapheme": "ƒ", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "NAƒ", + "template": "$1", + "rtl": false + } + }, + "AOA": { + "name": "Kwanza", + "localized_name": [ + { + "locale": "en", + "name": "Angolan Kwanza" + }, + { + "locale": "es", + "name": "Kwanza Angoleño" + } + ], + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "ARS": { + "name": "Peso Argentino", + "localized_name": [ + { + "locale": "en", + "name": "Argentine Peso" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "AUD": { + "name": "Australian Dollar", + "localized_name": [ + { + "locale": "es", + "name": "Dólar Australiano" + }, + { + "locale": "pt", + "name": "Dólar Australiano" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "A$", + "template": "$1", + "rtl": false + } + }, + "AWG": { + "name": "Aruban Florin", + "fractionSize": 2, + "symbol": { + "grapheme": "ƒ", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Afl", + "template": "$1", + "rtl": false + } + }, + "AZN": { + "name": "Azerbaijan Manat", + "fractionSize": 2, + "symbol": { + "grapheme": "₼", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₼", + "template": "$1", + "rtl": false + } + }, + "BAM": { + "name": "Convertible Mark", + "fractionSize": 2, + "symbol": { + "grapheme": "KM", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "KM", + "template": "$1", + "rtl": false + } + }, + "BBD": { + "name": "Barbados Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "BDT": { + "name": "Taka", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "BGN": { + "name": "Bulgarian Lev", + "fractionSize": 2, + "symbol": { + "grapheme": "лв", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "лв", + "template": "$1", + "rtl": false + } + }, + "BHD": { + "name": "Bahraini Dinar", + "fractionSize": 3, + "symbol": { + "grapheme": ".د.ب", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".د.ب", + "template": "1 $", + "rtl": true + } + }, + "BIF": { + "name": "Burundi Franc", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "BMD": { + "name": "Bermudian Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "BD$", + "template": "$1", + "rtl": false + } + }, + "BND": { + "name": "Brunei Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "BOB": { + "name": "Boliviano", + "fractionSize": 2, + "symbol": { + "grapheme": "Bs.", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Bs.", + "template": "$1", + "rtl": false + } + }, + "BOV": { + "name": "Mvdol", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "BRL": { + "name": "Real", + "localized_name": [ + { + "locale": "en", + "name": "Brazilian Real" + }, + { + "locale": "es", + "name": "Real Brasileño" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "R$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "R$", + "template": "$1", + "rtl": false + } + }, + "BSD": { + "name": "Bahamian Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "BTN": { + "name": "Ngultrum", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "BWP": { + "name": "Pula", + "fractionSize": 2, + "symbol": { + "grapheme": "P", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "P", + "template": "$1", + "rtl": false + } + }, + "BYN": { + "name": "Belarusian Ruble", + "fractionSize": 2, + "symbol": { + "grapheme": "p.", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "р.", + "template": "1 $", + "rtl": false + } + }, + "BYR": { + "name": "Belarussian Ruble", + "fractionSize": 0, + "symbol": { + "grapheme": "p.", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "р.", + "template": "1 $", + "rtl": false + } + }, + "BZD": { + "name": "Belize Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "BZ$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "BZ$", + "template": "$1", + "rtl": false + } + }, + "CAD": { + "name": "Canadian Dollar", + "localized_name": [ + { + "locale": "es", + "name": "Dólar Canadiense" + }, + { + "locale": "pt", + "name": "Dólar Canadense" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "CA$", + "template": "$1", + "rtl": false + } + }, + "CDF": { + "name": "Congolese Franc", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "CHE": { + "name": "WIR Euro", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "CHF": { + "name": "Swiss Franc", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "CHW": { + "name": "WIR Franc", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "CLF": { + "name": "Unidad de Fomento", + "fractionSize": 4, + "symbol": null, + "uniqSymbol": null + }, + "CLP": { + "name": "Peso Chileno", + "localized_name": [ + { + "locale": "en", + "name": "Chilean Peso" + }, + { + "locale": "pt", + "name": "Peso Chileno" + } + ], + "fractionSize": 0, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "CNY": { + "name": "Yuan Renminbi", + "fractionSize": 2, + "symbol": { + "grapheme": "元", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "元", + "template": "1 $", + "rtl": false + } + }, + "COP": { + "name": "Peso Colombiano", + "localized_name": [ + { + "locale": "en", + "name": "Colombian Peso" + }, + { + "locale": "pt", + "name": "Peso Colombiano" + } + ], + "fractionSize": 0, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "COU": { + "name": "Unidad de Valor Real", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "CRC": { + "name": "Cost Rican Colon", + "fractionSize": 2, + "symbol": { + "grapheme": "₡", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₡", + "template": "$1", + "rtl": false + } + }, + "CUC": { + "name": "Peso Convertible", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "CUP": { + "name": "Peso Cubano", + "localized_name": [ + { + "locale": "en", + "name": "Cuban Peso" + }, + { + "locale": "pt", + "name": "Peso Cubano" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "$MN", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "$MN", + "template": "$1", + "rtl": false + } + }, + "CVE": { + "name": "Cabo Verde Escudo", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "CZK": { + "name": "Czech Koruna", + "fractionSize": 2, + "symbol": { + "grapheme": "Kč", + "template": "1 $", + "rtl": false, + "position": 1 + }, + "uniqSymbol": { + "grapheme": "Kč", + "template": "1 $", + "rtl": false + } + }, + "DJF": { + "name": "Djibouti Franc", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "DKK": { + "name": "Danish Krone", + "fractionSize": 2, + "symbol": { + "grapheme": "kr.", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": null + }, + "DOP": { + "name": "Peso Dominicano", + "localized_name": [ + { + "locale": "en", + "name": "Dominican Peso" + }, + { + "locale": "pt", + "name": "Peso Dominicano" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "RD$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "RD$", + "template": "$1", + "rtl": false + } + }, + "DZD": { + "name": "Algerian Dinar", + "fractionSize": 2, + "symbol": { + "grapheme": ".د.ج", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".د.ج", + "template": "1 $", + "rtl": true + } + }, + "EEK": { + "name": "Estonian Kroon", + "fractionSize": 2, + "symbol": { + "grapheme": "kr", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "EGP": { + "name": "Egyptian Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": ".ج.م", + "template": "1 $", + "rtl": true + } + }, + "ERN": { + "name": "Nakfa", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "ETB": { + "name": "Ethiopian Birr", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "EUR": { + "name": "Euro", + "fractionSize": 2, + "spacing": 1, + "symbol": { + "grapheme": "€", + "position": 1, + "rtl": false + }, + "uniqSymbol": { + "grapheme": "€", + "rtl": false + }, + "localeOverrides": [ + { + "locale": "de-AT", + "symbol": { + "position": 0 + } + }, + { + "locale": "el-CY", + "spacing": 0, + "symbol": { + "position": 0 + } + }, + { + "locale": "en", + "spacing": 0, + "symbol": { + "position": 0 + } + }, + { + "locale": "nl", + "symbol": { + "position": 0 + } + }, + { + "locale": "tr", + "spacing": 0, + "symbol": { + "position": 0 + } + } + ] + }, + "FJD": { + "name": "Fiji Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "FJ$", + "template": "$1", + "rtl": false + } + }, + "FKP": { + "name": "Falkland Islands Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "GBP": { + "name": "Pound Sterling", + "localized_name": [ + { + "locale": "es", + "name": "Libra Esterlina" + }, + { + "locale": "pt", + "name": "Libra Esterlina" + } + ], + "fractionSize": 2, + "spacing": 0, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + } + }, + "GEL": { + "name": "Lari", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "GGP": { + "name": "Guernsey Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "GHC": { + "name": "Ghanaian Cedi", + "fractionSize": 2, + "symbol": { + "grapheme": "¢", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "¢", + "template": "$1", + "rtl": false + } + }, + "GHS": { + "name": "Ghana Cedi", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "GIP": { + "name": "Gibraltar Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "GMD": { + "name": "Dalasi", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "GNF": { + "name": "Guinean Franc", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "GTQ": { + "name": "Quetzal", + "fractionSize": 2, + "symbol": { + "grapheme": "Q", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Q", + "template": "$1", + "rtl": false + } + }, + "GYD": { + "name": "Guyana Dollar", + "localized_name": [ + { + "locale": "es", + "name": "Dólar Guyanés" + }, + { + "locale": "pt", + "name": "Dólar Guianês" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "GY$", + "template": "$1", + "rtl": false + } + }, + "HKD": { + "name": "Hong Kong Dollar", + "localized_name": [ + { + "locale": "es", + "name": "Dólar de Hong Kong" + }, + { + "locale": "pt", + "name": "Dólar de Hong Kong" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "HK$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "HK$", + "template": "$1", + "rtl": false + } + }, + "HNL": { + "name": "Lempira", + "fractionSize": 2, + "symbol": { + "grapheme": "L", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "L", + "template": "$1", + "rtl": false + } + }, + "HRK": { + "name": "Kuna", + "fractionSize": 2, + "symbol": { + "grapheme": "kn", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "kn", + "template": "$1", + "rtl": false + } + }, + "HTG": { + "name": "Gourde", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "HUF": { + "name": "Forint", + "fractionSize": 0, + "symbol": { + "grapheme": "Ft", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Ft", + "template": "$1", + "rtl": false + } + }, + "IDR": { + "name": "Rupiah", + "fractionSize": 2, + "symbol": { + "grapheme": "Rp", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Rp", + "template": "$1", + "rtl": false + } + }, + "ILS": { + "name": "New Israeli Shekel", + "fractionSize": 2, + "symbol": { + "grapheme": "₪", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₪", + "template": "$1", + "rtl": false + } + }, + "IMP": { + "name": "Manx Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "INR": { + "name": "Indian Rupee", + "fractionSize": 2, + "symbol": { + "grapheme": "₹", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₹", + "template": "$1", + "rtl": false + } + }, + "IQD": { + "name": "Iraqi Dinar", + "fractionSize": 3, + "symbol": { + "grapheme": ".د.ع", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".د.ع", + "template": "1 $", + "rtl": true + } + }, + "IRR": { + "name": "Iranian Rial", + "fractionSize": 0, + "symbol": { + "grapheme": "﷼", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": "﷼", + "template": "1 $", + "rtl": true + } + }, + "ISK": { + "name": "Iceland Krona", + "fractionSize": 2, + "symbol": { + "grapheme": "kr", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "JEP": { + "name": "Jersey Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "JMD": { + "name": "Jamaican Dollar", + "localized_name": [ + { + "locale": "es", + "name": "Dólar Jamaiquino" + }, + { + "locale": "pt", + "name": "Dólar Jamaicano" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "J$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "J$", + "template": "$1", + "rtl": false + } + }, + "JOD": { + "name": "Jordanian Dinar", + "fractionSize": 3, + "symbol": { + "grapheme": ".د.إ", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": null + }, + "JPY": { + "name": "円", + "localized_name": [ + { + "locale": "en", + "name": "Yen" + }, + { + "locale": "es", + "name": "Yen" + }, + { + "locale": "pt", + "name": "Iene" + } + ], + "fractionSize": 0, + "symbol": { + "grapheme": "¥", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "¥", + "template": "$1", + "rtl": false + } + }, + "KES": { + "name": "Kenyan Shilling", + "fractionSize": 2, + "symbol": { + "grapheme": "KSh", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "KSh", + "template": "$1", + "rtl": false + } + }, + "KGS": { + "name": "Som", + "fractionSize": 2, + "symbol": { + "grapheme": "сом", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "сом", + "template": "$1", + "rtl": false + } + }, + "KHR": { + "name": "Riel", + "fractionSize": 2, + "symbol": { + "grapheme": "៛", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "៛", + "template": "$1", + "rtl": false + } + }, + "KMF": { + "name": "Comorian Franc", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "KPW": { + "name": "North Korean Won", + "fractionSize": 0, + "symbol": { + "grapheme": "₩", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "KRW": { + "name": "원", + "localized_name": [ + { + "locale": "en", + "name": "Won" + }, + { + "locale": "es", + "name": "Won" + }, + { + "locale": "pt", + "name": "Won" + } + ], + "fractionSize": 0, + "symbol": { + "grapheme": "₩", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₩", + "template": "$1", + "rtl": false + } + }, + "KWD": { + "name": "Kuwaiti Dinar", + "fractionSize": 3, + "symbol": { + "grapheme": ".د.ك", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".د.ك", + "template": "1 $", + "rtl": true + } + }, + "KYD": { + "name": "Cayman Islands Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "CI$", + "template": "$1", + "rtl": false + } + }, + "KZT": { + "name": "Tenge", + "fractionSize": 2, + "symbol": { + "grapheme": "₸", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₸", + "template": "$1", + "rtl": false + } + }, + "LAK": { + "name": "Lao Kip", + "fractionSize": 2, + "symbol": { + "grapheme": "₭", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₭", + "template": "$1", + "rtl": false + } + }, + "LBP": { + "name": "Lebanese Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": ".ل.ل", + "template": "1 $", + "rtl": true + } + }, + "LKR": { + "name": "Sri Lanka Rupee", + "fractionSize": 2, + "symbol": { + "grapheme": "₨", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "LRD": { + "name": "Liberian Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "L$", + "template": "$1", + "rtl": false + } + }, + "LSL": { + "name": "Loti", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "LTL": { + "name": "Lithuanian Litas", + "fractionSize": 2, + "symbol": { + "grapheme": "Lt", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Lt", + "template": "$1", + "rtl": false + } + }, + "LVL": { + "name": "Latvian Lats", + "fractionSize": 2, + "symbol": { + "grapheme": "Ls", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Ls", + "template": "1 $", + "rtl": false + } + }, + "LYD": { + "name": "Libyan Dinar", + "fractionSize": 3, + "symbol": { + "grapheme": ".د.ل", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".د.ل", + "template": "1 $", + "rtl": true + } + }, + "MAD": { + "name": "Moroccan Dirham", + "fractionSize": 2, + "symbol": { + "grapheme": ".د.م", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".د.م", + "template": "1 $", + "rtl": true + } + }, + "MDL": { + "name": "Moldovan Leu", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "MGA": { + "name": "Malagasy Ariary", + "fractionSize": 1, + "symbol": null, + "uniqSymbol": null + }, + "MKD": { + "name": "Denar", + "fractionSize": 2, + "symbol": { + "grapheme": "ден", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "ден", + "template": "$1", + "rtl": false + } + }, + "MMK": { + "name": "Kyat", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "MNT": { + "name": "Tugrik", + "fractionSize": 2, + "symbol": { + "grapheme": "₮", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₮", + "template": "$1", + "rtl": false + } + }, + "MOP": { + "name": "Pataca", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "MRU": { + "name": "Ouguiya", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "MUR": { + "name": "Mauritius Rupee", + "fractionSize": 2, + "symbol": { + "grapheme": "₨", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "MVR": { + "name": "Rufiyaa", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "MWK": { + "name": "Malawi Kwacha", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "MXN": { + "name": "Peso Mexicano", + "localized_name": [ + { + "locale": "en", + "name": "Mexican Peso" + }, + { + "locale": "pt", + "name": "Peso Mexicano" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "MXV": { + "name": "Mexican Unidad de Inversion (UDI)", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "MYR": { + "name": "Malaysian Ringgit", + "fractionSize": 2, + "symbol": { + "grapheme": "RM", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "RM", + "template": "$1", + "rtl": false + } + }, + "MZN": { + "name": "Metical", + "localized_name": [ + { + "locale": "en", + "name": "Mozambique Metical" + }, + { + "locale": "es", + "name": "Metical Mozambiqueño" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "MT", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "MT", + "template": "$1", + "rtl": false + } + }, + "NAD": { + "name": "Namibia Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "N$", + "template": "$1", + "rtl": false + } + }, + "NGN": { + "name": "Naira", + "fractionSize": 2, + "symbol": { + "grapheme": "₦", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₦", + "template": "$1", + "rtl": false + } + }, + "NIO": { + "name": "Cordoba Oro", + "fractionSize": 2, + "symbol": { + "grapheme": "C$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "C$", + "template": "$1", + "rtl": false + } + }, + "NOK": { + "name": "Norwegian Krone", + "fractionSize": 2, + "symbol": { + "grapheme": "kr", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": null + }, + "NPR": { + "name": "Nepalese Rupee", + "fractionSize": 2, + "symbol": { + "grapheme": "₨", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "NZD": { + "name": "New Zealand Dollar", + "localized_name": [ + { + "locale": "es", + "name": "Dólar Neozelandés" + }, + { + "locale": "pt", + "name": "Dólar Neozelandês" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "NZ$", + "template": "$1", + "rtl": false + } + }, + "OMR": { + "name": "Rial Omani", + "fractionSize": 3, + "symbol": { + "grapheme": "﷼", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".ر.ع", + "template": "1 $", + "rtl": true + } + }, + "PAB": { + "name": "Balboa", + "fractionSize": 2, + "symbol": { + "grapheme": "B/.", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "B/.", + "template": "$1", + "rtl": false + } + }, + "PEN": { + "name": "Sol", + "fractionSize": 2, + "symbol": { + "grapheme": "S/", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "S/", + "template": "$1", + "rtl": false + } + }, + "PGK": { + "name": "Kina", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "PHP": { + "name": "Piso", + "localized_name": [ + { + "locale": "en", + "name": "Philippine Peso" + }, + { + "locale": "es", + "name": "Peso Filipino" + }, + { + "locale": "pt", + "name": "Peso Filipino" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "₱", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₱", + "template": "$1", + "rtl": false + } + }, + "PKR": { + "name": "Pakistan Rupee", + "fractionSize": 2, + "symbol": { + "grapheme": "₨", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "PLN": { + "name": "Zloty", + "fractionSize": 2, + "symbol": { + "grapheme": "zł", + "position": 1, + "rtl": false + }, + "uniqSymbol": { + "grapheme": "zł", + "rtl": false + } + }, + "PYG": { + "name": "Guaraní", + "localized_name": [ + { + "locale": "en", + "name": "Guarani" + }, + { + "locale": "pt", + "name": "Guarani" + } + ], + "fractionSize": 0, + "symbol": { + "grapheme": "Gs", + "template": "1$", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Gs", + "template": "1$", + "rtl": false + } + }, + "QAR": { + "name": "Qatari Rial", + "fractionSize": 2, + "symbol": { + "grapheme": "﷼", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".ر.ق", + "template": "1 $", + "rtl": true + } + }, + "RON": { + "name": "Romanian Leu", + "fractionSize": 2, + "symbol": { + "grapheme": "lei", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "lei", + "template": "$1", + "rtl": false + } + }, + "RSD": { + "name": "Serbian Dinar", + "fractionSize": 2, + "symbol": { + "grapheme": "Дин.", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Дин.", + "template": "$1", + "rtl": false + } + }, + "RUB": { + "name": "Russian Ruble", + "fractionSize": 2, + "symbol": { + "grapheme": "₽", + "template": "1 $", + "rtl": false, + "position": 1 + }, + "uniqSymbol": { + "grapheme": "₽", + "template": "1 $", + "rtl": false + } + }, + "RUR": { + "name": "Russian Ruble", + "fractionSize": 2, + "symbol": { + "grapheme": "₽", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₽", + "template": "1 $", + "rtl": false + } + }, + "RWF": { + "name": "Rwanda Franc", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "SAR": { + "name": "Saudi Riyal", + "fractionSize": 2, + "symbol": { + "grapheme": "﷼", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".ر.س", + "template": "1 $", + "rtl": true + } + }, + "SBD": { + "name": "Solomon Islands Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "SI$", + "template": "$1", + "rtl": false + } + }, + "SCR": { + "name": "Seychelles Rupee", + "fractionSize": 2, + "symbol": { + "grapheme": "₨", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "SDG": { + "name": "Sudanese Pound", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "SEK": { + "name": "Swedish Krona", + "fractionSize": 2, + "symbol": { + "grapheme": "kr", + "template": "1 $", + "rtl": false, + "position": 1 + }, + "uniqSymbol": null + }, + "SGD": { + "name": "Singapore Dollar", + "fractionSize": 2, + "spacing": 0, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "S$", + "template": "$1", + "rtl": false + } + }, + "SHP": { + "name": "Saint Helena Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "SLL": { + "name": "Leone", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "SOS": { + "name": "Somali Shilling", + "fractionSize": 2, + "symbol": { + "grapheme": "S", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "S", + "template": "$1", + "rtl": false + } + }, + "SRD": { + "name": "Surinam Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "SSP": { + "name": "South Sudanese Pound", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "STN": { + "name": "Dobra", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "SVC": { + "name": "El Salvador Colon", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "C", + "template": "$1", + "rtl": false + } + }, + "SYP": { + "name": "Syrian Pound", + "fractionSize": 2, + "symbol": { + "grapheme": "£", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": ".ل.س", + "template": "1 $", + "rtl": true + } + }, + "SZL": { + "name": "Lilangeni", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "THB": { + "name": "Baht", + "fractionSize": 2, + "symbol": { + "grapheme": "฿", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "฿", + "template": "$1", + "rtl": false + } + }, + "TJS": { + "name": "Somoni", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "TMT": { + "name": "Turkmenistan New Manat", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "TND": { + "name": "Tunisian Dinar", + "fractionSize": 3, + "symbol": { + "grapheme": ".د.ت", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".د.ت", + "template": "1 $", + "rtl": true + } + }, + "TOP": { + "name": "Pa’anga", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "TRL": { + "name": "Turkish Lira", + "fractionSize": 2, + "symbol": { + "grapheme": "₤", + "template": "$1", + "rtl": false + }, + "uniqSymbol": null + }, + "TRY": { + "name": "Turkish Lira", + "fractionSize": 2, + "symbol": { + "grapheme": "₺", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₺", + "template": "$1", + "rtl": false + } + }, + "TTD": { + "name": "Trinidad and Tobago Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "TT$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "TT$", + "template": "$1", + "rtl": false + } + }, + "TWD": { + "name": "New Taiwan Dollar", + "fractionSize": 0, + "symbol": { + "grapheme": "NT$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "NT$", + "template": "$1", + "rtl": false + } + }, + "TZS": { + "name": "Tanzanian Shilling", + "fractionSize": 0, + "symbol": { + "grapheme": "TSh", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "TSh", + "template": "$1", + "rtl": false + } + }, + "UAH": { + "name": "Hryvnia", + "fractionSize": 2, + "symbol": { + "grapheme": "₴", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "₴", + "template": "$1", + "rtl": false + } + }, + "UGX": { + "name": "Uganda Shilling", + "fractionSize": 0, + "symbol": { + "grapheme": "USh", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "USh", + "template": "$1", + "rtl": false + } + }, + "USD": { + "name": "US Dollar", + "localized_name": [ + { + "locale": "es", + "name": "Dólar Americano" + }, + { + "locale": "pt", + "name": "Dólar Americano" + } + ], + "fractionSize": 2, + "spacing": 0, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + } + }, + "USN": { + "name": "US Dollar (Next day)", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "UYI": { + "name": "Uruguay Peso en Unidades Indexadas (UI)", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "UYU": { + "name": "Peso Uruguayo", + "localized_name": [ + { + "locale": "en", + "name": "Uruguayan Peso" + }, + { + "locale": "pt", + "name": "Peso Uruguaio" + } + ], + "fractionSize": 0, + "symbol": { + "grapheme": "$U", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "$U", + "template": "$1", + "rtl": false + } + }, + "UZS": { + "name": "Uzbekistan Sum", + "fractionSize": 2, + "symbol": { + "grapheme": "so’m", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "so’m", + "template": "$1", + "rtl": false + } + }, + "VEF": { + "name": "Bolívar", + "localized_name": [ + { + "locale": "en", + "name": "Venezuelan Bolivar" + }, + { + "locale": "pt", + "name": "Bolívar Venezuelano" + } + ], + "fractionSize": 2, + "symbol": { + "grapheme": "Bs", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Bs", + "template": "$1", + "rtl": false + } + }, + "VES": { + "name": "Bolivar Soberano", + "fractionSize": 2, + "symbol": { + "grapheme": "Bs", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Bs", + "template": "$1", + "rtl": false + } + }, + "VND": { + "name": "Dong", + "fractionSize": 0, + "symbol": { + "grapheme": "₫", + "template": "1 $", + "rtl": false, + "position": 1 + }, + "uniqSymbol": { + "grapheme": "₫", + "template": "1 $", + "rtl": false + } + }, + "VUV": { + "name": "Vatu", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "WST": { + "name": "Tala", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "XAF": { + "name": "CFA Franc BEAC", + "fractionSize": 0, + "symbol": { + "grapheme": "FCFA", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "FCFA", + "template": "1 $", + "rtl": false + } + }, + "XCD": { + "name": "East Caribbean Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "EC$", + "template": "$1", + "rtl": false + } + }, + "XDR": { + "name": "SDR (Special Drawing Right)", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "XOF": { + "name": "CFA Franc BCEAO", + "fractionSize": 0, + "symbol": { + "grapheme": "CFA", + "template": "1 $", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "CFA", + "template": "1 $", + "rtl": false + } + }, + "XPF": { + "name": "CFP Franc", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "XSU": { + "name": "Sucre", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "XUA": { + "name": "ADB Unit of Account", + "fractionSize": 0, + "symbol": null, + "uniqSymbol": null + }, + "YER": { + "name": "Yemeni Rial", + "fractionSize": 2, + "symbol": { + "grapheme": "﷼", + "template": "1 $", + "rtl": true + }, + "uniqSymbol": { + "grapheme": ".ر.ي", + "template": "1 $", + "rtl": true + } + }, + "ZAR": { + "name": "Rand", + "fractionSize": 2, + "symbol": { + "grapheme": "R", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "R", + "template": "$1", + "rtl": false + } + }, + "ZMW": { + "name": "Zambian Kwacha", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + }, + "ZWD": { + "name": "Zimbabwe Dollar", + "fractionSize": 2, + "symbol": { + "grapheme": "Z$", + "template": "$1", + "rtl": false + }, + "uniqSymbol": { + "grapheme": "Z$", + "template": "$1", + "rtl": false + } + }, + "ZWL": { + "name": "Zimbabwe Dollar", + "fractionSize": 2, + "symbol": null, + "uniqSymbol": null + } } \ No newline at end of file diff --git a/libs/sdk-core/src/fiat.rs b/libs/sdk-common/src/fiat.rs similarity index 77% rename from libs/sdk-core/src/fiat.rs rename to libs/sdk-common/src/fiat.rs index cc32fd358..5a1c6999d 100644 --- a/libs/sdk-core/src/fiat.rs +++ b/libs/sdk-common/src/fiat.rs @@ -1,12 +1,21 @@ use std::collections::HashMap; +use anyhow::{anyhow, Result}; use serde::{Deserialize, Serialize}; -use sdk_common::prelude::BreezServer; -use sdk_common::grpc::RatesRequest; use tonic::Request; -use crate::error::{SdkError, SdkResult}; -use crate::models::FiatAPI; +use crate::grpc::RatesRequest; +use crate::prelude::BreezServer; + +/// Trait covering fiat-related functionality +#[tonic::async_trait] +pub trait FiatAPI: Send + Sync { + /// List all supported fiat currencies for which there is a known exchange rate. + async fn list_fiat_currencies(&self) -> Result>; + + /// Get the live rates from the server. + async fn fetch_fiat_rates(&self) -> Result>; +} /// Settings for the symbol representation of a currency #[derive(Clone, Serialize, Deserialize, Debug)] @@ -41,8 +50,10 @@ pub struct CurrencyInfo { pub spacing: Option, pub symbol: Option, pub uniq_symbol: Option, - pub localized_name: Option>, - pub locale_overrides: Option>, + #[serde(default)] + pub localized_name: Vec, + #[serde(default)] + pub locale_overrides: Vec, } /// Wrapper around the [CurrencyInfo] of a fiat currency @@ -65,7 +76,7 @@ fn convert_to_fiat_currency_with_id(id: String, info: CurrencyInfo) -> FiatCurre #[tonic::async_trait] impl FiatAPI for BreezServer { - async fn list_fiat_currencies(&self) -> SdkResult> { + async fn list_fiat_currencies(&self) -> Result> { let known_rates = self.fetch_fiat_rates().await?; let known_rates_currencies = known_rates .iter() @@ -84,16 +95,14 @@ impl FiatAPI for BreezServer { Ok(fiat_currency_list) } - async fn fetch_fiat_rates(&self) -> SdkResult> { + async fn fetch_fiat_rates(&self) -> Result> { let mut client = self.get_information_client().await; let request = Request::new(RatesRequest {}); let response = client .rates(request) .await - .map_err(|e| SdkError::ServiceConnectivity { - err: format!("Fetch rates request failed: {e}"), - })?; + .map_err(|e| anyhow!("Fetch rates request failed: {e}"))?; let mut rates = response.into_inner().rates; rates.sort_by(|a, b| a.coin.cmp(&b.coin)); diff --git a/libs/sdk-common/src/lib.rs b/libs/sdk-common/src/lib.rs index 5c52bb3b1..1546d54cd 100644 --- a/libs/sdk-common/src/lib.rs +++ b/libs/sdk-common/src/lib.rs @@ -1,5 +1,6 @@ mod breez_server; mod error; +mod fiat; pub mod grpc; pub mod input_parser; pub mod invoice; @@ -22,6 +23,7 @@ pub mod prelude { pub use crate::*; pub use crate::breez_server::*; pub use crate::error::*; + pub use crate::fiat::*; pub use crate::input_parser::*; pub use crate::invoice::*; pub use crate::lnurl::error::*; diff --git a/libs/sdk-core/src/binding.rs b/libs/sdk-core/src/binding.rs index 169c67635..2d0aa2c92 100644 --- a/libs/sdk-core/src/binding.rs +++ b/libs/sdk-core/src/binding.rs @@ -20,11 +20,11 @@ use once_cell::sync::{Lazy, OnceCell}; use sdk_common::invoice; pub use sdk_common::prelude::{ parse, AesSuccessActionDataDecrypted, AesSuccessActionDataResult, BitcoinAddressData, - InputType, LNInvoice, LnUrlAuthRequestData, LnUrlCallbackStatus, LnUrlError, LnUrlErrorData, - LnUrlPayErrorData, LnUrlPayRequest, LnUrlPayRequestData, LnUrlWithdrawRequest, - LnUrlWithdrawRequestData, LnUrlWithdrawResult, LnUrlWithdrawSuccessData, - MessageSuccessActionData, Network, RouteHint, RouteHintHop, SuccessActionProcessed, - UrlSuccessActionData, + CurrencyInfo, FiatCurrency, InputType, LNInvoice, LnUrlAuthRequestData, LnUrlCallbackStatus, + LnUrlError, LnUrlErrorData, LnUrlPayErrorData, LnUrlPayRequest, LnUrlPayRequestData, + LnUrlWithdrawRequest, LnUrlWithdrawRequestData, LnUrlWithdrawResult, LnUrlWithdrawSuccessData, + LocaleOverrides, LocalizedName, MessageSuccessActionData, Network, Rate, RouteHint, + RouteHintHop, SuccessActionProcessed, Symbol, UrlSuccessActionData, }; use tokio::sync::Mutex; @@ -34,7 +34,6 @@ use crate::error::{ ConnectError, ReceiveOnchainError, ReceivePaymentError, SdkError, SendOnchainError, SendPaymentError, }; -use crate::fiat::{FiatCurrency, Rate}; use crate::lsp::LspInformation; use crate::models::{Config, LogEntry, NodeState, Payment, SwapInfo}; use crate::{ @@ -241,6 +240,50 @@ pub struct _LnUrlWithdrawSuccessData { pub invoice: LNInvoice, } +#[frb(mirror(Rate))] +pub struct _Rate { + pub coin: String, + pub value: f64, +} + +#[frb(mirror(FiatCurrency))] +pub struct _FiatCurrency { + pub id: String, + pub info: CurrencyInfo, +} + +#[frb(mirror(CurrencyInfo))] +pub struct _CurrencyInfo { + pub name: String, + pub fraction_size: u32, + pub spacing: Option, + pub symbol: Option, + pub uniq_symbol: Option, + pub localized_name: Vec, + pub locale_overrides: Vec, +} + +#[frb(mirror(LocaleOverrides))] +pub struct _LocaleOverrides { + pub locale: String, + pub spacing: Option, + pub symbol: Symbol, +} + +#[frb(mirror(LocalizedName))] +pub struct _LocalizedName { + pub locale: String, + pub name: String, +} + +#[frb(mirror(Symbol))] +pub struct _Symbol { + pub grapheme: Option, + pub template: Option, + pub rtl: Option, + pub position: Option, +} + /* The format Lazy>> for the following variables allows them to be instance-global, meaning they can be set only once per instance, but calling disconnect() will unset them. diff --git a/libs/sdk-core/src/breez_services.rs b/libs/sdk-core/src/breez_services.rs index cff36c7b8..a30727a3f 100644 --- a/libs/sdk-core/src/breez_services.rs +++ b/libs/sdk-core/src/breez_services.rs @@ -30,13 +30,12 @@ use crate::error::{ ConnectError, ReceiveOnchainError, ReceiveOnchainResult, ReceivePaymentError, SdkError, SdkResult, SendOnchainError, SendPaymentError, }; -use crate::fiat::{FiatCurrency, Rate}; use crate::greenlight::{GLBackupTransport, Greenlight}; use crate::lnurl::pay::*; use crate::lsp::LspInformation; use crate::models::{ parse_short_channel_id, ChannelState, ClosedChannelPaymentDetails, Config, EnvironmentType, - FiatAPI, LspAPI, NodeState, Payment, PaymentDetails, PaymentType, ReverseSwapPairInfo, + LspAPI, NodeState, Payment, PaymentDetails, PaymentType, ReverseSwapPairInfo, ReverseSwapServiceAPI, SwapInfo, SwapperAPI, INVOICE_PAYMENT_FEE_EXPIRY_SECONDS, }; use crate::moonpay::MoonPayApi; @@ -648,13 +647,16 @@ impl BreezServices { /// Fetch live rates of fiat currencies, sorted by name pub async fn fetch_fiat_rates(&self) -> SdkResult> { - self.fiat_api.fetch_fiat_rates().await + self.fiat_api.fetch_fiat_rates().await.map_err(Into::into) } /// List all supported fiat currencies for which there is a known exchange rate. /// List is sorted by the canonical name of the currency pub async fn list_fiat_currencies(&self) -> SdkResult> { - self.fiat_api.list_fiat_currencies().await + self.fiat_api + .list_fiat_currencies() + .await + .map_err(Into::into) } /// List available LSPs that can be selected by the user @@ -2618,9 +2620,9 @@ pub(crate) mod tests { use anyhow::{anyhow, Result}; use regex::Regex; use reqwest::Url; + use sdk_common::prelude::Rate; use crate::breez_services::{BreezServices, BreezServicesBuilder}; - use crate::fiat::Rate; use crate::models::{LnPaymentDetails, NodeState, Payment, PaymentDetails, PaymentTypeFilter}; use crate::node_api::NodeAPI; use crate::test_utils::*; diff --git a/libs/sdk-core/src/bridge_generated.rs b/libs/sdk-core/src/bridge_generated.rs index caf7bbd56..7da92a893 100644 --- a/libs/sdk-core/src/bridge_generated.rs +++ b/libs/sdk-core/src/bridge_generated.rs @@ -29,12 +29,6 @@ use crate::breez_services::PaymentFailedData; use crate::breez_services::SignMessageRequest; use crate::breez_services::SignMessageResponse; use crate::chain::RecommendedFees; -use crate::fiat::CurrencyInfo; -use crate::fiat::FiatCurrency; -use crate::fiat::LocaleOverrides; -use crate::fiat::LocalizedName; -use crate::fiat::Rate; -use crate::fiat::Symbol; use crate::lnurl::pay::LnUrlPayResult; use crate::lnurl::pay::LnUrlPaySuccessData; use crate::lsp::LspInformation; @@ -593,7 +587,7 @@ fn wire_report_issue_impl(port_: MessagePort, req: impl Wire2Api, _>( + FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, Vec, _>( WrapInfo { debug_name: "fetch_fiat_rates", port: Some(port_), @@ -603,7 +597,7 @@ fn wire_fetch_fiat_rates_impl(port_: MessagePort) { ) } fn wire_list_fiat_currencies_impl(port_: MessagePort) { - FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, Vec, _>( + FLUTTER_RUST_BRIDGE_HANDLER.wrap::<_, _, _, Vec, _>( WrapInfo { debug_name: "list_fiat_currencies", port: Some(port_), @@ -903,6 +897,12 @@ pub struct mirror_AesSuccessActionDataResult(AesSuccessActionDataResult); #[derive(Clone)] pub struct mirror_BitcoinAddressData(BitcoinAddressData); +#[derive(Clone)] +pub struct mirror_CurrencyInfo(CurrencyInfo); + +#[derive(Clone)] +pub struct mirror_FiatCurrency(FiatCurrency); + #[derive(Clone)] pub struct mirror_InputType(InputType); @@ -933,12 +933,21 @@ pub struct mirror_LnUrlWithdrawResult(LnUrlWithdrawResult); #[derive(Clone)] pub struct mirror_LnUrlWithdrawSuccessData(LnUrlWithdrawSuccessData); +#[derive(Clone)] +pub struct mirror_LocaleOverrides(LocaleOverrides); + +#[derive(Clone)] +pub struct mirror_LocalizedName(LocalizedName); + #[derive(Clone)] pub struct mirror_MessageSuccessActionData(MessageSuccessActionData); #[derive(Clone)] pub struct mirror_Network(Network); +#[derive(Clone)] +pub struct mirror_Rate(Rate); + #[derive(Clone)] pub struct mirror_RouteHint(RouteHint); @@ -948,6 +957,9 @@ pub struct mirror_RouteHintHop(RouteHintHop); #[derive(Clone)] pub struct mirror_SuccessActionProcessed(SuccessActionProcessed); +#[derive(Clone)] +pub struct mirror_Symbol(Symbol); + #[derive(Clone)] pub struct mirror_UrlSuccessActionData(UrlSuccessActionData); @@ -975,6 +987,21 @@ const _: fn() = || { let _: Option = BitcoinAddressData.label; let _: Option = BitcoinAddressData.message; } + { + let CurrencyInfo = None::.unwrap(); + let _: String = CurrencyInfo.name; + let _: u32 = CurrencyInfo.fraction_size; + let _: Option = CurrencyInfo.spacing; + let _: Option = CurrencyInfo.symbol; + let _: Option = CurrencyInfo.uniq_symbol; + let _: Vec = CurrencyInfo.localized_name; + let _: Vec = CurrencyInfo.locale_overrides; + } + { + let FiatCurrency = None::.unwrap(); + let _: String = FiatCurrency.id; + let _: CurrencyInfo = FiatCurrency.info; + } match None::.unwrap() { InputType::BitcoinAddress { address } => { let _: BitcoinAddressData = address; @@ -1070,6 +1097,17 @@ const _: fn() = || { let LnUrlWithdrawSuccessData = None::.unwrap(); let _: LNInvoice = LnUrlWithdrawSuccessData.invoice; } + { + let LocaleOverrides = None::.unwrap(); + let _: String = LocaleOverrides.locale; + let _: Option = LocaleOverrides.spacing; + let _: Symbol = LocaleOverrides.symbol; + } + { + let LocalizedName = None::.unwrap(); + let _: String = LocalizedName.locale; + let _: String = LocalizedName.name; + } { let MessageSuccessActionData = None::.unwrap(); let _: String = MessageSuccessActionData.message; @@ -1080,6 +1118,11 @@ const _: fn() = || { Network::Signet => {} Network::Regtest => {} } + { + let Rate = None::.unwrap(); + let _: String = Rate.coin; + let _: f64 = Rate.value; + } { let RouteHint = None::.unwrap(); let _: Vec = RouteHint.hops; @@ -1105,6 +1148,13 @@ const _: fn() = || { let _: UrlSuccessActionData = data; } } + { + let Symbol = None::.unwrap(); + let _: Option = Symbol.grapheme; + let _: Option = Symbol.template; + let _: Option = Symbol.rtl; + let _: Option = Symbol.position; + } { let UrlSuccessActionData = None::.unwrap(); let _: String = UrlSuccessActionData.description; @@ -1434,40 +1484,40 @@ impl rust2dart::IntoIntoDart for Config { } } -impl support::IntoDart for CurrencyInfo { +impl support::IntoDart for mirror_CurrencyInfo { fn into_dart(self) -> support::DartAbi { vec![ - self.name.into_into_dart().into_dart(), - self.fraction_size.into_into_dart().into_dart(), - self.spacing.into_dart(), - self.symbol.into_dart(), - self.uniq_symbol.into_dart(), - self.localized_name.into_dart(), - self.locale_overrides.into_dart(), + self.0.name.into_into_dart().into_dart(), + self.0.fraction_size.into_into_dart().into_dart(), + self.0.spacing.into_dart(), + self.0.symbol.map(|v| mirror_Symbol(v)).into_dart(), + self.0.uniq_symbol.map(|v| mirror_Symbol(v)).into_dart(), + self.0.localized_name.into_into_dart().into_dart(), + self.0.locale_overrides.into_into_dart().into_dart(), ] .into_dart() } } -impl support::IntoDartExceptPrimitive for CurrencyInfo {} -impl rust2dart::IntoIntoDart for CurrencyInfo { - fn into_into_dart(self) -> Self { - self +impl support::IntoDartExceptPrimitive for mirror_CurrencyInfo {} +impl rust2dart::IntoIntoDart for CurrencyInfo { + fn into_into_dart(self) -> mirror_CurrencyInfo { + mirror_CurrencyInfo(self) } } -impl support::IntoDart for FiatCurrency { +impl support::IntoDart for mirror_FiatCurrency { fn into_dart(self) -> support::DartAbi { vec![ - self.id.into_into_dart().into_dart(), - self.info.into_into_dart().into_dart(), + self.0.id.into_into_dart().into_dart(), + self.0.info.into_into_dart().into_dart(), ] .into_dart() } } -impl support::IntoDartExceptPrimitive for FiatCurrency {} -impl rust2dart::IntoIntoDart for FiatCurrency { - fn into_into_dart(self) -> Self { - self +impl support::IntoDartExceptPrimitive for mirror_FiatCurrency {} +impl rust2dart::IntoIntoDart for FiatCurrency { + fn into_into_dart(self) -> mirror_FiatCurrency { + mirror_FiatCurrency(self) } } @@ -1817,36 +1867,36 @@ impl rust2dart::IntoIntoDart for LnUrlWithdrawS } } -impl support::IntoDart for LocaleOverrides { +impl support::IntoDart for mirror_LocaleOverrides { fn into_dart(self) -> support::DartAbi { vec![ - self.locale.into_into_dart().into_dart(), - self.spacing.into_dart(), - self.symbol.into_into_dart().into_dart(), + self.0.locale.into_into_dart().into_dart(), + self.0.spacing.into_dart(), + self.0.symbol.into_into_dart().into_dart(), ] .into_dart() } } -impl support::IntoDartExceptPrimitive for LocaleOverrides {} -impl rust2dart::IntoIntoDart for LocaleOverrides { - fn into_into_dart(self) -> Self { - self +impl support::IntoDartExceptPrimitive for mirror_LocaleOverrides {} +impl rust2dart::IntoIntoDart for LocaleOverrides { + fn into_into_dart(self) -> mirror_LocaleOverrides { + mirror_LocaleOverrides(self) } } -impl support::IntoDart for LocalizedName { +impl support::IntoDart for mirror_LocalizedName { fn into_dart(self) -> support::DartAbi { vec![ - self.locale.into_into_dart().into_dart(), - self.name.into_into_dart().into_dart(), + self.0.locale.into_into_dart().into_dart(), + self.0.name.into_into_dart().into_dart(), ] .into_dart() } } -impl support::IntoDartExceptPrimitive for LocalizedName {} -impl rust2dart::IntoIntoDart for LocalizedName { - fn into_into_dart(self) -> Self { - self +impl support::IntoDartExceptPrimitive for mirror_LocalizedName {} +impl rust2dart::IntoIntoDart for LocalizedName { + fn into_into_dart(self) -> mirror_LocalizedName { + mirror_LocalizedName(self) } } @@ -2218,19 +2268,19 @@ impl rust2dart::IntoIntoDart for PrepareRefundResponse { } } -impl support::IntoDart for Rate { +impl support::IntoDart for mirror_Rate { fn into_dart(self) -> support::DartAbi { vec![ - self.coin.into_into_dart().into_dart(), - self.value.into_into_dart().into_dart(), + self.0.coin.into_into_dart().into_dart(), + self.0.value.into_into_dart().into_dart(), ] .into_dart() } } -impl support::IntoDartExceptPrimitive for Rate {} -impl rust2dart::IntoIntoDart for Rate { - fn into_into_dart(self) -> Self { - self +impl support::IntoDartExceptPrimitive for mirror_Rate {} +impl rust2dart::IntoIntoDart for Rate { + fn into_into_dart(self) -> mirror_Rate { + mirror_Rate(self) } } @@ -2531,21 +2581,21 @@ impl rust2dart::IntoIntoDart for SwapStatus { } } -impl support::IntoDart for Symbol { +impl support::IntoDart for mirror_Symbol { fn into_dart(self) -> support::DartAbi { vec![ - self.grapheme.into_dart(), - self.template.into_dart(), - self.rtl.into_dart(), - self.position.into_dart(), + self.0.grapheme.into_dart(), + self.0.template.into_dart(), + self.0.rtl.into_dart(), + self.0.position.into_dart(), ] .into_dart() } } -impl support::IntoDartExceptPrimitive for Symbol {} -impl rust2dart::IntoIntoDart for Symbol { - fn into_into_dart(self) -> Self { - self +impl support::IntoDartExceptPrimitive for mirror_Symbol {} +impl rust2dart::IntoIntoDart for Symbol { + fn into_into_dart(self) -> mirror_Symbol { + mirror_Symbol(self) } } diff --git a/libs/sdk-core/src/lib.rs b/libs/sdk-core/src/lib.rs index cf96ae80a..989768fc7 100644 --- a/libs/sdk-core/src/lib.rs +++ b/libs/sdk-core/src/lib.rs @@ -171,7 +171,6 @@ pub mod error; mod node_api; // flutter_rust_bridge_codegen: has to be defined before greenlight; greenlight::node_api mod greenlight; #[rustfmt::skip] -mod fiat; // flutter_rust_bridge_codegen: has to be defined after grpc; grpc::Rate pub mod lnurl; mod lsp; mod lsps0; @@ -194,7 +193,6 @@ pub use breez_services::{ SignMessageRequest, SignMessageResponse, }; pub use chain::RecommendedFees; -pub use fiat::{CurrencyInfo, FiatCurrency, LocaleOverrides, LocalizedName, Rate, Symbol}; pub use lsp::LspInformation; pub use models::*; pub use sdk_common::prelude::*; diff --git a/libs/sdk-core/src/models.rs b/libs/sdk-core/src/models.rs index 348693d3b..70f5d3e2c 100644 --- a/libs/sdk-core/src/models.rs +++ b/libs/sdk-core/src/models.rs @@ -21,7 +21,6 @@ use crate::bitcoin::hashes::{sha256, Hash}; use crate::bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey}; use crate::bitcoin::{Address, Script}; use crate::error::SdkResult; -use crate::fiat::{FiatCurrency, Rate}; use crate::lsp::LspInformation; use crate::persist::swap::SwapChainInfo; use crate::swap_in::error::{SwapError, SwapResult}; @@ -83,16 +82,6 @@ pub trait LspAPI: Send + Sync { ) -> SdkResult; } -/// Trait covering fiat-related functionality -#[tonic::async_trait] -pub trait FiatAPI: Send + Sync { - /// List all supported fiat currencies for which there is a known exchange rate. - async fn list_fiat_currencies(&self) -> SdkResult>; - - /// Get the live rates from the server. - async fn fetch_fiat_rates(&self) -> SdkResult>; -} - /// Summary of an ongoing swap pub struct Swap { pub bitcoin_address: String, diff --git a/libs/sdk-core/src/test_utils.rs b/libs/sdk-core/src/test_utils.rs index 68d47eb90..ad1fc9068 100644 --- a/libs/sdk-core/src/test_utils.rs +++ b/libs/sdk-core/src/test_utils.rs @@ -13,6 +13,7 @@ use rand::distributions::{Alphanumeric, DistString, Standard}; use rand::rngs::OsRng; use rand::{random, Rng}; use sdk_common::grpc; +use sdk_common::prelude::{FiatAPI, FiatCurrency, Rate}; use tokio::sync::{mpsc, watch, Mutex}; use tokio::time::sleep; use tokio_stream::Stream; @@ -29,14 +30,12 @@ use crate::bitcoin::Network; use crate::breez_services::{OpenChannelParams, Receiver}; use crate::chain::{ChainService, OnchainTx, Outspend, RecommendedFees, TxStatus}; use crate::error::{ReceivePaymentError, SdkError, SdkResult}; -use crate::fiat::{FiatCurrency, Rate}; use crate::invoice::{InvoiceError, InvoiceResult}; use crate::lightning::ln::PaymentSecret; use crate::lightning_invoice::{Currency, InvoiceBuilder, RawBolt11Invoice}; use crate::lsp::LspInformation; use crate::models::{ - FiatAPI, LspAPI, NodeState, Payment, ReverseSwapServiceAPI, Swap, SwapperAPI, SyncResponse, - TlvEntry, + LspAPI, NodeState, Payment, ReverseSwapServiceAPI, Swap, SwapperAPI, SyncResponse, TlvEntry, }; use crate::moonpay::MoonPayApi; use crate::node_api::{CreateInvoiceRequest, FetchBolt11Result, NodeAPI, NodeError, NodeResult}; @@ -690,11 +689,11 @@ impl LspAPI for MockBreezServer { #[tonic::async_trait] impl FiatAPI for MockBreezServer { - async fn list_fiat_currencies(&self) -> SdkResult> { + async fn list_fiat_currencies(&self) -> Result> { Ok(vec![]) } - async fn fetch_fiat_rates(&self) -> SdkResult> { + async fn fetch_fiat_rates(&self) -> Result> { Ok(vec![Rate { coin: "USD".to_string(), value: 20_000.00, diff --git a/libs/sdk-flutter/lib/bridge_generated.dart b/libs/sdk-flutter/lib/bridge_generated.dart index 984d2f5e9..625db9251 100644 --- a/libs/sdk-flutter/lib/bridge_generated.dart +++ b/libs/sdk-flutter/lib/bridge_generated.dart @@ -569,15 +569,14 @@ class ConnectRequest { }); } -/// Details about a supported currency in the fiat rate feed class CurrencyInfo { final String name; final int fractionSize; final int? spacing; final Symbol? symbol; final Symbol? uniqSymbol; - final List? localizedName; - final List? localeOverrides; + final List localizedName; + final List localeOverrides; const CurrencyInfo({ required this.name, @@ -585,8 +584,8 @@ class CurrencyInfo { this.spacing, this.symbol, this.uniqSymbol, - this.localizedName, - this.localeOverrides, + required this.localizedName, + required this.localeOverrides, }); } @@ -596,7 +595,6 @@ enum EnvironmentType { Staging, } -/// Wrapper around the [CurrencyInfo] of a fiat currency class FiatCurrency { final String id; final CurrencyInfo info; @@ -948,7 +946,6 @@ class LnUrlWithdrawSuccessData { }); } -/// Locale-specific settings for the representation of a currency class LocaleOverrides { final String locale; final int? spacing; @@ -961,7 +958,6 @@ class LocaleOverrides { }); } -/// Localized name of a currency class LocalizedName { final String locale; final String name; @@ -1372,7 +1368,6 @@ class PrepareRefundResponse { }); } -/// Denominator in an exchange rate class Rate { final String coin; final double value; @@ -1913,7 +1908,6 @@ enum SwapStatus { Completed, } -/// Settings for the symbol representation of a currency class Symbol { final String? grapheme; final String? template; @@ -3300,8 +3294,8 @@ class BreezSdkCoreImpl implements BreezSdkCore { spacing: _wire2api_opt_box_autoadd_u32(arr[2]), symbol: _wire2api_opt_box_autoadd_symbol(arr[3]), uniqSymbol: _wire2api_opt_box_autoadd_symbol(arr[4]), - localizedName: _wire2api_opt_list_localized_name(arr[5]), - localeOverrides: _wire2api_opt_list_locale_overrides(arr[6]), + localizedName: _wire2api_list_localized_name(arr[5]), + localeOverrides: _wire2api_list_locale_overrides(arr[6]), ); } @@ -3821,14 +3815,6 @@ class BreezSdkCoreImpl implements BreezSdkCore { return raw == null ? null : _wire2api_box_autoadd_u64(raw); } - List? _wire2api_opt_list_locale_overrides(dynamic raw) { - return raw == null ? null : _wire2api_list_locale_overrides(raw); - } - - List? _wire2api_opt_list_localized_name(dynamic raw) { - return raw == null ? null : _wire2api_list_localized_name(raw); - } - PayOnchainResponse _wire2api_pay_onchain_response(dynamic raw) { final arr = raw as List; if (arr.length != 1) throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); diff --git a/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt b/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt index 861eace5c..9b11251a7 100644 --- a/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt +++ b/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt @@ -520,6 +520,8 @@ fun asCurrencyInfo(currencyInfo: ReadableMap): CurrencyInfo? { arrayOf( "name", "fractionSize", + "localizedName", + "localeOverrides", ), ) ) { @@ -530,22 +532,8 @@ fun asCurrencyInfo(currencyInfo: ReadableMap): CurrencyInfo? { val spacing = if (hasNonNullKey(currencyInfo, "spacing")) currencyInfo.getInt("spacing").toUInt() else null val symbol = if (hasNonNullKey(currencyInfo, "symbol")) currencyInfo.getMap("symbol")?.let { asSymbol(it) } else null val uniqSymbol = if (hasNonNullKey(currencyInfo, "uniqSymbol")) currencyInfo.getMap("uniqSymbol")?.let { asSymbol(it) } else null - val localizedName = - if (hasNonNullKey(currencyInfo, "localizedName")) { - currencyInfo.getArray("localizedName")?.let { - asLocalizedNameList(it) - } - } else { - null - } - val localeOverrides = - if (hasNonNullKey(currencyInfo, "localeOverrides")) { - currencyInfo.getArray("localeOverrides")?.let { - asLocaleOverridesList(it) - } - } else { - null - } + val localizedName = currencyInfo.getArray("localizedName")?.let { asLocalizedNameList(it) }!! + val localeOverrides = currencyInfo.getArray("localeOverrides")?.let { asLocaleOverridesList(it) }!! return CurrencyInfo( name, fractionSize, @@ -564,8 +552,8 @@ fun readableMapOf(currencyInfo: CurrencyInfo): ReadableMap = "spacing" to currencyInfo.spacing, "symbol" to currencyInfo.symbol?.let { readableMapOf(it) }, "uniqSymbol" to currencyInfo.uniqSymbol?.let { readableMapOf(it) }, - "localizedName" to currencyInfo.localizedName?.let { readableArrayOf(it) }, - "localeOverrides" to currencyInfo.localeOverrides?.let { readableArrayOf(it) }, + "localizedName" to readableArrayOf(currencyInfo.localizedName), + "localeOverrides" to readableArrayOf(currencyInfo.localeOverrides), ) fun asCurrencyInfoList(arr: ReadableArray): List { diff --git a/libs/sdk-react-native/ios/BreezSDKMapper.swift b/libs/sdk-react-native/ios/BreezSDKMapper.swift index fee289306..ab3f5b49b 100644 --- a/libs/sdk-react-native/ios/BreezSDKMapper.swift +++ b/libs/sdk-react-native/ios/BreezSDKMapper.swift @@ -601,15 +601,15 @@ enum BreezSDKMapper { uniqSymbol = try asSymbol(symbol: uniqSymbolTmp) } - var localizedName: [LocalizedName]? - if let localizedNameTmp = currencyInfo["localizedName"] as? [[String: Any?]] { - localizedName = try asLocalizedNameList(arr: localizedNameTmp) + guard let localizedNameTmp = currencyInfo["localizedName"] as? [[String: Any?]] else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "localizedName", typeName: "CurrencyInfo")) } + let localizedName = try asLocalizedNameList(arr: localizedNameTmp) - var localeOverrides: [LocaleOverrides]? - if let localeOverridesTmp = currencyInfo["localeOverrides"] as? [[String: Any?]] { - localeOverrides = try asLocaleOverridesList(arr: localeOverridesTmp) + guard let localeOverridesTmp = currencyInfo["localeOverrides"] as? [[String: Any?]] else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "localeOverrides", typeName: "CurrencyInfo")) } + let localeOverrides = try asLocaleOverridesList(arr: localeOverridesTmp) return CurrencyInfo( name: name, @@ -629,8 +629,8 @@ enum BreezSDKMapper { "spacing": currencyInfo.spacing == nil ? nil : currencyInfo.spacing, "symbol": currencyInfo.symbol == nil ? nil : dictionaryOf(symbol: currencyInfo.symbol!), "uniqSymbol": currencyInfo.uniqSymbol == nil ? nil : dictionaryOf(symbol: currencyInfo.uniqSymbol!), - "localizedName": currencyInfo.localizedName == nil ? nil : arrayOf(localizedNameList: currencyInfo.localizedName!), - "localeOverrides": currencyInfo.localeOverrides == nil ? nil : arrayOf(localeOverridesList: currencyInfo.localeOverrides!), + "localizedName": arrayOf(localizedNameList: currencyInfo.localizedName), + "localeOverrides": arrayOf(localeOverridesList: currencyInfo.localeOverrides), ] } diff --git a/libs/sdk-react-native/src/index.ts b/libs/sdk-react-native/src/index.ts index e69ecd4cd..38b198898 100644 --- a/libs/sdk-react-native/src/index.ts +++ b/libs/sdk-react-native/src/index.ts @@ -98,8 +98,8 @@ export interface CurrencyInfo { spacing?: number symbol?: SymbolType uniqSymbol?: SymbolType - localizedName?: LocalizedName[] - localeOverrides?: LocaleOverrides[] + localizedName: LocalizedName[] + localeOverrides: LocaleOverrides[] } export interface FiatCurrency { diff --git a/tools/sdk-cli/Cargo.lock b/tools/sdk-cli/Cargo.lock index 617ed4c49..00a198ad7 100644 --- a/tools/sdk-cli/Cargo.lock +++ b/tools/sdk-cli/Cargo.lock @@ -2683,7 +2683,6 @@ dependencies = [ "querystring", "regex", "reqwest", - "rusqlite", "serde", "serde_json", "strum_macros",