@swapkit/helpers 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +326 -0
- package/dist/index.es-8503fb04.js +34669 -0
- package/dist/index.es-903b9173.cjs +1 -0
- package/dist/index.es.js +651 -0
- package/package.json +49 -0
- package/src/helpers/__tests__/asset.test.ts +157 -0
- package/src/helpers/__tests__/memo.test.ts +79 -0
- package/src/helpers/__tests__/others.test.ts +59 -0
- package/src/helpers/asset.ts +177 -0
- package/src/helpers/liquidity.ts +157 -0
- package/src/helpers/memo.ts +90 -0
- package/src/helpers/number.ts +40 -0
- package/src/helpers/others.ts +59 -0
- package/src/helpers/validators.ts +17 -0
- package/src/index.ts +15 -0
- package/src/modules/__tests__/assetValue.test.ts +285 -0
- package/src/modules/__tests__/swapKitNumber.test.ts +331 -0
- package/src/modules/assetValue.ts +236 -0
- package/src/modules/bigIntArithmetics.ts +259 -0
- package/src/modules/swapKitError.ts +70 -0
- package/src/modules/swapKitNumber.ts +13 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { SwapKitNumber } from '../swapKitNumber.ts';
|
|
4
|
+
|
|
5
|
+
describe('SwapKitNumber', () => {
|
|
6
|
+
describe('constructors', () => {
|
|
7
|
+
test('creates numbers correctly', () => {
|
|
8
|
+
const skNumber1 = new SwapKitNumber(1);
|
|
9
|
+
expect(skNumber1.value).toBe('1');
|
|
10
|
+
expect(skNumber1.bigIntValue).toBe(100000000n);
|
|
11
|
+
|
|
12
|
+
const skNumber2 = new SwapKitNumber('1');
|
|
13
|
+
expect(skNumber2.value).toBe('1');
|
|
14
|
+
expect(skNumber2.bigIntValue).toBe(100000000n);
|
|
15
|
+
|
|
16
|
+
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');
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('creates SwapKitInstance from BigInt: (12.345678901234, decimals: 12)', () => {
|
|
38
|
+
const skNumber = SwapKitNumber.fromBigInt(12345678901234n, 12);
|
|
39
|
+
|
|
40
|
+
expect(skNumber.value).toBe('12.345678901234');
|
|
41
|
+
expect(skNumber.bigIntValue).toBe(12345678901234n);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('shiftDecimals', () => {
|
|
46
|
+
test('shifts up and bumps number', () => {
|
|
47
|
+
const skNumber = new SwapKitNumber(1);
|
|
48
|
+
expect(skNumber.value).toBe('1');
|
|
49
|
+
expect(skNumber.bigIntValue).toBe(100000000n);
|
|
50
|
+
|
|
51
|
+
const shiftedSkNumber = SwapKitNumber.shiftDecimals({
|
|
52
|
+
value: skNumber,
|
|
53
|
+
from: 6,
|
|
54
|
+
to: 8,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
expect(shiftedSkNumber.value).toBe('100');
|
|
58
|
+
expect(shiftedSkNumber.bigIntValue).toBe(10000000000n);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test.skip('shifts down and rounds down number', () => {
|
|
62
|
+
const skNumber = new SwapKitNumber(2.12345678);
|
|
63
|
+
expect(skNumber.value).toBe('2.12345678');
|
|
64
|
+
expect(skNumber.bigIntValue).toBe(212345678n);
|
|
65
|
+
|
|
66
|
+
const shiftedSkNumber = SwapKitNumber.shiftDecimals({
|
|
67
|
+
value: skNumber,
|
|
68
|
+
from: 8,
|
|
69
|
+
to: 6,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
expect(shiftedSkNumber.value).toBe('2.123456');
|
|
73
|
+
expect(shiftedSkNumber.bigIntValue).toBe(2123456n);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('add', () => {
|
|
78
|
+
test('adds same type numbers correctly', () => {
|
|
79
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
80
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
81
|
+
const skNumber3 = new SwapKitNumber('0.5');
|
|
82
|
+
const result = skNumber1.add(skNumber2, skNumber3);
|
|
83
|
+
|
|
84
|
+
expect(result.value).toBe('15.5');
|
|
85
|
+
expect(result.bigIntValue).toBe(1550000000n);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test('adds different type numbers correctly', () => {
|
|
89
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
90
|
+
const result = skNumber1.add(6, '0.5');
|
|
91
|
+
|
|
92
|
+
expect(result.value).toBe('16.5');
|
|
93
|
+
expect(result.bigIntValue).toBe(1650000000n);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('adds large decimal numbers correctly', () => {
|
|
97
|
+
const skNumber1 = new SwapKitNumber(0.0000000001);
|
|
98
|
+
const result = skNumber1.add(6.000000000001, '0.0000000000000005');
|
|
99
|
+
expect(result.value).toBe('6.0000000001010005');
|
|
100
|
+
expect(result.bigIntValue).toBe(60000000001010005n);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe('sub', () => {
|
|
105
|
+
test('subtracts same type numbers correctly', () => {
|
|
106
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
107
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
108
|
+
const skNumber3 = new SwapKitNumber(0.5);
|
|
109
|
+
const result = skNumber1.sub(skNumber2, skNumber3);
|
|
110
|
+
|
|
111
|
+
expect(result.value).toBe('4.5');
|
|
112
|
+
expect(result.bigIntValue).toBe(450000000n);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
test('subtracts different type numbers correctly', () => {
|
|
116
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
117
|
+
const result = skNumber1.sub(6, '0.5');
|
|
118
|
+
|
|
119
|
+
expect(result.value).toBe('3.5');
|
|
120
|
+
expect(result.bigIntValue).toBe(350000000n);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test('can process negative results', () => {
|
|
124
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
125
|
+
const result0 = skNumber1.sub(10);
|
|
126
|
+
const resultMinus = result0.sub('10');
|
|
127
|
+
|
|
128
|
+
expect(result0.value).toBe('0');
|
|
129
|
+
expect(resultMinus.value).toBe('-10');
|
|
130
|
+
expect(result0.bigIntValue).toBe(0n);
|
|
131
|
+
expect(resultMinus.bigIntValue).toBe(-1000000000n);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
describe('mul', () => {
|
|
136
|
+
test('multiplies same type numbers correctly', () => {
|
|
137
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
138
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
139
|
+
const skNumber3 = new SwapKitNumber(0.5);
|
|
140
|
+
const result = skNumber1.mul(skNumber2, skNumber3);
|
|
141
|
+
|
|
142
|
+
expect(result.value).toBe('25');
|
|
143
|
+
expect(result.bigIntValue).toBe(2500000000n);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test('multiplies different type numbers correctly', () => {
|
|
147
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
148
|
+
const result = skNumber1.mul(6, '0.5');
|
|
149
|
+
|
|
150
|
+
expect(result.value).toBe('30');
|
|
151
|
+
expect(result.bigIntValue).toBe(3000000000n);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test('multiplies numbers correctly if decimals of SKN is lower than number multiplied with', () => {
|
|
155
|
+
const skNumber1 = new SwapKitNumber({ value: 1000000, decimal: 4 });
|
|
156
|
+
const result = skNumber1.mul('0.00001');
|
|
157
|
+
|
|
158
|
+
expect(result.value).toBe('10');
|
|
159
|
+
expect(result.bigIntValue).toBe(1000000000n);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test('should correctly round the result of multiplication', () => {
|
|
163
|
+
const skNumber1 = new SwapKitNumber({ decimal: 2, value: 1.23 });
|
|
164
|
+
const skNumber2 = new SwapKitNumber({ decimal: 4, value: 4.56 });
|
|
165
|
+
|
|
166
|
+
const result = skNumber1.mul(skNumber2);
|
|
167
|
+
|
|
168
|
+
// The exact result of 1.23 * 4.56 is 5.6088
|
|
169
|
+
// 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);
|
|
172
|
+
|
|
173
|
+
const skNumber3 = new SwapKitNumber({ decimal: 2, value: 1.23 });
|
|
174
|
+
const skNumber4 = new SwapKitNumber(-1.234567891);
|
|
175
|
+
|
|
176
|
+
const result2 = skNumber3.mul(skNumber4);
|
|
177
|
+
|
|
178
|
+
// The exact result of 1.23 * -1.234567891 is -1,518518505
|
|
179
|
+
// 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);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe('div', () => {
|
|
186
|
+
test('divides same type numbers correctly', () => {
|
|
187
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
188
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
189
|
+
const skNumber3 = new SwapKitNumber(0.5);
|
|
190
|
+
const result = skNumber1.div(skNumber2, skNumber3);
|
|
191
|
+
|
|
192
|
+
expect(result.value).toBe('4');
|
|
193
|
+
expect(result.bigIntValue).toBe(400000000n);
|
|
194
|
+
|
|
195
|
+
const skNumber4 = new SwapKitNumber(10.12);
|
|
196
|
+
const result2 = skNumber4.div(0.0001);
|
|
197
|
+
|
|
198
|
+
expect(result2.value).toBe('101200');
|
|
199
|
+
expect(result2.bigIntValue).toBe(10120000000000n);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test('divides different type numbers correctly', () => {
|
|
203
|
+
const skNumber1 = new SwapKitNumber(20);
|
|
204
|
+
const result = skNumber1.div(5, '0.5');
|
|
205
|
+
|
|
206
|
+
expect(result.value).toBe('8');
|
|
207
|
+
expect(result.bigIntValue).toBe(800000000n);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
test('divides different type numbers correctly when decimal is set', () => {
|
|
211
|
+
const skNumber1 = new SwapKitNumber({ value: '1.2', decimal: 2 });
|
|
212
|
+
const result = skNumber1.div(0.001);
|
|
213
|
+
|
|
214
|
+
expect(result.value).toBe('1200');
|
|
215
|
+
expect(result.bigIntValue).toBe(120000000000n);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
test('divides smaller number by larger number', () => {
|
|
219
|
+
const skNumber1 = new SwapKitNumber(1);
|
|
220
|
+
const result = skNumber1.div(2);
|
|
221
|
+
|
|
222
|
+
expect(result.value).toBe('0.5');
|
|
223
|
+
expect(result.bigIntValue).toBe(50000000n);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test('divides a number with 18 decimals by a negative number with less decimals', () => {
|
|
227
|
+
const skNumber1 = new SwapKitNumber({ value: '1.000000000000000010', decimal: 18 });
|
|
228
|
+
const skNumber2 = new SwapKitNumber({ value: '-2', decimal: 1 });
|
|
229
|
+
|
|
230
|
+
const result = skNumber1.div(skNumber2);
|
|
231
|
+
|
|
232
|
+
// The exact result of 1.000000000000000010 / -2 is -0.500000000000000005
|
|
233
|
+
expect(result.value).toBe('-0.500000000000000005');
|
|
234
|
+
expect(result.bigIntValue).toBe(-500000000000000005n);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test('divides a number with 2 decimals by a negative number with more decimals', () => {
|
|
238
|
+
const skNumber1 = new SwapKitNumber({ value: '2', decimal: 2 });
|
|
239
|
+
const skNumber2 = new SwapKitNumber({ value: '-0.000005', decimal: 18 });
|
|
240
|
+
|
|
241
|
+
const result = skNumber1.div(skNumber2);
|
|
242
|
+
|
|
243
|
+
// The exact result of 2 / -0.000005 is -400000
|
|
244
|
+
expect(result.value).toBe('-400000');
|
|
245
|
+
expect(result.bigIntValue).toBe(-40000000000000n);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
describe('shitcoin cases', () => {
|
|
250
|
+
test('multiply huge numbers', () => {
|
|
251
|
+
const skNumber1 = new SwapKitNumber({ value: 1_000_000_000_000_001, decimal: 18 });
|
|
252
|
+
const skNumber2 = new SwapKitNumber({ value: 987_654_321_000, decimal: 18 });
|
|
253
|
+
|
|
254
|
+
const result = skNumber1.mul(skNumber2);
|
|
255
|
+
expect(result.value).toBe('987654321000000987654321000');
|
|
256
|
+
expect(result.bigIntValue).toBe(987654321000000987654321000000000000000000000n);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test('divide huge numbers', () => {
|
|
260
|
+
const skNumber1 = new SwapKitNumber({ value: 1_000_000_000_000_001, decimal: 18 });
|
|
261
|
+
const skNumber2 = new SwapKitNumber({ value: 987_654_321_000, decimal: 18 });
|
|
262
|
+
|
|
263
|
+
const result = skNumber1.div(skNumber2);
|
|
264
|
+
expect(result.value).toBe('1012.4999999873447625');
|
|
265
|
+
expect(result.bigIntValue).toBe(1012499999987344762500n);
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
describe('gt', () => {
|
|
270
|
+
test('greater than', () => {
|
|
271
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
272
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
273
|
+
|
|
274
|
+
expect(skNumber1.gt(skNumber2)).toBe(true);
|
|
275
|
+
expect(skNumber2.gt(skNumber1)).toBe(false);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
describe('gte', () => {
|
|
280
|
+
test('greater than or equal', () => {
|
|
281
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
282
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
283
|
+
|
|
284
|
+
expect(skNumber1.gte(skNumber2)).toBe(true);
|
|
285
|
+
expect(skNumber1.gte(skNumber1)).toBe(true);
|
|
286
|
+
expect(skNumber2.gte(skNumber1)).toBe(false);
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
describe('lt', () => {
|
|
291
|
+
test('less than', () => {
|
|
292
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
293
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
294
|
+
|
|
295
|
+
expect(skNumber1.lt(skNumber2)).toBe(false);
|
|
296
|
+
expect(skNumber2.lt(skNumber1)).toBe(true);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
describe('lte', () => {
|
|
301
|
+
test('less than or equal', () => {
|
|
302
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
303
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
304
|
+
|
|
305
|
+
expect(skNumber1.lte(skNumber2)).toBe(false);
|
|
306
|
+
expect(skNumber1.lte(skNumber1)).toBe(true);
|
|
307
|
+
expect(skNumber2.lte(skNumber1)).toBe(true);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
describe('eq', () => {
|
|
312
|
+
test('equal', () => {
|
|
313
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
314
|
+
const skNumber2 = new SwapKitNumber('5');
|
|
315
|
+
|
|
316
|
+
expect(skNumber1.eq(skNumber2)).toBe(false);
|
|
317
|
+
expect(skNumber1.eq(skNumber1)).toBe(true);
|
|
318
|
+
expect(skNumber2.eq(skNumber1)).toBe(false);
|
|
319
|
+
});
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
describe('Throws', () => {
|
|
323
|
+
test('throws if division by zero', () => {
|
|
324
|
+
const skNumber1 = new SwapKitNumber(10);
|
|
325
|
+
const skNumber2 = new SwapKitNumber('0');
|
|
326
|
+
|
|
327
|
+
expect(() => skNumber1.div(skNumber2)).toThrow(RangeError);
|
|
328
|
+
expect(() => skNumber1.div(0)).toThrow(RangeError);
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
});
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CoinGeckoList,
|
|
3
|
+
MayaList,
|
|
4
|
+
PancakeswapETHList,
|
|
5
|
+
PancakeswapList,
|
|
6
|
+
PangolinList,
|
|
7
|
+
StargateARBList,
|
|
8
|
+
SushiswapList,
|
|
9
|
+
ThorchainList,
|
|
10
|
+
TraderjoeList,
|
|
11
|
+
UniswapList,
|
|
12
|
+
WoofiList,
|
|
13
|
+
} from '@swapkit/tokens';
|
|
14
|
+
import { BaseDecimal, Chain } from '@swapkit/types';
|
|
15
|
+
|
|
16
|
+
import type { CommonAssetString } from '../helpers/asset.ts';
|
|
17
|
+
import { getAssetType, getCommonAssetInfo, getDecimal, isGasAsset } from '../helpers/asset.ts';
|
|
18
|
+
import { validateIdentifier } from '../helpers/validators.ts';
|
|
19
|
+
|
|
20
|
+
import { BigIntArithmetics } from './bigIntArithmetics.ts';
|
|
21
|
+
import type { SwapKitValueType } from './swapKitNumber.ts';
|
|
22
|
+
|
|
23
|
+
type AssetValueParams = { decimal: number; value: SwapKitValueType } & (
|
|
24
|
+
| { chain: Chain; symbol: string }
|
|
25
|
+
| { identifier: string }
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
type TCTokenNames = (typeof ThorchainList)['tokens'][number]['identifier'];
|
|
29
|
+
|
|
30
|
+
type TokenNames =
|
|
31
|
+
| TCTokenNames
|
|
32
|
+
| (typeof CoinGeckoList)['tokens'][number]['identifier']
|
|
33
|
+
| (typeof MayaList)['tokens'][number]['identifier']
|
|
34
|
+
| (typeof PancakeswapETHList)['tokens'][number]['identifier']
|
|
35
|
+
| (typeof PancakeswapList)['tokens'][number]['identifier']
|
|
36
|
+
| (typeof PangolinList)['tokens'][number]['identifier']
|
|
37
|
+
| (typeof StargateARBList)['tokens'][number]['identifier']
|
|
38
|
+
| (typeof SushiswapList)['tokens'][number]['identifier']
|
|
39
|
+
| (typeof TraderjoeList)['tokens'][number]['identifier']
|
|
40
|
+
| (typeof WoofiList)['tokens'][number]['identifier']
|
|
41
|
+
| (typeof UniswapList)['tokens'][number]['identifier'];
|
|
42
|
+
|
|
43
|
+
let staticTokensMap: Map<TokenNames, { decimal: number; identifier: string }> | undefined;
|
|
44
|
+
|
|
45
|
+
const getStaticToken = (identifier: TokenNames) => {
|
|
46
|
+
if (!staticTokensMap) {
|
|
47
|
+
throw new Error('Static assets not loaded, call await AssetValue.loadStaticAssets() first');
|
|
48
|
+
}
|
|
49
|
+
const tokenInfo = staticTokensMap.get(identifier.toUpperCase() as TokenNames);
|
|
50
|
+
|
|
51
|
+
return tokenInfo || { decimal: BaseDecimal.THOR, identifier: '' };
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const createAssetValue = async (assetString: string, value: number | string = 0) => {
|
|
55
|
+
validateIdentifier(assetString);
|
|
56
|
+
|
|
57
|
+
const decimal = await getDecimal(getAssetInfo(assetString));
|
|
58
|
+
return new AssetValue({ decimal, value, identifier: assetString });
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export class AssetValue extends BigIntArithmetics {
|
|
62
|
+
static async fromString(assetString: string, value: number | string = 0) {
|
|
63
|
+
return createAssetValue(assetString, value);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
static fromStringSync(assetString: string, value: number | string = 0) {
|
|
67
|
+
const { decimal, identifier: tokenIdentifier } = getStaticToken(
|
|
68
|
+
assetString as unknown as TokenNames,
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return tokenIdentifier
|
|
72
|
+
? new AssetValue({ decimal, identifier: tokenIdentifier, value })
|
|
73
|
+
: undefined;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static async fromIdentifier(
|
|
77
|
+
assetString: `${Chain}.${string}` | `${Chain}/${string}` | `${Chain}.${string}-${string}`,
|
|
78
|
+
value: number | string = 0,
|
|
79
|
+
) {
|
|
80
|
+
return createAssetValue(assetString, value);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static fromIdentifierSync(identifier: TokenNames, value: number | string = 0) {
|
|
84
|
+
const { decimal, identifier: tokenIdentifier } = getStaticToken(identifier);
|
|
85
|
+
|
|
86
|
+
return new AssetValue({ decimal, identifier: tokenIdentifier, value });
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static fromChainOrSignature(assetString: CommonAssetString, value: number | string = 0) {
|
|
90
|
+
const { decimal, identifier } = getCommonAssetInfo(assetString);
|
|
91
|
+
|
|
92
|
+
return new AssetValue({ value, decimal, identifier });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
static async fromTCQuote(identifier: TCTokenNames, value: number | string = 0) {
|
|
96
|
+
const decimal = await getDecimal(getAssetInfo(identifier));
|
|
97
|
+
const shiftedValue = this.shiftDecimals({ value, from: BaseDecimal.THOR, to: decimal });
|
|
98
|
+
|
|
99
|
+
return new AssetValue({ value: shiftedValue, identifier, decimal });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
static fromTCQuoteStatic(identifier: TCTokenNames, value: number | string = 0) {
|
|
103
|
+
const tokenInfo = getStaticToken(identifier);
|
|
104
|
+
const shiftedValue = this.shiftDecimals({
|
|
105
|
+
value,
|
|
106
|
+
from: BaseDecimal.THOR,
|
|
107
|
+
to: tokenInfo.decimal,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
return new AssetValue({ ...tokenInfo, value: shiftedValue });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static async loadStaticAssets() {
|
|
114
|
+
return new Promise<{ ok: true } | { ok: false; message: string; error: any }>(
|
|
115
|
+
async (resolve, reject) => {
|
|
116
|
+
try {
|
|
117
|
+
const {
|
|
118
|
+
// Omit ThorchainList from import to avoid decimals conflict (TC uses 8 for all)
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
120
|
+
ThorchainList: _ThorchainList,
|
|
121
|
+
NativeList,
|
|
122
|
+
...tokensPackage
|
|
123
|
+
} = await import('@swapkit/tokens');
|
|
124
|
+
const tokensMap = [NativeList, ...Object.values(tokensPackage)].reduce(
|
|
125
|
+
(acc, { tokens }) => {
|
|
126
|
+
tokens.forEach(({ identifier, chain, ...rest }) => {
|
|
127
|
+
const decimal = 'decimals' in rest ? rest.decimals : BaseDecimal[chain as Chain];
|
|
128
|
+
|
|
129
|
+
acc.set(identifier as TokenNames, { identifier, decimal });
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
return acc;
|
|
133
|
+
},
|
|
134
|
+
new Map<TokenNames, { decimal: number; identifier: string }>(),
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
staticTokensMap = tokensMap;
|
|
138
|
+
|
|
139
|
+
resolve({ ok: true });
|
|
140
|
+
} catch (error) {
|
|
141
|
+
console.error(error);
|
|
142
|
+
reject({
|
|
143
|
+
ok: false,
|
|
144
|
+
error,
|
|
145
|
+
message:
|
|
146
|
+
"Couldn't load static assets. Ensure you have installed @swapkit/tokens package",
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
address?: string;
|
|
154
|
+
chain: Chain;
|
|
155
|
+
isSynthetic = false;
|
|
156
|
+
isGasAsset = false;
|
|
157
|
+
symbol: string;
|
|
158
|
+
ticker: string;
|
|
159
|
+
type: ReturnType<typeof getAssetType>;
|
|
160
|
+
|
|
161
|
+
constructor(params: AssetValueParams) {
|
|
162
|
+
super(
|
|
163
|
+
params.value instanceof BigIntArithmetics
|
|
164
|
+
? params.value
|
|
165
|
+
: { decimal: params.decimal, value: params.value },
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const identifier =
|
|
169
|
+
'identifier' in params ? params.identifier : `${params.chain}.${params.symbol}`;
|
|
170
|
+
const assetInfo = getAssetInfo(identifier);
|
|
171
|
+
|
|
172
|
+
this.type = getAssetType(assetInfo);
|
|
173
|
+
this.chain = assetInfo.chain;
|
|
174
|
+
this.ticker = assetInfo.ticker;
|
|
175
|
+
this.symbol = assetInfo.symbol;
|
|
176
|
+
this.address = assetInfo.address;
|
|
177
|
+
this.isSynthetic = assetInfo.isSynthetic;
|
|
178
|
+
this.isGasAsset = assetInfo.isGasAsset;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
get assetValue() {
|
|
182
|
+
return `${this.value} ${this.ticker}`;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
toString() {
|
|
186
|
+
return `${this.chain}.${this.symbol}`;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
eq({ chain, symbol }: { chain: Chain; symbol: string }) {
|
|
190
|
+
return this.chain === chain && this.symbol === symbol;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export const getMinAmountByChain = (chain: Chain) => {
|
|
195
|
+
const asset = AssetValue.fromChainOrSignature(chain);
|
|
196
|
+
|
|
197
|
+
switch (chain) {
|
|
198
|
+
case Chain.Bitcoin:
|
|
199
|
+
case Chain.Litecoin:
|
|
200
|
+
case Chain.BitcoinCash:
|
|
201
|
+
return asset.add(10001);
|
|
202
|
+
|
|
203
|
+
case Chain.Dogecoin:
|
|
204
|
+
return asset.add(100000001);
|
|
205
|
+
|
|
206
|
+
case Chain.Avalanche:
|
|
207
|
+
case Chain.Ethereum:
|
|
208
|
+
return asset.add(10 * 10 ** 9);
|
|
209
|
+
|
|
210
|
+
case Chain.THORChain:
|
|
211
|
+
case Chain.Maya:
|
|
212
|
+
return asset.add(0);
|
|
213
|
+
|
|
214
|
+
default:
|
|
215
|
+
return asset.add(1);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const getAssetInfo = (identifier: string) => {
|
|
220
|
+
const isSynthetic = identifier.slice(0, 14).includes('/');
|
|
221
|
+
const adjustedIdentifier = identifier.includes('.')
|
|
222
|
+
? identifier
|
|
223
|
+
: `${Chain.THORChain}.${identifier}`;
|
|
224
|
+
|
|
225
|
+
const [chain, symbol] = adjustedIdentifier.split('.') as [Chain, string];
|
|
226
|
+
const [ticker, address] = symbol.split('-') as [string, string?];
|
|
227
|
+
|
|
228
|
+
return {
|
|
229
|
+
address: address?.toLowerCase(),
|
|
230
|
+
chain,
|
|
231
|
+
isGasAsset: isGasAsset({ chain, symbol }),
|
|
232
|
+
isSynthetic,
|
|
233
|
+
symbol: address ? `${ticker}-${address?.toLowerCase() ?? ''}` : symbol,
|
|
234
|
+
ticker: isSynthetic ? symbol : ticker,
|
|
235
|
+
};
|
|
236
|
+
};
|