@swapkit/helpers 1.0.0-rc.3 → 1.0.0-rc.30
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/dist/index.cjs +1 -1
- package/dist/index.d.ts +39 -24
- package/dist/index.es.js +776 -415
- package/package.json +9 -6
- package/src/helpers/asset.ts +46 -15
- package/src/helpers/liquidity.ts +12 -10
- package/src/helpers/others.ts +0 -48
- package/src/helpers/request.ts +15 -0
- package/src/index.ts +1 -0
- package/src/modules/__tests__/assetValue.test.ts +44 -12
- package/src/modules/__tests__/swapKitNumber.test.ts +133 -47
- package/src/modules/assetValue.ts +60 -57
- package/src/modules/bigIntArithmetics.ts +102 -50
- package/src/modules/swapKitNumber.ts +8 -1
|
@@ -8,37 +8,40 @@ describe('SwapKitNumber', () => {
|
|
|
8
8
|
const skNumber1 = new SwapKitNumber(1);
|
|
9
9
|
expect(skNumber1.getValue('string')).toBe('1');
|
|
10
10
|
expect(skNumber1.getValue('number')).toBe(1);
|
|
11
|
-
expect(skNumber1.
|
|
11
|
+
expect(skNumber1.getBaseValue('bigint')).toBe(100000000n);
|
|
12
12
|
|
|
13
13
|
const skNumber2 = new SwapKitNumber('1');
|
|
14
14
|
expect(skNumber2.getValue('string')).toBe('1');
|
|
15
|
-
expect(skNumber2.
|
|
15
|
+
expect(skNumber2.getBaseValue('bigint')).toBe(100000000n);
|
|
16
16
|
|
|
17
|
+
/**
|
|
18
|
+
* because by default we have 8 decimals - it will be rounded to 0 on base value
|
|
19
|
+
*/
|
|
17
20
|
const skNumber3 = new SwapKitNumber('0.0000000001');
|
|
18
21
|
expect(skNumber3.getValue('string')).toBe('0.0000000001');
|
|
19
|
-
expect(skNumber3.
|
|
22
|
+
expect(skNumber3.getBaseValue('bigint')).toBe(0n);
|
|
20
23
|
|
|
21
|
-
const skNumber4 = new SwapKitNumber(0.
|
|
22
|
-
expect(skNumber4.getValue('string')).toBe('0.
|
|
23
|
-
expect(skNumber4.
|
|
24
|
+
const skNumber4 = new SwapKitNumber({ value: '0.0000000001', decimal: 10 });
|
|
25
|
+
expect(skNumber4.getValue('string')).toBe('0.0000000001');
|
|
26
|
+
expect(skNumber4.getBaseValue('bigint')).toBe(1n);
|
|
24
27
|
|
|
25
|
-
const
|
|
26
|
-
expect(
|
|
27
|
-
expect(
|
|
28
|
+
const skNumber5 = new SwapKitNumber({ value: 0.1005, decimal: 3 });
|
|
29
|
+
expect(skNumber5.getValue('string')).toBe('0.101');
|
|
30
|
+
expect(skNumber5.getBaseValue('bigint')).toBe(100n);
|
|
28
31
|
|
|
29
|
-
const
|
|
30
|
-
expect(
|
|
31
|
-
expect(
|
|
32
|
-
expect(
|
|
33
|
-
expect(
|
|
34
|
-
expect(
|
|
32
|
+
const skNumber6 = new SwapKitNumber({ value: -0.1005, decimal: 3 });
|
|
33
|
+
expect(skNumber6.getValue('string')).toBe('-0.101');
|
|
34
|
+
expect(skNumber6.getBaseValue('bigint')).toBe(-100n);
|
|
35
|
+
expect(skNumber6.decimal).toBe(3);
|
|
36
|
+
expect(skNumber6.getValue('number')).toBe(-0.101);
|
|
37
|
+
expect(skNumber6.decimalMultiplier).toBe(100000000n);
|
|
35
38
|
});
|
|
36
39
|
|
|
37
40
|
test('creates SwapKitInstance from BigInt: (12.345678901234, decimals: 12)', () => {
|
|
38
41
|
const skNumber = SwapKitNumber.fromBigInt(12345678901234n, 12);
|
|
39
42
|
|
|
40
43
|
expect(skNumber.getValue('string')).toBe('12.345678901234');
|
|
41
|
-
expect(skNumber.
|
|
44
|
+
expect(skNumber.getBaseValue('bigint')).toBe(12345678901234n);
|
|
42
45
|
});
|
|
43
46
|
});
|
|
44
47
|
|
|
@@ -46,22 +49,22 @@ describe('SwapKitNumber', () => {
|
|
|
46
49
|
test('shifts up and bumps number', () => {
|
|
47
50
|
const skNumber = new SwapKitNumber(1);
|
|
48
51
|
expect(skNumber.getValue('string')).toBe('1');
|
|
49
|
-
expect(skNumber.
|
|
52
|
+
expect(skNumber.getBaseValue('bigint')).toBe(100000000n);
|
|
50
53
|
|
|
51
54
|
const shiftedSkNumber = SwapKitNumber.shiftDecimals({
|
|
52
55
|
value: skNumber,
|
|
53
|
-
from:
|
|
54
|
-
to:
|
|
56
|
+
from: 8,
|
|
57
|
+
to: 6,
|
|
55
58
|
});
|
|
56
59
|
|
|
57
|
-
expect(shiftedSkNumber.getValue('string')).toBe('
|
|
58
|
-
expect(shiftedSkNumber.
|
|
60
|
+
expect(shiftedSkNumber.getValue('string')).toBe('1');
|
|
61
|
+
expect(shiftedSkNumber.getBaseValue('bigint')).toBe(1000000n);
|
|
59
62
|
});
|
|
60
63
|
|
|
61
64
|
test('shifts down and rounds down number', () => {
|
|
62
65
|
const skNumber = new SwapKitNumber(2.12345678);
|
|
63
66
|
expect(skNumber.getValue('string')).toBe('2.12345678');
|
|
64
|
-
expect(skNumber.
|
|
67
|
+
expect(skNumber.getBaseValue('bigint')).toBe(212345678n);
|
|
65
68
|
|
|
66
69
|
const shiftedSkNumber = SwapKitNumber.shiftDecimals({
|
|
67
70
|
value: skNumber,
|
|
@@ -70,7 +73,20 @@ describe('SwapKitNumber', () => {
|
|
|
70
73
|
});
|
|
71
74
|
|
|
72
75
|
expect(shiftedSkNumber.getValue('string')).toBe('2.123456');
|
|
73
|
-
expect(shiftedSkNumber.
|
|
76
|
+
expect(shiftedSkNumber.getBaseValue('bigint')).toBe(2123456n);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('shift eth from 18 to 8', () => {
|
|
80
|
+
const skNumber = new SwapKitNumber({ value: '0.2', decimal: 18 });
|
|
81
|
+
|
|
82
|
+
const shiftedSkNumber = SwapKitNumber.shiftDecimals({
|
|
83
|
+
value: skNumber,
|
|
84
|
+
from: 18,
|
|
85
|
+
to: 8,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
expect(shiftedSkNumber.getValue('string')).toBe('0.2');
|
|
89
|
+
expect(shiftedSkNumber.getBaseValue('bigint')).toBe(20000000n);
|
|
74
90
|
});
|
|
75
91
|
});
|
|
76
92
|
|
|
@@ -102,7 +118,7 @@ describe('SwapKitNumber', () => {
|
|
|
102
118
|
describe('bigint', () => {
|
|
103
119
|
test('returns bigint value', () => {
|
|
104
120
|
const skNumber = new SwapKitNumber(1);
|
|
105
|
-
expect(skNumber.
|
|
121
|
+
expect(skNumber.getBaseValue('bigint')).toBe(100000000n);
|
|
106
122
|
});
|
|
107
123
|
});
|
|
108
124
|
});
|
|
@@ -150,6 +166,76 @@ describe('SwapKitNumber', () => {
|
|
|
150
166
|
});
|
|
151
167
|
});
|
|
152
168
|
|
|
169
|
+
describe('toAbbreviation', () => {
|
|
170
|
+
test('returns abbreviation with up to 3 integer digits', () => {
|
|
171
|
+
const skNumber = new SwapKitNumber(1234.5678);
|
|
172
|
+
expect(skNumber.toAbbreviation()).toBe('1.23K');
|
|
173
|
+
|
|
174
|
+
const skNumber2 = new SwapKitNumber(1234567.5678);
|
|
175
|
+
expect(skNumber2.toAbbreviation()).toBe('1.23M');
|
|
176
|
+
|
|
177
|
+
const skNumber3 = new SwapKitNumber(1234567890.5678);
|
|
178
|
+
expect(skNumber3.toAbbreviation()).toBe('1.23B');
|
|
179
|
+
|
|
180
|
+
const skNumber4 = new SwapKitNumber(1234567890123.5678);
|
|
181
|
+
expect(skNumber4.toAbbreviation()).toBe('1.23T');
|
|
182
|
+
|
|
183
|
+
const skNumber5 = new SwapKitNumber(1234567890123456.5678);
|
|
184
|
+
expect(skNumber5.toAbbreviation()).toBe('1.23Q');
|
|
185
|
+
|
|
186
|
+
const skNumber6 = new SwapKitNumber(1234567890123456789.5678);
|
|
187
|
+
expect(skNumber6.toAbbreviation()).toBe('1.23Qi');
|
|
188
|
+
|
|
189
|
+
const skNumber7 = new SwapKitNumber(1234567890123456789012.5678);
|
|
190
|
+
expect(skNumber7.toAbbreviation()).toBe('1.23S');
|
|
191
|
+
|
|
192
|
+
const skNumber8 = new SwapKitNumber(1234.5678);
|
|
193
|
+
expect(skNumber8.toAbbreviation(0)).toBe('1K');
|
|
194
|
+
|
|
195
|
+
const skNumber9 = new SwapKitNumber(1234.5678);
|
|
196
|
+
expect(skNumber9.toAbbreviation(1)).toBe('1.2K');
|
|
197
|
+
|
|
198
|
+
const skNumber10 = new SwapKitNumber(123456.78);
|
|
199
|
+
expect(skNumber10.toAbbreviation()).toBe('123.46K');
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
describe('toCurrency', () => {
|
|
204
|
+
test('returns abbreviation with up to 3 integer digits', () => {
|
|
205
|
+
const skNumber = new SwapKitNumber(1234.5678);
|
|
206
|
+
expect(skNumber.toCurrency()).toBe('$1,234.56');
|
|
207
|
+
expect(
|
|
208
|
+
skNumber.toCurrency('€', {
|
|
209
|
+
decimalSeparator: ',',
|
|
210
|
+
thousandSeparator: ' ',
|
|
211
|
+
currencyPosition: 'end',
|
|
212
|
+
}),
|
|
213
|
+
).toBe('1 234,56€');
|
|
214
|
+
|
|
215
|
+
const skNumber2 = new SwapKitNumber(0.5678);
|
|
216
|
+
expect(skNumber2.toCurrency()).toBe('$0.5678');
|
|
217
|
+
expect(
|
|
218
|
+
skNumber2.toCurrency('€', {
|
|
219
|
+
decimalSeparator: ',',
|
|
220
|
+
currencyPosition: 'end',
|
|
221
|
+
}),
|
|
222
|
+
).toBe('0,5678€');
|
|
223
|
+
|
|
224
|
+
const skNumber3 = new SwapKitNumber(0.00005678);
|
|
225
|
+
expect(skNumber3.toCurrency()).toBe('$0.000057');
|
|
226
|
+
expect(
|
|
227
|
+
skNumber3.toCurrency('€', {
|
|
228
|
+
decimalSeparator: ',',
|
|
229
|
+
thousandSeparator: ' ',
|
|
230
|
+
currencyPosition: 'end',
|
|
231
|
+
}),
|
|
232
|
+
).toBe('0,000057€');
|
|
233
|
+
|
|
234
|
+
const skNumber4 = new SwapKitNumber(12345);
|
|
235
|
+
expect(skNumber4.toCurrency()).toBe('$12,345');
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
153
239
|
describe('add', () => {
|
|
154
240
|
test('adds same type numbers correctly', () => {
|
|
155
241
|
const skNumber1 = new SwapKitNumber(10);
|
|
@@ -158,7 +244,7 @@ describe('SwapKitNumber', () => {
|
|
|
158
244
|
const result = skNumber1.add(skNumber2, skNumber3);
|
|
159
245
|
|
|
160
246
|
expect(result.getValue('string')).toBe('15.5');
|
|
161
|
-
expect(result.
|
|
247
|
+
expect(result.getBaseValue('bigint')).toBe(1550000000n);
|
|
162
248
|
});
|
|
163
249
|
|
|
164
250
|
test('adds different type numbers correctly', () => {
|
|
@@ -166,14 +252,14 @@ describe('SwapKitNumber', () => {
|
|
|
166
252
|
const result = skNumber1.add(6, '0.5');
|
|
167
253
|
|
|
168
254
|
expect(result.getValue('string')).toBe('16.5');
|
|
169
|
-
expect(result.
|
|
255
|
+
expect(result.getBaseValue('bigint')).toBe(1650000000n);
|
|
170
256
|
});
|
|
171
257
|
|
|
172
258
|
test('adds large decimal numbers correctly', () => {
|
|
173
259
|
const skNumber1 = new SwapKitNumber(0.0000000001);
|
|
174
260
|
const result = skNumber1.add(6.000000000001, '0.0000000000000005');
|
|
175
261
|
expect(result.getValue('string')).toBe('6.0000000001010005');
|
|
176
|
-
expect(result.
|
|
262
|
+
expect(result.getBaseValue('bigint')).toBe(600000000n);
|
|
177
263
|
});
|
|
178
264
|
});
|
|
179
265
|
|
|
@@ -185,7 +271,7 @@ describe('SwapKitNumber', () => {
|
|
|
185
271
|
const result = skNumber1.sub(skNumber2, skNumber3);
|
|
186
272
|
|
|
187
273
|
expect(result.getValue('string')).toBe('4.5');
|
|
188
|
-
expect(result.
|
|
274
|
+
expect(result.getBaseValue('bigint')).toBe(450000000n);
|
|
189
275
|
});
|
|
190
276
|
|
|
191
277
|
test('subtracts different type numbers correctly', () => {
|
|
@@ -193,7 +279,7 @@ describe('SwapKitNumber', () => {
|
|
|
193
279
|
const result = skNumber1.sub(6, '0.5');
|
|
194
280
|
|
|
195
281
|
expect(result.getValue('string')).toBe('3.5');
|
|
196
|
-
expect(result.
|
|
282
|
+
expect(result.getBaseValue('bigint')).toBe(350000000n);
|
|
197
283
|
});
|
|
198
284
|
|
|
199
285
|
test('can process negative results', () => {
|
|
@@ -203,8 +289,8 @@ describe('SwapKitNumber', () => {
|
|
|
203
289
|
|
|
204
290
|
expect(result0.getValue('string')).toBe('0');
|
|
205
291
|
expect(resultMinus.getValue('string')).toBe('-10');
|
|
206
|
-
expect(result0.
|
|
207
|
-
expect(resultMinus.
|
|
292
|
+
expect(result0.getBaseValue('bigint')).toBe(0n);
|
|
293
|
+
expect(resultMinus.getBaseValue('bigint')).toBe(-1000000000n);
|
|
208
294
|
});
|
|
209
295
|
});
|
|
210
296
|
|
|
@@ -216,7 +302,7 @@ describe('SwapKitNumber', () => {
|
|
|
216
302
|
const result = skNumber1.mul(skNumber2, skNumber3);
|
|
217
303
|
|
|
218
304
|
expect(result.getValue('string')).toBe('25');
|
|
219
|
-
expect(result.
|
|
305
|
+
expect(result.getBaseValue('bigint')).toBe(2500000000n);
|
|
220
306
|
});
|
|
221
307
|
|
|
222
308
|
test('multiplies different type numbers correctly', () => {
|
|
@@ -224,7 +310,7 @@ describe('SwapKitNumber', () => {
|
|
|
224
310
|
const result = skNumber1.mul(6, '0.5');
|
|
225
311
|
|
|
226
312
|
expect(result.getValue('string')).toBe('30');
|
|
227
|
-
expect(result.
|
|
313
|
+
expect(result.getBaseValue('bigint')).toBe(3000000000n);
|
|
228
314
|
});
|
|
229
315
|
|
|
230
316
|
test('multiplies numbers correctly if decimals of SKN is lower than number multiplied with', () => {
|
|
@@ -232,19 +318,19 @@ describe('SwapKitNumber', () => {
|
|
|
232
318
|
const result = skNumber1.mul('0.00001');
|
|
233
319
|
|
|
234
320
|
expect(result.getValue('string')).toBe('10');
|
|
235
|
-
expect(result.
|
|
321
|
+
expect(result.getBaseValue('bigint')).toBe(100000n);
|
|
236
322
|
});
|
|
237
323
|
|
|
238
324
|
test('should correctly round the result of multiplication', () => {
|
|
239
|
-
const skNumber1 = new SwapKitNumber({ decimal:
|
|
325
|
+
const skNumber1 = new SwapKitNumber({ decimal: 3, value: 1.23 });
|
|
240
326
|
const skNumber2 = new SwapKitNumber({ decimal: 4, value: 4.56 });
|
|
241
327
|
|
|
242
328
|
const result = skNumber1.mul(skNumber2);
|
|
243
329
|
|
|
244
330
|
// The exact result of 1.23 * 4.56 is 5.6088
|
|
245
331
|
// If we round it to 2 decimal places, we should get 5.61
|
|
246
|
-
expect(result.getValue('string')).toBe('5.
|
|
247
|
-
expect(result.
|
|
332
|
+
expect(result.getValue('string')).toBe('5.609');
|
|
333
|
+
expect(result.getBaseValue('bigint')).toBe(5608n);
|
|
248
334
|
|
|
249
335
|
const skNumber3 = new SwapKitNumber({ decimal: 2, value: 1.23 });
|
|
250
336
|
const skNumber4 = new SwapKitNumber(-1.234567891);
|
|
@@ -254,7 +340,7 @@ describe('SwapKitNumber', () => {
|
|
|
254
340
|
// The exact result of 1.23 * -1.234567891 is -1,518518505
|
|
255
341
|
// If we round it to 2 decimal places, we should get 5.61
|
|
256
342
|
expect(result2.getValue('string')).toBe('-1.52');
|
|
257
|
-
expect(result2.
|
|
343
|
+
expect(result2.getBaseValue('bigint')).toBe(-151n);
|
|
258
344
|
});
|
|
259
345
|
});
|
|
260
346
|
|
|
@@ -266,13 +352,13 @@ describe('SwapKitNumber', () => {
|
|
|
266
352
|
const result = skNumber1.div(skNumber2, skNumber3);
|
|
267
353
|
|
|
268
354
|
expect(result.getValue('string')).toBe('4');
|
|
269
|
-
expect(result.
|
|
355
|
+
expect(result.getBaseValue('bigint')).toBe(400000000n);
|
|
270
356
|
|
|
271
357
|
const skNumber4 = new SwapKitNumber(10.12);
|
|
272
358
|
const result2 = skNumber4.div(0.0001);
|
|
273
359
|
|
|
274
360
|
expect(result2.getValue('string')).toBe('101200');
|
|
275
|
-
expect(result2.
|
|
361
|
+
expect(result2.getBaseValue('bigint')).toBe(10120000000000n);
|
|
276
362
|
});
|
|
277
363
|
|
|
278
364
|
test('divides different type numbers correctly', () => {
|
|
@@ -280,7 +366,7 @@ describe('SwapKitNumber', () => {
|
|
|
280
366
|
const result = skNumber1.div(5, '0.5');
|
|
281
367
|
|
|
282
368
|
expect(result.getValue('string')).toBe('8');
|
|
283
|
-
expect(result.
|
|
369
|
+
expect(result.getBaseValue('bigint')).toBe(800000000n);
|
|
284
370
|
});
|
|
285
371
|
|
|
286
372
|
test('divides different type numbers correctly when decimal is set', () => {
|
|
@@ -288,7 +374,7 @@ describe('SwapKitNumber', () => {
|
|
|
288
374
|
const result = skNumber1.div(0.001);
|
|
289
375
|
|
|
290
376
|
expect(result.getValue('string')).toBe('1200');
|
|
291
|
-
expect(result.
|
|
377
|
+
expect(result.getBaseValue('bigint')).toBe(120000n);
|
|
292
378
|
});
|
|
293
379
|
|
|
294
380
|
test('divides smaller number by larger number', () => {
|
|
@@ -296,7 +382,7 @@ describe('SwapKitNumber', () => {
|
|
|
296
382
|
const result = skNumber1.div(2);
|
|
297
383
|
|
|
298
384
|
expect(result.getValue('string')).toBe('0.5');
|
|
299
|
-
expect(result.
|
|
385
|
+
expect(result.getBaseValue('bigint')).toBe(50000000n);
|
|
300
386
|
});
|
|
301
387
|
|
|
302
388
|
test('divides a number with 18 decimals by a negative number with less decimals', () => {
|
|
@@ -307,7 +393,7 @@ describe('SwapKitNumber', () => {
|
|
|
307
393
|
|
|
308
394
|
// The exact result of 1.000000000000000010 / -2 is -0.500000000000000005
|
|
309
395
|
expect(result.getValue('string')).toBe('-0.500000000000000005');
|
|
310
|
-
expect(result.
|
|
396
|
+
expect(result.getBaseValue('bigint')).toBe(-500000000000000005n);
|
|
311
397
|
});
|
|
312
398
|
|
|
313
399
|
test('divides a number with 2 decimals by a negative number with more decimals', () => {
|
|
@@ -318,7 +404,7 @@ describe('SwapKitNumber', () => {
|
|
|
318
404
|
|
|
319
405
|
// The exact result of 2 / -0.000005 is -400000
|
|
320
406
|
expect(result.getValue('string')).toBe('-400000');
|
|
321
|
-
expect(result.
|
|
407
|
+
expect(result.getBaseValue('bigint')).toBe(-40000000n);
|
|
322
408
|
});
|
|
323
409
|
});
|
|
324
410
|
|
|
@@ -329,7 +415,7 @@ describe('SwapKitNumber', () => {
|
|
|
329
415
|
|
|
330
416
|
const result = skNumber1.mul(skNumber2);
|
|
331
417
|
expect(result.getValue('string')).toBe('987654321000000987654321000');
|
|
332
|
-
expect(result.
|
|
418
|
+
expect(result.getBaseValue('bigint')).toBe(987654321000000987654321000000000000000000000n);
|
|
333
419
|
});
|
|
334
420
|
|
|
335
421
|
test('divide huge numbers', () => {
|
|
@@ -338,7 +424,7 @@ describe('SwapKitNumber', () => {
|
|
|
338
424
|
|
|
339
425
|
const result = skNumber1.div(skNumber2);
|
|
340
426
|
expect(result.getValue('string')).toBe('1012.4999999873447625');
|
|
341
|
-
expect(result.
|
|
427
|
+
expect(result.getBaseValue('bigint')).toBe(1012499999987344762500n);
|
|
342
428
|
});
|
|
343
429
|
});
|
|
344
430
|
|
|
@@ -17,9 +17,15 @@ import type { CommonAssetString } from '../helpers/asset.ts';
|
|
|
17
17
|
import { getAssetType, getCommonAssetInfo, getDecimal, isGasAsset } from '../helpers/asset.ts';
|
|
18
18
|
import { validateIdentifier } from '../helpers/validators.ts';
|
|
19
19
|
|
|
20
|
-
import {
|
|
20
|
+
import type { NumberPrimitives } from './bigIntArithmetics.ts';
|
|
21
|
+
import { BigIntArithmetics, formatBigIntToSafeValue } from './bigIntArithmetics.ts';
|
|
21
22
|
import type { SwapKitValueType } from './swapKitNumber.ts';
|
|
22
23
|
|
|
24
|
+
const safeValue = (value: NumberPrimitives, decimal: number) =>
|
|
25
|
+
typeof value === 'bigint'
|
|
26
|
+
? formatBigIntToSafeValue({ value, bigIntDecimal: decimal, decimal })
|
|
27
|
+
: value;
|
|
28
|
+
|
|
23
29
|
type AssetValueParams = { decimal: number; value: SwapKitValueType } & (
|
|
24
30
|
| { chain: Chain; symbol: string }
|
|
25
31
|
| { identifier: string }
|
|
@@ -51,33 +57,27 @@ const getStaticToken = (identifier: TokenNames) => {
|
|
|
51
57
|
return tokenInfo || { decimal: BaseDecimal.THOR, identifier: '' };
|
|
52
58
|
};
|
|
53
59
|
|
|
54
|
-
const createAssetValue = async (assetString: string, value:
|
|
60
|
+
const createAssetValue = async (assetString: string, value: NumberPrimitives = 0) => {
|
|
55
61
|
validateIdentifier(assetString);
|
|
56
62
|
|
|
57
63
|
const decimal = await getDecimal(getAssetInfo(assetString));
|
|
58
|
-
|
|
64
|
+
const parsedValue = safeValue(value, decimal);
|
|
65
|
+
|
|
66
|
+
return new AssetValue({ decimal, value: parsedValue, identifier: assetString });
|
|
59
67
|
};
|
|
60
68
|
|
|
61
69
|
export class AssetValue extends BigIntArithmetics {
|
|
62
|
-
address?: string;
|
|
63
|
-
chain: Chain;
|
|
64
|
-
isSynthetic = false;
|
|
65
|
-
isGasAsset = false;
|
|
66
|
-
symbol: string;
|
|
67
|
-
ticker: string;
|
|
68
|
-
type: ReturnType<typeof getAssetType>;
|
|
69
|
-
|
|
70
70
|
constructor(params: AssetValueParams) {
|
|
71
|
+
const identifier =
|
|
72
|
+
'identifier' in params ? params.identifier : `${params.chain}.${params.symbol}`;
|
|
73
|
+
|
|
71
74
|
super(
|
|
72
75
|
params.value instanceof BigIntArithmetics
|
|
73
76
|
? params.value
|
|
74
77
|
: { decimal: params.decimal, value: params.value },
|
|
75
78
|
);
|
|
76
79
|
|
|
77
|
-
const identifier =
|
|
78
|
-
'identifier' in params ? params.identifier : `${params.chain}.${params.symbol}`;
|
|
79
80
|
const assetInfo = getAssetInfo(identifier);
|
|
80
|
-
|
|
81
81
|
this.type = getAssetType(assetInfo);
|
|
82
82
|
this.chain = assetInfo.chain;
|
|
83
83
|
this.ticker = assetInfo.ticker;
|
|
@@ -87,67 +87,68 @@ export class AssetValue extends BigIntArithmetics {
|
|
|
87
87
|
this.isGasAsset = assetInfo.isGasAsset;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
address?: string;
|
|
91
|
+
isSynthetic = false;
|
|
92
|
+
isGasAsset = false;
|
|
93
|
+
chain: Chain;
|
|
94
|
+
symbol: string;
|
|
95
|
+
ticker: string;
|
|
96
|
+
type: ReturnType<typeof getAssetType>;
|
|
97
|
+
|
|
98
|
+
toString(short = false) {
|
|
99
|
+
// THOR.RUNE | ETH/ETH
|
|
100
|
+
const shortFormat = this.isSynthetic ? this.symbol.split('-')[0] : this.ticker;
|
|
93
101
|
|
|
94
|
-
|
|
95
|
-
|
|
102
|
+
return short
|
|
103
|
+
? shortFormat
|
|
104
|
+
: // THOR.ETH/ETH | ETH.USDT-0x1234567890
|
|
105
|
+
`${this.chain}.${this.symbol}`;
|
|
96
106
|
}
|
|
97
107
|
|
|
98
108
|
eq({ chain, symbol }: { chain: Chain; symbol: string }) {
|
|
99
109
|
return this.chain === chain && this.symbol === symbol;
|
|
100
110
|
}
|
|
101
111
|
|
|
102
|
-
static async fromString(assetString: string, value:
|
|
112
|
+
static async fromString(assetString: string, value: NumberPrimitives = 0) {
|
|
103
113
|
return createAssetValue(assetString, value);
|
|
104
114
|
}
|
|
105
115
|
|
|
106
|
-
static fromStringSync(assetString: string, value:
|
|
116
|
+
static fromStringSync(assetString: string, value: NumberPrimitives = 0) {
|
|
117
|
+
const { isSynthetic } = getAssetInfo(assetString);
|
|
107
118
|
const { decimal, identifier: tokenIdentifier } = getStaticToken(
|
|
108
119
|
assetString as unknown as TokenNames,
|
|
109
120
|
);
|
|
110
121
|
|
|
111
|
-
|
|
112
|
-
|
|
122
|
+
const parsedValue = safeValue(value, decimal);
|
|
123
|
+
|
|
124
|
+
const asset = tokenIdentifier
|
|
125
|
+
? new AssetValue({ decimal, identifier: tokenIdentifier, value: parsedValue })
|
|
126
|
+
: isSynthetic
|
|
127
|
+
? new AssetValue({ decimal: 8, identifier: assetString, value: parsedValue })
|
|
113
128
|
: undefined;
|
|
129
|
+
|
|
130
|
+
return asset;
|
|
114
131
|
}
|
|
115
132
|
|
|
116
133
|
static async fromIdentifier(
|
|
117
134
|
assetString: `${Chain}.${string}` | `${Chain}/${string}` | `${Chain}.${string}-${string}`,
|
|
118
|
-
value:
|
|
135
|
+
value: NumberPrimitives = 0,
|
|
119
136
|
) {
|
|
120
137
|
return createAssetValue(assetString, value);
|
|
121
138
|
}
|
|
122
139
|
|
|
123
|
-
static fromIdentifierSync(identifier: TokenNames, value:
|
|
140
|
+
static fromIdentifierSync(identifier: TokenNames, value: NumberPrimitives = 0) {
|
|
124
141
|
const { decimal, identifier: tokenIdentifier } = getStaticToken(identifier);
|
|
142
|
+
const parsedValue = safeValue(value, decimal);
|
|
125
143
|
|
|
126
|
-
return new AssetValue({ decimal, identifier: tokenIdentifier, value });
|
|
144
|
+
return new AssetValue({ decimal, identifier: tokenIdentifier, value: parsedValue });
|
|
127
145
|
}
|
|
128
146
|
|
|
129
|
-
static fromChainOrSignature(assetString: CommonAssetString, value:
|
|
147
|
+
static fromChainOrSignature(assetString: CommonAssetString, value: NumberPrimitives = 0) {
|
|
130
148
|
const { decimal, identifier } = getCommonAssetInfo(assetString);
|
|
149
|
+
const parsedValue = safeValue(value, decimal);
|
|
131
150
|
|
|
132
|
-
return new AssetValue({ value, decimal, identifier });
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
static async fromTCQuote(identifier: TCTokenNames, value: number | string = 0) {
|
|
136
|
-
const decimal = await getDecimal(getAssetInfo(identifier));
|
|
137
|
-
const shiftedValue = this.shiftDecimals({ value, from: BaseDecimal.THOR, to: decimal });
|
|
138
|
-
|
|
139
|
-
return new AssetValue({ value: shiftedValue, identifier, decimal });
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
static fromTCQuoteStatic(identifier: TCTokenNames, value: number | string = 0) {
|
|
143
|
-
const tokenInfo = getStaticToken(identifier);
|
|
144
|
-
const shiftedValue = this.shiftDecimals({
|
|
145
|
-
value,
|
|
146
|
-
from: BaseDecimal.THOR,
|
|
147
|
-
to: tokenInfo.decimal,
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
return new AssetValue({ ...tokenInfo, value: shiftedValue });
|
|
151
|
+
return new AssetValue({ value: parsedValue, decimal, identifier });
|
|
151
152
|
}
|
|
152
153
|
|
|
153
154
|
static async loadStaticAssets() {
|
|
@@ -198,39 +199,41 @@ export const getMinAmountByChain = (chain: Chain) => {
|
|
|
198
199
|
case Chain.Bitcoin:
|
|
199
200
|
case Chain.Litecoin:
|
|
200
201
|
case Chain.BitcoinCash:
|
|
201
|
-
return asset.
|
|
202
|
+
return asset.set(0.00010001);
|
|
202
203
|
|
|
203
204
|
case Chain.Dogecoin:
|
|
204
|
-
return asset.
|
|
205
|
+
return asset.set(1.00000001);
|
|
205
206
|
|
|
206
207
|
case Chain.Avalanche:
|
|
207
208
|
case Chain.Ethereum:
|
|
208
|
-
return asset.
|
|
209
|
+
return asset.set(0.00000001);
|
|
209
210
|
|
|
210
211
|
case Chain.THORChain:
|
|
211
212
|
case Chain.Maya:
|
|
212
|
-
return asset.
|
|
213
|
+
return asset.set(0);
|
|
213
214
|
|
|
214
215
|
default:
|
|
215
|
-
return asset.
|
|
216
|
+
return asset.set(0.00000001);
|
|
216
217
|
}
|
|
217
218
|
};
|
|
218
219
|
|
|
219
220
|
const getAssetInfo = (identifier: string) => {
|
|
220
221
|
const isSynthetic = identifier.slice(0, 14).includes('/');
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
: `${Chain.THORChain}.${
|
|
222
|
+
const [synthChain, synthSymbol] = identifier.split('.').pop()!.split('/');
|
|
223
|
+
const adjustedIdentifier =
|
|
224
|
+
identifier.includes('.') && !isSynthetic ? identifier : `${Chain.THORChain}.${synthSymbol}`;
|
|
224
225
|
|
|
225
226
|
const [chain, symbol] = adjustedIdentifier.split('.') as [Chain, string];
|
|
226
|
-
const [ticker, address] = symbol.split('-') as [string, string?];
|
|
227
|
+
const [ticker, address] = (isSynthetic ? synthSymbol : symbol).split('-') as [string, string?];
|
|
227
228
|
|
|
228
229
|
return {
|
|
229
230
|
address: address?.toLowerCase(),
|
|
230
231
|
chain,
|
|
231
232
|
isGasAsset: isGasAsset({ chain, symbol }),
|
|
232
233
|
isSynthetic,
|
|
233
|
-
symbol:
|
|
234
|
-
|
|
234
|
+
symbol:
|
|
235
|
+
(isSynthetic ? `${synthChain}/` : '') +
|
|
236
|
+
(address ? `${ticker}-${address?.toLowerCase() ?? ''}` : symbol),
|
|
237
|
+
ticker: ticker,
|
|
235
238
|
};
|
|
236
239
|
};
|