diff --git a/common/Makefile b/common/Makefile index 8cf98829e..a830c9c5a 100644 --- a/common/Makefile +++ b/common/Makefile @@ -98,6 +98,7 @@ COMMON_HEADERS_NOGEN := $(COMMON_SRC_NOGEN:.c=.h) \ common/errcode.h \ common/gossip_constants.h \ common/htlc.h \ + common/iso4217.h \ common/json_command.h \ common/jsonrpc_errors.h \ common/overflows.h \ diff --git a/common/iso4217.c b/common/iso4217.c new file mode 100644 index 000000000..4238f6ced --- /dev/null +++ b/common/iso4217.c @@ -0,0 +1,201 @@ +#include +#include +#include + +/* Wikipedia leads me to: https://www.currency-iso.org/en/home/tables/table-a1.html + + "List one: Currency, fund and precious metal codes",,,,, + Published:,,,,, + "August 29, 2018", ,,,, + ENTITY,Currency,Alphabetic Code,Numeric Code,Minor unit,Fund +*/ +static const struct iso4217_name_and_divisor iso4217[] = { + { "AED", 2 }, + { "AFN", 2 }, + { "ALL", 2 }, + { "AMD", 2 }, + { "ANG", 2 }, + { "AOA", 2 }, + { "ARS", 2 }, + { "AUD", 2 }, + { "AWG", 2 }, + { "AZN", 2 }, + { "BAM", 2 }, + { "BBD", 2 }, + { "BDT", 2 }, + { "BGN", 2 }, + { "BHD", 3 }, + { "BIF", 0 }, + { "BMD", 2 }, + { "BND", 2 }, + { "BOB", 2 }, + { "BOV", 2 }, + { "BRL", 2 }, + { "BSD", 2 }, + { "BTN", 2 }, + { "BWP", 2 }, + { "BYN", 2 }, + { "BZD", 2 }, + { "CAD", 2 }, + { "CDF", 2 }, + { "CHE", 2 }, + { "CHF", 2 }, + { "CHW", 2 }, + { "CLF", 4 }, + { "CLP", 0 }, + { "CNY", 2 }, + { "COP", 2 }, + { "COU", 2 }, + { "CRC", 2 }, + { "CUC", 2 }, + { "CUP", 2 }, + { "CVE", 2 }, + { "CZK", 2 }, + { "DJF", 0 }, + { "DKK", 2 }, + { "DOP", 2 }, + { "DZD", 2 }, + { "EGP", 2 }, + { "ERN", 2 }, + { "ETB", 2 }, + { "EUR", 2 }, + { "FJD", 2 }, + { "FKP", 2 }, + { "GBP", 2 }, + { "GEL", 2 }, + { "GHS", 2 }, + { "GIP", 2 }, + { "GMD", 2 }, + { "GNF", 0 }, + { "GTQ", 2 }, + { "GYD", 2 }, + { "HKD", 2 }, + { "HNL", 2 }, + { "HRK", 2 }, + { "HTG", 2 }, + { "HUF", 2 }, + { "IDR", 2 }, + { "ILS", 2 }, + { "INR", 2 }, + { "IQD", 3 }, + { "IRR", 2 }, + { "ISK", 0 }, + { "JMD", 2 }, + { "JOD", 3 }, + { "JPY", 0 }, + { "KES", 2 }, + { "KGS", 2 }, + { "KHR", 2 }, + { "KMF", 0 }, + { "KPW", 2 }, + { "KRW", 0 }, + { "KWD", 3 }, + { "KYD", 2 }, + { "KZT", 2 }, + { "LAK", 2 }, + { "LBP", 2 }, + { "LKR", 2 }, + { "LRD", 2 }, + { "LSL", 2 }, + { "LYD", 3 }, + { "MAD", 2 }, + { "MDL", 2 }, + { "MGA", 2 }, + { "MKD", 2 }, + { "MMK", 2 }, + { "MNT", 2 }, + { "MOP", 2 }, + { "MRU", 2 }, + { "MUR", 2 }, + { "MVR", 2 }, + { "MWK", 2 }, + { "MXN", 2 }, + { "MXV", 2 }, + { "MYR", 2 }, + { "MZN", 2 }, + { "NAD", 2 }, + { "NGN", 2 }, + { "NIO", 2 }, + { "NOK", 2 }, + { "NPR", 2 }, + { "NZD", 2 }, + { "OMR", 3 }, + { "PAB", 2 }, + { "PEN", 2 }, + { "PGK", 2 }, + { "PHP", 2 }, + { "PKR", 2 }, + { "PLN", 2 }, + { "PYG", 0 }, + { "QAR", 2 }, + { "RON", 2 }, + { "RSD", 2 }, + { "RUB", 2 }, + { "RWF", 0 }, + { "SAR", 2 }, + { "SBD", 2 }, + { "SCR", 2 }, + { "SDG", 2 }, + { "SEK", 2 }, + { "SGD", 2 }, + { "SHP", 2 }, + { "SLL", 2 }, + { "SOS", 2 }, + { "SRD", 2 }, + { "SSP", 2 }, + { "STN", 2 }, + { "SVC", 2 }, + { "SYP", 2 }, + { "SZL", 2 }, + { "THB", 2 }, + { "TJS", 2 }, + { "TMT", 2 }, + { "TND", 3 }, + { "TOP", 2 }, + { "TRY", 2 }, + { "TTD", 2 }, + { "TWD", 2 }, + { "TZS", 2 }, + { "UAH", 2 }, + { "UGX", 0 }, + { "USD", 2 }, + { "USN", 2 }, + { "UYI", 0 }, + { "UYU", 2 }, + { "UYW", 4 }, + { "UZS", 2 }, + { "VES", 2 }, + { "VND", 0 }, + { "VUV", 0 }, + { "WST", 2 }, + { "XAF", 0 }, + { "XAG", 0 }, + { "XAU", 0 }, + { "XBA", 0 }, + { "XBB", 0 }, + { "XBC", 0 }, + { "XBD", 0 }, + { "XCD", 2 }, + { "XDR", 0 }, + { "XOF", 0 }, + { "XPD", 0 }, + { "XPF", 0 }, + { "XPT", 0 }, + { "XSU", 0 }, + { "XTS", 0 }, + { "XUA", 0 }, + { "XXX", 0 }, + { "YER", 2 }, + { "ZAR", 2 }, + { "ZMW", 2 }, + { "ZWL", 2 }, +}; + +const struct iso4217_name_and_divisor *find_iso4217(const char *prefix) +{ + for (size_t i = 0; i < ARRAY_SIZE(iso4217); i++) { + if (memcmp(iso4217[i].name, prefix, ISO4217_NAMELEN) == 0) + return &iso4217[i]; + } + return NULL; +} diff --git a/common/iso4217.h b/common/iso4217.h new file mode 100644 index 000000000..aafe566c6 --- /dev/null +++ b/common/iso4217.h @@ -0,0 +1,19 @@ +#ifndef LIGHTNING_COMMON_ISO4217_H +#define LIGHTNING_COMMON_ISO4217_H +#include "config.h" + +/* BOLT-offers #12: + * + * - MUST specify `iso4217` as an ISO 4712 three-letter code. + * - MUST specify `amount` in the currency unit adjusted by the ISO 4712 + * exponent (e.g. USD cents). + */ +struct iso4217_name_and_divisor { + const char *name; + unsigned int minor_unit; +}; + +#define ISO4217_NAMELEN 3 + +const struct iso4217_name_and_divisor *find_iso4217(const char *prefix); +#endif /* LIGHTNING_COMMON_ISO4217_H */