@swapkit/helpers 4.4.5 → 4.5.3
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/api/index.cjs +2 -2
- package/dist/api/index.cjs.map +4 -4
- package/dist/api/index.js +2 -2
- package/dist/api/index.js.map +4 -4
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +10 -10
- package/dist/index.js +3 -3
- package/dist/index.js.map +10 -10
- package/dist/types/api/index.d.ts +247 -0
- package/dist/types/api/index.d.ts.map +1 -1
- package/dist/types/api/swapkitApi/endpoints.d.ts +247 -0
- package/dist/types/api/swapkitApi/endpoints.d.ts.map +1 -1
- package/dist/types/api/swapkitApi/types.d.ts +3 -1
- package/dist/types/api/swapkitApi/types.d.ts.map +1 -1
- package/dist/types/modules/assetValue.d.ts +6 -0
- package/dist/types/modules/assetValue.d.ts.map +1 -1
- package/dist/types/modules/bigIntArithmetics.d.ts.map +1 -1
- package/dist/types/modules/swapKitConfig.d.ts +63 -36
- package/dist/types/modules/swapKitConfig.d.ts.map +1 -1
- package/dist/types/modules/swapKitError.d.ts +20 -24
- package/dist/types/modules/swapKitError.d.ts.map +1 -1
- package/dist/types/types/wallet.d.ts +5 -1
- package/dist/types/types/wallet.d.ts.map +1 -1
- package/dist/types/utils/asset.d.ts +1 -1
- package/dist/types/utils/asset.d.ts.map +1 -1
- package/package.json +24 -12
- package/src/api/index.ts +9 -0
- package/src/api/midgard/endpoints.ts +348 -0
- package/src/api/midgard/types.ts +515 -0
- package/src/api/swapkitApi/endpoints.ts +242 -0
- package/src/api/swapkitApi/types.ts +624 -0
- package/src/api/thornode/endpoints.ts +105 -0
- package/src/api/thornode/types.ts +247 -0
- package/src/contracts.ts +1 -0
- package/src/index.ts +28 -0
- package/src/modules/__tests__/assetValue.test.ts +1637 -0
- package/src/modules/__tests__/bigIntArithmetics.test.ts +383 -0
- package/src/modules/__tests__/swapKitConfig.test.ts +425 -0
- package/src/modules/__tests__/swapKitNumber.test.ts +535 -0
- package/src/modules/assetValue.ts +532 -0
- package/src/modules/bigIntArithmetics.ts +363 -0
- package/src/modules/feeMultiplier.ts +80 -0
- package/src/modules/requestClient.ts +110 -0
- package/src/modules/swapKitConfig.ts +174 -0
- package/src/modules/swapKitError.ts +470 -0
- package/src/modules/swapKitNumber.ts +13 -0
- package/src/tokens.ts +1 -0
- package/src/types/commonTypes.ts +10 -0
- package/src/types/derivationPath.ts +11 -0
- package/src/types/errors/apiV1.ts +0 -0
- package/src/types/index.ts +5 -0
- package/src/types/quotes.ts +174 -0
- package/src/types/sdk.ts +38 -0
- package/src/types/wallet.ts +124 -0
- package/src/utils/__tests__/asset.test.ts +185 -0
- package/src/utils/__tests__/derivationPath.test.ts +16 -0
- package/src/utils/__tests__/explorerUrls.test.ts +59 -0
- package/src/utils/__tests__/memo.test.ts +99 -0
- package/src/utils/__tests__/others.test.ts +83 -0
- package/src/utils/__tests__/validators.test.ts +24 -0
- package/src/utils/asset.ts +395 -0
- package/src/utils/chains.ts +100 -0
- package/src/utils/derivationPath.ts +101 -0
- package/src/utils/explorerUrls.ts +32 -0
- package/src/utils/liquidity.ts +150 -0
- package/src/utils/memo.ts +102 -0
- package/src/utils/others.ts +62 -0
- package/src/utils/validators.ts +32 -0
- package/src/utils/wallets.ts +237 -0
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
import { SwapKitNumber } from "../swapKitNumber";
|
|
4
|
+
|
|
5
|
+
describe("SwapKitNumber", () => {
|
|
6
|
+
describe("constructors", () => {
|
|
7
|
+
test("creates numbers correctly", () => {
|
|
8
|
+
const skNumber1 = new SwapKitNumber(1);
|
|
9
|
+
expect(skNumber1.getValue("string")).toBe("1");
|
|
10
|
+
expect(skNumber1.getValue("number")).toBe(1);
|
|
11
|
+
expect(skNumber1.getBaseValue("bigint")).toBe(100000000n);
|
|
12
|
+
|
|
13
|
+
const skNumber2 = new SwapKitNumber("1");
|
|
14
|
+
expect(skNumber2.getValue("string")).toBe("1");
|
|
15
|
+
expect(skNumber2.getBaseValue("bigint")).toBe(100000000n);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* because by default we have 8 decimals - it will be rounded to 0 on base value
|
|
19
|
+
*/
|
|
20
|
+
const skNumber3 = new SwapKitNumber("0.0000000001");
|
|
21
|
+
expect(skNumber3.getValue("string")).toBe("0.0000000001");
|
|
22
|
+
expect(skNumber3.getBaseValue("bigint")).toBe(0n);
|
|
23
|
+
|
|
24
|
+
const skNumber4 = new SwapKitNumber({ decimal: 10, value: "0.0000000001" });
|
|
25
|
+
expect(skNumber4.getValue("string")).toBe("0.0000000001");
|
|
26
|
+
expect(skNumber4.getBaseValue("bigint")).toBe(1n);
|
|
27
|
+
|
|
28
|
+
const skNumber5 = new SwapKitNumber({ decimal: 3, value: 0.1005 });
|
|
29
|
+
expect(skNumber5.getValue("string")).toBe("0.101");
|
|
30
|
+
expect(skNumber5.getBaseValue("bigint")).toBe(101n);
|
|
31
|
+
|
|
32
|
+
const skNumber6 = new SwapKitNumber({ decimal: 3, value: -0.1005 });
|
|
33
|
+
expect(skNumber6.getValue("string")).toBe("-0.101");
|
|
34
|
+
expect(skNumber6.getBaseValue("bigint")).toBe(-101n);
|
|
35
|
+
expect(skNumber6.decimal).toBe(3);
|
|
36
|
+
expect(skNumber6.getValue("number")).toBe(-0.101);
|
|
37
|
+
expect(skNumber6.decimalMultiplier).toBe(100000000n);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("creates SwapKitInstance from BigInt: (12.345678901234, decimals: 12)", () => {
|
|
41
|
+
const skNumber = SwapKitNumber.fromBigInt(12345678901234n, 12);
|
|
42
|
+
|
|
43
|
+
expect(skNumber.getValue("string")).toBe("12.345678901234");
|
|
44
|
+
expect(skNumber.getBaseValue("bigint")).toBe(12345678901234n);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe("shiftDecimals", () => {
|
|
49
|
+
test("shifts up and bumps number", () => {
|
|
50
|
+
const skNumber = new SwapKitNumber(1);
|
|
51
|
+
expect(skNumber.getValue("string")).toBe("1");
|
|
52
|
+
expect(skNumber.getBaseValue("bigint")).toBe(100000000n);
|
|
53
|
+
|
|
54
|
+
const shiftedSkNumber = SwapKitNumber.shiftDecimals({ from: 8, to: 6, value: skNumber });
|
|
55
|
+
|
|
56
|
+
expect(shiftedSkNumber.getValue("string")).toBe("1");
|
|
57
|
+
expect(shiftedSkNumber.getBaseValue("bigint")).toBe(1000000n);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("shifts down and rounds down number", () => {
|
|
61
|
+
const skNumber = new SwapKitNumber(2.12345678);
|
|
62
|
+
expect(skNumber.getValue("string")).toBe("2.12345678");
|
|
63
|
+
expect(skNumber.getBaseValue("bigint")).toBe(212345678n);
|
|
64
|
+
|
|
65
|
+
const shiftedSkNumber = SwapKitNumber.shiftDecimals({ from: 8, to: 6, value: skNumber });
|
|
66
|
+
|
|
67
|
+
expect(shiftedSkNumber.getValue("string")).toBe("2.123456");
|
|
68
|
+
expect(shiftedSkNumber.getBaseValue("bigint")).toBe(2123456n);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("shift eth from 18 to 8", () => {
|
|
72
|
+
const skNumber = new SwapKitNumber({ decimal: 18, value: "0.2" });
|
|
73
|
+
|
|
74
|
+
const shiftedSkNumber = SwapKitNumber.shiftDecimals({ from: 18, to: 8, value: skNumber });
|
|
75
|
+
|
|
76
|
+
expect(shiftedSkNumber.getValue("string")).toBe("0.2");
|
|
77
|
+
expect(shiftedSkNumber.getBaseValue("bigint")).toBe(20000000n);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe("getValue", () => {
|
|
82
|
+
describe("string", () => {
|
|
83
|
+
test("returns string value", () => {
|
|
84
|
+
const skNumber = new SwapKitNumber(1);
|
|
85
|
+
expect(skNumber.getValue("string")).toBe("1");
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test("returns string value with decimals", () => {
|
|
89
|
+
const skNumber = new SwapKitNumber(0.01);
|
|
90
|
+
expect(skNumber.getValue("string")).toBe("0.01");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("returns string value with adjusted decimals", () => {
|
|
94
|
+
const skNumber = new SwapKitNumber({ decimal: 18, value: "1.234567890123456789" });
|
|
95
|
+
expect(skNumber.getValue("string", 8)).toBe("1.23456789");
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("returns string base value with adjusted decimals", () => {
|
|
99
|
+
const skNumber = new SwapKitNumber({ decimal: 18, value: "1.234567890123456789" });
|
|
100
|
+
expect(skNumber.getBaseValue("string", 8)).toBe("123456789");
|
|
101
|
+
expect(skNumber.getBaseValue("string", 10)).toBe("12345678901");
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe("number", () => {
|
|
106
|
+
test("returns number value", () => {
|
|
107
|
+
const skNumber = new SwapKitNumber(1);
|
|
108
|
+
expect(skNumber.getValue("number")).toBe(1);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("returns number value with decimals", () => {
|
|
112
|
+
const skNumber = new SwapKitNumber(0.01);
|
|
113
|
+
expect(skNumber.getValue("number")).toBe(0.01);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("returns number value with adjusted decimals", () => {
|
|
117
|
+
const skNumber = new SwapKitNumber({ decimal: 18, value: "1.234567890123456789" });
|
|
118
|
+
expect(skNumber.getValue("number", 8)).toBe(1.23456789);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test("returns number base value with adjusted decimals", () => {
|
|
122
|
+
const skNumber = new SwapKitNumber({ decimal: 18, value: "1.234567890123456789" });
|
|
123
|
+
expect(skNumber.getBaseValue("number", 8)).toBe(123456789);
|
|
124
|
+
expect(skNumber.getBaseValue("number", 10)).toBe(12345678901);
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
describe("bigint", () => {
|
|
129
|
+
test("returns bigint value", () => {
|
|
130
|
+
const skNumber = new SwapKitNumber(1);
|
|
131
|
+
expect(skNumber.getBaseValue("bigint")).toBe(100000000n);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("returns bigint value with adjusted decimals", () => {
|
|
135
|
+
const skNumber = new SwapKitNumber({ decimal: 18, value: "1.234567890123456789" });
|
|
136
|
+
expect(skNumber.getBaseValue("bigint", 8)).toBe(123456789n);
|
|
137
|
+
expect(skNumber.getBaseValue("bigint", 10)).toBe(12345678901n);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
describe("toSignificant", () => {
|
|
143
|
+
describe("normal cases", () => {
|
|
144
|
+
test("returns first significant number of digits", () => {
|
|
145
|
+
const usdLikeNumber = new SwapKitNumber(1234.5678);
|
|
146
|
+
expect(usdLikeNumber.toSignificant(2)).toBe("1200");
|
|
147
|
+
expect(usdLikeNumber.toSignificant(3)).toBe("1230");
|
|
148
|
+
expect(usdLikeNumber.toSignificant(4)).toBe("1234");
|
|
149
|
+
expect(usdLikeNumber.toSignificant(5)).toBe("1234.5");
|
|
150
|
+
expect(usdLikeNumber.toSignificant(6)).toBe("1234.56");
|
|
151
|
+
expect(usdLikeNumber.toSignificant(7)).toBe("1234.567");
|
|
152
|
+
expect(usdLikeNumber.toSignificant(8)).toBe("1234.5678");
|
|
153
|
+
|
|
154
|
+
const btcLikeNumber = new SwapKitNumber(0.00005678);
|
|
155
|
+
expect(btcLikeNumber.toSignificant(2)).toBe("0.000056");
|
|
156
|
+
expect(btcLikeNumber.toSignificant(3)).toBe("0.0000567");
|
|
157
|
+
expect(btcLikeNumber.toSignificant(4)).toBe("0.00005678");
|
|
158
|
+
expect(btcLikeNumber.toSignificant(5)).toBe("0.00005678");
|
|
159
|
+
expect(btcLikeNumber.toSignificant(8)).toBe("0.00005678");
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
describe("custom decimals", () => {
|
|
164
|
+
test("returns first significant number of digits", () => {
|
|
165
|
+
const usdLikeNumber = new SwapKitNumber({ decimal: 2, value: 1234.5678 });
|
|
166
|
+
expect(usdLikeNumber.toSignificant(2)).toBe("1200");
|
|
167
|
+
expect(usdLikeNumber.toSignificant(3)).toBe("1230");
|
|
168
|
+
expect(usdLikeNumber.toSignificant(4)).toBe("1234");
|
|
169
|
+
expect(usdLikeNumber.toSignificant(5)).toBe("1234.5");
|
|
170
|
+
expect(usdLikeNumber.toSignificant(6)).toBe("1234.57");
|
|
171
|
+
expect(usdLikeNumber.toSignificant(7)).toBe("1234.57");
|
|
172
|
+
expect(usdLikeNumber.toSignificant(8)).toBe("1234.57");
|
|
173
|
+
|
|
174
|
+
const ethLikeNumber = new SwapKitNumber({ decimal: 18, value: 0.00005678 });
|
|
175
|
+
expect(ethLikeNumber.toSignificant(2)).toBe("0.000056");
|
|
176
|
+
expect(ethLikeNumber.toSignificant(3)).toBe("0.0000567");
|
|
177
|
+
expect(ethLikeNumber.toSignificant(4)).toBe("0.00005678");
|
|
178
|
+
expect(ethLikeNumber.toSignificant(5)).toBe("0.00005678");
|
|
179
|
+
expect(ethLikeNumber.toSignificant(8)).toBe("0.00005678");
|
|
180
|
+
expect(ethLikeNumber.toSignificant(18)).toBe("0.00005678");
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe("toAbbreviation", () => {
|
|
186
|
+
test("returns abbreviation with up to 3 integer digits", () => {
|
|
187
|
+
const skNumber = new SwapKitNumber(1234.5678);
|
|
188
|
+
expect(skNumber.toAbbreviation()).toBe("1.23K");
|
|
189
|
+
|
|
190
|
+
const skNumber2 = new SwapKitNumber(1234567.5678);
|
|
191
|
+
expect(skNumber2.toAbbreviation()).toBe("1.23M");
|
|
192
|
+
|
|
193
|
+
const skNumber3 = new SwapKitNumber(1234567890.5678);
|
|
194
|
+
expect(skNumber3.toAbbreviation()).toBe("1.23B");
|
|
195
|
+
|
|
196
|
+
const skNumber4 = new SwapKitNumber("1234567890123.5678");
|
|
197
|
+
expect(skNumber4.toAbbreviation()).toBe("1.23T");
|
|
198
|
+
|
|
199
|
+
const skNumber5 = new SwapKitNumber("1234567890123456.5678");
|
|
200
|
+
expect(skNumber5.toAbbreviation()).toBe("1.23Q");
|
|
201
|
+
|
|
202
|
+
const skNumber6 = new SwapKitNumber("1234567890123456789.5678");
|
|
203
|
+
expect(skNumber6.toAbbreviation()).toBe("1.23Qi");
|
|
204
|
+
|
|
205
|
+
const skNumber7 = new SwapKitNumber("1234567890123456789012.5678");
|
|
206
|
+
expect(skNumber7.toAbbreviation()).toBe("1.23S");
|
|
207
|
+
|
|
208
|
+
const skNumber8 = new SwapKitNumber(1234.5678);
|
|
209
|
+
expect(skNumber8.toAbbreviation(0)).toBe("1K");
|
|
210
|
+
|
|
211
|
+
const skNumber9 = new SwapKitNumber(1234.5678);
|
|
212
|
+
expect(skNumber9.toAbbreviation(1)).toBe("1.2K");
|
|
213
|
+
|
|
214
|
+
const skNumber10 = new SwapKitNumber(123456.78);
|
|
215
|
+
expect(skNumber10.toAbbreviation()).toBe("123.46K");
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
describe("toCurrency", () => {
|
|
220
|
+
test("returns abbreviation with up to 3 integer digits", () => {
|
|
221
|
+
const skNumber = new SwapKitNumber(1234.5678);
|
|
222
|
+
expect(skNumber.toCurrency()).toBe("$1,234.57");
|
|
223
|
+
expect(skNumber.toCurrency("€", { currencyPosition: "end", decimalSeparator: ",", thousandSeparator: " " })).toBe(
|
|
224
|
+
"1 234,57€",
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
const skNumber2 = new SwapKitNumber(0.5678);
|
|
228
|
+
expect(skNumber2.toCurrency()).toBe("$0.5678");
|
|
229
|
+
expect(skNumber2.toCurrency("€", { currencyPosition: "end", decimalSeparator: "," })).toBe("0,5678€");
|
|
230
|
+
|
|
231
|
+
const skNumber3 = new SwapKitNumber(0.00005678);
|
|
232
|
+
expect(skNumber3.toCurrency()).toBe("$0.00005678");
|
|
233
|
+
expect(
|
|
234
|
+
skNumber3.toCurrency("€", { currencyPosition: "end", decimalSeparator: ",", thousandSeparator: " " }),
|
|
235
|
+
).toBe("0,00005678€");
|
|
236
|
+
|
|
237
|
+
const skNumber4 = new SwapKitNumber(12345);
|
|
238
|
+
expect(skNumber4.toCurrency()).toBe("$12,345");
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
describe("add", () => {
|
|
243
|
+
test("adds same type numbers correctly", () => {
|
|
244
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
245
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
246
|
+
const skNumber3 = new SwapKitNumber("0.5");
|
|
247
|
+
const result = skNumber1.add(skNumber2, skNumber3);
|
|
248
|
+
|
|
249
|
+
expect(result.getValue("string")).toBe("15.5");
|
|
250
|
+
expect(result.getBaseValue("bigint")).toBe(1550000000n);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
test("adds different type numbers correctly", () => {
|
|
254
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
255
|
+
const result = skNumber1.add(6, "0.5");
|
|
256
|
+
|
|
257
|
+
expect(result.getValue("string")).toBe("16.5");
|
|
258
|
+
expect(result.getBaseValue("bigint")).toBe(1650000000n);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test("adds large decimal numbers correctly", () => {
|
|
262
|
+
const skNumber1 = new SwapKitNumber(0.0000000001);
|
|
263
|
+
const result = skNumber1.add(6.000000000001, "0.0000000000000005");
|
|
264
|
+
expect(result.getValue("string")).toBe("6.0000000001010005");
|
|
265
|
+
expect(result.getBaseValue("bigint")).toBe(600000000n);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
describe("sub", () => {
|
|
270
|
+
test("subtracts same type numbers correctly", () => {
|
|
271
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
272
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
273
|
+
const skNumber3 = new SwapKitNumber(0.5);
|
|
274
|
+
const result = skNumber1.sub(skNumber2, skNumber3);
|
|
275
|
+
|
|
276
|
+
expect(result.getValue("string")).toBe("4.5");
|
|
277
|
+
expect(result.getBaseValue("bigint")).toBe(450000000n);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test("subtracts different type numbers correctly", () => {
|
|
281
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
282
|
+
const result = skNumber1.sub(6, "0.5");
|
|
283
|
+
|
|
284
|
+
expect(result.getValue("string")).toBe("3.5");
|
|
285
|
+
expect(result.getBaseValue("bigint")).toBe(350000000n);
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
test("can process negative results", () => {
|
|
289
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
290
|
+
const result0 = skNumber1.sub(10);
|
|
291
|
+
const resultMinus = result0.sub("10");
|
|
292
|
+
|
|
293
|
+
expect(result0.getValue("string")).toBe("0");
|
|
294
|
+
expect(resultMinus.getValue("string")).toBe("-10");
|
|
295
|
+
expect(result0.getBaseValue("bigint")).toBe(0n);
|
|
296
|
+
expect(resultMinus.getBaseValue("bigint")).toBe(-1000000000n);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
describe("mul", () => {
|
|
301
|
+
test("multiplies same type numbers correctly", () => {
|
|
302
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
303
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
304
|
+
const skNumber3 = new SwapKitNumber(0.5);
|
|
305
|
+
const result = skNumber1.mul(skNumber2, skNumber3);
|
|
306
|
+
|
|
307
|
+
expect(result.getValue("string")).toBe("25");
|
|
308
|
+
expect(result.getBaseValue("bigint")).toBe(2500000000n);
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
test("multiplies different type numbers correctly", () => {
|
|
312
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
313
|
+
const result = skNumber1.mul(6, "0.5");
|
|
314
|
+
|
|
315
|
+
expect(result.getValue("string")).toBe("30");
|
|
316
|
+
expect(result.getBaseValue("bigint")).toBe(3000000000n);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
test("multiplies numbers correctly if decimals of SKN is lower than number multiplied with", () => {
|
|
320
|
+
const skNumber1 = new SwapKitNumber({ decimal: 4, value: 1000000 });
|
|
321
|
+
const result = skNumber1.mul("0.00001");
|
|
322
|
+
|
|
323
|
+
expect(result.getValue("string")).toBe("10");
|
|
324
|
+
expect(result.getBaseValue("bigint")).toBe(100000n);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
test("should correctly round the result of multiplication", () => {
|
|
328
|
+
const skNumber1 = new SwapKitNumber({ decimal: 3, value: 1.23 });
|
|
329
|
+
const skNumber2 = new SwapKitNumber({ decimal: 4, value: 4.56 });
|
|
330
|
+
|
|
331
|
+
const result = skNumber1.mul(skNumber2);
|
|
332
|
+
|
|
333
|
+
expect(result.getValue("string")).toBe("5.609");
|
|
334
|
+
expect(result.getBaseValue("bigint")).toBe(5609n);
|
|
335
|
+
|
|
336
|
+
const skNumber3 = new SwapKitNumber({ decimal: 2, value: 1.23 });
|
|
337
|
+
const skNumber4 = new SwapKitNumber(-1.234567891);
|
|
338
|
+
|
|
339
|
+
const result2 = skNumber3.mul(skNumber4);
|
|
340
|
+
|
|
341
|
+
// The exact result of 1.23 * -1.234567891 is -1,518518505
|
|
342
|
+
// If we round it to 2 decimal places, we should get 5.61
|
|
343
|
+
expect(result2.getValue("string")).toBe("-1.52");
|
|
344
|
+
expect(result2.getBaseValue("bigint")).toBe(-152n);
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
describe("div", () => {
|
|
349
|
+
test("divides same type numbers correctly", () => {
|
|
350
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
351
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
352
|
+
const skNumber3 = new SwapKitNumber(0.5);
|
|
353
|
+
const result = skNumber1.div(skNumber2, skNumber3);
|
|
354
|
+
|
|
355
|
+
expect(result.getValue("string")).toBe("4");
|
|
356
|
+
expect(result.getBaseValue("bigint")).toBe(400000000n);
|
|
357
|
+
|
|
358
|
+
const skNumber4 = new SwapKitNumber(10.12);
|
|
359
|
+
const result2 = skNumber4.div(0.0001);
|
|
360
|
+
|
|
361
|
+
expect(result2.getValue("string")).toBe("101200");
|
|
362
|
+
expect(result2.getBaseValue("bigint")).toBe(10120000000000n);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
test("divides different type numbers correctly", () => {
|
|
366
|
+
const skNumber1 = new SwapKitNumber(20);
|
|
367
|
+
const result = skNumber1.div(5, "0.5");
|
|
368
|
+
|
|
369
|
+
expect(result.getValue("string")).toBe("8");
|
|
370
|
+
expect(result.getBaseValue("bigint")).toBe(800000000n);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
test("divides different type numbers correctly when decimal is set", () => {
|
|
374
|
+
const skNumber1 = new SwapKitNumber({ decimal: 2, value: "1.2" });
|
|
375
|
+
const result = skNumber1.div(0.001);
|
|
376
|
+
|
|
377
|
+
expect(result.getValue("string")).toBe("1200");
|
|
378
|
+
expect(result.getBaseValue("bigint")).toBe(120000n);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
test("divides smaller number by larger number", () => {
|
|
382
|
+
const skNumber1 = new SwapKitNumber(1);
|
|
383
|
+
const result = skNumber1.div(2);
|
|
384
|
+
|
|
385
|
+
expect(result.getValue("string")).toBe("0.5");
|
|
386
|
+
expect(result.getBaseValue("bigint")).toBe(50000000n);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
test("divides a number with 18 decimals by a negative number with less decimals", () => {
|
|
390
|
+
const skNumber1 = new SwapKitNumber({ decimal: 18, value: "1.000000000000000010" });
|
|
391
|
+
const skNumber2 = new SwapKitNumber({ decimal: 1, value: "-2" });
|
|
392
|
+
|
|
393
|
+
const result = skNumber1.div(skNumber2);
|
|
394
|
+
|
|
395
|
+
// The exact result of 1.000000000000000010 / -2 is -0.500000000000000005
|
|
396
|
+
expect(result.getValue("string")).toBe("-0.500000000000000005");
|
|
397
|
+
expect(result.getBaseValue("bigint")).toBe(-500000000000000005n);
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
test("divides a number with 2 decimals by a negative number with more decimals", () => {
|
|
401
|
+
const skNumber1 = new SwapKitNumber({ decimal: 2, value: "2" });
|
|
402
|
+
const skNumber2 = new SwapKitNumber({ decimal: 18, value: "-0.000005" });
|
|
403
|
+
|
|
404
|
+
const result = skNumber1.div(skNumber2);
|
|
405
|
+
|
|
406
|
+
// The exact result of 2 / -0.000005 is -400000
|
|
407
|
+
expect(result.getValue("string")).toBe("-400000");
|
|
408
|
+
expect(result.getBaseValue("bigint")).toBe(-40000000n);
|
|
409
|
+
});
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
describe("shitcoin cases", () => {
|
|
413
|
+
test("multiply huge numbers", () => {
|
|
414
|
+
const skNumber1 = new SwapKitNumber({ decimal: 18, value: 1_000_000_000_000_001 });
|
|
415
|
+
const skNumber2 = new SwapKitNumber({ decimal: 18, value: 987_654_321_000 });
|
|
416
|
+
|
|
417
|
+
const result = skNumber1.mul(skNumber2);
|
|
418
|
+
expect(result.getValue("string")).toBe("987654321000000987654321000");
|
|
419
|
+
expect(result.getBaseValue("bigint")).toBe(987654321000000987654321000000000000000000000n);
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
test("divide huge numbers", () => {
|
|
423
|
+
const skNumber1 = new SwapKitNumber({ decimal: 18, value: 1_000_000_000_000_001 });
|
|
424
|
+
const skNumber2 = new SwapKitNumber({ decimal: 18, value: 987_654_321_000 });
|
|
425
|
+
|
|
426
|
+
const result = skNumber1.div(skNumber2);
|
|
427
|
+
expect(result.getValue("string")).toBe("1012.4999999873447625");
|
|
428
|
+
expect(result.getBaseValue("bigint")).toBe(1012499999987344762500n);
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
describe("extending multiplier without loosing precision", () => {
|
|
433
|
+
test("edge case 1", () => {
|
|
434
|
+
const asset1 = new SwapKitNumber({ decimal: 8, value: 41.90963702 });
|
|
435
|
+
const multiplier = 5.337952274462478;
|
|
436
|
+
const divider = 105.2562773915526;
|
|
437
|
+
const result = asset1.mul(multiplier).div(divider);
|
|
438
|
+
|
|
439
|
+
expect(result.getValue("string")).toBe("2.12539953");
|
|
440
|
+
});
|
|
441
|
+
|
|
442
|
+
test("edge case 2", () => {
|
|
443
|
+
const asset1 = new SwapKitNumber("41.90963702");
|
|
444
|
+
const multiplier = new SwapKitNumber("5.337952274462478");
|
|
445
|
+
const divider = new SwapKitNumber("105.2562773915526");
|
|
446
|
+
const result = asset1.mul(multiplier).div(divider);
|
|
447
|
+
|
|
448
|
+
expect(result.getValue("string")).toBe("2.12539952767472630150052259932285534");
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
describe("gt", () => {
|
|
453
|
+
test("greater than", () => {
|
|
454
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
455
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
456
|
+
|
|
457
|
+
expect(skNumber1.gt(skNumber2)).toBe(true);
|
|
458
|
+
expect(skNumber2.gt(skNumber1)).toBe(false);
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
test("different decimals doesn't affect comparison", () => {
|
|
462
|
+
const skNumber1 = new SwapKitNumber({ decimal: 18, value: 10 });
|
|
463
|
+
const skNumber2 = new SwapKitNumber({ decimal: 8, value: "50" });
|
|
464
|
+
|
|
465
|
+
expect(skNumber1.lt(skNumber2)).toBe(true);
|
|
466
|
+
expect(skNumber2.gt(skNumber1)).toBe(true);
|
|
467
|
+
});
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
describe("gte", () => {
|
|
471
|
+
test("greater than or equal", () => {
|
|
472
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
473
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
474
|
+
|
|
475
|
+
expect(skNumber1.gte(skNumber2)).toBe(true);
|
|
476
|
+
expect(skNumber1.gte(skNumber1)).toBe(true);
|
|
477
|
+
expect(skNumber2.gte(skNumber1)).toBe(false);
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
describe("lt", () => {
|
|
482
|
+
test("less than", () => {
|
|
483
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
484
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
485
|
+
|
|
486
|
+
expect(skNumber1.lt(skNumber2)).toBe(false);
|
|
487
|
+
expect(skNumber2.lt(skNumber1)).toBe(true);
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
describe("lte", () => {
|
|
492
|
+
test("less than or equal", () => {
|
|
493
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
494
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
495
|
+
|
|
496
|
+
expect(skNumber1.lte(skNumber2)).toBe(false);
|
|
497
|
+
expect(skNumber1.lte(skNumber1)).toBe(true);
|
|
498
|
+
expect(skNumber2.lte(skNumber1)).toBe(true);
|
|
499
|
+
});
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
describe("eq", () => {
|
|
503
|
+
test("equal", () => {
|
|
504
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
505
|
+
const skNumber2 = new SwapKitNumber("5");
|
|
506
|
+
|
|
507
|
+
expect(skNumber1.eq(skNumber2)).toBe(false);
|
|
508
|
+
expect(skNumber1.eq(skNumber1)).toBe(true);
|
|
509
|
+
expect(skNumber2.eq(skNumber1)).toBe(false);
|
|
510
|
+
});
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
describe("comparison edge cases with decimals", () => {
|
|
514
|
+
test("compare on cut decimals", () => {
|
|
515
|
+
const skNumber1 = new SwapKitNumber({ decimal: 3, value: 0.001 });
|
|
516
|
+
const value = "0.0019";
|
|
517
|
+
|
|
518
|
+
expect(skNumber1.lt(value)).toBe(true);
|
|
519
|
+
expect(skNumber1.gt(value)).toBe(false);
|
|
520
|
+
expect(skNumber1.eq(value)).toBe(false);
|
|
521
|
+
expect(skNumber1.lte(value)).toBe(true);
|
|
522
|
+
expect(skNumber1.gte(value)).toBe(false);
|
|
523
|
+
});
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
describe("Throws", () => {
|
|
527
|
+
test("throws if division by zero", () => {
|
|
528
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
529
|
+
const skNumber2 = new SwapKitNumber("0");
|
|
530
|
+
|
|
531
|
+
expect(() => skNumber1.div(skNumber2)).toThrow(RangeError);
|
|
532
|
+
expect(() => skNumber1.div(0)).toThrow(RangeError);
|
|
533
|
+
});
|
|
534
|
+
});
|
|
535
|
+
});
|