@metamask/client-utils 1.0.0 → 1.2.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/CHANGELOG.md CHANGED
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.2.0]
11
+
12
+ ### Added
13
+
14
+ - Add `createFormatters` factory with shared display formatters (`formatNumber`, `formatCurrency`, `formatCurrencyCompact`, `formatCurrencyWithMinThreshold`, `formatCurrencyTokenPrice`, `formatToken`, `formatTokenQuantity`, `formatTokenAmount`, `formatPercentWithMinThreshold`, `formatCompact`, `formatDateTime`) ([#9504](https://github.com/MetaMask/core/pull/9504))
15
+
16
+ ## [1.1.0]
17
+
18
+ ### Added
19
+
20
+ - Map `assetActivation` and `assetDeactivation` activity types in transaction activity mappers ([#9440](https://github.com/MetaMask/core/pull/9440))
21
+
22
+ ### Changed
23
+
24
+ - Bump `@metamask/transaction-controller` from `^68.3.0` to `^69.0.0` ([#9456](https://github.com/MetaMask/core/pull/9456), [#9470](https://github.com/MetaMask/core/pull/9470))
25
+
10
26
  ## [1.0.0]
11
27
 
12
28
  ### Added
@@ -23,5 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
23
39
  - Bump `@metamask/transaction-controller` from `^68.2.2` to `^68.3.0` ([#9421](https://github.com/MetaMask/core/pull/9421))
24
40
  - Bump `@metamask/keyring-api` from `^23.3.0` to `^23.5.0` ([#9390](https://github.com/MetaMask/core/pull/9390))
25
41
 
26
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.0.0...HEAD
42
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.2.0...HEAD
43
+ [1.2.0]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.1.0...@metamask/client-utils@1.2.0
44
+ [1.1.0]: https://github.com/MetaMask/core/compare/@metamask/client-utils@1.0.0...@metamask/client-utils@1.1.0
27
45
  [1.0.0]: https://github.com/MetaMask/core/releases/tag/@metamask/client-utils@1.0.0
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFormatters = void 0;
4
+ const FALLBACK_LOCALE = 'en';
5
+ const twoDecimals = {
6
+ minimumFractionDigits: 2,
7
+ maximumFractionDigits: 2,
8
+ };
9
+ const oneSignificantDigit = {
10
+ minimumSignificantDigits: 1,
11
+ maximumSignificantDigits: 1,
12
+ };
13
+ const threeSignificantDigits = {
14
+ minimumSignificantDigits: 3,
15
+ maximumSignificantDigits: 3,
16
+ };
17
+ const numberFormatCache = {};
18
+ const dateTimeFormatCache = {};
19
+ function getCachedNumberFormat(locale, options) {
20
+ const key = `${locale}_${JSON.stringify(options)}`;
21
+ let format = numberFormatCache[key];
22
+ if (format) {
23
+ return format;
24
+ }
25
+ try {
26
+ format = new Intl.NumberFormat(locale, options);
27
+ }
28
+ catch (error) {
29
+ if (error instanceof RangeError) {
30
+ format = new Intl.NumberFormat(locale, twoDecimals);
31
+ }
32
+ else {
33
+ throw error;
34
+ }
35
+ }
36
+ numberFormatCache[key] = format;
37
+ return format;
38
+ }
39
+ function getCachedDateTimeFormat(locale, options) {
40
+ const key = `${locale}_${JSON.stringify(options)}`;
41
+ if (!dateTimeFormatCache[key]) {
42
+ dateTimeFormatCache[key] = new Intl.DateTimeFormat(locale, options);
43
+ }
44
+ return dateTimeFormatCache[key];
45
+ }
46
+ function formatNumber(config, value, options = {}) {
47
+ if (!Number.isFinite(Number(value))) {
48
+ return '';
49
+ }
50
+ const numberFormat = getCachedNumberFormat(config.locale, options);
51
+ // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+
52
+ return numberFormat.format(value);
53
+ }
54
+ function formatCurrency(config, value, currency, options = {}) {
55
+ if (!Number.isFinite(Number(value))) {
56
+ return '';
57
+ }
58
+ const numberFormat = getCachedNumberFormat(config.locale, {
59
+ style: 'currency',
60
+ currency,
61
+ ...options,
62
+ });
63
+ // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+
64
+ return numberFormat.format(value);
65
+ }
66
+ function formatCurrencyCompact(config, value, currency) {
67
+ return formatCurrency(config, value, currency, {
68
+ notation: 'compact',
69
+ ...twoDecimals,
70
+ });
71
+ }
72
+ function formatCurrencyWithMinThreshold(config, value, currency) {
73
+ const minThreshold = 0.01;
74
+ const number = Number(value);
75
+ const absoluteValue = Math.abs(number);
76
+ if (!Number.isFinite(number)) {
77
+ return '';
78
+ }
79
+ if (number === 0) {
80
+ return formatCurrency(config, 0, currency);
81
+ }
82
+ if (absoluteValue < minThreshold) {
83
+ const formattedMin = formatCurrency(config, minThreshold, currency);
84
+ return `<${formattedMin}`;
85
+ }
86
+ return formatCurrency(config, number, currency);
87
+ }
88
+ function formatCurrencyTokenPrice(config, value, currency) {
89
+ const minThreshold = 0.00000001;
90
+ const number = Number(value);
91
+ const absoluteValue = Math.abs(number);
92
+ if (!Number.isFinite(number)) {
93
+ return '';
94
+ }
95
+ if (number === 0) {
96
+ return formatCurrency(config, 0, currency);
97
+ }
98
+ if (absoluteValue < minThreshold) {
99
+ return `<${formatCurrency(config, minThreshold, currency, oneSignificantDigit)}`;
100
+ }
101
+ if (absoluteValue < 1) {
102
+ return formatCurrency(config, number, currency, threeSignificantDigits);
103
+ }
104
+ if (absoluteValue < 1000000) {
105
+ return formatCurrency(config, number, currency);
106
+ }
107
+ return formatCurrencyCompact(config, number, currency);
108
+ }
109
+ function formatToken(config, value, symbol, options = {}) {
110
+ if (!Number.isFinite(Number(value))) {
111
+ return '';
112
+ }
113
+ const numberFormat = getCachedNumberFormat(config.locale, {
114
+ style: 'decimal',
115
+ ...options,
116
+ });
117
+ // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+
118
+ const formattedNumber = numberFormat.format(value);
119
+ return `${formattedNumber} ${symbol}`;
120
+ }
121
+ function formatTokenQuantity(config, value, symbol) {
122
+ const minThreshold = 0.00001;
123
+ const number = Number(value);
124
+ const absoluteValue = Math.abs(number);
125
+ if (!Number.isFinite(number)) {
126
+ return '';
127
+ }
128
+ if (number === 0) {
129
+ return formatToken(config, 0, symbol);
130
+ }
131
+ if (absoluteValue < minThreshold) {
132
+ return `<${formatToken(config, minThreshold, symbol, oneSignificantDigit)}`;
133
+ }
134
+ if (absoluteValue < 1) {
135
+ return formatToken(config, number, symbol, threeSignificantDigits);
136
+ }
137
+ if (absoluteValue < 1000000) {
138
+ return formatToken(config, number, symbol);
139
+ }
140
+ return formatToken(config, number, symbol, {
141
+ notation: 'compact',
142
+ ...twoDecimals,
143
+ });
144
+ }
145
+ // Format token quantity without trailing zeros.
146
+ function formatTokenAmount(config, value, symbol) {
147
+ const minThreshold = 0.00001;
148
+ const number = Number(value);
149
+ const absoluteValue = Math.abs(number);
150
+ if (!Number.isFinite(number)) {
151
+ return '';
152
+ }
153
+ if (number === 0) {
154
+ return formatToken(config, 0, symbol, { maximumFractionDigits: 0 });
155
+ }
156
+ if (absoluteValue < minThreshold) {
157
+ return `<${formatToken(config, minThreshold, symbol, {
158
+ minimumSignificantDigits: 1,
159
+ maximumSignificantDigits: 1,
160
+ })}`;
161
+ }
162
+ if (absoluteValue < 1) {
163
+ return formatToken(config, number, symbol, {
164
+ minimumSignificantDigits: 1,
165
+ maximumSignificantDigits: 4,
166
+ });
167
+ }
168
+ if (absoluteValue < 1000000) {
169
+ return formatToken(config, number, symbol, {
170
+ minimumFractionDigits: 0,
171
+ maximumFractionDigits: 4,
172
+ });
173
+ }
174
+ return formatToken(config, number, symbol, {
175
+ notation: 'compact',
176
+ minimumFractionDigits: 0,
177
+ maximumFractionDigits: 2,
178
+ });
179
+ }
180
+ function formatPercentWithMinThreshold(config, value, options = {}) {
181
+ const minThreshold = 0.0001; // 0.01%
182
+ const number = Number(value);
183
+ if (!Number.isFinite(number)) {
184
+ return '';
185
+ }
186
+ const clamped = number === 0
187
+ ? 0
188
+ : Math.sign(number) * Math.max(Math.abs(number), minThreshold);
189
+ return formatNumber(config, clamped, {
190
+ style: 'percent',
191
+ maximumFractionDigits: 2,
192
+ minimumFractionDigits: 2,
193
+ ...options,
194
+ });
195
+ }
196
+ function formatCompact(config, value) {
197
+ return formatNumber(config, value, {
198
+ notation: 'compact',
199
+ minimumFractionDigits: 2,
200
+ maximumFractionDigits: 2,
201
+ });
202
+ }
203
+ function formatDateTime(config, timestamp, options) {
204
+ if (!timestamp) {
205
+ return '';
206
+ }
207
+ const date = new Date(timestamp);
208
+ if (isNaN(date.getTime())) {
209
+ return '';
210
+ }
211
+ return getCachedDateTimeFormat(config.locale, {
212
+ month: 'short',
213
+ day: 'numeric',
214
+ year: 'numeric',
215
+ hour: 'numeric',
216
+ minute: 'numeric',
217
+ hour12: true,
218
+ ...options,
219
+ }).format(date);
220
+ }
221
+ function createFormatters({ locale = FALLBACK_LOCALE, }) {
222
+ const config = { locale };
223
+ return {
224
+ formatNumber: formatNumber.bind(null, config),
225
+ formatCurrency: formatCurrency.bind(null, config),
226
+ formatCurrencyCompact: formatCurrencyCompact.bind(null, config),
227
+ formatCurrencyWithMinThreshold: formatCurrencyWithMinThreshold.bind(null, config),
228
+ formatCurrencyTokenPrice: formatCurrencyTokenPrice.bind(null, config),
229
+ formatToken: formatToken.bind(null, config),
230
+ formatTokenQuantity: formatTokenQuantity.bind(null, config),
231
+ formatTokenAmount: formatTokenAmount.bind(null, config),
232
+ formatPercentWithMinThreshold: formatPercentWithMinThreshold.bind(null, config),
233
+ formatCompact: formatCompact.bind(null, config),
234
+ formatDateTime: formatDateTime.bind(null, config),
235
+ };
236
+ }
237
+ exports.createFormatters = createFormatters;
238
+ //# sourceMappingURL=create-formatters.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-formatters.cjs","sourceRoot":"","sources":["../../src/formatters/create-formatters.ts"],"names":[],"mappings":"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","sourcesContent":["const FALLBACK_LOCALE = 'en';\n\nconst twoDecimals = {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nconst oneSignificantDigit = {\n minimumSignificantDigits: 1,\n maximumSignificantDigits: 1,\n};\n\nconst threeSignificantDigits = {\n minimumSignificantDigits: 3,\n maximumSignificantDigits: 3,\n};\n\nconst numberFormatCache: Record<string, Intl.NumberFormat> = {};\nconst dateTimeFormatCache: Record<string, Intl.DateTimeFormat> = {};\n\ntype Value = number | bigint | `${number}`;\n\nfunction getCachedNumberFormat(\n locale: string,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat {\n const key = `${locale}_${JSON.stringify(options)}`;\n\n let format = numberFormatCache[key];\n\n if (format) {\n return format;\n }\n\n try {\n format = new Intl.NumberFormat(locale, options);\n } catch (error) {\n if (error instanceof RangeError) {\n format = new Intl.NumberFormat(locale, twoDecimals);\n } else {\n throw error;\n }\n }\n\n numberFormatCache[key] = format;\n return format;\n}\n\nfunction getCachedDateTimeFormat(\n locale: string,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat {\n const key = `${locale}_${JSON.stringify(options)}`;\n if (!dateTimeFormatCache[key]) {\n dateTimeFormatCache[key] = new Intl.DateTimeFormat(locale, options);\n }\n return dateTimeFormatCache[key];\n}\n\nfunction formatNumber(\n config: { locale: string },\n value: Value,\n options: Intl.NumberFormatOptions = {},\n): string {\n if (!Number.isFinite(Number(value))) {\n return '';\n }\n\n const numberFormat = getCachedNumberFormat(config.locale, options);\n\n // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n return numberFormat.format(value);\n}\n\nfunction formatCurrency(\n config: { locale: string },\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n options: Intl.NumberFormatOptions = {},\n): string {\n if (!Number.isFinite(Number(value))) {\n return '';\n }\n\n const numberFormat = getCachedNumberFormat(config.locale, {\n style: 'currency',\n currency,\n ...options,\n });\n\n // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n return numberFormat.format(value);\n}\n\nfunction formatCurrencyCompact(\n config: { locale: string },\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n): string {\n return formatCurrency(config, value, currency, {\n notation: 'compact',\n ...twoDecimals,\n });\n}\n\nfunction formatCurrencyWithMinThreshold(\n config: { locale: string },\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n): string {\n const minThreshold = 0.01;\n const number = Number(value);\n const absoluteValue = Math.abs(number);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n if (number === 0) {\n return formatCurrency(config, 0, currency);\n }\n\n if (absoluteValue < minThreshold) {\n const formattedMin = formatCurrency(config, minThreshold, currency);\n return `<${formattedMin}`;\n }\n\n return formatCurrency(config, number, currency);\n}\n\nfunction formatCurrencyTokenPrice(\n config: { locale: string },\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n): string {\n const minThreshold = 0.00000001;\n const number = Number(value);\n const absoluteValue = Math.abs(number);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n if (number === 0) {\n return formatCurrency(config, 0, currency);\n }\n\n if (absoluteValue < minThreshold) {\n return `<${formatCurrency(config, minThreshold, currency, oneSignificantDigit)}`;\n }\n\n if (absoluteValue < 1) {\n return formatCurrency(config, number, currency, threeSignificantDigits);\n }\n\n if (absoluteValue < 1_000_000) {\n return formatCurrency(config, number, currency);\n }\n\n return formatCurrencyCompact(config, number, currency);\n}\n\nfunction formatToken(\n config: { locale: string },\n value: Value,\n symbol: string,\n options: Intl.NumberFormatOptions = {},\n): string {\n if (!Number.isFinite(Number(value))) {\n return '';\n }\n\n const numberFormat = getCachedNumberFormat(config.locale, {\n style: 'decimal',\n ...options,\n });\n\n // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n const formattedNumber = numberFormat.format(value);\n\n return `${formattedNumber} ${symbol}`;\n}\n\nfunction formatTokenQuantity(\n config: { locale: string },\n value: Value,\n symbol: string,\n): string {\n const minThreshold = 0.00001;\n const number = Number(value);\n const absoluteValue = Math.abs(number);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n if (number === 0) {\n return formatToken(config, 0, symbol);\n }\n\n if (absoluteValue < minThreshold) {\n return `<${formatToken(config, minThreshold, symbol, oneSignificantDigit)}`;\n }\n\n if (absoluteValue < 1) {\n return formatToken(config, number, symbol, threeSignificantDigits);\n }\n\n if (absoluteValue < 1_000_000) {\n return formatToken(config, number, symbol);\n }\n\n return formatToken(config, number, symbol, {\n notation: 'compact',\n ...twoDecimals,\n });\n}\n\n// Format token quantity without trailing zeros.\nfunction formatTokenAmount(\n config: { locale: string },\n value: Value,\n symbol: string,\n): string {\n const minThreshold = 0.00001;\n const number = Number(value);\n const absoluteValue = Math.abs(number);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n if (number === 0) {\n return formatToken(config, 0, symbol, { maximumFractionDigits: 0 });\n }\n\n if (absoluteValue < minThreshold) {\n return `<${formatToken(config, minThreshold, symbol, {\n minimumSignificantDigits: 1,\n maximumSignificantDigits: 1,\n })}`;\n }\n\n if (absoluteValue < 1) {\n return formatToken(config, number, symbol, {\n minimumSignificantDigits: 1,\n maximumSignificantDigits: 4,\n });\n }\n\n if (absoluteValue < 1_000_000) {\n return formatToken(config, number, symbol, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 4,\n });\n }\n\n return formatToken(config, number, symbol, {\n notation: 'compact',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatPercentWithMinThreshold(\n config: { locale: string },\n value: Value,\n options: Intl.NumberFormatOptions = {},\n): string {\n const minThreshold = 0.0001; // 0.01%\n const number = Number(value);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n const clamped =\n number === 0\n ? 0\n : Math.sign(number) * Math.max(Math.abs(number), minThreshold);\n\n return formatNumber(config, clamped, {\n style: 'percent',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n ...options,\n });\n}\n\nfunction formatCompact(config: { locale: string }, value: Value): string {\n return formatNumber(config, value, {\n notation: 'compact',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatDateTime(\n config: { locale: string },\n timestamp: string | number,\n options?: Intl.DateTimeFormatOptions,\n): string {\n if (!timestamp) {\n return '';\n }\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n return '';\n }\n return getCachedDateTimeFormat(config.locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n ...options,\n }).format(date);\n}\n\nexport type Formatters = {\n formatNumber: (value: Value, options?: Intl.NumberFormatOptions) => string;\n formatCurrency: (\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n options?: Intl.NumberFormatOptions,\n ) => string;\n formatCurrencyCompact: (\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n ) => string;\n formatCurrencyWithMinThreshold: (\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n ) => string;\n formatCurrencyTokenPrice: (\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n ) => string;\n formatToken: (\n value: Value,\n symbol: string,\n options?: Intl.NumberFormatOptions,\n ) => string;\n formatTokenQuantity: (value: Value, symbol: string) => string;\n formatTokenAmount: (value: Value, symbol: string) => string;\n formatPercentWithMinThreshold: (\n value: Value,\n options?: Intl.NumberFormatOptions,\n ) => string;\n formatCompact: (value: Value) => string;\n formatDateTime: (\n timestamp: string | number,\n options?: Intl.DateTimeFormatOptions,\n ) => string;\n};\n\nexport function createFormatters({\n locale = FALLBACK_LOCALE,\n}: {\n locale?: string;\n}): Formatters {\n const config = { locale };\n return {\n formatNumber: formatNumber.bind(null, config),\n formatCurrency: formatCurrency.bind(null, config),\n formatCurrencyCompact: formatCurrencyCompact.bind(null, config),\n formatCurrencyWithMinThreshold: formatCurrencyWithMinThreshold.bind(\n null,\n config,\n ),\n formatCurrencyTokenPrice: formatCurrencyTokenPrice.bind(null, config),\n formatToken: formatToken.bind(null, config),\n formatTokenQuantity: formatTokenQuantity.bind(null, config),\n formatTokenAmount: formatTokenAmount.bind(null, config),\n formatPercentWithMinThreshold: formatPercentWithMinThreshold.bind(\n null,\n config,\n ),\n formatCompact: formatCompact.bind(null, config),\n formatDateTime: formatDateTime.bind(null, config),\n };\n}\n"]}
@@ -0,0 +1,19 @@
1
+ type Value = number | bigint | `${number}`;
2
+ export type Formatters = {
3
+ formatNumber: (value: Value, options?: Intl.NumberFormatOptions) => string;
4
+ formatCurrency: (value: Value, currency: Intl.NumberFormatOptions['currency'], options?: Intl.NumberFormatOptions) => string;
5
+ formatCurrencyCompact: (value: Value, currency: Intl.NumberFormatOptions['currency']) => string;
6
+ formatCurrencyWithMinThreshold: (value: Value, currency: Intl.NumberFormatOptions['currency']) => string;
7
+ formatCurrencyTokenPrice: (value: Value, currency: Intl.NumberFormatOptions['currency']) => string;
8
+ formatToken: (value: Value, symbol: string, options?: Intl.NumberFormatOptions) => string;
9
+ formatTokenQuantity: (value: Value, symbol: string) => string;
10
+ formatTokenAmount: (value: Value, symbol: string) => string;
11
+ formatPercentWithMinThreshold: (value: Value, options?: Intl.NumberFormatOptions) => string;
12
+ formatCompact: (value: Value) => string;
13
+ formatDateTime: (timestamp: string | number, options?: Intl.DateTimeFormatOptions) => string;
14
+ };
15
+ export declare function createFormatters({ locale, }: {
16
+ locale?: string;
17
+ }): Formatters;
18
+ export {};
19
+ //# sourceMappingURL=create-formatters.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-formatters.d.cts","sourceRoot":"","sources":["../../src/formatters/create-formatters.ts"],"names":[],"mappings":"AAoBA,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;AA4S3C,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAAK,MAAM,CAAC;IAC3E,cAAc,EAAE,CACd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAC9C,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAC/B,MAAM,CAAC;IACZ,qBAAqB,EAAE,CACrB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAC3C,MAAM,CAAC;IACZ,8BAA8B,EAAE,CAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAC3C,MAAM,CAAC;IACZ,wBAAwB,EAAE,CACxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAC3C,MAAM,CAAC;IACZ,WAAW,EAAE,CACX,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAC/B,MAAM,CAAC;IACZ,mBAAmB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9D,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5D,6BAA6B,EAAE,CAC7B,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAC/B,MAAM,CAAC;IACZ,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;IACxC,cAAc,EAAE,CACd,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,KACjC,MAAM,CAAC;CACb,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,MAAwB,GACzB,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,UAAU,CAqBb"}
@@ -0,0 +1,19 @@
1
+ type Value = number | bigint | `${number}`;
2
+ export type Formatters = {
3
+ formatNumber: (value: Value, options?: Intl.NumberFormatOptions) => string;
4
+ formatCurrency: (value: Value, currency: Intl.NumberFormatOptions['currency'], options?: Intl.NumberFormatOptions) => string;
5
+ formatCurrencyCompact: (value: Value, currency: Intl.NumberFormatOptions['currency']) => string;
6
+ formatCurrencyWithMinThreshold: (value: Value, currency: Intl.NumberFormatOptions['currency']) => string;
7
+ formatCurrencyTokenPrice: (value: Value, currency: Intl.NumberFormatOptions['currency']) => string;
8
+ formatToken: (value: Value, symbol: string, options?: Intl.NumberFormatOptions) => string;
9
+ formatTokenQuantity: (value: Value, symbol: string) => string;
10
+ formatTokenAmount: (value: Value, symbol: string) => string;
11
+ formatPercentWithMinThreshold: (value: Value, options?: Intl.NumberFormatOptions) => string;
12
+ formatCompact: (value: Value) => string;
13
+ formatDateTime: (timestamp: string | number, options?: Intl.DateTimeFormatOptions) => string;
14
+ };
15
+ export declare function createFormatters({ locale, }: {
16
+ locale?: string;
17
+ }): Formatters;
18
+ export {};
19
+ //# sourceMappingURL=create-formatters.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-formatters.d.mts","sourceRoot":"","sources":["../../src/formatters/create-formatters.ts"],"names":[],"mappings":"AAoBA,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;AA4S3C,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAAK,MAAM,CAAC;IAC3E,cAAc,EAAE,CACd,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAC9C,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAC/B,MAAM,CAAC;IACZ,qBAAqB,EAAE,CACrB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAC3C,MAAM,CAAC;IACZ,8BAA8B,EAAE,CAC9B,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAC3C,MAAM,CAAC;IACZ,wBAAwB,EAAE,CACxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,KAC3C,MAAM,CAAC;IACZ,WAAW,EAAE,CACX,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAC/B,MAAM,CAAC;IACZ,mBAAmB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9D,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5D,6BAA6B,EAAE,CAC7B,KAAK,EAAE,KAAK,EACZ,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAC/B,MAAM,CAAC;IACZ,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;IACxC,cAAc,EAAE,CACd,SAAS,EAAE,MAAM,GAAG,MAAM,EAC1B,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,KACjC,MAAM,CAAC;CACb,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,MAAwB,GACzB,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,UAAU,CAqBb"}
@@ -0,0 +1,234 @@
1
+ const FALLBACK_LOCALE = 'en';
2
+ const twoDecimals = {
3
+ minimumFractionDigits: 2,
4
+ maximumFractionDigits: 2,
5
+ };
6
+ const oneSignificantDigit = {
7
+ minimumSignificantDigits: 1,
8
+ maximumSignificantDigits: 1,
9
+ };
10
+ const threeSignificantDigits = {
11
+ minimumSignificantDigits: 3,
12
+ maximumSignificantDigits: 3,
13
+ };
14
+ const numberFormatCache = {};
15
+ const dateTimeFormatCache = {};
16
+ function getCachedNumberFormat(locale, options) {
17
+ const key = `${locale}_${JSON.stringify(options)}`;
18
+ let format = numberFormatCache[key];
19
+ if (format) {
20
+ return format;
21
+ }
22
+ try {
23
+ format = new Intl.NumberFormat(locale, options);
24
+ }
25
+ catch (error) {
26
+ if (error instanceof RangeError) {
27
+ format = new Intl.NumberFormat(locale, twoDecimals);
28
+ }
29
+ else {
30
+ throw error;
31
+ }
32
+ }
33
+ numberFormatCache[key] = format;
34
+ return format;
35
+ }
36
+ function getCachedDateTimeFormat(locale, options) {
37
+ const key = `${locale}_${JSON.stringify(options)}`;
38
+ if (!dateTimeFormatCache[key]) {
39
+ dateTimeFormatCache[key] = new Intl.DateTimeFormat(locale, options);
40
+ }
41
+ return dateTimeFormatCache[key];
42
+ }
43
+ function formatNumber(config, value, options = {}) {
44
+ if (!Number.isFinite(Number(value))) {
45
+ return '';
46
+ }
47
+ const numberFormat = getCachedNumberFormat(config.locale, options);
48
+ // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+
49
+ return numberFormat.format(value);
50
+ }
51
+ function formatCurrency(config, value, currency, options = {}) {
52
+ if (!Number.isFinite(Number(value))) {
53
+ return '';
54
+ }
55
+ const numberFormat = getCachedNumberFormat(config.locale, {
56
+ style: 'currency',
57
+ currency,
58
+ ...options,
59
+ });
60
+ // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+
61
+ return numberFormat.format(value);
62
+ }
63
+ function formatCurrencyCompact(config, value, currency) {
64
+ return formatCurrency(config, value, currency, {
65
+ notation: 'compact',
66
+ ...twoDecimals,
67
+ });
68
+ }
69
+ function formatCurrencyWithMinThreshold(config, value, currency) {
70
+ const minThreshold = 0.01;
71
+ const number = Number(value);
72
+ const absoluteValue = Math.abs(number);
73
+ if (!Number.isFinite(number)) {
74
+ return '';
75
+ }
76
+ if (number === 0) {
77
+ return formatCurrency(config, 0, currency);
78
+ }
79
+ if (absoluteValue < minThreshold) {
80
+ const formattedMin = formatCurrency(config, minThreshold, currency);
81
+ return `<${formattedMin}`;
82
+ }
83
+ return formatCurrency(config, number, currency);
84
+ }
85
+ function formatCurrencyTokenPrice(config, value, currency) {
86
+ const minThreshold = 0.00000001;
87
+ const number = Number(value);
88
+ const absoluteValue = Math.abs(number);
89
+ if (!Number.isFinite(number)) {
90
+ return '';
91
+ }
92
+ if (number === 0) {
93
+ return formatCurrency(config, 0, currency);
94
+ }
95
+ if (absoluteValue < minThreshold) {
96
+ return `<${formatCurrency(config, minThreshold, currency, oneSignificantDigit)}`;
97
+ }
98
+ if (absoluteValue < 1) {
99
+ return formatCurrency(config, number, currency, threeSignificantDigits);
100
+ }
101
+ if (absoluteValue < 1000000) {
102
+ return formatCurrency(config, number, currency);
103
+ }
104
+ return formatCurrencyCompact(config, number, currency);
105
+ }
106
+ function formatToken(config, value, symbol, options = {}) {
107
+ if (!Number.isFinite(Number(value))) {
108
+ return '';
109
+ }
110
+ const numberFormat = getCachedNumberFormat(config.locale, {
111
+ style: 'decimal',
112
+ ...options,
113
+ });
114
+ // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+
115
+ const formattedNumber = numberFormat.format(value);
116
+ return `${formattedNumber} ${symbol}`;
117
+ }
118
+ function formatTokenQuantity(config, value, symbol) {
119
+ const minThreshold = 0.00001;
120
+ const number = Number(value);
121
+ const absoluteValue = Math.abs(number);
122
+ if (!Number.isFinite(number)) {
123
+ return '';
124
+ }
125
+ if (number === 0) {
126
+ return formatToken(config, 0, symbol);
127
+ }
128
+ if (absoluteValue < minThreshold) {
129
+ return `<${formatToken(config, minThreshold, symbol, oneSignificantDigit)}`;
130
+ }
131
+ if (absoluteValue < 1) {
132
+ return formatToken(config, number, symbol, threeSignificantDigits);
133
+ }
134
+ if (absoluteValue < 1000000) {
135
+ return formatToken(config, number, symbol);
136
+ }
137
+ return formatToken(config, number, symbol, {
138
+ notation: 'compact',
139
+ ...twoDecimals,
140
+ });
141
+ }
142
+ // Format token quantity without trailing zeros.
143
+ function formatTokenAmount(config, value, symbol) {
144
+ const minThreshold = 0.00001;
145
+ const number = Number(value);
146
+ const absoluteValue = Math.abs(number);
147
+ if (!Number.isFinite(number)) {
148
+ return '';
149
+ }
150
+ if (number === 0) {
151
+ return formatToken(config, 0, symbol, { maximumFractionDigits: 0 });
152
+ }
153
+ if (absoluteValue < minThreshold) {
154
+ return `<${formatToken(config, minThreshold, symbol, {
155
+ minimumSignificantDigits: 1,
156
+ maximumSignificantDigits: 1,
157
+ })}`;
158
+ }
159
+ if (absoluteValue < 1) {
160
+ return formatToken(config, number, symbol, {
161
+ minimumSignificantDigits: 1,
162
+ maximumSignificantDigits: 4,
163
+ });
164
+ }
165
+ if (absoluteValue < 1000000) {
166
+ return formatToken(config, number, symbol, {
167
+ minimumFractionDigits: 0,
168
+ maximumFractionDigits: 4,
169
+ });
170
+ }
171
+ return formatToken(config, number, symbol, {
172
+ notation: 'compact',
173
+ minimumFractionDigits: 0,
174
+ maximumFractionDigits: 2,
175
+ });
176
+ }
177
+ function formatPercentWithMinThreshold(config, value, options = {}) {
178
+ const minThreshold = 0.0001; // 0.01%
179
+ const number = Number(value);
180
+ if (!Number.isFinite(number)) {
181
+ return '';
182
+ }
183
+ const clamped = number === 0
184
+ ? 0
185
+ : Math.sign(number) * Math.max(Math.abs(number), minThreshold);
186
+ return formatNumber(config, clamped, {
187
+ style: 'percent',
188
+ maximumFractionDigits: 2,
189
+ minimumFractionDigits: 2,
190
+ ...options,
191
+ });
192
+ }
193
+ function formatCompact(config, value) {
194
+ return formatNumber(config, value, {
195
+ notation: 'compact',
196
+ minimumFractionDigits: 2,
197
+ maximumFractionDigits: 2,
198
+ });
199
+ }
200
+ function formatDateTime(config, timestamp, options) {
201
+ if (!timestamp) {
202
+ return '';
203
+ }
204
+ const date = new Date(timestamp);
205
+ if (isNaN(date.getTime())) {
206
+ return '';
207
+ }
208
+ return getCachedDateTimeFormat(config.locale, {
209
+ month: 'short',
210
+ day: 'numeric',
211
+ year: 'numeric',
212
+ hour: 'numeric',
213
+ minute: 'numeric',
214
+ hour12: true,
215
+ ...options,
216
+ }).format(date);
217
+ }
218
+ export function createFormatters({ locale = FALLBACK_LOCALE, }) {
219
+ const config = { locale };
220
+ return {
221
+ formatNumber: formatNumber.bind(null, config),
222
+ formatCurrency: formatCurrency.bind(null, config),
223
+ formatCurrencyCompact: formatCurrencyCompact.bind(null, config),
224
+ formatCurrencyWithMinThreshold: formatCurrencyWithMinThreshold.bind(null, config),
225
+ formatCurrencyTokenPrice: formatCurrencyTokenPrice.bind(null, config),
226
+ formatToken: formatToken.bind(null, config),
227
+ formatTokenQuantity: formatTokenQuantity.bind(null, config),
228
+ formatTokenAmount: formatTokenAmount.bind(null, config),
229
+ formatPercentWithMinThreshold: formatPercentWithMinThreshold.bind(null, config),
230
+ formatCompact: formatCompact.bind(null, config),
231
+ formatDateTime: formatDateTime.bind(null, config),
232
+ };
233
+ }
234
+ //# sourceMappingURL=create-formatters.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-formatters.mjs","sourceRoot":"","sources":["../../src/formatters/create-formatters.ts"],"names":[],"mappings":"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","sourcesContent":["const FALLBACK_LOCALE = 'en';\n\nconst twoDecimals = {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n};\n\nconst oneSignificantDigit = {\n minimumSignificantDigits: 1,\n maximumSignificantDigits: 1,\n};\n\nconst threeSignificantDigits = {\n minimumSignificantDigits: 3,\n maximumSignificantDigits: 3,\n};\n\nconst numberFormatCache: Record<string, Intl.NumberFormat> = {};\nconst dateTimeFormatCache: Record<string, Intl.DateTimeFormat> = {};\n\ntype Value = number | bigint | `${number}`;\n\nfunction getCachedNumberFormat(\n locale: string,\n options: Intl.NumberFormatOptions,\n): Intl.NumberFormat {\n const key = `${locale}_${JSON.stringify(options)}`;\n\n let format = numberFormatCache[key];\n\n if (format) {\n return format;\n }\n\n try {\n format = new Intl.NumberFormat(locale, options);\n } catch (error) {\n if (error instanceof RangeError) {\n format = new Intl.NumberFormat(locale, twoDecimals);\n } else {\n throw error;\n }\n }\n\n numberFormatCache[key] = format;\n return format;\n}\n\nfunction getCachedDateTimeFormat(\n locale: string,\n options: Intl.DateTimeFormatOptions,\n): Intl.DateTimeFormat {\n const key = `${locale}_${JSON.stringify(options)}`;\n if (!dateTimeFormatCache[key]) {\n dateTimeFormatCache[key] = new Intl.DateTimeFormat(locale, options);\n }\n return dateTimeFormatCache[key];\n}\n\nfunction formatNumber(\n config: { locale: string },\n value: Value,\n options: Intl.NumberFormatOptions = {},\n): string {\n if (!Number.isFinite(Number(value))) {\n return '';\n }\n\n const numberFormat = getCachedNumberFormat(config.locale, options);\n\n // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n return numberFormat.format(value);\n}\n\nfunction formatCurrency(\n config: { locale: string },\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n options: Intl.NumberFormatOptions = {},\n): string {\n if (!Number.isFinite(Number(value))) {\n return '';\n }\n\n const numberFormat = getCachedNumberFormat(config.locale, {\n style: 'currency',\n currency,\n ...options,\n });\n\n // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n return numberFormat.format(value);\n}\n\nfunction formatCurrencyCompact(\n config: { locale: string },\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n): string {\n return formatCurrency(config, value, currency, {\n notation: 'compact',\n ...twoDecimals,\n });\n}\n\nfunction formatCurrencyWithMinThreshold(\n config: { locale: string },\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n): string {\n const minThreshold = 0.01;\n const number = Number(value);\n const absoluteValue = Math.abs(number);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n if (number === 0) {\n return formatCurrency(config, 0, currency);\n }\n\n if (absoluteValue < minThreshold) {\n const formattedMin = formatCurrency(config, minThreshold, currency);\n return `<${formattedMin}`;\n }\n\n return formatCurrency(config, number, currency);\n}\n\nfunction formatCurrencyTokenPrice(\n config: { locale: string },\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n): string {\n const minThreshold = 0.00000001;\n const number = Number(value);\n const absoluteValue = Math.abs(number);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n if (number === 0) {\n return formatCurrency(config, 0, currency);\n }\n\n if (absoluteValue < minThreshold) {\n return `<${formatCurrency(config, minThreshold, currency, oneSignificantDigit)}`;\n }\n\n if (absoluteValue < 1) {\n return formatCurrency(config, number, currency, threeSignificantDigits);\n }\n\n if (absoluteValue < 1_000_000) {\n return formatCurrency(config, number, currency);\n }\n\n return formatCurrencyCompact(config, number, currency);\n}\n\nfunction formatToken(\n config: { locale: string },\n value: Value,\n symbol: string,\n options: Intl.NumberFormatOptions = {},\n): string {\n if (!Number.isFinite(Number(value))) {\n return '';\n }\n\n const numberFormat = getCachedNumberFormat(config.locale, {\n style: 'decimal',\n ...options,\n });\n\n // @ts-expect-error Remove this comment once TypeScript is updated to 5.5+\n const formattedNumber = numberFormat.format(value);\n\n return `${formattedNumber} ${symbol}`;\n}\n\nfunction formatTokenQuantity(\n config: { locale: string },\n value: Value,\n symbol: string,\n): string {\n const minThreshold = 0.00001;\n const number = Number(value);\n const absoluteValue = Math.abs(number);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n if (number === 0) {\n return formatToken(config, 0, symbol);\n }\n\n if (absoluteValue < minThreshold) {\n return `<${formatToken(config, minThreshold, symbol, oneSignificantDigit)}`;\n }\n\n if (absoluteValue < 1) {\n return formatToken(config, number, symbol, threeSignificantDigits);\n }\n\n if (absoluteValue < 1_000_000) {\n return formatToken(config, number, symbol);\n }\n\n return formatToken(config, number, symbol, {\n notation: 'compact',\n ...twoDecimals,\n });\n}\n\n// Format token quantity without trailing zeros.\nfunction formatTokenAmount(\n config: { locale: string },\n value: Value,\n symbol: string,\n): string {\n const minThreshold = 0.00001;\n const number = Number(value);\n const absoluteValue = Math.abs(number);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n if (number === 0) {\n return formatToken(config, 0, symbol, { maximumFractionDigits: 0 });\n }\n\n if (absoluteValue < minThreshold) {\n return `<${formatToken(config, minThreshold, symbol, {\n minimumSignificantDigits: 1,\n maximumSignificantDigits: 1,\n })}`;\n }\n\n if (absoluteValue < 1) {\n return formatToken(config, number, symbol, {\n minimumSignificantDigits: 1,\n maximumSignificantDigits: 4,\n });\n }\n\n if (absoluteValue < 1_000_000) {\n return formatToken(config, number, symbol, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 4,\n });\n }\n\n return formatToken(config, number, symbol, {\n notation: 'compact',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatPercentWithMinThreshold(\n config: { locale: string },\n value: Value,\n options: Intl.NumberFormatOptions = {},\n): string {\n const minThreshold = 0.0001; // 0.01%\n const number = Number(value);\n\n if (!Number.isFinite(number)) {\n return '';\n }\n\n const clamped =\n number === 0\n ? 0\n : Math.sign(number) * Math.max(Math.abs(number), minThreshold);\n\n return formatNumber(config, clamped, {\n style: 'percent',\n maximumFractionDigits: 2,\n minimumFractionDigits: 2,\n ...options,\n });\n}\n\nfunction formatCompact(config: { locale: string }, value: Value): string {\n return formatNumber(config, value, {\n notation: 'compact',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nfunction formatDateTime(\n config: { locale: string },\n timestamp: string | number,\n options?: Intl.DateTimeFormatOptions,\n): string {\n if (!timestamp) {\n return '';\n }\n const date = new Date(timestamp);\n if (isNaN(date.getTime())) {\n return '';\n }\n return getCachedDateTimeFormat(config.locale, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n hour12: true,\n ...options,\n }).format(date);\n}\n\nexport type Formatters = {\n formatNumber: (value: Value, options?: Intl.NumberFormatOptions) => string;\n formatCurrency: (\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n options?: Intl.NumberFormatOptions,\n ) => string;\n formatCurrencyCompact: (\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n ) => string;\n formatCurrencyWithMinThreshold: (\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n ) => string;\n formatCurrencyTokenPrice: (\n value: Value,\n currency: Intl.NumberFormatOptions['currency'],\n ) => string;\n formatToken: (\n value: Value,\n symbol: string,\n options?: Intl.NumberFormatOptions,\n ) => string;\n formatTokenQuantity: (value: Value, symbol: string) => string;\n formatTokenAmount: (value: Value, symbol: string) => string;\n formatPercentWithMinThreshold: (\n value: Value,\n options?: Intl.NumberFormatOptions,\n ) => string;\n formatCompact: (value: Value) => string;\n formatDateTime: (\n timestamp: string | number,\n options?: Intl.DateTimeFormatOptions,\n ) => string;\n};\n\nexport function createFormatters({\n locale = FALLBACK_LOCALE,\n}: {\n locale?: string;\n}): Formatters {\n const config = { locale };\n return {\n formatNumber: formatNumber.bind(null, config),\n formatCurrency: formatCurrency.bind(null, config),\n formatCurrencyCompact: formatCurrencyCompact.bind(null, config),\n formatCurrencyWithMinThreshold: formatCurrencyWithMinThreshold.bind(\n null,\n config,\n ),\n formatCurrencyTokenPrice: formatCurrencyTokenPrice.bind(null, config),\n formatToken: formatToken.bind(null, config),\n formatTokenQuantity: formatTokenQuantity.bind(null, config),\n formatTokenAmount: formatTokenAmount.bind(null, config),\n formatPercentWithMinThreshold: formatPercentWithMinThreshold.bind(\n null,\n config,\n ),\n formatCompact: formatCompact.bind(null, config),\n formatDateTime: formatDateTime.bind(null, config),\n };\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mapLocalTransaction = exports.mapKeyringTransaction = exports.mapApiTransaction = void 0;
3
+ exports.mapLocalTransaction = exports.mapKeyringTransaction = exports.mapApiTransaction = exports.createFormatters = void 0;
4
+ var create_formatters_1 = require("./formatters/create-formatters.cjs");
5
+ Object.defineProperty(exports, "createFormatters", { enumerable: true, get: function () { return create_formatters_1.createFormatters; } });
4
6
  var api_transaction_mapper_1 = require("./mappers/api-transaction-mapper.cjs");
5
7
  Object.defineProperty(exports, "mapApiTransaction", { enumerable: true, get: function () { return api_transaction_mapper_1.mapApiTransaction; } });
6
8
  var keyring_transaction_mapper_1 = require("./mappers/keyring-transaction-mapper.cjs");
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+EAAqE;AAA5D,2HAAA,iBAAiB,OAAA;AAC1B,uFAA6E;AAApE,mIAAA,qBAAqB,OAAA;AAC9B,mFAAyE;AAAhE,+HAAA,mBAAmB,OAAA","sourcesContent":["export { mapApiTransaction } from './mappers/api-transaction-mapper';\nexport { mapKeyringTransaction } from './mappers/keyring-transaction-mapper';\nexport { mapLocalTransaction } from './mappers/local-transaction-mapper';\n\nexport type * from './types';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,wEAAkE;AAAzD,qHAAA,gBAAgB,OAAA;AAGzB,+EAAqE;AAA5D,2HAAA,iBAAiB,OAAA;AAC1B,uFAA6E;AAApE,mIAAA,qBAAqB,OAAA;AAC9B,mFAAyE;AAAhE,+HAAA,mBAAmB,OAAA","sourcesContent":["export { createFormatters } from './formatters/create-formatters';\nexport type { Formatters } from './formatters/create-formatters';\n\nexport { mapApiTransaction } from './mappers/api-transaction-mapper';\nexport { mapKeyringTransaction } from './mappers/keyring-transaction-mapper';\nexport { mapLocalTransaction } from './mappers/local-transaction-mapper';\n\nexport type * from './types';\n"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,5 @@
1
+ export { createFormatters } from "./formatters/create-formatters.cjs";
2
+ export type { Formatters } from "./formatters/create-formatters.cjs";
1
3
  export { mapApiTransaction } from "./mappers/api-transaction-mapper.cjs";
2
4
  export { mapKeyringTransaction } from "./mappers/keyring-transaction-mapper.cjs";
3
5
  export { mapLocalTransaction } from "./mappers/local-transaction-mapper.cjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EAAE,qBAAqB,EAAE,iDAA6C;AAC7E,OAAO,EAAE,mBAAmB,EAAE,+CAA2C;AAEzE,iCAA6B"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,2CAAuC;AAClE,YAAY,EAAE,UAAU,EAAE,2CAAuC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EAAE,qBAAqB,EAAE,iDAA6C;AAC7E,OAAO,EAAE,mBAAmB,EAAE,+CAA2C;AAEzE,iCAA6B"}
package/dist/index.d.mts CHANGED
@@ -1,3 +1,5 @@
1
+ export { createFormatters } from "./formatters/create-formatters.mjs";
2
+ export type { Formatters } from "./formatters/create-formatters.mjs";
1
3
  export { mapApiTransaction } from "./mappers/api-transaction-mapper.mjs";
2
4
  export { mapKeyringTransaction } from "./mappers/keyring-transaction-mapper.mjs";
3
5
  export { mapLocalTransaction } from "./mappers/local-transaction-mapper.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EAAE,qBAAqB,EAAE,iDAA6C;AAC7E,OAAO,EAAE,mBAAmB,EAAE,+CAA2C;AAEzE,iCAA6B"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,2CAAuC;AAClE,YAAY,EAAE,UAAU,EAAE,2CAAuC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EAAE,qBAAqB,EAAE,iDAA6C;AAC7E,OAAO,EAAE,mBAAmB,EAAE,+CAA2C;AAEzE,iCAA6B"}
package/dist/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ export { createFormatters } from "./formatters/create-formatters.mjs";
1
2
  export { mapApiTransaction } from "./mappers/api-transaction-mapper.mjs";
2
3
  export { mapKeyringTransaction } from "./mappers/keyring-transaction-mapper.mjs";
3
4
  export { mapLocalTransaction } from "./mappers/local-transaction-mapper.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EAAE,qBAAqB,EAAE,iDAA6C;AAC7E,OAAO,EAAE,mBAAmB,EAAE,+CAA2C","sourcesContent":["export { mapApiTransaction } from './mappers/api-transaction-mapper';\nexport { mapKeyringTransaction } from './mappers/keyring-transaction-mapper';\nexport { mapLocalTransaction } from './mappers/local-transaction-mapper';\n\nexport type * from './types';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,2CAAuC;AAGlE,OAAO,EAAE,iBAAiB,EAAE,6CAAyC;AACrE,OAAO,EAAE,qBAAqB,EAAE,iDAA6C;AAC7E,OAAO,EAAE,mBAAmB,EAAE,+CAA2C","sourcesContent":["export { createFormatters } from './formatters/create-formatters';\nexport type { Formatters } from './formatters/create-formatters';\n\nexport { mapApiTransaction } from './mappers/api-transaction-mapper';\nexport { mapKeyringTransaction } from './mappers/keyring-transaction-mapper';\nexport { mapLocalTransaction } from './mappers/local-transaction-mapper';\n\nexport type * from './types';\n"]}
@@ -1,7 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mapKeyringTransaction = void 0;
3
+ exports.mapKeyringTransaction = exports.CustomTransactionTypeLabel = void 0;
4
4
  const keyring_api_1 = require("@metamask/keyring-api");
5
+ /**
6
+ * Custom labels for non-EVM transactions.
7
+ *
8
+ * The labels are used to map the transaction type to the title in the activity list and dialog.
9
+ * The labels are defined in the `transaction.details.typeLabel` property.
10
+ * For details: {@link https://github.com/MetaMask/metamask-extension/pull/38040}
11
+ */
12
+ var CustomTransactionTypeLabel;
13
+ (function (CustomTransactionTypeLabel) {
14
+ // Token requires one off approve to receive
15
+ CustomTransactionTypeLabel["TrustlineApprove"] = "trustline-approve";
16
+ // Token requires revoke the approve to stop receiving
17
+ CustomTransactionTypeLabel["TrustlineDisapprove"] = "trustline-disapprove";
18
+ })(CustomTransactionTypeLabel || (exports.CustomTransactionTypeLabel = CustomTransactionTypeLabel = {}));
19
+ function hasTrustlineTypeLabel(details) {
20
+ // A flag to indicate if the transaction is a trustline type.
21
+ return [
22
+ String(CustomTransactionTypeLabel.TrustlineApprove),
23
+ String(CustomTransactionTypeLabel.TrustlineDisapprove),
24
+ ].includes(details?.typeLabel ?? '');
25
+ }
5
26
  function mapStatus(status) {
6
27
  switch (status) {
7
28
  case keyring_api_1.TransactionStatus.Confirmed:
@@ -113,6 +134,17 @@ function mapKeyringTransaction({ transaction, subjectAddress, }) {
113
134
  };
114
135
  case keyring_api_1.TransactionType.TokenApprove: {
115
136
  const rawToken = getToken(transaction.from, 'out');
137
+ if (hasTrustlineTypeLabel(transaction.details)) {
138
+ return {
139
+ type: 'assetActivation',
140
+ ...common,
141
+ data: {
142
+ from,
143
+ token: rawToken ? { ...rawToken, amount: undefined } : rawToken,
144
+ fees,
145
+ },
146
+ };
147
+ }
116
148
  const isUnlimited = rawToken?.amount !== undefined &&
117
149
  rawToken.amount.split('.')[0].length > approveAmountMaxIntegerDigits;
118
150
  return {
@@ -127,6 +159,29 @@ function mapKeyringTransaction({ transaction, subjectAddress, }) {
127
159
  },
128
160
  };
129
161
  }
162
+ case keyring_api_1.TransactionType.TokenDisapprove: {
163
+ if (!hasTrustlineTypeLabel(transaction.details)) {
164
+ return {
165
+ type: 'contractInteraction',
166
+ ...common,
167
+ data: {
168
+ from,
169
+ to,
170
+ fees,
171
+ },
172
+ };
173
+ }
174
+ const rawToken = getToken(transaction.from, 'out');
175
+ return {
176
+ type: 'assetDeactivation',
177
+ ...common,
178
+ data: {
179
+ from,
180
+ token: rawToken ? { ...rawToken, amount: undefined } : rawToken,
181
+ fees,
182
+ },
183
+ };
184
+ }
130
185
  default:
131
186
  return {
132
187
  type: 'contractInteraction',
@@ -1 +1 @@
1
- {"version":3,"file":"keyring-transaction-mapper.cjs","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transaction as KeyringTransaction } from '@metamask/keyring-api';\nimport {\n TransactionStatus,\n TransactionType as KeyringTransactionType,\n} from '@metamask/keyring-api';\n\nimport type { Fee, ActivityItem, Status, TokenAmount } from '../types';\n\ntype Movement = KeyringTransaction['from'][number];\ntype KeyringFee = KeyringTransaction['fees'][number];\ntype FungibleAsset = Extract<\n NonNullable<Movement['asset']>,\n { fungible: true }\n>;\n\nfunction mapStatus(status: KeyringTransaction['status']): Status {\n switch (status) {\n case TransactionStatus.Confirmed:\n return 'success';\n case TransactionStatus.Failed:\n return 'failed';\n case TransactionStatus.Submitted:\n case TransactionStatus.Unconfirmed:\n default:\n return 'pending';\n }\n}\n\nfunction getAddress(movements: Movement[]): string {\n return movements[0]?.address ?? '';\n}\n\nfunction hasFungibleAsset(\n movement: Movement,\n): movement is Movement & { asset: FungibleAsset } {\n return movement.asset?.fungible === true;\n}\n\nfunction getToken(\n movements: Movement[],\n direction: TokenAmount['direction'],\n): TokenAmount | undefined {\n const movement = movements.find(hasFungibleAsset);\n\n if (!movement) {\n return undefined;\n }\n\n return {\n amount: movement.asset.amount,\n symbol: movement.asset.unit,\n assetId: movement.asset.type,\n direction,\n };\n}\n\nfunction getFee(fee: KeyringFee): Fee | undefined {\n const { asset } = fee;\n\n if (!asset.fungible) {\n return undefined;\n }\n\n return {\n type: fee.type,\n amount: asset.amount,\n symbol: asset.unit,\n assetId: asset.type,\n };\n}\n\nfunction getFees(transaction: KeyringTransaction): Fee[] {\n return transaction.fees.flatMap((fee) => {\n const mappedFee = getFee(fee);\n\n return mappedFee ? [mappedFee] : [];\n });\n}\n\nconst approveAmountMaxIntegerDigits = 15;\n\n/**\n * Maps a keyring transaction into the shared activity item shape.\n *\n * @param options - The mapping options.\n * @param options.transaction - The keyring transaction to map.\n * @param options.subjectAddress - Account address used for send/receive attribution.\n * @returns The normalized activity item.\n */\nexport function mapKeyringTransaction({\n transaction,\n subjectAddress,\n}: {\n transaction: KeyringTransaction;\n subjectAddress?: string;\n}): ActivityItem {\n const { type, id } = transaction;\n const status = mapStatus(transaction.status);\n const timestamp = transaction.timestamp ? transaction.timestamp * 1000 : 0;\n const chainId = transaction.chain;\n\n const from =\n type === KeyringTransactionType.Send && subjectAddress\n ? subjectAddress\n : getAddress(transaction.from);\n\n const to =\n type === KeyringTransactionType.Receive && subjectAddress\n ? subjectAddress\n : getAddress(transaction.to);\n\n const fees = getFees(transaction);\n const common = { chainId, status, timestamp, hash: id };\n\n switch (type) {\n case KeyringTransactionType.Send: {\n const fromToken = getToken(transaction.from, 'out');\n const token =\n !fromToken && chainId.startsWith('bip122:')\n ? getToken(transaction.to, 'out')\n : fromToken;\n\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token,\n fees,\n },\n };\n }\n\n case KeyringTransactionType.Receive:\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: getToken(transaction.to, 'in'),\n fees,\n },\n };\n\n case KeyringTransactionType.Swap:\n return {\n type: 'swap',\n ...common,\n data: {\n from,\n destinationToken: getToken(transaction.to, 'in'),\n sourceToken: getToken(transaction.from, 'out'),\n fees,\n },\n };\n\n case KeyringTransactionType.TokenApprove: {\n const rawToken = getToken(transaction.from, 'out');\n const isUnlimited =\n rawToken?.amount !== undefined &&\n rawToken.amount.split('.')[0].length > approveAmountMaxIntegerDigits;\n\n return {\n type: 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: rawToken\n ? { ...rawToken, amount: isUnlimited ? undefined : rawToken.amount }\n : rawToken,\n fees,\n },\n };\n }\n\n default:\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n fees,\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"keyring-transaction-mapper.cjs","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transaction as KeyringTransaction } from '@metamask/keyring-api';\nimport {\n TransactionStatus,\n TransactionType as KeyringTransactionType,\n} from '@metamask/keyring-api';\n\nimport type { Fee, ActivityItem, Status, TokenAmount } from '../types';\n\ntype Movement = KeyringTransaction['from'][number];\ntype KeyringFee = KeyringTransaction['fees'][number];\ntype FungibleAsset = Extract<\n NonNullable<Movement['asset']>,\n { fungible: true }\n>;\n\n/**\n * Custom labels for non-EVM transactions.\n *\n * The labels are used to map the transaction type to the title in the activity list and dialog.\n * The labels are defined in the `transaction.details.typeLabel` property.\n * For details: {@link https://github.com/MetaMask/metamask-extension/pull/38040}\n */\nexport enum CustomTransactionTypeLabel {\n // Token requires one off approve to receive\n TrustlineApprove = 'trustline-approve',\n // Token requires revoke the approve to stop receiving\n TrustlineDisapprove = 'trustline-disapprove',\n}\n\nfunction hasTrustlineTypeLabel(\n details: KeyringTransaction['details'],\n): boolean {\n // A flag to indicate if the transaction is a trustline type.\n return [\n String(CustomTransactionTypeLabel.TrustlineApprove),\n String(CustomTransactionTypeLabel.TrustlineDisapprove),\n ].includes(details?.typeLabel ?? '');\n}\n\nfunction mapStatus(status: KeyringTransaction['status']): Status {\n switch (status) {\n case TransactionStatus.Confirmed:\n return 'success';\n case TransactionStatus.Failed:\n return 'failed';\n case TransactionStatus.Submitted:\n case TransactionStatus.Unconfirmed:\n default:\n return 'pending';\n }\n}\n\nfunction getAddress(movements: Movement[]): string {\n return movements[0]?.address ?? '';\n}\n\nfunction hasFungibleAsset(\n movement: Movement,\n): movement is Movement & { asset: FungibleAsset } {\n return movement.asset?.fungible === true;\n}\n\nfunction getToken(\n movements: Movement[],\n direction: TokenAmount['direction'],\n): TokenAmount | undefined {\n const movement = movements.find(hasFungibleAsset);\n\n if (!movement) {\n return undefined;\n }\n\n return {\n amount: movement.asset.amount,\n symbol: movement.asset.unit,\n assetId: movement.asset.type,\n direction,\n };\n}\n\nfunction getFee(fee: KeyringFee): Fee | undefined {\n const { asset } = fee;\n\n if (!asset.fungible) {\n return undefined;\n }\n\n return {\n type: fee.type,\n amount: asset.amount,\n symbol: asset.unit,\n assetId: asset.type,\n };\n}\n\nfunction getFees(transaction: KeyringTransaction): Fee[] {\n return transaction.fees.flatMap((fee) => {\n const mappedFee = getFee(fee);\n\n return mappedFee ? [mappedFee] : [];\n });\n}\n\nconst approveAmountMaxIntegerDigits = 15;\n\n/**\n * Maps a keyring transaction into the shared activity item shape.\n *\n * @param options - The mapping options.\n * @param options.transaction - The keyring transaction to map.\n * @param options.subjectAddress - Account address used for send/receive attribution.\n * @returns The normalized activity item.\n */\nexport function mapKeyringTransaction({\n transaction,\n subjectAddress,\n}: {\n transaction: KeyringTransaction;\n subjectAddress?: string;\n}): ActivityItem {\n const { type, id } = transaction;\n const status = mapStatus(transaction.status);\n const timestamp = transaction.timestamp ? transaction.timestamp * 1000 : 0;\n const chainId = transaction.chain;\n\n const from =\n type === KeyringTransactionType.Send && subjectAddress\n ? subjectAddress\n : getAddress(transaction.from);\n\n const to =\n type === KeyringTransactionType.Receive && subjectAddress\n ? subjectAddress\n : getAddress(transaction.to);\n\n const fees = getFees(transaction);\n const common = { chainId, status, timestamp, hash: id };\n\n switch (type) {\n case KeyringTransactionType.Send: {\n const fromToken = getToken(transaction.from, 'out');\n const token =\n !fromToken && chainId.startsWith('bip122:')\n ? getToken(transaction.to, 'out')\n : fromToken;\n\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token,\n fees,\n },\n };\n }\n\n case KeyringTransactionType.Receive:\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: getToken(transaction.to, 'in'),\n fees,\n },\n };\n\n case KeyringTransactionType.Swap:\n return {\n type: 'swap',\n ...common,\n data: {\n from,\n destinationToken: getToken(transaction.to, 'in'),\n sourceToken: getToken(transaction.from, 'out'),\n fees,\n },\n };\n\n case KeyringTransactionType.TokenApprove: {\n const rawToken = getToken(transaction.from, 'out');\n\n if (hasTrustlineTypeLabel(transaction.details)) {\n return {\n type: 'assetActivation',\n ...common,\n data: {\n from,\n token: rawToken ? { ...rawToken, amount: undefined } : rawToken,\n fees,\n },\n };\n }\n\n const isUnlimited =\n rawToken?.amount !== undefined &&\n rawToken.amount.split('.')[0].length > approveAmountMaxIntegerDigits;\n\n return {\n type: 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: rawToken\n ? { ...rawToken, amount: isUnlimited ? undefined : rawToken.amount }\n : rawToken,\n fees,\n },\n };\n }\n\n case KeyringTransactionType.TokenDisapprove: {\n if (!hasTrustlineTypeLabel(transaction.details)) {\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n fees,\n },\n };\n }\n\n const rawToken = getToken(transaction.from, 'out');\n\n return {\n type: 'assetDeactivation',\n ...common,\n data: {\n from,\n token: rawToken ? { ...rawToken, amount: undefined } : rawToken,\n fees,\n },\n };\n }\n\n default:\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n fees,\n },\n };\n }\n}\n"]}
@@ -1,5 +1,16 @@
1
1
  import type { Transaction as KeyringTransaction } from "@metamask/keyring-api";
2
2
  import type { ActivityItem } from "../types.cjs";
3
+ /**
4
+ * Custom labels for non-EVM transactions.
5
+ *
6
+ * The labels are used to map the transaction type to the title in the activity list and dialog.
7
+ * The labels are defined in the `transaction.details.typeLabel` property.
8
+ * For details: {@link https://github.com/MetaMask/metamask-extension/pull/38040}
9
+ */
10
+ export declare enum CustomTransactionTypeLabel {
11
+ TrustlineApprove = "trustline-approve",
12
+ TrustlineDisapprove = "trustline-disapprove"
13
+ }
3
14
  /**
4
15
  * Maps a keyring transaction into the shared activity item shape.
5
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"keyring-transaction-mapper.d.cts","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,kBAAkB,EAAE,8BAA8B;AAM/E,OAAO,KAAK,EAAO,YAAY,EAAuB,qBAAiB;AA2EvE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,CA6Ff"}
1
+ {"version":3,"file":"keyring-transaction-mapper.d.cts","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,kBAAkB,EAAE,8BAA8B;AAM/E,OAAO,KAAK,EAAO,YAAY,EAAuB,qBAAiB;AASvE;;;;;;GAMG;AACH,oBAAY,0BAA0B;IAEpC,gBAAgB,sBAAsB;IAEtC,mBAAmB,yBAAyB;CAC7C;AA8ED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,CAoIf"}
@@ -1,5 +1,16 @@
1
1
  import type { Transaction as KeyringTransaction } from "@metamask/keyring-api";
2
2
  import type { ActivityItem } from "../types.mjs";
3
+ /**
4
+ * Custom labels for non-EVM transactions.
5
+ *
6
+ * The labels are used to map the transaction type to the title in the activity list and dialog.
7
+ * The labels are defined in the `transaction.details.typeLabel` property.
8
+ * For details: {@link https://github.com/MetaMask/metamask-extension/pull/38040}
9
+ */
10
+ export declare enum CustomTransactionTypeLabel {
11
+ TrustlineApprove = "trustline-approve",
12
+ TrustlineDisapprove = "trustline-disapprove"
13
+ }
3
14
  /**
4
15
  * Maps a keyring transaction into the shared activity item shape.
5
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"keyring-transaction-mapper.d.mts","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,kBAAkB,EAAE,8BAA8B;AAM/E,OAAO,KAAK,EAAO,YAAY,EAAuB,qBAAiB;AA2EvE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,CA6Ff"}
1
+ {"version":3,"file":"keyring-transaction-mapper.d.mts","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,IAAI,kBAAkB,EAAE,8BAA8B;AAM/E,OAAO,KAAK,EAAO,YAAY,EAAuB,qBAAiB;AASvE;;;;;;GAMG;AACH,oBAAY,0BAA0B;IAEpC,gBAAgB,sBAAsB;IAEtC,mBAAmB,yBAAyB;CAC7C;AA8ED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,WAAW,EACX,cAAc,GACf,EAAE;IACD,WAAW,EAAE,kBAAkB,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,YAAY,CAoIf"}
@@ -1,4 +1,25 @@
1
1
  import { TransactionStatus, TransactionType as KeyringTransactionType } from "@metamask/keyring-api";
2
+ /**
3
+ * Custom labels for non-EVM transactions.
4
+ *
5
+ * The labels are used to map the transaction type to the title in the activity list and dialog.
6
+ * The labels are defined in the `transaction.details.typeLabel` property.
7
+ * For details: {@link https://github.com/MetaMask/metamask-extension/pull/38040}
8
+ */
9
+ export var CustomTransactionTypeLabel;
10
+ (function (CustomTransactionTypeLabel) {
11
+ // Token requires one off approve to receive
12
+ CustomTransactionTypeLabel["TrustlineApprove"] = "trustline-approve";
13
+ // Token requires revoke the approve to stop receiving
14
+ CustomTransactionTypeLabel["TrustlineDisapprove"] = "trustline-disapprove";
15
+ })(CustomTransactionTypeLabel || (CustomTransactionTypeLabel = {}));
16
+ function hasTrustlineTypeLabel(details) {
17
+ // A flag to indicate if the transaction is a trustline type.
18
+ return [
19
+ String(CustomTransactionTypeLabel.TrustlineApprove),
20
+ String(CustomTransactionTypeLabel.TrustlineDisapprove),
21
+ ].includes(details?.typeLabel ?? '');
22
+ }
2
23
  function mapStatus(status) {
3
24
  switch (status) {
4
25
  case TransactionStatus.Confirmed:
@@ -110,6 +131,17 @@ export function mapKeyringTransaction({ transaction, subjectAddress, }) {
110
131
  };
111
132
  case KeyringTransactionType.TokenApprove: {
112
133
  const rawToken = getToken(transaction.from, 'out');
134
+ if (hasTrustlineTypeLabel(transaction.details)) {
135
+ return {
136
+ type: 'assetActivation',
137
+ ...common,
138
+ data: {
139
+ from,
140
+ token: rawToken ? { ...rawToken, amount: undefined } : rawToken,
141
+ fees,
142
+ },
143
+ };
144
+ }
113
145
  const isUnlimited = rawToken?.amount !== undefined &&
114
146
  rawToken.amount.split('.')[0].length > approveAmountMaxIntegerDigits;
115
147
  return {
@@ -124,6 +156,29 @@ export function mapKeyringTransaction({ transaction, subjectAddress, }) {
124
156
  },
125
157
  };
126
158
  }
159
+ case KeyringTransactionType.TokenDisapprove: {
160
+ if (!hasTrustlineTypeLabel(transaction.details)) {
161
+ return {
162
+ type: 'contractInteraction',
163
+ ...common,
164
+ data: {
165
+ from,
166
+ to,
167
+ fees,
168
+ },
169
+ };
170
+ }
171
+ const rawToken = getToken(transaction.from, 'out');
172
+ return {
173
+ type: 'assetDeactivation',
174
+ ...common,
175
+ data: {
176
+ from,
177
+ token: rawToken ? { ...rawToken, amount: undefined } : rawToken,
178
+ fees,
179
+ },
180
+ };
181
+ }
127
182
  default:
128
183
  return {
129
184
  type: 'contractInteraction',
@@ -1 +1 @@
1
- {"version":3,"file":"keyring-transaction-mapper.mjs","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,eAAe,IAAI,sBAAsB,EAC1C,8BAA8B;AAW/B,SAAS,SAAS,CAAC,MAAoC;IACrD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,iBAAiB,CAAC,SAAS;YAC9B,OAAO,SAAS,CAAC;QACnB,KAAK,iBAAiB,CAAC,MAAM;YAC3B,OAAO,QAAQ,CAAC;QAClB,KAAK,iBAAiB,CAAC,SAAS,CAAC;QACjC,KAAK,iBAAiB,CAAC,WAAW,CAAC;QACnC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,SAAqB;IACvC,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CACvB,QAAkB;IAElB,OAAO,QAAQ,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CACf,SAAqB,EACrB,SAAmC;IAEnC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAElD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM;QAC7B,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;QAC3B,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;QAC5B,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,GAAe;IAC7B,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAEtB,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,OAAO,EAAE,KAAK,CAAC,IAAI;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,WAA+B;IAC9C,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9B,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAEzC;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,EACpC,WAAW,EACX,cAAc,GAIf;IACC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,WAAW,CAAC;IACjC,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC;IAElC,MAAM,IAAI,GACR,IAAI,KAAK,sBAAsB,CAAC,IAAI,IAAI,cAAc;QACpD,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAEnC,MAAM,EAAE,GACN,IAAI,KAAK,sBAAsB,CAAC,OAAO,IAAI,cAAc;QACvD,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAEjC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAExD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,KAAK,GACT,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;gBACzC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC;gBACjC,CAAC,CAAC,SAAS,CAAC;YAEhB,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,EAAE;oBACF,KAAK;oBACL,IAAI;iBACL;aACF,CAAC;QACJ,CAAC;QAED,KAAK,sBAAsB,CAAC,OAAO;YACjC,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,EAAE;oBACF,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC;oBACrC,IAAI;iBACL;aACF,CAAC;QAEJ,KAAK,sBAAsB,CAAC,IAAI;YAC9B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,gBAAgB,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC;oBAChD,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;oBAC9C,IAAI;iBACL;aACF,CAAC;QAEJ,KAAK,sBAAsB,CAAC,YAAY,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,WAAW,GACf,QAAQ,EAAE,MAAM,KAAK,SAAS;gBAC9B,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,6BAA6B,CAAC;YAEvE,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,KAAK,EAAE,QAAQ;wBACb,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE;wBACpE,CAAC,CAAC,QAAQ;oBACZ,IAAI;iBACL;aACF,CAAC;QACJ,CAAC;QAED;YACE,OAAO;gBACL,IAAI,EAAE,qBAAqB;gBAC3B,GAAG,MAAM;gBACT,IAAI,EAAE;oBACJ,IAAI;oBACJ,EAAE;oBACF,IAAI;iBACL;aACF,CAAC;IACN,CAAC;AACH,CAAC","sourcesContent":["import type { Transaction as KeyringTransaction } from '@metamask/keyring-api';\nimport {\n TransactionStatus,\n TransactionType as KeyringTransactionType,\n} from '@metamask/keyring-api';\n\nimport type { Fee, ActivityItem, Status, TokenAmount } from '../types';\n\ntype Movement = KeyringTransaction['from'][number];\ntype KeyringFee = KeyringTransaction['fees'][number];\ntype FungibleAsset = Extract<\n NonNullable<Movement['asset']>,\n { fungible: true }\n>;\n\nfunction mapStatus(status: KeyringTransaction['status']): Status {\n switch (status) {\n case TransactionStatus.Confirmed:\n return 'success';\n case TransactionStatus.Failed:\n return 'failed';\n case TransactionStatus.Submitted:\n case TransactionStatus.Unconfirmed:\n default:\n return 'pending';\n }\n}\n\nfunction getAddress(movements: Movement[]): string {\n return movements[0]?.address ?? '';\n}\n\nfunction hasFungibleAsset(\n movement: Movement,\n): movement is Movement & { asset: FungibleAsset } {\n return movement.asset?.fungible === true;\n}\n\nfunction getToken(\n movements: Movement[],\n direction: TokenAmount['direction'],\n): TokenAmount | undefined {\n const movement = movements.find(hasFungibleAsset);\n\n if (!movement) {\n return undefined;\n }\n\n return {\n amount: movement.asset.amount,\n symbol: movement.asset.unit,\n assetId: movement.asset.type,\n direction,\n };\n}\n\nfunction getFee(fee: KeyringFee): Fee | undefined {\n const { asset } = fee;\n\n if (!asset.fungible) {\n return undefined;\n }\n\n return {\n type: fee.type,\n amount: asset.amount,\n symbol: asset.unit,\n assetId: asset.type,\n };\n}\n\nfunction getFees(transaction: KeyringTransaction): Fee[] {\n return transaction.fees.flatMap((fee) => {\n const mappedFee = getFee(fee);\n\n return mappedFee ? [mappedFee] : [];\n });\n}\n\nconst approveAmountMaxIntegerDigits = 15;\n\n/**\n * Maps a keyring transaction into the shared activity item shape.\n *\n * @param options - The mapping options.\n * @param options.transaction - The keyring transaction to map.\n * @param options.subjectAddress - Account address used for send/receive attribution.\n * @returns The normalized activity item.\n */\nexport function mapKeyringTransaction({\n transaction,\n subjectAddress,\n}: {\n transaction: KeyringTransaction;\n subjectAddress?: string;\n}): ActivityItem {\n const { type, id } = transaction;\n const status = mapStatus(transaction.status);\n const timestamp = transaction.timestamp ? transaction.timestamp * 1000 : 0;\n const chainId = transaction.chain;\n\n const from =\n type === KeyringTransactionType.Send && subjectAddress\n ? subjectAddress\n : getAddress(transaction.from);\n\n const to =\n type === KeyringTransactionType.Receive && subjectAddress\n ? subjectAddress\n : getAddress(transaction.to);\n\n const fees = getFees(transaction);\n const common = { chainId, status, timestamp, hash: id };\n\n switch (type) {\n case KeyringTransactionType.Send: {\n const fromToken = getToken(transaction.from, 'out');\n const token =\n !fromToken && chainId.startsWith('bip122:')\n ? getToken(transaction.to, 'out')\n : fromToken;\n\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token,\n fees,\n },\n };\n }\n\n case KeyringTransactionType.Receive:\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: getToken(transaction.to, 'in'),\n fees,\n },\n };\n\n case KeyringTransactionType.Swap:\n return {\n type: 'swap',\n ...common,\n data: {\n from,\n destinationToken: getToken(transaction.to, 'in'),\n sourceToken: getToken(transaction.from, 'out'),\n fees,\n },\n };\n\n case KeyringTransactionType.TokenApprove: {\n const rawToken = getToken(transaction.from, 'out');\n const isUnlimited =\n rawToken?.amount !== undefined &&\n rawToken.amount.split('.')[0].length > approveAmountMaxIntegerDigits;\n\n return {\n type: 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: rawToken\n ? { ...rawToken, amount: isUnlimited ? undefined : rawToken.amount }\n : rawToken,\n fees,\n },\n };\n }\n\n default:\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n fees,\n },\n };\n }\n}\n"]}
1
+ {"version":3,"file":"keyring-transaction-mapper.mjs","sourceRoot":"","sources":["../../src/mappers/keyring-transaction-mapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transaction as KeyringTransaction } from '@metamask/keyring-api';\nimport {\n TransactionStatus,\n TransactionType as KeyringTransactionType,\n} from '@metamask/keyring-api';\n\nimport type { Fee, ActivityItem, Status, TokenAmount } from '../types';\n\ntype Movement = KeyringTransaction['from'][number];\ntype KeyringFee = KeyringTransaction['fees'][number];\ntype FungibleAsset = Extract<\n NonNullable<Movement['asset']>,\n { fungible: true }\n>;\n\n/**\n * Custom labels for non-EVM transactions.\n *\n * The labels are used to map the transaction type to the title in the activity list and dialog.\n * The labels are defined in the `transaction.details.typeLabel` property.\n * For details: {@link https://github.com/MetaMask/metamask-extension/pull/38040}\n */\nexport enum CustomTransactionTypeLabel {\n // Token requires one off approve to receive\n TrustlineApprove = 'trustline-approve',\n // Token requires revoke the approve to stop receiving\n TrustlineDisapprove = 'trustline-disapprove',\n}\n\nfunction hasTrustlineTypeLabel(\n details: KeyringTransaction['details'],\n): boolean {\n // A flag to indicate if the transaction is a trustline type.\n return [\n String(CustomTransactionTypeLabel.TrustlineApprove),\n String(CustomTransactionTypeLabel.TrustlineDisapprove),\n ].includes(details?.typeLabel ?? '');\n}\n\nfunction mapStatus(status: KeyringTransaction['status']): Status {\n switch (status) {\n case TransactionStatus.Confirmed:\n return 'success';\n case TransactionStatus.Failed:\n return 'failed';\n case TransactionStatus.Submitted:\n case TransactionStatus.Unconfirmed:\n default:\n return 'pending';\n }\n}\n\nfunction getAddress(movements: Movement[]): string {\n return movements[0]?.address ?? '';\n}\n\nfunction hasFungibleAsset(\n movement: Movement,\n): movement is Movement & { asset: FungibleAsset } {\n return movement.asset?.fungible === true;\n}\n\nfunction getToken(\n movements: Movement[],\n direction: TokenAmount['direction'],\n): TokenAmount | undefined {\n const movement = movements.find(hasFungibleAsset);\n\n if (!movement) {\n return undefined;\n }\n\n return {\n amount: movement.asset.amount,\n symbol: movement.asset.unit,\n assetId: movement.asset.type,\n direction,\n };\n}\n\nfunction getFee(fee: KeyringFee): Fee | undefined {\n const { asset } = fee;\n\n if (!asset.fungible) {\n return undefined;\n }\n\n return {\n type: fee.type,\n amount: asset.amount,\n symbol: asset.unit,\n assetId: asset.type,\n };\n}\n\nfunction getFees(transaction: KeyringTransaction): Fee[] {\n return transaction.fees.flatMap((fee) => {\n const mappedFee = getFee(fee);\n\n return mappedFee ? [mappedFee] : [];\n });\n}\n\nconst approveAmountMaxIntegerDigits = 15;\n\n/**\n * Maps a keyring transaction into the shared activity item shape.\n *\n * @param options - The mapping options.\n * @param options.transaction - The keyring transaction to map.\n * @param options.subjectAddress - Account address used for send/receive attribution.\n * @returns The normalized activity item.\n */\nexport function mapKeyringTransaction({\n transaction,\n subjectAddress,\n}: {\n transaction: KeyringTransaction;\n subjectAddress?: string;\n}): ActivityItem {\n const { type, id } = transaction;\n const status = mapStatus(transaction.status);\n const timestamp = transaction.timestamp ? transaction.timestamp * 1000 : 0;\n const chainId = transaction.chain;\n\n const from =\n type === KeyringTransactionType.Send && subjectAddress\n ? subjectAddress\n : getAddress(transaction.from);\n\n const to =\n type === KeyringTransactionType.Receive && subjectAddress\n ? subjectAddress\n : getAddress(transaction.to);\n\n const fees = getFees(transaction);\n const common = { chainId, status, timestamp, hash: id };\n\n switch (type) {\n case KeyringTransactionType.Send: {\n const fromToken = getToken(transaction.from, 'out');\n const token =\n !fromToken && chainId.startsWith('bip122:')\n ? getToken(transaction.to, 'out')\n : fromToken;\n\n return {\n type: 'send',\n ...common,\n data: {\n from,\n to,\n token,\n fees,\n },\n };\n }\n\n case KeyringTransactionType.Receive:\n return {\n type: 'receive',\n ...common,\n data: {\n from,\n to,\n token: getToken(transaction.to, 'in'),\n fees,\n },\n };\n\n case KeyringTransactionType.Swap:\n return {\n type: 'swap',\n ...common,\n data: {\n from,\n destinationToken: getToken(transaction.to, 'in'),\n sourceToken: getToken(transaction.from, 'out'),\n fees,\n },\n };\n\n case KeyringTransactionType.TokenApprove: {\n const rawToken = getToken(transaction.from, 'out');\n\n if (hasTrustlineTypeLabel(transaction.details)) {\n return {\n type: 'assetActivation',\n ...common,\n data: {\n from,\n token: rawToken ? { ...rawToken, amount: undefined } : rawToken,\n fees,\n },\n };\n }\n\n const isUnlimited =\n rawToken?.amount !== undefined &&\n rawToken.amount.split('.')[0].length > approveAmountMaxIntegerDigits;\n\n return {\n type: 'approveSpendingCap',\n ...common,\n data: {\n from,\n token: rawToken\n ? { ...rawToken, amount: isUnlimited ? undefined : rawToken.amount }\n : rawToken,\n fees,\n },\n };\n }\n\n case KeyringTransactionType.TokenDisapprove: {\n if (!hasTrustlineTypeLabel(transaction.details)) {\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n fees,\n },\n };\n }\n\n const rawToken = getToken(transaction.from, 'out');\n\n return {\n type: 'assetDeactivation',\n ...common,\n data: {\n from,\n token: rawToken ? { ...rawToken, amount: undefined } : rawToken,\n fees,\n },\n };\n }\n\n default:\n return {\n type: 'contractInteraction',\n ...common,\n data: {\n from,\n to,\n fees,\n },\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ValueTransfer as _ValueTransfer } from '@metamask/core-backend';\nimport type { CaipChainId } from '@metamask/utils';\n\nexport type ActivityKind =\n | 'receive'\n | 'sell'\n | 'buy'\n | 'deposit'\n | 'swap'\n | 'claim'\n | 'claimMusdBonus'\n | 'send'\n | 'wrap'\n | 'unwrap'\n | 'approveSpendingCap'\n | 'revokeSpendingCap'\n | 'increaseSpendingCap'\n | 'contractInteraction'\n | 'contractDeployment'\n | 'bridge'\n | 'convert'\n | 'nftBuy'\n | 'nftMint'\n | 'nftSell'\n | 'smartAccountUpgrade'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'predictionsAddFunds'\n | 'predictionsWithdrawFunds'\n | 'predictionClaimWinnings'\n | 'predictionCashedOut'\n | 'predictionPlaced'\n | 'perpsAddFunds'\n | 'perpsWithdraw'\n | 'perpsOpenLong'\n | 'perpsCloseLong'\n | 'perpsCloseLongLiquidated'\n | 'perpsCloseLongStopLoss'\n | 'perpsOpenShort'\n | 'perpsCloseShort'\n | 'perpsCloseShortLiquidated'\n | 'perpsCloseShortStopLoss'\n | 'perpsPaidFundingFees'\n | 'perpsReceivedFundingFees'\n | 'perpsCloseShortTakeProfit'\n | 'perpsCloseLongTakeProfit'\n | 'marketShort'\n | 'stopMarketCloseShort'\n | 'marketCloseShort';\n\nexport type Status = 'pending' | 'success' | 'failed' | 'cancelled';\n\nexport type TokenAmount = {\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n direction: 'in' | 'out';\n};\n\nexport type FiatAmount = {\n amount: string;\n currency?: string;\n};\n\nexport type Fee = {\n type: string;\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n};\n\ntype ActivityData<Type extends ActivityKind, Data> = {\n type: Type;\n chainId: CaipChainId;\n status: Status;\n timestamp: number;\n hash?: string;\n data: Data;\n};\n\nexport type ActivityItem =\n | ActivityData<\n 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap',\n {\n from?: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'send' | 'receive',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'nftBuy' | 'nftMint' | 'nftSell',\n {\n from?: string;\n to?: string;\n token?: TokenAmount;\n paymentToken?: TokenAmount;\n }\n >\n | ActivityData<\n | 'swap'\n | 'bridge'\n | 'convert'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'wrap'\n | 'unwrap',\n {\n from?: string;\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'buy' | 'claim' | 'deposit' | 'claimMusdBonus',\n {\n from?: string;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'perpsAddFunds' | 'perpsWithdraw',\n {\n from?: string;\n fiat?: FiatAmount;\n networkFee?: FiatAmount;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'contractInteraction',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n methodId?: string;\n transactionCategory?: string;\n transactionProtocol?: string;\n }\n >;\n\n// Note: Update core-backend\nexport type ValueTransfer = _ValueTransfer & {\n contractAddress: string;\n symbol: string;\n name: string;\n};\n"]}
1
+ {"version":3,"file":"types.cjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ValueTransfer as _ValueTransfer } from '@metamask/core-backend';\nimport type { CaipChainId } from '@metamask/utils';\n\nexport type ActivityKind =\n | 'receive'\n | 'sell'\n | 'buy'\n | 'deposit'\n | 'swap'\n | 'claim'\n | 'claimMusdBonus'\n | 'send'\n | 'wrap'\n | 'unwrap'\n | 'approveSpendingCap'\n | 'revokeSpendingCap'\n | 'increaseSpendingCap'\n | 'contractInteraction'\n | 'contractDeployment'\n | 'bridge'\n | 'convert'\n | 'nftBuy'\n | 'nftMint'\n | 'nftSell'\n | 'smartAccountUpgrade'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'predictionsAddFunds'\n | 'predictionsWithdrawFunds'\n | 'predictionClaimWinnings'\n | 'predictionCashedOut'\n | 'predictionPlaced'\n | 'perpsAddFunds'\n | 'perpsWithdraw'\n | 'perpsOpenLong'\n | 'perpsCloseLong'\n | 'perpsCloseLongLiquidated'\n | 'perpsCloseLongStopLoss'\n | 'perpsOpenShort'\n | 'perpsCloseShort'\n | 'perpsCloseShortLiquidated'\n | 'perpsCloseShortStopLoss'\n | 'perpsPaidFundingFees'\n | 'perpsReceivedFundingFees'\n | 'perpsCloseShortTakeProfit'\n | 'perpsCloseLongTakeProfit'\n | 'marketShort'\n | 'stopMarketCloseShort'\n | 'marketCloseShort'\n | 'assetActivation'\n | 'assetDeactivation';\n\nexport type Status = 'pending' | 'success' | 'failed' | 'cancelled';\n\nexport type TokenAmount = {\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n direction: 'in' | 'out';\n};\n\nexport type FiatAmount = {\n amount: string;\n currency?: string;\n};\n\nexport type Fee = {\n type: string;\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n};\n\ntype ActivityData<Type extends ActivityKind, Data> = {\n type: Type;\n chainId: CaipChainId;\n status: Status;\n timestamp: number;\n hash?: string;\n data: Data;\n};\n\nexport type ActivityItem =\n | ActivityData<\n 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap',\n {\n from?: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'assetActivation' | 'assetDeactivation',\n {\n from?: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'send' | 'receive',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'nftBuy' | 'nftMint' | 'nftSell',\n {\n from?: string;\n to?: string;\n token?: TokenAmount;\n paymentToken?: TokenAmount;\n }\n >\n | ActivityData<\n | 'swap'\n | 'bridge'\n | 'convert'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'wrap'\n | 'unwrap',\n {\n from?: string;\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'buy' | 'claim' | 'deposit' | 'claimMusdBonus',\n {\n from?: string;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'perpsAddFunds' | 'perpsWithdraw',\n {\n from?: string;\n fiat?: FiatAmount;\n networkFee?: FiatAmount;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'contractInteraction',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n methodId?: string;\n transactionCategory?: string;\n transactionProtocol?: string;\n }\n >;\n\n// Note: Update core-backend\nexport type ValueTransfer = _ValueTransfer & {\n contractAddress: string;\n symbol: string;\n name: string;\n};\n"]}
package/dist/types.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { ValueTransfer as _ValueTransfer } from "@metamask/core-backend";
2
2
  import type { CaipChainId } from "@metamask/utils";
3
- export type ActivityKind = 'receive' | 'sell' | 'buy' | 'deposit' | 'swap' | 'claim' | 'claimMusdBonus' | 'send' | 'wrap' | 'unwrap' | 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap' | 'contractInteraction' | 'contractDeployment' | 'bridge' | 'convert' | 'nftBuy' | 'nftMint' | 'nftSell' | 'smartAccountUpgrade' | 'lendingDeposit' | 'lendingWithdrawal' | 'predictionsAddFunds' | 'predictionsWithdrawFunds' | 'predictionClaimWinnings' | 'predictionCashedOut' | 'predictionPlaced' | 'perpsAddFunds' | 'perpsWithdraw' | 'perpsOpenLong' | 'perpsCloseLong' | 'perpsCloseLongLiquidated' | 'perpsCloseLongStopLoss' | 'perpsOpenShort' | 'perpsCloseShort' | 'perpsCloseShortLiquidated' | 'perpsCloseShortStopLoss' | 'perpsPaidFundingFees' | 'perpsReceivedFundingFees' | 'perpsCloseShortTakeProfit' | 'perpsCloseLongTakeProfit' | 'marketShort' | 'stopMarketCloseShort' | 'marketCloseShort';
3
+ export type ActivityKind = 'receive' | 'sell' | 'buy' | 'deposit' | 'swap' | 'claim' | 'claimMusdBonus' | 'send' | 'wrap' | 'unwrap' | 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap' | 'contractInteraction' | 'contractDeployment' | 'bridge' | 'convert' | 'nftBuy' | 'nftMint' | 'nftSell' | 'smartAccountUpgrade' | 'lendingDeposit' | 'lendingWithdrawal' | 'predictionsAddFunds' | 'predictionsWithdrawFunds' | 'predictionClaimWinnings' | 'predictionCashedOut' | 'predictionPlaced' | 'perpsAddFunds' | 'perpsWithdraw' | 'perpsOpenLong' | 'perpsCloseLong' | 'perpsCloseLongLiquidated' | 'perpsCloseLongStopLoss' | 'perpsOpenShort' | 'perpsCloseShort' | 'perpsCloseShortLiquidated' | 'perpsCloseShortStopLoss' | 'perpsPaidFundingFees' | 'perpsReceivedFundingFees' | 'perpsCloseShortTakeProfit' | 'perpsCloseLongTakeProfit' | 'marketShort' | 'stopMarketCloseShort' | 'marketCloseShort' | 'assetActivation' | 'assetDeactivation';
4
4
  export type Status = 'pending' | 'success' | 'failed' | 'cancelled';
5
5
  export type TokenAmount = {
6
6
  amount?: string;
@@ -32,6 +32,10 @@ export type ActivityItem = ActivityData<'approveSpendingCap' | 'revokeSpendingCa
32
32
  from?: string;
33
33
  token?: TokenAmount;
34
34
  fees?: Fee[];
35
+ }> | ActivityData<'assetActivation' | 'assetDeactivation', {
36
+ from?: string;
37
+ token?: TokenAmount;
38
+ fees?: Fee[];
35
39
  }> | ActivityData<'send' | 'receive', {
36
40
  from: string;
37
41
  to: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.cts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,IAAI,cAAc,EAAE,+BAA+B;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB;AAEnD,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,MAAM,GACN,KAAK,GACL,SAAS,GACT,MAAM,GACN,OAAO,GACP,gBAAgB,GAChB,MAAM,GACN,MAAM,GACN,QAAQ,GACR,oBAAoB,GACpB,mBAAmB,GACnB,qBAAqB,GACrB,qBAAqB,GACrB,oBAAoB,GACpB,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,SAAS,GACT,SAAS,GACT,qBAAqB,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,qBAAqB,GACrB,0BAA0B,GAC1B,yBAAyB,GACzB,qBAAqB,GACrB,kBAAkB,GAClB,eAAe,GACf,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,0BAA0B,GAC1B,wBAAwB,GACxB,gBAAgB,GAChB,iBAAiB,GACjB,2BAA2B,GAC3B,yBAAyB,GACzB,sBAAsB,GACtB,0BAA0B,GAC1B,2BAA2B,GAC3B,0BAA0B,GAC1B,aAAa,GACb,sBAAsB,GACtB,kBAAkB,GAClB,iBAAiB,GACjB,mBAAmB,CAAC;AAExB,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,GAAG,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,YAAY,CAAC,IAAI,SAAS,YAAY,EAAE,IAAI,IAAI;IACnD,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB,YAAY,CACV,oBAAoB,GAAG,mBAAmB,GAAG,qBAAqB,EAClE;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CACF,GACD,YAAY,CACV,iBAAiB,GAAG,mBAAmB,EACvC;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CACF,GACD,YAAY,CACV,MAAM,GAAG,SAAS,EAClB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CACF,GACD,YAAY,CACV,QAAQ,GAAG,SAAS,GAAG,SAAS,EAChC;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B,CACF,GACD,YAAY,CACR,MAAM,GACN,QAAQ,GACR,SAAS,GACT,gBAAgB,GAChB,mBAAmB,GACnB,MAAM,GACN,QAAQ,EACV;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd,CACF,GACD,YAAY,CACV,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,gBAAgB,EAC9C;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CACF,GACD,YAAY,CACV,eAAe,GAAG,eAAe,EACjC;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB,CACF,GACD,YAAY,CACV,qBAAqB,EACrB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CACF,CAAC;AAGN,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
package/dist/types.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { ValueTransfer as _ValueTransfer } from "@metamask/core-backend";
2
2
  import type { CaipChainId } from "@metamask/utils";
3
- export type ActivityKind = 'receive' | 'sell' | 'buy' | 'deposit' | 'swap' | 'claim' | 'claimMusdBonus' | 'send' | 'wrap' | 'unwrap' | 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap' | 'contractInteraction' | 'contractDeployment' | 'bridge' | 'convert' | 'nftBuy' | 'nftMint' | 'nftSell' | 'smartAccountUpgrade' | 'lendingDeposit' | 'lendingWithdrawal' | 'predictionsAddFunds' | 'predictionsWithdrawFunds' | 'predictionClaimWinnings' | 'predictionCashedOut' | 'predictionPlaced' | 'perpsAddFunds' | 'perpsWithdraw' | 'perpsOpenLong' | 'perpsCloseLong' | 'perpsCloseLongLiquidated' | 'perpsCloseLongStopLoss' | 'perpsOpenShort' | 'perpsCloseShort' | 'perpsCloseShortLiquidated' | 'perpsCloseShortStopLoss' | 'perpsPaidFundingFees' | 'perpsReceivedFundingFees' | 'perpsCloseShortTakeProfit' | 'perpsCloseLongTakeProfit' | 'marketShort' | 'stopMarketCloseShort' | 'marketCloseShort';
3
+ export type ActivityKind = 'receive' | 'sell' | 'buy' | 'deposit' | 'swap' | 'claim' | 'claimMusdBonus' | 'send' | 'wrap' | 'unwrap' | 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap' | 'contractInteraction' | 'contractDeployment' | 'bridge' | 'convert' | 'nftBuy' | 'nftMint' | 'nftSell' | 'smartAccountUpgrade' | 'lendingDeposit' | 'lendingWithdrawal' | 'predictionsAddFunds' | 'predictionsWithdrawFunds' | 'predictionClaimWinnings' | 'predictionCashedOut' | 'predictionPlaced' | 'perpsAddFunds' | 'perpsWithdraw' | 'perpsOpenLong' | 'perpsCloseLong' | 'perpsCloseLongLiquidated' | 'perpsCloseLongStopLoss' | 'perpsOpenShort' | 'perpsCloseShort' | 'perpsCloseShortLiquidated' | 'perpsCloseShortStopLoss' | 'perpsPaidFundingFees' | 'perpsReceivedFundingFees' | 'perpsCloseShortTakeProfit' | 'perpsCloseLongTakeProfit' | 'marketShort' | 'stopMarketCloseShort' | 'marketCloseShort' | 'assetActivation' | 'assetDeactivation';
4
4
  export type Status = 'pending' | 'success' | 'failed' | 'cancelled';
5
5
  export type TokenAmount = {
6
6
  amount?: string;
@@ -32,6 +32,10 @@ export type ActivityItem = ActivityData<'approveSpendingCap' | 'revokeSpendingCa
32
32
  from?: string;
33
33
  token?: TokenAmount;
34
34
  fees?: Fee[];
35
+ }> | ActivityData<'assetActivation' | 'assetDeactivation', {
36
+ from?: string;
37
+ token?: TokenAmount;
38
+ fees?: Fee[];
35
39
  }> | ActivityData<'send' | 'receive', {
36
40
  from: string;
37
41
  to: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.mts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.mjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ValueTransfer as _ValueTransfer } from '@metamask/core-backend';\nimport type { CaipChainId } from '@metamask/utils';\n\nexport type ActivityKind =\n | 'receive'\n | 'sell'\n | 'buy'\n | 'deposit'\n | 'swap'\n | 'claim'\n | 'claimMusdBonus'\n | 'send'\n | 'wrap'\n | 'unwrap'\n | 'approveSpendingCap'\n | 'revokeSpendingCap'\n | 'increaseSpendingCap'\n | 'contractInteraction'\n | 'contractDeployment'\n | 'bridge'\n | 'convert'\n | 'nftBuy'\n | 'nftMint'\n | 'nftSell'\n | 'smartAccountUpgrade'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'predictionsAddFunds'\n | 'predictionsWithdrawFunds'\n | 'predictionClaimWinnings'\n | 'predictionCashedOut'\n | 'predictionPlaced'\n | 'perpsAddFunds'\n | 'perpsWithdraw'\n | 'perpsOpenLong'\n | 'perpsCloseLong'\n | 'perpsCloseLongLiquidated'\n | 'perpsCloseLongStopLoss'\n | 'perpsOpenShort'\n | 'perpsCloseShort'\n | 'perpsCloseShortLiquidated'\n | 'perpsCloseShortStopLoss'\n | 'perpsPaidFundingFees'\n | 'perpsReceivedFundingFees'\n | 'perpsCloseShortTakeProfit'\n | 'perpsCloseLongTakeProfit'\n | 'marketShort'\n | 'stopMarketCloseShort'\n | 'marketCloseShort';\n\nexport type Status = 'pending' | 'success' | 'failed' | 'cancelled';\n\nexport type TokenAmount = {\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n direction: 'in' | 'out';\n};\n\nexport type FiatAmount = {\n amount: string;\n currency?: string;\n};\n\nexport type Fee = {\n type: string;\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n};\n\ntype ActivityData<Type extends ActivityKind, Data> = {\n type: Type;\n chainId: CaipChainId;\n status: Status;\n timestamp: number;\n hash?: string;\n data: Data;\n};\n\nexport type ActivityItem =\n | ActivityData<\n 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap',\n {\n from?: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'send' | 'receive',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'nftBuy' | 'nftMint' | 'nftSell',\n {\n from?: string;\n to?: string;\n token?: TokenAmount;\n paymentToken?: TokenAmount;\n }\n >\n | ActivityData<\n | 'swap'\n | 'bridge'\n | 'convert'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'wrap'\n | 'unwrap',\n {\n from?: string;\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'buy' | 'claim' | 'deposit' | 'claimMusdBonus',\n {\n from?: string;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'perpsAddFunds' | 'perpsWithdraw',\n {\n from?: string;\n fiat?: FiatAmount;\n networkFee?: FiatAmount;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'contractInteraction',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n methodId?: string;\n transactionCategory?: string;\n transactionProtocol?: string;\n }\n >;\n\n// Note: Update core-backend\nexport type ValueTransfer = _ValueTransfer & {\n contractAddress: string;\n symbol: string;\n name: string;\n};\n"]}
1
+ {"version":3,"file":"types.mjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ValueTransfer as _ValueTransfer } from '@metamask/core-backend';\nimport type { CaipChainId } from '@metamask/utils';\n\nexport type ActivityKind =\n | 'receive'\n | 'sell'\n | 'buy'\n | 'deposit'\n | 'swap'\n | 'claim'\n | 'claimMusdBonus'\n | 'send'\n | 'wrap'\n | 'unwrap'\n | 'approveSpendingCap'\n | 'revokeSpendingCap'\n | 'increaseSpendingCap'\n | 'contractInteraction'\n | 'contractDeployment'\n | 'bridge'\n | 'convert'\n | 'nftBuy'\n | 'nftMint'\n | 'nftSell'\n | 'smartAccountUpgrade'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'predictionsAddFunds'\n | 'predictionsWithdrawFunds'\n | 'predictionClaimWinnings'\n | 'predictionCashedOut'\n | 'predictionPlaced'\n | 'perpsAddFunds'\n | 'perpsWithdraw'\n | 'perpsOpenLong'\n | 'perpsCloseLong'\n | 'perpsCloseLongLiquidated'\n | 'perpsCloseLongStopLoss'\n | 'perpsOpenShort'\n | 'perpsCloseShort'\n | 'perpsCloseShortLiquidated'\n | 'perpsCloseShortStopLoss'\n | 'perpsPaidFundingFees'\n | 'perpsReceivedFundingFees'\n | 'perpsCloseShortTakeProfit'\n | 'perpsCloseLongTakeProfit'\n | 'marketShort'\n | 'stopMarketCloseShort'\n | 'marketCloseShort'\n | 'assetActivation'\n | 'assetDeactivation';\n\nexport type Status = 'pending' | 'success' | 'failed' | 'cancelled';\n\nexport type TokenAmount = {\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n direction: 'in' | 'out';\n};\n\nexport type FiatAmount = {\n amount: string;\n currency?: string;\n};\n\nexport type Fee = {\n type: string;\n amount?: string;\n decimals?: number;\n symbol?: string;\n assetId?: string;\n};\n\ntype ActivityData<Type extends ActivityKind, Data> = {\n type: Type;\n chainId: CaipChainId;\n status: Status;\n timestamp: number;\n hash?: string;\n data: Data;\n};\n\nexport type ActivityItem =\n | ActivityData<\n 'approveSpendingCap' | 'revokeSpendingCap' | 'increaseSpendingCap',\n {\n from?: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'assetActivation' | 'assetDeactivation',\n {\n from?: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'send' | 'receive',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'nftBuy' | 'nftMint' | 'nftSell',\n {\n from?: string;\n to?: string;\n token?: TokenAmount;\n paymentToken?: TokenAmount;\n }\n >\n | ActivityData<\n | 'swap'\n | 'bridge'\n | 'convert'\n | 'lendingDeposit'\n | 'lendingWithdrawal'\n | 'wrap'\n | 'unwrap',\n {\n from?: string;\n sourceToken?: TokenAmount;\n destinationToken?: TokenAmount;\n fees?: Fee[];\n }\n >\n | ActivityData<\n 'buy' | 'claim' | 'deposit' | 'claimMusdBonus',\n {\n from?: string;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'perpsAddFunds' | 'perpsWithdraw',\n {\n from?: string;\n fiat?: FiatAmount;\n networkFee?: FiatAmount;\n token?: TokenAmount;\n }\n >\n | ActivityData<\n 'contractInteraction',\n {\n from: string;\n to: string;\n token?: TokenAmount;\n fees?: Fee[];\n methodId?: string;\n transactionCategory?: string;\n transactionProtocol?: string;\n }\n >;\n\n// Note: Update core-backend\nexport type ValueTransfer = _ValueTransfer & {\n contractAddress: string;\n symbol: string;\n name: string;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/client-utils",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Shared functions and utilities used across MetaMask clients (extension and mobile)",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -44,6 +44,8 @@
44
44
  "build:docs": "typedoc",
45
45
  "changelog:update": "../../scripts/update-changelog.sh @metamask/client-utils",
46
46
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/client-utils",
47
+ "lint:tsconfigs": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts",
48
+ "lint:tsconfigs:fix": "tsx ../../scripts/lint-tsconfigs/lint-tsconfigs.mts --fix",
47
49
  "messenger-action-types:check": "tsx ../../packages/messenger-cli/src/cli.ts --formatter oxfmt --check",
48
50
  "messenger-action-types:generate": "tsx ../../packages/messenger-cli/src/cli.ts --formatter oxfmt --generate",
49
51
  "since-latest-release": "../../scripts/since-latest-release.sh",
@@ -57,7 +59,7 @@
57
59
  "@metamask/controller-utils": "^12.3.0",
58
60
  "@metamask/core-backend": "^6.5.0",
59
61
  "@metamask/keyring-api": "^23.5.0",
60
- "@metamask/transaction-controller": "^68.3.0",
62
+ "@metamask/transaction-controller": "^69.0.0",
61
63
  "@metamask/utils": "^11.11.0"
62
64
  },
63
65
  "devDependencies": {