@ledgerhq/coin-module-framework 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.unimportedrc.json +0 -1
- package/CHANGELOG.md +6 -0
- package/lib/config.d.ts +3 -4
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +2 -2
- package/lib/config.js.map +1 -1
- package/lib/currencies/BigNumberToLocaleString.d.ts +7 -0
- package/lib/currencies/BigNumberToLocaleString.d.ts.map +1 -0
- package/lib/currencies/BigNumberToLocaleString.js +58 -0
- package/lib/currencies/BigNumberToLocaleString.js.map +1 -0
- package/lib/currencies/formatCurrencyUnit.d.ts +25 -1
- package/lib/currencies/formatCurrencyUnit.d.ts.map +1 -1
- package/lib/currencies/formatCurrencyUnit.js +130 -4
- package/lib/currencies/formatCurrencyUnit.js.map +1 -1
- package/lib/currencies/localeUtility.d.ts +8 -0
- package/lib/currencies/localeUtility.d.ts.map +1 -0
- package/lib/currencies/localeUtility.js +51 -0
- package/lib/currencies/localeUtility.js.map +1 -0
- package/lib/currencies/parseCurrencyUnit.d.ts +2 -1
- package/lib/currencies/parseCurrencyUnit.d.ts.map +1 -1
- package/lib/currencies/parseCurrencyUnit.js +9 -2
- package/lib/currencies/parseCurrencyUnit.js.map +1 -1
- package/lib-es/config.d.ts +3 -4
- package/lib-es/config.d.ts.map +1 -1
- package/lib-es/config.js +2 -2
- package/lib-es/config.js.map +1 -1
- package/lib-es/currencies/BigNumberToLocaleString.d.ts +7 -0
- package/lib-es/currencies/BigNumberToLocaleString.d.ts.map +1 -0
- package/lib-es/currencies/BigNumberToLocaleString.js +54 -0
- package/lib-es/currencies/BigNumberToLocaleString.js.map +1 -0
- package/lib-es/currencies/formatCurrencyUnit.d.ts +25 -1
- package/lib-es/currencies/formatCurrencyUnit.d.ts.map +1 -1
- package/lib-es/currencies/formatCurrencyUnit.js +127 -1
- package/lib-es/currencies/formatCurrencyUnit.js.map +1 -1
- package/lib-es/currencies/localeUtility.d.ts +8 -0
- package/lib-es/currencies/localeUtility.d.ts.map +1 -0
- package/lib-es/currencies/localeUtility.js +48 -0
- package/lib-es/currencies/localeUtility.js.map +1 -0
- package/lib-es/currencies/parseCurrencyUnit.d.ts +2 -1
- package/lib-es/currencies/parseCurrencyUnit.d.ts.map +1 -1
- package/lib-es/currencies/parseCurrencyUnit.js +8 -1
- package/lib-es/currencies/parseCurrencyUnit.js.map +1 -1
- package/package.json +5 -5
- package/src/config.ts +4 -5
- package/src/currencies/BigNumberToLocaleString.test.ts +164 -0
- package/src/currencies/BigNumberToLocaleString.ts +70 -0
- package/src/currencies/formatCurrencyUnit.test.ts +215 -0
- package/src/currencies/formatCurrencyUnit.ts +200 -6
- package/src/currencies/localeUtility.test.ts +22 -0
- package/src/currencies/localeUtility.ts +59 -0
- package/src/currencies/parseCurrencyUnit.test.ts +26 -0
- package/src/currencies/parseCurrencyUnit.ts +10 -1
|
@@ -1,2 +1,128 @@
|
|
|
1
|
-
|
|
1
|
+
// Forked from @ledgerhq/live-currency-format/src/formatCurrencyUnit.ts
|
|
2
|
+
import { BigNumber } from 'bignumber.js';
|
|
3
|
+
import { getSeparators } from './localeUtility';
|
|
4
|
+
import { toLocaleString } from './BigNumberToLocaleString';
|
|
5
|
+
const nonBreakableSpace = '\u00A0';
|
|
6
|
+
const defaultFormatOptions = {
|
|
7
|
+
locale: 'en-EN',
|
|
8
|
+
showCode: false,
|
|
9
|
+
alwaysShowSign: false,
|
|
10
|
+
showAllDigits: false,
|
|
11
|
+
disableRounding: false,
|
|
12
|
+
useGrouping: true,
|
|
13
|
+
subMagnitude: 0,
|
|
14
|
+
discreet: false,
|
|
15
|
+
joinFragmentsSeparator: '',
|
|
16
|
+
dynamicSignificantDigits: 6,
|
|
17
|
+
staticSignificantDigits: 8,
|
|
18
|
+
};
|
|
19
|
+
const buildFormatState = (unit, value, _options) => {
|
|
20
|
+
const emptyState = () => ({
|
|
21
|
+
value: '',
|
|
22
|
+
sign: null,
|
|
23
|
+
code: null,
|
|
24
|
+
decimalSeparator: '.',
|
|
25
|
+
currencyPosition: unit.prefixCode ? 'start' : 'end',
|
|
26
|
+
});
|
|
27
|
+
if (!BigNumber.isBigNumber(value)) {
|
|
28
|
+
console.warn('formatCurrencyUnit called with value=', value);
|
|
29
|
+
return emptyState();
|
|
30
|
+
}
|
|
31
|
+
if (value.isNaN()) {
|
|
32
|
+
console.warn('formatCurrencyUnit called with NaN value!');
|
|
33
|
+
return emptyState();
|
|
34
|
+
}
|
|
35
|
+
if (!value.isFinite()) {
|
|
36
|
+
console.warn('formatCurrencyUnit called with infinite value=', value);
|
|
37
|
+
return emptyState();
|
|
38
|
+
}
|
|
39
|
+
const options = {};
|
|
40
|
+
if (_options) {
|
|
41
|
+
let k;
|
|
42
|
+
for (k in _options) {
|
|
43
|
+
const optionValue = _options[k];
|
|
44
|
+
if (optionValue !== undefined) {
|
|
45
|
+
options[k] = optionValue;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const resolvedOptions = {
|
|
50
|
+
...defaultFormatOptions,
|
|
51
|
+
...unit,
|
|
52
|
+
...options,
|
|
53
|
+
};
|
|
54
|
+
const { showCode, alwaysShowSign, showAllDigits, locale, disableRounding, useGrouping, subMagnitude, discreet, dynamicSignificantDigits, staticSignificantDigits, } = resolvedOptions;
|
|
55
|
+
const { magnitude, code } = unit;
|
|
56
|
+
const floatValue = value.div(new BigNumber(10).pow(magnitude));
|
|
57
|
+
const floatValueAbs = floatValue.abs();
|
|
58
|
+
const minimumFractionDigits = showAllDigits ? magnitude : 0;
|
|
59
|
+
const maximumFractionDigits = disableRounding
|
|
60
|
+
? magnitude + subMagnitude
|
|
61
|
+
: Math.max(minimumFractionDigits, Math.max(0, Math.min(dynamicSignificantDigits - Math.ceil(Math.log(floatValueAbs.toNumber()) / Math.log(10)), magnitude + subMagnitude, staticSignificantDigits)));
|
|
62
|
+
const sign = alwaysShowSign || floatValue.isNegative() ? (floatValue.isNegative() ? '-' : '+') : null;
|
|
63
|
+
const formattedValue = discreet
|
|
64
|
+
? '***'
|
|
65
|
+
: toLocaleString(floatValueAbs, locale, {
|
|
66
|
+
maximumFractionDigits,
|
|
67
|
+
minimumFractionDigits,
|
|
68
|
+
useGrouping,
|
|
69
|
+
});
|
|
70
|
+
const separators = getSeparators(locale);
|
|
71
|
+
const decimalSeparator = separators.decimal === ',' ? ',' : '.';
|
|
72
|
+
const currencyPosition = unit.prefixCode ? 'start' : 'end';
|
|
73
|
+
return {
|
|
74
|
+
value: formattedValue,
|
|
75
|
+
sign,
|
|
76
|
+
code: showCode ? code : null,
|
|
77
|
+
decimalSeparator,
|
|
78
|
+
currencyPosition,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
export const formatCurrencyUnitFragment = (unit, value, options) => {
|
|
82
|
+
const { value: formattedValue, sign, code, decimalSeparator, currencyPosition, } = buildFormatState(unit, value, options);
|
|
83
|
+
const hasDecimals = formattedValue.indexOf(decimalSeparator) !== -1;
|
|
84
|
+
const [integerPartRaw, decimalPartRaw] = hasDecimals
|
|
85
|
+
? formattedValue.split(decimalSeparator)
|
|
86
|
+
: [formattedValue, ''];
|
|
87
|
+
let integerPart = integerPartRaw;
|
|
88
|
+
const decimalPart = decimalPartRaw || '';
|
|
89
|
+
let currencyText = code || '';
|
|
90
|
+
if (sign) {
|
|
91
|
+
if (currencyPosition === 'start' && currencyText) {
|
|
92
|
+
currencyText = `${sign}${currencyText}`;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
integerPart = `${sign}${integerPart}`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
integerPart,
|
|
100
|
+
decimalPart,
|
|
101
|
+
decimalSeparator,
|
|
102
|
+
currencyText,
|
|
103
|
+
currencyPosition,
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
export const formatCurrencyUnit = (unit, value, options) => {
|
|
107
|
+
const joinFragmentsSeparator = (options && options.joinFragmentsSeparator) || defaultFormatOptions.joinFragmentsSeparator;
|
|
108
|
+
const { value: formattedValue, sign, code } = buildFormatState(unit, value, options);
|
|
109
|
+
const parts = [];
|
|
110
|
+
if (unit.prefixCode) {
|
|
111
|
+
if (sign)
|
|
112
|
+
parts.push(sign);
|
|
113
|
+
if (code)
|
|
114
|
+
parts.push(code);
|
|
115
|
+
parts.push(formattedValue);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
if (sign)
|
|
119
|
+
parts.push(sign);
|
|
120
|
+
parts.push(formattedValue);
|
|
121
|
+
if (code) {
|
|
122
|
+
parts.push(nonBreakableSpace);
|
|
123
|
+
parts.push(code);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return parts.join(joinFragmentsSeparator);
|
|
127
|
+
};
|
|
2
128
|
//# sourceMappingURL=formatCurrencyUnit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatCurrencyUnit.js","sourceRoot":"","sources":["../../src/currencies/formatCurrencyUnit.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"formatCurrencyUnit.js","sourceRoot":"","sources":["../../src/currencies/formatCurrencyUnit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const prefixFormat: readonly ["sign", "code", "value"];
|
|
2
|
+
export declare const suffixFormat: readonly ["sign", "value", "separator", "code"];
|
|
3
|
+
export type GetSeparators = (locale: string) => {
|
|
4
|
+
decimal: string | null | undefined;
|
|
5
|
+
thousands: string | null | undefined;
|
|
6
|
+
};
|
|
7
|
+
export declare const getSeparators: GetSeparators;
|
|
8
|
+
//# sourceMappingURL=localeUtility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localeUtility.d.ts","sourceRoot":"","sources":["../../src/currencies/localeUtility.ts"],"names":[],"mappings":"AA8BA,eAAO,MAAM,YAAY,oCAAqC,CAAA;AAC9D,eAAO,MAAM,YAAY,iDAAkD,CAAA;AAE3E,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK;IAC9C,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAClC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CACrC,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,aAoB1B,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Forked from @ledgerhq/live-currency-format/src/localeUtility.ts
|
|
2
|
+
const memoize = (fn) => {
|
|
3
|
+
const cache = {};
|
|
4
|
+
return ((arg) => {
|
|
5
|
+
if (!(arg in cache)) {
|
|
6
|
+
cache[arg] = fn(arg);
|
|
7
|
+
}
|
|
8
|
+
return cache[arg];
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
const options = {
|
|
12
|
+
style: 'currency',
|
|
13
|
+
currency: 'USD',
|
|
14
|
+
};
|
|
15
|
+
const localeNotAvailable = (1.2).toLocaleString('en', options) !== '$1.20';
|
|
16
|
+
const getFallback = (locale) => staticFallback[Object.prototype.hasOwnProperty.call(staticFallback, locale) ? locale : 'en'];
|
|
17
|
+
const staticFallback = {
|
|
18
|
+
en: ['-$1.00', '10,000.2'],
|
|
19
|
+
es: ['-1,00 US$', '10.000,2'],
|
|
20
|
+
fr: ['-1,00 $US', '10 000,2'],
|
|
21
|
+
ja: ['-US$1.00', '10,000.2'],
|
|
22
|
+
ko: ['-US$1.00', '10,000.2'],
|
|
23
|
+
ru: ['-1,00 $', '10 000,2'],
|
|
24
|
+
zh: ['-US$1.00', '10,000.2'],
|
|
25
|
+
};
|
|
26
|
+
export const prefixFormat = ['sign', 'code', 'value'];
|
|
27
|
+
export const suffixFormat = ['sign', 'value', 'separator', 'code'];
|
|
28
|
+
export const getSeparators = memoize((locale) => {
|
|
29
|
+
const res = localeNotAvailable ? getFallback(locale)[1] : (10000.2).toLocaleString(locale);
|
|
30
|
+
let decimal;
|
|
31
|
+
let thousands;
|
|
32
|
+
for (let i = 0; i < res.length; i++) {
|
|
33
|
+
const c = res[i];
|
|
34
|
+
if (/[0-9]/.test(c))
|
|
35
|
+
continue;
|
|
36
|
+
if (!thousands) {
|
|
37
|
+
thousands = c;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
decimal = c;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
decimal,
|
|
45
|
+
thousands,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=localeUtility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localeUtility.js","sourceRoot":"","sources":["../../src/currencies/localeUtility.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,MAAM,OAAO,GAAG,CAA2C,EAAK,EAAK,EAAE;IACrE,MAAM,KAAK,GAAkC,EAAE,CAAA;IAC/C,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE;QACtB,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC,CAAM,CAAA;AACT,CAAC,CAAA;AAED,MAAM,OAAO,GAAG;IACd,KAAK,EAAE,UAAmB;IAC1B,QAAQ,EAAE,KAAK;CAChB,CAAA;AACD,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,OAAO,CAAA;AAE1E,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE,CACrC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAE9F,MAAM,cAAc,GAA6B;IAC/C,EAAE,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC1B,EAAE,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;IAC7B,EAAE,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;IAC7B,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5B,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5B,EAAE,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAC3B,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;CAC7B,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAA;AAC9D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAU,CAAA;AAO3E,MAAM,CAAC,MAAM,aAAa,GAAkB,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;IAC7D,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IAC1F,IAAI,OAAO,CAAA;IACX,IAAI,SAAS,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,SAAQ;QAE7B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,CAAC,CAAA;QACf,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS;KACV,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCurrencyUnit.d.ts","sourceRoot":"","sources":["../../src/currencies/parseCurrencyUnit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parseCurrencyUnit.d.ts","sourceRoot":"","sources":["../../src/currencies/parseCurrencyUnit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAGxC,eAAO,MAAM,iBAAiB,GAAI,MAAM,IAAI,EAAE,aAAa,MAAM,KAAG,SAKnE,CAAA"}
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { BigNumber } from 'bignumber.js';
|
|
2
|
+
export const parseCurrencyUnit = (unit, valueString) => {
|
|
3
|
+
const str = valueString.replace(/,/g, '.');
|
|
4
|
+
const value = new BigNumber(str);
|
|
5
|
+
if (value.isNaN())
|
|
6
|
+
return new BigNumber(0);
|
|
7
|
+
return value.times(new BigNumber(10).pow(unit.magnitude)).integerValue();
|
|
8
|
+
};
|
|
2
9
|
//# sourceMappingURL=parseCurrencyUnit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseCurrencyUnit.js","sourceRoot":"","sources":["../../src/currencies/parseCurrencyUnit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parseCurrencyUnit.js","sourceRoot":"","sources":["../../src/currencies/parseCurrencyUnit.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAU,EAAE,WAAmB,EAAa,EAAE;IAC9E,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;IAChC,IAAI,KAAK,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,CAAA;AAC1E,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/coin-module-framework",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Ledger framework for Coin integration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -51,12 +51,12 @@
|
|
|
51
51
|
},
|
|
52
52
|
"license": "Apache-2.0",
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@ledgerhq/errors": "6.31.0-nightly.20260317030141",
|
|
55
|
-
"@ledgerhq/live-env": "2.30.0-nightly.20260317030141",
|
|
56
|
-
"@ledgerhq/live-currency-format": "0.6.0-nightly.20260317030141",
|
|
57
|
-
"@ledgerhq/types-cryptoassets": "7.35.0-nightly.20260317030141",
|
|
58
54
|
"bignumber.js": "^9.1.2"
|
|
59
55
|
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@ledgerhq/errors": "^6.33.0",
|
|
58
|
+
"@ledgerhq/live-env": "^2.31.0"
|
|
59
|
+
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@types/node": "^24.0.0",
|
|
62
62
|
"@types/jest": "^30.0.0",
|
package/src/config.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { CryptoCurrency, CryptoCurrencyId } from '@ledgerhq/types-cryptoassets'
|
|
2
1
|
import { MissingCoinConfig } from './errors'
|
|
3
2
|
import type { FeatureConfig } from './features/types'
|
|
4
3
|
|
|
@@ -13,7 +12,7 @@ type ConfigStatus =
|
|
|
13
12
|
}
|
|
14
13
|
| {
|
|
15
14
|
type: 'migration'
|
|
16
|
-
chain:
|
|
15
|
+
chain: string
|
|
17
16
|
from: string
|
|
18
17
|
to: string
|
|
19
18
|
link: string
|
|
@@ -55,7 +54,7 @@ export type CurrencyConfig = {
|
|
|
55
54
|
[key: string]: unknown
|
|
56
55
|
}
|
|
57
56
|
|
|
58
|
-
export type CoinConfig<T extends CurrencyConfig> = (
|
|
57
|
+
export type CoinConfig<T extends CurrencyConfig> = (currencyId?: string) => T
|
|
59
58
|
|
|
60
59
|
function buildCoinConfig<T extends CurrencyConfig>() {
|
|
61
60
|
let coinConfig: CoinConfig<T> | undefined
|
|
@@ -64,12 +63,12 @@ function buildCoinConfig<T extends CurrencyConfig>() {
|
|
|
64
63
|
coinConfig = config
|
|
65
64
|
}
|
|
66
65
|
|
|
67
|
-
const getCoinConfig = (
|
|
66
|
+
const getCoinConfig = (currencyId?: string): T => {
|
|
68
67
|
if (!coinConfig) {
|
|
69
68
|
throw new MissingCoinConfig()
|
|
70
69
|
}
|
|
71
70
|
|
|
72
|
-
return coinConfig(
|
|
71
|
+
return coinConfig(currencyId)
|
|
73
72
|
}
|
|
74
73
|
|
|
75
74
|
return {
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
// Forked from @ledgerhq/live-currency-format/src/BigNumberToLocaleString.test.ts
|
|
2
|
+
import { BigNumber } from 'bignumber.js'
|
|
3
|
+
import { toLocaleString } from './BigNumberToLocaleString'
|
|
4
|
+
|
|
5
|
+
test('basic toLocaleString usage', () => {
|
|
6
|
+
expect(toLocaleString(new BigNumber(0))).toBe('0')
|
|
7
|
+
expect(toLocaleString(new BigNumber(8))).toBe('8')
|
|
8
|
+
expect(toLocaleString(new BigNumber(123))).toBe('123')
|
|
9
|
+
expect(toLocaleString(new BigNumber(0.001))).toBe('0.001')
|
|
10
|
+
expect(toLocaleString(new BigNumber(13.1))).toBe('13.1')
|
|
11
|
+
expect(toLocaleString(new BigNumber(123.01))).toBe('123.01')
|
|
12
|
+
expect(toLocaleString(new BigNumber(123.012))).toBe('123.012')
|
|
13
|
+
expect(toLocaleString(new BigNumber(1123))).toBe('1,123')
|
|
14
|
+
expect(toLocaleString(new BigNumber('9999999999999999'))).toBe('9,999,999,999,999,999')
|
|
15
|
+
expect(toLocaleString(new BigNumber('9999999999999.99'))).toBe('9,999,999,999,999.99')
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test('toLocaleString to default maximumFractionDigits to 3', () => {
|
|
19
|
+
expect(toLocaleString(new BigNumber(4.44444))).toBe('4.444')
|
|
20
|
+
expect(toLocaleString(new BigNumber(444444.444444444))).toBe('444,444.444')
|
|
21
|
+
expect(toLocaleString(new BigNumber(0.444444444))).toBe('0.444')
|
|
22
|
+
expect(toLocaleString(new BigNumber(9.99999))).toBe('9.999')
|
|
23
|
+
expect(toLocaleString(new BigNumber(111111.111111111))).toBe('111,111.111')
|
|
24
|
+
expect(toLocaleString(new BigNumber(0.999999999))).toBe('0.999')
|
|
25
|
+
expect(toLocaleString(new BigNumber(9.5))).toBe('9.5')
|
|
26
|
+
expect(toLocaleString(new BigNumber(9.9))).toBe('9.9')
|
|
27
|
+
expect(toLocaleString(new BigNumber(99.6))).toBe('99.6')
|
|
28
|
+
expect(toLocaleString(new BigNumber(99.8))).toBe('99.8')
|
|
29
|
+
expect(toLocaleString(new BigNumber(999.7))).toBe('999.7')
|
|
30
|
+
expect(toLocaleString(new BigNumber(999.9))).toBe('999.9')
|
|
31
|
+
expect(toLocaleString(new BigNumber(999999.7))).toBe('999,999.7')
|
|
32
|
+
expect(toLocaleString(new BigNumber(999999.9))).toBe('999,999.9')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test('toLocaleString minimumFractionDigits', () => {
|
|
36
|
+
expect(
|
|
37
|
+
toLocaleString(new BigNumber(0), 'en', {
|
|
38
|
+
minimumFractionDigits: 1,
|
|
39
|
+
})
|
|
40
|
+
).toBe('0.0')
|
|
41
|
+
expect(
|
|
42
|
+
toLocaleString(new BigNumber(8), 'en', {
|
|
43
|
+
minimumFractionDigits: 1,
|
|
44
|
+
})
|
|
45
|
+
).toBe('8.0')
|
|
46
|
+
expect(
|
|
47
|
+
toLocaleString(new BigNumber(123), 'en', {
|
|
48
|
+
minimumFractionDigits: 1,
|
|
49
|
+
})
|
|
50
|
+
).toBe('123.0')
|
|
51
|
+
expect(
|
|
52
|
+
toLocaleString(new BigNumber(0.001), 'en', {
|
|
53
|
+
minimumFractionDigits: 1,
|
|
54
|
+
})
|
|
55
|
+
).toBe('0.001')
|
|
56
|
+
expect(
|
|
57
|
+
toLocaleString(new BigNumber(9.5), 'en', {
|
|
58
|
+
minimumFractionDigits: 1,
|
|
59
|
+
})
|
|
60
|
+
).toBe('9.5')
|
|
61
|
+
expect(
|
|
62
|
+
toLocaleString(new BigNumber(9.6), 'en', {
|
|
63
|
+
minimumFractionDigits: 2,
|
|
64
|
+
})
|
|
65
|
+
).toBe('9.60')
|
|
66
|
+
expect(
|
|
67
|
+
toLocaleString(new BigNumber(13.1), 'en', {
|
|
68
|
+
minimumFractionDigits: 3,
|
|
69
|
+
})
|
|
70
|
+
).toBe('13.100')
|
|
71
|
+
expect(
|
|
72
|
+
toLocaleString(new BigNumber(123.01), 'en', {
|
|
73
|
+
minimumFractionDigits: 5,
|
|
74
|
+
})
|
|
75
|
+
).toBe('123.01000')
|
|
76
|
+
expect(
|
|
77
|
+
toLocaleString(new BigNumber(123.012), 'en', {
|
|
78
|
+
minimumFractionDigits: 10,
|
|
79
|
+
})
|
|
80
|
+
).toBe('123.0120000000')
|
|
81
|
+
expect(
|
|
82
|
+
toLocaleString(new BigNumber(1123), 'en', {
|
|
83
|
+
minimumFractionDigits: 1,
|
|
84
|
+
})
|
|
85
|
+
).toBe('1,123.0')
|
|
86
|
+
expect(
|
|
87
|
+
toLocaleString(new BigNumber('9999999999999999'), 'en', {
|
|
88
|
+
minimumFractionDigits: 1,
|
|
89
|
+
})
|
|
90
|
+
).toBe('9,999,999,999,999,999.0')
|
|
91
|
+
expect(
|
|
92
|
+
toLocaleString(new BigNumber('9999999999999.999'), 'en', {
|
|
93
|
+
minimumFractionDigits: 5,
|
|
94
|
+
})
|
|
95
|
+
).toBe('9,999,999,999,999.99900')
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
test('toLocaleString minimumFractionDigits and maximumFractionDigits', () => {
|
|
99
|
+
expect(
|
|
100
|
+
toLocaleString(new BigNumber(1), 'en', {
|
|
101
|
+
minimumFractionDigits: 1,
|
|
102
|
+
maximumFractionDigits: 5,
|
|
103
|
+
})
|
|
104
|
+
).toBe('1.0')
|
|
105
|
+
expect(
|
|
106
|
+
toLocaleString(new BigNumber(1.003), 'en', {
|
|
107
|
+
minimumFractionDigits: 1,
|
|
108
|
+
maximumFractionDigits: 5,
|
|
109
|
+
})
|
|
110
|
+
).toBe('1.003')
|
|
111
|
+
expect(
|
|
112
|
+
toLocaleString(new BigNumber(1.000003), 'en', {
|
|
113
|
+
minimumFractionDigits: 1,
|
|
114
|
+
maximumFractionDigits: 5,
|
|
115
|
+
})
|
|
116
|
+
).toBe('1.0')
|
|
117
|
+
expect(
|
|
118
|
+
toLocaleString(new BigNumber(1.333333333333), 'en', {
|
|
119
|
+
minimumFractionDigits: 1,
|
|
120
|
+
maximumFractionDigits: 5,
|
|
121
|
+
})
|
|
122
|
+
).toBe('1.33333')
|
|
123
|
+
expect(
|
|
124
|
+
toLocaleString(new BigNumber(0), 'en', {
|
|
125
|
+
minimumFractionDigits: 1,
|
|
126
|
+
maximumFractionDigits: 5,
|
|
127
|
+
})
|
|
128
|
+
).toBe('0.0')
|
|
129
|
+
expect(
|
|
130
|
+
toLocaleString(new BigNumber(0.003), 'en', {
|
|
131
|
+
minimumFractionDigits: 1,
|
|
132
|
+
maximumFractionDigits: 5,
|
|
133
|
+
})
|
|
134
|
+
).toBe('0.003')
|
|
135
|
+
expect(
|
|
136
|
+
toLocaleString(new BigNumber(0.000003), 'en', {
|
|
137
|
+
minimumFractionDigits: 1,
|
|
138
|
+
maximumFractionDigits: 5,
|
|
139
|
+
})
|
|
140
|
+
).toBe('0.0')
|
|
141
|
+
expect(
|
|
142
|
+
toLocaleString(new BigNumber(9.7), 'en', {
|
|
143
|
+
minimumFractionDigits: 1,
|
|
144
|
+
maximumFractionDigits: 1,
|
|
145
|
+
})
|
|
146
|
+
).toBe('9.7')
|
|
147
|
+
expect(
|
|
148
|
+
toLocaleString(new BigNumber('4.4444444444444444444411111111111111'), 'en', {
|
|
149
|
+
maximumFractionDigits: 20,
|
|
150
|
+
})
|
|
151
|
+
).toBe('4.44444444444444444444')
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
test('toLocaleString with different locales', () => {
|
|
155
|
+
const resultEn = toLocaleString(new BigNumber('1234.56'), 'en')
|
|
156
|
+
expect(resultEn).toBe('1,234.56')
|
|
157
|
+
const resultFr = toLocaleString(new BigNumber('1234.56'), 'fr')
|
|
158
|
+
expect(resultFr).toBeDefined()
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
test('toLocaleString handles separator types', () => {
|
|
162
|
+
const result = toLocaleString(new BigNumber('1234.56'), 'en')
|
|
163
|
+
expect(result).toBe('1,234.56')
|
|
164
|
+
})
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Forked from @ledgerhq/live-currency-format/src/BigNumberToLocaleString.ts
|
|
2
|
+
import { BigNumber } from 'bignumber.js'
|
|
3
|
+
import { getSeparators } from './localeUtility'
|
|
4
|
+
|
|
5
|
+
export type SupportedOptions = {
|
|
6
|
+
minimumFractionDigits: number
|
|
7
|
+
maximumFractionDigits: number
|
|
8
|
+
useGrouping: boolean
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const getFormatForLocale = (locale: string) => {
|
|
12
|
+
const { decimal, thousands } = getSeparators(locale)
|
|
13
|
+
const opts = {
|
|
14
|
+
decimalSeparator: '.',
|
|
15
|
+
groupSeparator: ',',
|
|
16
|
+
groupSize: 3,
|
|
17
|
+
secondaryGroupSize: 0,
|
|
18
|
+
fractionGroupSeparator: '\xA0', // non-breaking space
|
|
19
|
+
fractionGroupSize: 0,
|
|
20
|
+
}
|
|
21
|
+
if (typeof decimal === 'string') opts.decimalSeparator = decimal
|
|
22
|
+
if (typeof thousands === 'string') opts.groupSeparator = thousands
|
|
23
|
+
return opts
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const toLocaleString = (
|
|
27
|
+
n: BigNumber,
|
|
28
|
+
localeInput?: string,
|
|
29
|
+
options: Partial<SupportedOptions> = {}
|
|
30
|
+
): string => {
|
|
31
|
+
let locale = localeInput
|
|
32
|
+
if (!locale) locale = 'en'
|
|
33
|
+
const minimumFractionDigits =
|
|
34
|
+
typeof options.minimumFractionDigits === 'number' ? options.minimumFractionDigits : 0
|
|
35
|
+
const maximumFractionDigits =
|
|
36
|
+
typeof options.maximumFractionDigits === 'number'
|
|
37
|
+
? options.maximumFractionDigits
|
|
38
|
+
: Math.max(minimumFractionDigits, 3)
|
|
39
|
+
const useGrouping = 'useGrouping' in options ? options.useGrouping : true
|
|
40
|
+
const format = getFormatForLocale(locale)
|
|
41
|
+
|
|
42
|
+
if (!useGrouping) {
|
|
43
|
+
format.groupSeparator = ''
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const BN = BigNumber.clone({
|
|
47
|
+
FORMAT: format,
|
|
48
|
+
})
|
|
49
|
+
const bn = new BN(n)
|
|
50
|
+
const maxDecimals = bn.toFormat(maximumFractionDigits, BigNumber.ROUND_FLOOR)
|
|
51
|
+
|
|
52
|
+
if (maximumFractionDigits !== minimumFractionDigits) {
|
|
53
|
+
const minDecimals = bn.toFormat(minimumFractionDigits, BigNumber.ROUND_FLOOR)
|
|
54
|
+
let i = maxDecimals.length
|
|
55
|
+
|
|
56
|
+
while (i > minDecimals.length) {
|
|
57
|
+
if (maxDecimals[i - 1] !== '0') {
|
|
58
|
+
if (maxDecimals[i - 1] === format.decimalSeparator) {
|
|
59
|
+
i--
|
|
60
|
+
}
|
|
61
|
+
break
|
|
62
|
+
}
|
|
63
|
+
i--
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return maxDecimals.slice(0, i)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return maxDecimals
|
|
70
|
+
}
|