@swapkit/helpers 1.0.0-rc.7 → 1.0.0-rc.71

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.
@@ -0,0 +1,30 @@
1
+ import { describe, expect, test } from 'vitest';
2
+
3
+ import { formatBigIntToSafeValue } from '../bigIntArithmetics.ts';
4
+
5
+ describe('BigIntArithmatics', () => {
6
+ describe('formatBigIntToSafeValue', () => {
7
+ test('parse bigint with decimals to string', () => {
8
+ const safeValue1 = formatBigIntToSafeValue({
9
+ value: BigInt(0),
10
+ decimal: 6,
11
+ bigIntDecimal: 6,
12
+ });
13
+ expect(safeValue1).toBe('0');
14
+
15
+ const safeValue2 = formatBigIntToSafeValue({
16
+ value: BigInt(15),
17
+ decimal: 0,
18
+ bigIntDecimal: 0,
19
+ });
20
+ expect(safeValue2).toBe('15');
21
+
22
+ const safeValue3 = formatBigIntToSafeValue({
23
+ value: BigInt(123456789),
24
+ decimal: 4,
25
+ bigIntDecimal: 4,
26
+ });
27
+ expect(safeValue3).toBe('12345.6789');
28
+ });
29
+ });
30
+ });
@@ -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.getValue('bigint')).toBe(100000000n);
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.getValue('bigint')).toBe(100000000n);
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.getValue('bigint')).toBe(1n);
22
+ expect(skNumber3.getBaseValue('bigint')).toBe(0n);
20
23
 
21
- const skNumber4 = new SwapKitNumber(0.000000001);
22
- expect(skNumber4.getValue('string')).toBe('0.000000001');
23
- expect(skNumber4.getValue('bigint')).toBe(1n);
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 skNumber6 = new SwapKitNumber({ value: 0.1005, decimal: 3 });
26
- expect(skNumber6.getValue('string')).toBe('0.101');
27
- expect(skNumber6.getValue('bigint')).toBe(10050000n);
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 skNumber7 = new SwapKitNumber({ value: -0.1005, decimal: 3 });
30
- expect(skNumber7.getValue('string')).toBe('-0.101');
31
- expect(skNumber7.getValue('bigint')).toBe(-10050000n);
32
- expect(skNumber7.decimal).toBe(3);
33
- expect(skNumber7.getValue('number')).toBe(-0.101);
34
- expect(skNumber7.decimalMultiplier).toBe(100000000n);
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.getValue('bigint')).toBe(12345678901234n);
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.getValue('bigint')).toBe(100000000n);
52
+ expect(skNumber.getBaseValue('bigint')).toBe(100000000n);
50
53
 
51
54
  const shiftedSkNumber = SwapKitNumber.shiftDecimals({
52
55
  value: skNumber,
53
- from: 6,
54
- to: 8,
56
+ from: 8,
57
+ to: 6,
55
58
  });
56
59
 
57
- expect(shiftedSkNumber.getValue('string')).toBe('100');
58
- expect(shiftedSkNumber.getValue('bigint')).toBe(10000000000n);
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.getValue('bigint')).toBe(212345678n);
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.getValue('bigint')).toBe(212345600n);
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.getValue('bigint')).toBe(100000000n);
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.getValue('bigint')).toBe(1550000000n);
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.getValue('bigint')).toBe(1650000000n);
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.getValue('bigint')).toBe(60000000001010005n);
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.getValue('bigint')).toBe(450000000n);
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.getValue('bigint')).toBe(350000000n);
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.getValue('bigint')).toBe(0n);
207
- expect(resultMinus.getValue('bigint')).toBe(-1000000000n);
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.getValue('bigint')).toBe(2500000000n);
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.getValue('bigint')).toBe(3000000000n);
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,18 @@ describe('SwapKitNumber', () => {
232
318
  const result = skNumber1.mul('0.00001');
233
319
 
234
320
  expect(result.getValue('string')).toBe('10');
235
- expect(result.getValue('bigint')).toBe(1000000000n);
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: 2, value: 1.23 });
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
- // If we round it to 2 decimal places, we should get 5.61
246
- expect(result.getValue('string')).toBe('5.61');
247
- expect(result.getValue('bigint')).toBe(560880000n);
331
+ expect(result.getValue('string')).toBe('5.609');
332
+ expect(result.getBaseValue('bigint')).toBe(5608n);
248
333
 
249
334
  const skNumber3 = new SwapKitNumber({ decimal: 2, value: 1.23 });
250
335
  const skNumber4 = new SwapKitNumber(-1.234567891);
@@ -254,7 +339,7 @@ describe('SwapKitNumber', () => {
254
339
  // The exact result of 1.23 * -1.234567891 is -1,518518505
255
340
  // If we round it to 2 decimal places, we should get 5.61
256
341
  expect(result2.getValue('string')).toBe('-1.52');
257
- expect(result2.getValue('bigint')).toBe(-1518518505n);
342
+ expect(result2.getBaseValue('bigint')).toBe(-151n);
258
343
  });
259
344
  });
260
345
 
@@ -266,13 +351,13 @@ describe('SwapKitNumber', () => {
266
351
  const result = skNumber1.div(skNumber2, skNumber3);
267
352
 
268
353
  expect(result.getValue('string')).toBe('4');
269
- expect(result.getValue('bigint')).toBe(400000000n);
354
+ expect(result.getBaseValue('bigint')).toBe(400000000n);
270
355
 
271
356
  const skNumber4 = new SwapKitNumber(10.12);
272
357
  const result2 = skNumber4.div(0.0001);
273
358
 
274
359
  expect(result2.getValue('string')).toBe('101200');
275
- expect(result2.getValue('bigint')).toBe(10120000000000n);
360
+ expect(result2.getBaseValue('bigint')).toBe(10120000000000n);
276
361
  });
277
362
 
278
363
  test('divides different type numbers correctly', () => {
@@ -280,7 +365,7 @@ describe('SwapKitNumber', () => {
280
365
  const result = skNumber1.div(5, '0.5');
281
366
 
282
367
  expect(result.getValue('string')).toBe('8');
283
- expect(result.getValue('bigint')).toBe(800000000n);
368
+ expect(result.getBaseValue('bigint')).toBe(800000000n);
284
369
  });
285
370
 
286
371
  test('divides different type numbers correctly when decimal is set', () => {
@@ -288,7 +373,7 @@ describe('SwapKitNumber', () => {
288
373
  const result = skNumber1.div(0.001);
289
374
 
290
375
  expect(result.getValue('string')).toBe('1200');
291
- expect(result.getValue('bigint')).toBe(120000000000n);
376
+ expect(result.getBaseValue('bigint')).toBe(120000n);
292
377
  });
293
378
 
294
379
  test('divides smaller number by larger number', () => {
@@ -296,7 +381,7 @@ describe('SwapKitNumber', () => {
296
381
  const result = skNumber1.div(2);
297
382
 
298
383
  expect(result.getValue('string')).toBe('0.5');
299
- expect(result.getValue('bigint')).toBe(50000000n);
384
+ expect(result.getBaseValue('bigint')).toBe(50000000n);
300
385
  });
301
386
 
302
387
  test('divides a number with 18 decimals by a negative number with less decimals', () => {
@@ -307,7 +392,7 @@ describe('SwapKitNumber', () => {
307
392
 
308
393
  // The exact result of 1.000000000000000010 / -2 is -0.500000000000000005
309
394
  expect(result.getValue('string')).toBe('-0.500000000000000005');
310
- expect(result.getValue('bigint')).toBe(-500000000000000005n);
395
+ expect(result.getBaseValue('bigint')).toBe(-500000000000000005n);
311
396
  });
312
397
 
313
398
  test('divides a number with 2 decimals by a negative number with more decimals', () => {
@@ -318,7 +403,7 @@ describe('SwapKitNumber', () => {
318
403
 
319
404
  // The exact result of 2 / -0.000005 is -400000
320
405
  expect(result.getValue('string')).toBe('-400000');
321
- expect(result.getValue('bigint')).toBe(-40000000000000n);
406
+ expect(result.getBaseValue('bigint')).toBe(-40000000n);
322
407
  });
323
408
  });
324
409
 
@@ -329,7 +414,7 @@ describe('SwapKitNumber', () => {
329
414
 
330
415
  const result = skNumber1.mul(skNumber2);
331
416
  expect(result.getValue('string')).toBe('987654321000000987654321000');
332
- expect(result.getValue('bigint')).toBe(987654321000000987654321000000000000000000000n);
417
+ expect(result.getBaseValue('bigint')).toBe(987654321000000987654321000000000000000000000n);
333
418
  });
334
419
 
335
420
  test('divide huge numbers', () => {
@@ -338,7 +423,27 @@ describe('SwapKitNumber', () => {
338
423
 
339
424
  const result = skNumber1.div(skNumber2);
340
425
  expect(result.getValue('string')).toBe('1012.4999999873447625');
341
- expect(result.getValue('bigint')).toBe(1012499999987344762500n);
426
+ expect(result.getBaseValue('bigint')).toBe(1012499999987344762500n);
427
+ });
428
+ });
429
+
430
+ describe('extending multiplier without loosing precision', () => {
431
+ test('edge case 1', () => {
432
+ const asset1 = new SwapKitNumber({ value: 41.90963702, decimal: 8 });
433
+ const multiplier = 5.337952274462478;
434
+ const divider = 105.2562773915526;
435
+ const result = asset1.mul(multiplier).div(divider);
436
+
437
+ expect(result.getValue('string')).toBe('2.12539953');
438
+ });
439
+
440
+ test('edge case 2', () => {
441
+ const asset1 = new SwapKitNumber('41.90963702');
442
+ const multiplier = new SwapKitNumber('5.337952274462478');
443
+ const divider = new SwapKitNumber('105.2562773915526');
444
+ const result = asset1.mul(multiplier).div(divider);
445
+
446
+ expect(result.getValue('string')).toBe('2.125399527674726');
342
447
  });
343
448
  });
344
449
 
@@ -350,6 +455,14 @@ describe('SwapKitNumber', () => {
350
455
  expect(skNumber1.gt(skNumber2)).toBe(true);
351
456
  expect(skNumber2.gt(skNumber1)).toBe(false);
352
457
  });
458
+
459
+ test("different decimals doesn't affect comparison", () => {
460
+ const skNumber1 = new SwapKitNumber({ value: 10, decimal: 18 });
461
+ const skNumber2 = new SwapKitNumber({ value: '50', decimal: 8 });
462
+
463
+ expect(skNumber1.lt(skNumber2)).toBe(true);
464
+ expect(skNumber2.gt(skNumber1)).toBe(true);
465
+ });
353
466
  });
354
467
 
355
468
  describe('gte', () => {
@@ -395,6 +508,19 @@ describe('SwapKitNumber', () => {
395
508
  });
396
509
  });
397
510
 
511
+ describe('comparison edge cases with decimals', () => {
512
+ test('compare on cut decimals', () => {
513
+ const skNumber1 = new SwapKitNumber({ value: 0.001, decimal: 3 });
514
+ const value = '0.0019';
515
+
516
+ expect(skNumber1.lt(value)).toBe(true);
517
+ expect(skNumber1.gt(value)).toBe(false);
518
+ expect(skNumber1.eq(value)).toBe(false);
519
+ expect(skNumber1.lte(value)).toBe(true);
520
+ expect(skNumber1.gte(value)).toBe(false);
521
+ });
522
+ });
523
+
398
524
  describe('Throws', () => {
399
525
  test('throws if division by zero', () => {
400
526
  const skNumber1 = new SwapKitNumber(10);