@swapkit/helpers 1.0.0-rc.2 → 1.0.0-rc.21

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.
@@ -6,62 +6,65 @@ describe('SwapKitNumber', () => {
6
6
  describe('constructors', () => {
7
7
  test('creates numbers correctly', () => {
8
8
  const skNumber1 = new SwapKitNumber(1);
9
- expect(skNumber1.value).toBe('1');
10
- expect(skNumber1.bigIntValue).toBe(100000000n);
9
+ expect(skNumber1.getValue('string')).toBe('1');
10
+ expect(skNumber1.getValue('number')).toBe(1);
11
+ expect(skNumber1.getBaseValue('bigint')).toBe(100000000n);
11
12
 
12
13
  const skNumber2 = new SwapKitNumber('1');
13
- expect(skNumber2.value).toBe('1');
14
- expect(skNumber2.bigIntValue).toBe(100000000n);
14
+ expect(skNumber2.getValue('string')).toBe('1');
15
+ expect(skNumber2.getBaseValue('bigint')).toBe(100000000n);
15
16
 
17
+ /**
18
+ * because by default we have 8 decimals - it will be rounded to 0 on base value
19
+ */
16
20
  const skNumber3 = new SwapKitNumber('0.0000000001');
17
- expect(skNumber3.value).toBe('0.0000000001');
18
- expect(skNumber3.bigIntValue).toBe(1n);
19
-
20
- const skNumber4 = new SwapKitNumber(0.000000001);
21
- expect(skNumber4.value).toBe('0.000000001');
22
- expect(skNumber4.bigIntValue).toBe(1n);
23
-
24
- const skNumber6 = new SwapKitNumber({ value: 0.1005, decimal: 3 });
25
- expect(skNumber6.value).toBe('0.101');
26
- expect(skNumber6.bigIntValue).toBe(10050000n);
27
-
28
- const skNumber7 = new SwapKitNumber({ value: -0.1005, decimal: 3 });
29
- expect(skNumber7.value).toBe('-0.101');
30
- expect(skNumber7.bigIntValue).toBe(-10050000n);
31
- expect(skNumber7.decimal).toBe(3);
32
- expect(skNumber7.unsafeNumber).toBe(0);
33
- expect(skNumber7.decimalMultiplier).toBe(100000000n);
34
- expect(skNumber7.toString()).toBe('-0.101');
21
+ expect(skNumber3.getValue('string')).toBe('0.0000000001');
22
+ expect(skNumber3.getBaseValue('bigint')).toBe(0n);
23
+
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);
27
+
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);
31
+
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
- expect(skNumber.value).toBe('12.345678901234');
41
- expect(skNumber.bigIntValue).toBe(12345678901234n);
43
+ expect(skNumber.getValue('string')).toBe('12.345678901234');
44
+ expect(skNumber.getBaseValue('bigint')).toBe(12345678901234n);
42
45
  });
43
46
  });
44
47
 
45
48
  describe('shiftDecimals', () => {
46
49
  test('shifts up and bumps number', () => {
47
50
  const skNumber = new SwapKitNumber(1);
48
- expect(skNumber.value).toBe('1');
49
- expect(skNumber.bigIntValue).toBe(100000000n);
51
+ expect(skNumber.getValue('string')).toBe('1');
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.value).toBe('100');
58
- expect(shiftedSkNumber.bigIntValue).toBe(10000000000n);
60
+ expect(shiftedSkNumber.getValue('string')).toBe('1');
61
+ expect(shiftedSkNumber.getBaseValue('bigint')).toBe(1000000n);
59
62
  });
60
63
 
61
- test.skip('shifts down and rounds down number', () => {
64
+ test('shifts down and rounds down number', () => {
62
65
  const skNumber = new SwapKitNumber(2.12345678);
63
- expect(skNumber.value).toBe('2.12345678');
64
- expect(skNumber.bigIntValue).toBe(212345678n);
66
+ expect(skNumber.getValue('string')).toBe('2.12345678');
67
+ expect(skNumber.getBaseValue('bigint')).toBe(212345678n);
65
68
 
66
69
  const shiftedSkNumber = SwapKitNumber.shiftDecimals({
67
70
  value: skNumber,
@@ -69,8 +72,131 @@ describe('SwapKitNumber', () => {
69
72
  to: 6,
70
73
  });
71
74
 
72
- expect(shiftedSkNumber.value).toBe('2.123456');
73
- expect(shiftedSkNumber.bigIntValue).toBe(2123456n);
75
+ expect(shiftedSkNumber.getValue('string')).toBe('2.123456');
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);
90
+ });
91
+ });
92
+
93
+ describe('getValue', () => {
94
+ describe('string', () => {
95
+ test('returns string value', () => {
96
+ const skNumber = new SwapKitNumber(1);
97
+ expect(skNumber.getValue('string')).toBe('1');
98
+ });
99
+
100
+ test('returns string value with decimals', () => {
101
+ const skNumber = new SwapKitNumber(0.01);
102
+ expect(skNumber.getValue('string')).toBe('0.01');
103
+ });
104
+ });
105
+
106
+ describe('number', () => {
107
+ test('returns number value', () => {
108
+ const skNumber = new SwapKitNumber(1);
109
+ expect(skNumber.getValue('number')).toBe(1);
110
+ });
111
+
112
+ test('returns number value with decimals', () => {
113
+ const skNumber = new SwapKitNumber(0.01);
114
+ expect(skNumber.getValue('number')).toBe(0.01);
115
+ });
116
+ });
117
+
118
+ describe('bigint', () => {
119
+ test('returns bigint value', () => {
120
+ const skNumber = new SwapKitNumber(1);
121
+ expect(skNumber.getBaseValue('bigint')).toBe(100000000n);
122
+ });
123
+ });
124
+ });
125
+
126
+ describe('toSignificant', () => {
127
+ describe('normal cases', () => {
128
+ test('returns first significant number of digits', () => {
129
+ const usdLikeNumber = new SwapKitNumber(1234.5678);
130
+ expect(usdLikeNumber.toSignificant(2)).toBe('1200');
131
+ expect(usdLikeNumber.toSignificant(3)).toBe('1230');
132
+ expect(usdLikeNumber.toSignificant(4)).toBe('1234');
133
+ expect(usdLikeNumber.toSignificant(5)).toBe('1234.5');
134
+ expect(usdLikeNumber.toSignificant(6)).toBe('1234.56');
135
+ expect(usdLikeNumber.toSignificant(7)).toBe('1234.567');
136
+ expect(usdLikeNumber.toSignificant(8)).toBe('1234.5678');
137
+
138
+ const btcLikeNumber = new SwapKitNumber(0.00005678);
139
+ expect(btcLikeNumber.toSignificant(2)).toBe('0.000056');
140
+ expect(btcLikeNumber.toSignificant(3)).toBe('0.0000567');
141
+ expect(btcLikeNumber.toSignificant(4)).toBe('0.00005678');
142
+ expect(btcLikeNumber.toSignificant(5)).toBe('0.00005678');
143
+ expect(btcLikeNumber.toSignificant(8)).toBe('0.00005678');
144
+ });
145
+ });
146
+
147
+ describe('custom decimals', () => {
148
+ test('returns first significant number of digits', () => {
149
+ const usdLikeNumber = new SwapKitNumber({ value: 1234.5678, decimal: 2 });
150
+ expect(usdLikeNumber.toSignificant(2)).toBe('1200');
151
+ expect(usdLikeNumber.toSignificant(3)).toBe('1230');
152
+ expect(usdLikeNumber.toSignificant(4)).toBe('1234');
153
+ expect(usdLikeNumber.toSignificant(5)).toBe('1234.5');
154
+ expect(usdLikeNumber.toSignificant(6)).toBe('1234.57');
155
+ expect(usdLikeNumber.toSignificant(7)).toBe('1234.57');
156
+ expect(usdLikeNumber.toSignificant(8)).toBe('1234.57');
157
+
158
+ const ethLikeNumber = new SwapKitNumber({ value: 0.00005678, decimal: 18 });
159
+ expect(ethLikeNumber.toSignificant(2)).toBe('0.000056');
160
+ expect(ethLikeNumber.toSignificant(3)).toBe('0.0000567');
161
+ expect(ethLikeNumber.toSignificant(4)).toBe('0.00005678');
162
+ expect(ethLikeNumber.toSignificant(5)).toBe('0.00005678');
163
+ expect(ethLikeNumber.toSignificant(8)).toBe('0.00005678');
164
+ expect(ethLikeNumber.toSignificant(18)).toBe('0.00005678');
165
+ });
166
+ });
167
+ });
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');
74
200
  });
75
201
  });
76
202
 
@@ -81,23 +207,23 @@ describe('SwapKitNumber', () => {
81
207
  const skNumber3 = new SwapKitNumber('0.5');
82
208
  const result = skNumber1.add(skNumber2, skNumber3);
83
209
 
84
- expect(result.value).toBe('15.5');
85
- expect(result.bigIntValue).toBe(1550000000n);
210
+ expect(result.getValue('string')).toBe('15.5');
211
+ expect(result.getBaseValue('bigint')).toBe(1550000000n);
86
212
  });
87
213
 
88
214
  test('adds different type numbers correctly', () => {
89
215
  const skNumber1 = new SwapKitNumber(10);
90
216
  const result = skNumber1.add(6, '0.5');
91
217
 
92
- expect(result.value).toBe('16.5');
93
- expect(result.bigIntValue).toBe(1650000000n);
218
+ expect(result.getValue('string')).toBe('16.5');
219
+ expect(result.getBaseValue('bigint')).toBe(1650000000n);
94
220
  });
95
221
 
96
222
  test('adds large decimal numbers correctly', () => {
97
223
  const skNumber1 = new SwapKitNumber(0.0000000001);
98
224
  const result = skNumber1.add(6.000000000001, '0.0000000000000005');
99
- expect(result.value).toBe('6.0000000001010005');
100
- expect(result.bigIntValue).toBe(60000000001010005n);
225
+ expect(result.getValue('string')).toBe('6.0000000001010005');
226
+ expect(result.getBaseValue('bigint')).toBe(600000000n);
101
227
  });
102
228
  });
103
229
 
@@ -108,16 +234,16 @@ describe('SwapKitNumber', () => {
108
234
  const skNumber3 = new SwapKitNumber(0.5);
109
235
  const result = skNumber1.sub(skNumber2, skNumber3);
110
236
 
111
- expect(result.value).toBe('4.5');
112
- expect(result.bigIntValue).toBe(450000000n);
237
+ expect(result.getValue('string')).toBe('4.5');
238
+ expect(result.getBaseValue('bigint')).toBe(450000000n);
113
239
  });
114
240
 
115
241
  test('subtracts different type numbers correctly', () => {
116
242
  const skNumber1 = new SwapKitNumber(10);
117
243
  const result = skNumber1.sub(6, '0.5');
118
244
 
119
- expect(result.value).toBe('3.5');
120
- expect(result.bigIntValue).toBe(350000000n);
245
+ expect(result.getValue('string')).toBe('3.5');
246
+ expect(result.getBaseValue('bigint')).toBe(350000000n);
121
247
  });
122
248
 
123
249
  test('can process negative results', () => {
@@ -125,10 +251,10 @@ describe('SwapKitNumber', () => {
125
251
  const result0 = skNumber1.sub(10);
126
252
  const resultMinus = result0.sub('10');
127
253
 
128
- expect(result0.value).toBe('0');
129
- expect(resultMinus.value).toBe('-10');
130
- expect(result0.bigIntValue).toBe(0n);
131
- expect(resultMinus.bigIntValue).toBe(-1000000000n);
254
+ expect(result0.getValue('string')).toBe('0');
255
+ expect(resultMinus.getValue('string')).toBe('-10');
256
+ expect(result0.getBaseValue('bigint')).toBe(0n);
257
+ expect(resultMinus.getBaseValue('bigint')).toBe(-1000000000n);
132
258
  });
133
259
  });
134
260
 
@@ -139,36 +265,36 @@ describe('SwapKitNumber', () => {
139
265
  const skNumber3 = new SwapKitNumber(0.5);
140
266
  const result = skNumber1.mul(skNumber2, skNumber3);
141
267
 
142
- expect(result.value).toBe('25');
143
- expect(result.bigIntValue).toBe(2500000000n);
268
+ expect(result.getValue('string')).toBe('25');
269
+ expect(result.getBaseValue('bigint')).toBe(2500000000n);
144
270
  });
145
271
 
146
272
  test('multiplies different type numbers correctly', () => {
147
273
  const skNumber1 = new SwapKitNumber(10);
148
274
  const result = skNumber1.mul(6, '0.5');
149
275
 
150
- expect(result.value).toBe('30');
151
- expect(result.bigIntValue).toBe(3000000000n);
276
+ expect(result.getValue('string')).toBe('30');
277
+ expect(result.getBaseValue('bigint')).toBe(3000000000n);
152
278
  });
153
279
 
154
280
  test('multiplies numbers correctly if decimals of SKN is lower than number multiplied with', () => {
155
281
  const skNumber1 = new SwapKitNumber({ value: 1000000, decimal: 4 });
156
282
  const result = skNumber1.mul('0.00001');
157
283
 
158
- expect(result.value).toBe('10');
159
- expect(result.bigIntValue).toBe(1000000000n);
284
+ expect(result.getValue('string')).toBe('10');
285
+ expect(result.getBaseValue('bigint')).toBe(100000n);
160
286
  });
161
287
 
162
288
  test('should correctly round the result of multiplication', () => {
163
- const skNumber1 = new SwapKitNumber({ decimal: 2, value: 1.23 });
289
+ const skNumber1 = new SwapKitNumber({ decimal: 3, value: 1.23 });
164
290
  const skNumber2 = new SwapKitNumber({ decimal: 4, value: 4.56 });
165
291
 
166
292
  const result = skNumber1.mul(skNumber2);
167
293
 
168
294
  // The exact result of 1.23 * 4.56 is 5.6088
169
295
  // If we round it to 2 decimal places, we should get 5.61
170
- expect(result.value).toBe('5.61');
171
- expect(result.bigIntValue).toBe(560880000n);
296
+ expect(result.getValue('string')).toBe('5.609');
297
+ expect(result.getBaseValue('bigint')).toBe(5608n);
172
298
 
173
299
  const skNumber3 = new SwapKitNumber({ decimal: 2, value: 1.23 });
174
300
  const skNumber4 = new SwapKitNumber(-1.234567891);
@@ -177,8 +303,8 @@ describe('SwapKitNumber', () => {
177
303
 
178
304
  // The exact result of 1.23 * -1.234567891 is -1,518518505
179
305
  // If we round it to 2 decimal places, we should get 5.61
180
- expect(result2.value).toBe('-1.52');
181
- expect(result2.bigIntValue).toBe(-1518518505n);
306
+ expect(result2.getValue('string')).toBe('-1.52');
307
+ expect(result2.getBaseValue('bigint')).toBe(-151n);
182
308
  });
183
309
  });
184
310
 
@@ -189,38 +315,38 @@ describe('SwapKitNumber', () => {
189
315
  const skNumber3 = new SwapKitNumber(0.5);
190
316
  const result = skNumber1.div(skNumber2, skNumber3);
191
317
 
192
- expect(result.value).toBe('4');
193
- expect(result.bigIntValue).toBe(400000000n);
318
+ expect(result.getValue('string')).toBe('4');
319
+ expect(result.getBaseValue('bigint')).toBe(400000000n);
194
320
 
195
321
  const skNumber4 = new SwapKitNumber(10.12);
196
322
  const result2 = skNumber4.div(0.0001);
197
323
 
198
- expect(result2.value).toBe('101200');
199
- expect(result2.bigIntValue).toBe(10120000000000n);
324
+ expect(result2.getValue('string')).toBe('101200');
325
+ expect(result2.getBaseValue('bigint')).toBe(10120000000000n);
200
326
  });
201
327
 
202
328
  test('divides different type numbers correctly', () => {
203
329
  const skNumber1 = new SwapKitNumber(20);
204
330
  const result = skNumber1.div(5, '0.5');
205
331
 
206
- expect(result.value).toBe('8');
207
- expect(result.bigIntValue).toBe(800000000n);
332
+ expect(result.getValue('string')).toBe('8');
333
+ expect(result.getBaseValue('bigint')).toBe(800000000n);
208
334
  });
209
335
 
210
336
  test('divides different type numbers correctly when decimal is set', () => {
211
337
  const skNumber1 = new SwapKitNumber({ value: '1.2', decimal: 2 });
212
338
  const result = skNumber1.div(0.001);
213
339
 
214
- expect(result.value).toBe('1200');
215
- expect(result.bigIntValue).toBe(120000000000n);
340
+ expect(result.getValue('string')).toBe('1200');
341
+ expect(result.getBaseValue('bigint')).toBe(120000n);
216
342
  });
217
343
 
218
344
  test('divides smaller number by larger number', () => {
219
345
  const skNumber1 = new SwapKitNumber(1);
220
346
  const result = skNumber1.div(2);
221
347
 
222
- expect(result.value).toBe('0.5');
223
- expect(result.bigIntValue).toBe(50000000n);
348
+ expect(result.getValue('string')).toBe('0.5');
349
+ expect(result.getBaseValue('bigint')).toBe(50000000n);
224
350
  });
225
351
 
226
352
  test('divides a number with 18 decimals by a negative number with less decimals', () => {
@@ -230,8 +356,8 @@ describe('SwapKitNumber', () => {
230
356
  const result = skNumber1.div(skNumber2);
231
357
 
232
358
  // The exact result of 1.000000000000000010 / -2 is -0.500000000000000005
233
- expect(result.value).toBe('-0.500000000000000005');
234
- expect(result.bigIntValue).toBe(-500000000000000005n);
359
+ expect(result.getValue('string')).toBe('-0.500000000000000005');
360
+ expect(result.getBaseValue('bigint')).toBe(-500000000000000005n);
235
361
  });
236
362
 
237
363
  test('divides a number with 2 decimals by a negative number with more decimals', () => {
@@ -241,8 +367,8 @@ describe('SwapKitNumber', () => {
241
367
  const result = skNumber1.div(skNumber2);
242
368
 
243
369
  // The exact result of 2 / -0.000005 is -400000
244
- expect(result.value).toBe('-400000');
245
- expect(result.bigIntValue).toBe(-40000000000000n);
370
+ expect(result.getValue('string')).toBe('-400000');
371
+ expect(result.getBaseValue('bigint')).toBe(-40000000n);
246
372
  });
247
373
  });
248
374
 
@@ -252,8 +378,8 @@ describe('SwapKitNumber', () => {
252
378
  const skNumber2 = new SwapKitNumber({ value: 987_654_321_000, decimal: 18 });
253
379
 
254
380
  const result = skNumber1.mul(skNumber2);
255
- expect(result.value).toBe('987654321000000987654321000');
256
- expect(result.bigIntValue).toBe(987654321000000987654321000000000000000000000n);
381
+ expect(result.getValue('string')).toBe('987654321000000987654321000');
382
+ expect(result.getBaseValue('bigint')).toBe(987654321000000987654321000000000000000000000n);
257
383
  });
258
384
 
259
385
  test('divide huge numbers', () => {
@@ -261,8 +387,8 @@ describe('SwapKitNumber', () => {
261
387
  const skNumber2 = new SwapKitNumber({ value: 987_654_321_000, decimal: 18 });
262
388
 
263
389
  const result = skNumber1.div(skNumber2);
264
- expect(result.value).toBe('1012.4999999873447625');
265
- expect(result.bigIntValue).toBe(1012499999987344762500n);
390
+ expect(result.getValue('string')).toBe('1012.4999999873447625');
391
+ expect(result.getBaseValue('bigint')).toBe(1012499999987344762500n);
266
392
  });
267
393
  });
268
394