@galacticcouncil/sdk 0.0.1-beta.7 → 0.0.1-beta.8

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.esm.js CHANGED
@@ -1,2128 +1,2 @@
1
- // src/utils/queue.ts
2
- var Queue = class {
3
- constructor(capacity = Infinity) {
4
- this.capacity = capacity;
5
- }
6
- storage = [];
7
- enqueue(item) {
8
- if (this.size() === this.capacity) {
9
- throw Error("Queue has reached max capacity, you cannot add more items");
10
- }
11
- this.storage.push(item);
12
- }
13
- dequeue() {
14
- return this.storage.shift();
15
- }
16
- size() {
17
- return this.storage.length;
18
- }
19
- };
20
-
21
- // src/suggester/bfs.ts
22
- var Bfs = class {
23
- isNotVisited(x, path) {
24
- let notVisited = true;
25
- path.forEach((pv) => {
26
- if (pv[0] === x) {
27
- notVisited = false;
28
- }
29
- });
30
- return notVisited;
31
- }
32
- findPaths(g, src, dst) {
33
- const paths = [];
34
- const queue = new Queue();
35
- const currentPath = [];
36
- currentPath.push([src, ""]);
37
- queue.enqueue(currentPath);
38
- while (queue.size() > 0) {
39
- const path = queue.dequeue();
40
- if (path == null) {
41
- return paths;
42
- }
43
- const last = path[path.length - 1];
44
- if (dst === null) {
45
- paths.push(path);
46
- } else if (last[0] === dst) {
47
- paths.push(path);
48
- }
49
- const lastNode = g[last[0]];
50
- lastNode.forEach((segment) => {
51
- if (this.isNotVisited(segment[0], path)) {
52
- const newpath = [...path];
53
- newpath.push(segment);
54
- queue.enqueue(newpath);
55
- }
56
- });
57
- }
58
- return paths;
59
- }
60
- buildAndPopulateGraph(nodes, edges) {
61
- const graph = [];
62
- for (let j = 0; j < nodes.length; j++) {
63
- graph.push([]);
64
- }
65
- for (const [address, from, to] of edges) {
66
- const fromNumber = parseInt(from);
67
- const toNumber = parseInt(to);
68
- graph[fromNumber].push([toNumber, address]);
69
- }
70
- return graph;
71
- }
72
- };
73
-
74
- // src/suggester/graph.ts
75
- function getNodesAndEdges(pools) {
76
- const edgesFromNode = {};
77
- for (const pool of pools) {
78
- const n = pool.tokens.length;
79
- for (let i = 0; i < n; i++) {
80
- if (!edgesFromNode[pool.tokens[i].id]) {
81
- edgesFromNode[pool.tokens[i].id] = [];
82
- }
83
- for (let j = 0; j < n; j++) {
84
- if (i == j)
85
- continue;
86
- const edge = [pool.address, pool.tokens[i].id, pool.tokens[j].id];
87
- edgesFromNode[pool.tokens[i].id].push(edge);
88
- }
89
- }
90
- }
91
- return edgesFromNode;
92
- }
93
-
94
- // src/suggester/suggester.ts
95
- var RouteSuggester = class {
96
- getProposals(tokenIn, tokenOut, pools) {
97
- const nodeEdges = getNodesAndEdges(pools);
98
- const poolAssets = Object.keys(nodeEdges);
99
- const possiblePairs = poolAssets.map((node) => nodeEdges[node]).flat();
100
- const bfs = new Bfs();
101
- const bfsGraph = bfs.buildAndPopulateGraph(poolAssets, possiblePairs);
102
- const possiblePaths = bfs.findPaths(
103
- bfsGraph,
104
- parseInt(tokenIn),
105
- tokenOut ? parseInt(tokenOut) : null
106
- );
107
- return this.parsePaths(possiblePaths);
108
- }
109
- parsePaths(possiblePaths) {
110
- const paths = [];
111
- for (const path of possiblePaths) {
112
- const edges = [];
113
- for (let i = 0; i < path.length; i++) {
114
- const from = path[i];
115
- const to = path[i + 1];
116
- if (to == null) {
117
- break;
118
- } else {
119
- edges.push(this.toEdge(from, to));
120
- }
121
- }
122
- paths.push(edges);
123
- }
124
- return paths;
125
- }
126
- toEdge(from, to) {
127
- return [to[1], from[0].toString(), to[0].toString()];
128
- }
129
- };
130
-
131
- // src/client/polkadot.ts
132
- var PolkadotClient = class {
133
- api;
134
- constructor(api) {
135
- this.api = api;
136
- }
137
- getStorageKey(asset, index) {
138
- return asset[0].toHuman()[index];
139
- }
140
- getStorageEntryArray(asset) {
141
- return asset[1].toHuman();
142
- }
143
- async getAssetMetadata(tokenKey) {
144
- return await this.api.query.assetRegistry.assetMetadataMap(
145
- tokenKey
146
- );
147
- }
148
- async getSystemAccountBalance(accountId) {
149
- const {
150
- data: { free }
151
- } = await this.api.query.system.account(accountId);
152
- return free.toString();
153
- }
154
- async getTokenAccountBalance(accountId, tokenKey) {
155
- const { free } = await this.api.query.tokens.accounts(
156
- accountId,
157
- tokenKey
158
- );
159
- return free.toString();
160
- }
161
- };
162
-
163
- // src/types.ts
164
- var PoolType = /* @__PURE__ */ ((PoolType2) => {
165
- PoolType2["XYK"] = "XYK";
166
- PoolType2["LBP"] = "LBP";
167
- PoolType2["Stable"] = "Stable";
168
- PoolType2["Omni"] = "Omni";
169
- return PoolType2;
170
- })(PoolType || {});
171
-
172
- // src/pool/xyk/xykPolkadotClient.ts
173
- var XykPolkadotClient = class extends PolkadotClient {
174
- async getPools() {
175
- const poolAssets = await this.api.query.xyk.poolAssets.entries();
176
- const pools = poolAssets.map(
177
- async (asset) => {
178
- const poolAddress = this.getStorageKey(asset, 0);
179
- const poolEntries = this.getStorageEntryArray(asset);
180
- const poolTokens = await this.getPoolTokens(poolAddress, poolEntries);
181
- return {
182
- address: poolAddress,
183
- type: "XYK" /* XYK */,
184
- swapFee: this.getSwapFee(),
185
- tokens: poolTokens
186
- };
187
- }
188
- );
189
- return Promise.all(pools);
190
- }
191
- async getPoolTokens(poolAddress, assetKeys) {
192
- const poolTokens = assetKeys.map(async (id) => {
193
- const balance = await this.getBalance(poolAddress, id);
194
- const metadata = await super.getAssetMetadata(id);
195
- const metadataJson = metadata.toHuman();
196
- return {
197
- id,
198
- balance,
199
- decimals: metadataJson ? metadataJson.decimals : "12",
200
- symbol: metadataJson ? metadataJson.symbol : "BSX"
201
- };
202
- });
203
- return Promise.all(poolTokens);
204
- }
205
- getBalance(poolAddress, assetKey) {
206
- if (assetKey === "0") {
207
- return this.getSystemAccountBalance(poolAddress);
208
- } else {
209
- return this.getTokenAccountBalance(poolAddress, assetKey);
210
- }
211
- }
212
- getSwapFee() {
213
- const exchangeFee = this.api.consts.xyk.getExchangeFee;
214
- return (exchangeFee[0].toNumber() / exchangeFee[1].toNumber() * 100).toString();
215
- }
216
- };
217
-
218
- // src/pool/polkadotPoolService.ts
219
- var PolkadotPoolService = class {
220
- api;
221
- constructor(api) {
222
- this.api = api;
223
- }
224
- async getPools() {
225
- const pools = [];
226
- const xykPools = await new XykPolkadotClient(this.api).getPools();
227
- pools.push(xykPools);
228
- return pools.flat();
229
- }
230
- };
231
-
232
- // node_modules/bignumber.js/bignumber.mjs
233
- var isNumeric = /^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
234
- var mathceil = Math.ceil;
235
- var mathfloor = Math.floor;
236
- var bignumberError = "[BigNumber Error] ";
237
- var tooManyDigits = bignumberError + "Number primitive has more than 15 significant digits: ";
238
- var BASE = 1e14;
239
- var LOG_BASE = 14;
240
- var MAX_SAFE_INTEGER = 9007199254740991;
241
- var POWS_TEN = [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13];
242
- var SQRT_BASE = 1e7;
243
- var MAX = 1e9;
244
- function clone(configObject) {
245
- var div, convertBase, parseNumeric, P = BigNumber4.prototype = { constructor: BigNumber4, toString: null, valueOf: null }, ONE2 = new BigNumber4(1), DECIMAL_PLACES2 = 20, ROUNDING_MODE = 4, TO_EXP_NEG = -7, TO_EXP_POS = 21, MIN_EXP = -1e7, MAX_EXP = 1e7, CRYPTO = false, MODULO_MODE = 1, POW_PRECISION = 0, FORMAT = {
246
- prefix: "",
247
- groupSize: 3,
248
- secondaryGroupSize: 0,
249
- groupSeparator: ",",
250
- decimalSeparator: ".",
251
- fractionGroupSize: 0,
252
- fractionGroupSeparator: "\xA0",
253
- suffix: ""
254
- }, ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyz", alphabetHasNormalDecimalDigits = true;
255
- function BigNumber4(v, b) {
256
- var alphabet, c, caseChanged, e, i, isNum, len, str, x = this;
257
- if (!(x instanceof BigNumber4))
258
- return new BigNumber4(v, b);
259
- if (b == null) {
260
- if (v && v._isBigNumber === true) {
261
- x.s = v.s;
262
- if (!v.c || v.e > MAX_EXP) {
263
- x.c = x.e = null;
264
- } else if (v.e < MIN_EXP) {
265
- x.c = [x.e = 0];
266
- } else {
267
- x.e = v.e;
268
- x.c = v.c.slice();
269
- }
270
- return;
271
- }
272
- if ((isNum = typeof v == "number") && v * 0 == 0) {
273
- x.s = 1 / v < 0 ? (v = -v, -1) : 1;
274
- if (v === ~~v) {
275
- for (e = 0, i = v; i >= 10; i /= 10, e++)
276
- ;
277
- if (e > MAX_EXP) {
278
- x.c = x.e = null;
279
- } else {
280
- x.e = e;
281
- x.c = [v];
282
- }
283
- return;
284
- }
285
- str = String(v);
286
- } else {
287
- if (!isNumeric.test(str = String(v)))
288
- return parseNumeric(x, str, isNum);
289
- x.s = str.charCodeAt(0) == 45 ? (str = str.slice(1), -1) : 1;
290
- }
291
- if ((e = str.indexOf(".")) > -1)
292
- str = str.replace(".", "");
293
- if ((i = str.search(/e/i)) > 0) {
294
- if (e < 0)
295
- e = i;
296
- e += +str.slice(i + 1);
297
- str = str.substring(0, i);
298
- } else if (e < 0) {
299
- e = str.length;
300
- }
301
- } else {
302
- intCheck(b, 2, ALPHABET.length, "Base");
303
- if (b == 10 && alphabetHasNormalDecimalDigits) {
304
- x = new BigNumber4(v);
305
- return round(x, DECIMAL_PLACES2 + x.e + 1, ROUNDING_MODE);
306
- }
307
- str = String(v);
308
- if (isNum = typeof v == "number") {
309
- if (v * 0 != 0)
310
- return parseNumeric(x, str, isNum, b);
311
- x.s = 1 / v < 0 ? (str = str.slice(1), -1) : 1;
312
- if (BigNumber4.DEBUG && str.replace(/^0\.0*|\./, "").length > 15) {
313
- throw Error(tooManyDigits + v);
314
- }
315
- } else {
316
- x.s = str.charCodeAt(0) === 45 ? (str = str.slice(1), -1) : 1;
317
- }
318
- alphabet = ALPHABET.slice(0, b);
319
- e = i = 0;
320
- for (len = str.length; i < len; i++) {
321
- if (alphabet.indexOf(c = str.charAt(i)) < 0) {
322
- if (c == ".") {
323
- if (i > e) {
324
- e = len;
325
- continue;
326
- }
327
- } else if (!caseChanged) {
328
- if (str == str.toUpperCase() && (str = str.toLowerCase()) || str == str.toLowerCase() && (str = str.toUpperCase())) {
329
- caseChanged = true;
330
- i = -1;
331
- e = 0;
332
- continue;
333
- }
334
- }
335
- return parseNumeric(x, String(v), isNum, b);
336
- }
337
- }
338
- isNum = false;
339
- str = convertBase(str, b, 10, x.s);
340
- if ((e = str.indexOf(".")) > -1)
341
- str = str.replace(".", "");
342
- else
343
- e = str.length;
344
- }
345
- for (i = 0; str.charCodeAt(i) === 48; i++)
346
- ;
347
- for (len = str.length; str.charCodeAt(--len) === 48; )
348
- ;
349
- if (str = str.slice(i, ++len)) {
350
- len -= i;
351
- if (isNum && BigNumber4.DEBUG && len > 15 && (v > MAX_SAFE_INTEGER || v !== mathfloor(v))) {
352
- throw Error(tooManyDigits + x.s * v);
353
- }
354
- if ((e = e - i - 1) > MAX_EXP) {
355
- x.c = x.e = null;
356
- } else if (e < MIN_EXP) {
357
- x.c = [x.e = 0];
358
- } else {
359
- x.e = e;
360
- x.c = [];
361
- i = (e + 1) % LOG_BASE;
362
- if (e < 0)
363
- i += LOG_BASE;
364
- if (i < len) {
365
- if (i)
366
- x.c.push(+str.slice(0, i));
367
- for (len -= LOG_BASE; i < len; ) {
368
- x.c.push(+str.slice(i, i += LOG_BASE));
369
- }
370
- i = LOG_BASE - (str = str.slice(i)).length;
371
- } else {
372
- i -= len;
373
- }
374
- for (; i--; str += "0")
375
- ;
376
- x.c.push(+str);
377
- }
378
- } else {
379
- x.c = [x.e = 0];
380
- }
381
- }
382
- BigNumber4.clone = clone;
383
- BigNumber4.ROUND_UP = 0;
384
- BigNumber4.ROUND_DOWN = 1;
385
- BigNumber4.ROUND_CEIL = 2;
386
- BigNumber4.ROUND_FLOOR = 3;
387
- BigNumber4.ROUND_HALF_UP = 4;
388
- BigNumber4.ROUND_HALF_DOWN = 5;
389
- BigNumber4.ROUND_HALF_EVEN = 6;
390
- BigNumber4.ROUND_HALF_CEIL = 7;
391
- BigNumber4.ROUND_HALF_FLOOR = 8;
392
- BigNumber4.EUCLID = 9;
393
- BigNumber4.config = BigNumber4.set = function(obj) {
394
- var p, v;
395
- if (obj != null) {
396
- if (typeof obj == "object") {
397
- if (obj.hasOwnProperty(p = "DECIMAL_PLACES")) {
398
- v = obj[p];
399
- intCheck(v, 0, MAX, p);
400
- DECIMAL_PLACES2 = v;
401
- }
402
- if (obj.hasOwnProperty(p = "ROUNDING_MODE")) {
403
- v = obj[p];
404
- intCheck(v, 0, 8, p);
405
- ROUNDING_MODE = v;
406
- }
407
- if (obj.hasOwnProperty(p = "EXPONENTIAL_AT")) {
408
- v = obj[p];
409
- if (v && v.pop) {
410
- intCheck(v[0], -MAX, 0, p);
411
- intCheck(v[1], 0, MAX, p);
412
- TO_EXP_NEG = v[0];
413
- TO_EXP_POS = v[1];
414
- } else {
415
- intCheck(v, -MAX, MAX, p);
416
- TO_EXP_NEG = -(TO_EXP_POS = v < 0 ? -v : v);
417
- }
418
- }
419
- if (obj.hasOwnProperty(p = "RANGE")) {
420
- v = obj[p];
421
- if (v && v.pop) {
422
- intCheck(v[0], -MAX, -1, p);
423
- intCheck(v[1], 1, MAX, p);
424
- MIN_EXP = v[0];
425
- MAX_EXP = v[1];
426
- } else {
427
- intCheck(v, -MAX, MAX, p);
428
- if (v) {
429
- MIN_EXP = -(MAX_EXP = v < 0 ? -v : v);
430
- } else {
431
- throw Error(bignumberError + p + " cannot be zero: " + v);
432
- }
433
- }
434
- }
435
- if (obj.hasOwnProperty(p = "CRYPTO")) {
436
- v = obj[p];
437
- if (v === !!v) {
438
- if (v) {
439
- if (typeof crypto != "undefined" && crypto && (crypto.getRandomValues || crypto.randomBytes)) {
440
- CRYPTO = v;
441
- } else {
442
- CRYPTO = !v;
443
- throw Error(bignumberError + "crypto unavailable");
444
- }
445
- } else {
446
- CRYPTO = v;
447
- }
448
- } else {
449
- throw Error(bignumberError + p + " not true or false: " + v);
450
- }
451
- }
452
- if (obj.hasOwnProperty(p = "MODULO_MODE")) {
453
- v = obj[p];
454
- intCheck(v, 0, 9, p);
455
- MODULO_MODE = v;
456
- }
457
- if (obj.hasOwnProperty(p = "POW_PRECISION")) {
458
- v = obj[p];
459
- intCheck(v, 0, MAX, p);
460
- POW_PRECISION = v;
461
- }
462
- if (obj.hasOwnProperty(p = "FORMAT")) {
463
- v = obj[p];
464
- if (typeof v == "object")
465
- FORMAT = v;
466
- else
467
- throw Error(bignumberError + p + " not an object: " + v);
468
- }
469
- if (obj.hasOwnProperty(p = "ALPHABET")) {
470
- v = obj[p];
471
- if (typeof v == "string" && !/^.?$|[+\-.\s]|(.).*\1/.test(v)) {
472
- alphabetHasNormalDecimalDigits = v.slice(0, 10) == "0123456789";
473
- ALPHABET = v;
474
- } else {
475
- throw Error(bignumberError + p + " invalid: " + v);
476
- }
477
- }
478
- } else {
479
- throw Error(bignumberError + "Object expected: " + obj);
480
- }
481
- }
482
- return {
483
- DECIMAL_PLACES: DECIMAL_PLACES2,
484
- ROUNDING_MODE,
485
- EXPONENTIAL_AT: [TO_EXP_NEG, TO_EXP_POS],
486
- RANGE: [MIN_EXP, MAX_EXP],
487
- CRYPTO,
488
- MODULO_MODE,
489
- POW_PRECISION,
490
- FORMAT,
491
- ALPHABET
492
- };
493
- };
494
- BigNumber4.isBigNumber = function(v) {
495
- if (!v || v._isBigNumber !== true)
496
- return false;
497
- if (!BigNumber4.DEBUG)
498
- return true;
499
- var i, n, c = v.c, e = v.e, s = v.s;
500
- out:
501
- if ({}.toString.call(c) == "[object Array]") {
502
- if ((s === 1 || s === -1) && e >= -MAX && e <= MAX && e === mathfloor(e)) {
503
- if (c[0] === 0) {
504
- if (e === 0 && c.length === 1)
505
- return true;
506
- break out;
507
- }
508
- i = (e + 1) % LOG_BASE;
509
- if (i < 1)
510
- i += LOG_BASE;
511
- if (String(c[0]).length == i) {
512
- for (i = 0; i < c.length; i++) {
513
- n = c[i];
514
- if (n < 0 || n >= BASE || n !== mathfloor(n))
515
- break out;
516
- }
517
- if (n !== 0)
518
- return true;
519
- }
520
- }
521
- } else if (c === null && e === null && (s === null || s === 1 || s === -1)) {
522
- return true;
523
- }
524
- throw Error(bignumberError + "Invalid BigNumber: " + v);
525
- };
526
- BigNumber4.maximum = BigNumber4.max = function() {
527
- return maxOrMin(arguments, P.lt);
528
- };
529
- BigNumber4.minimum = BigNumber4.min = function() {
530
- return maxOrMin(arguments, P.gt);
531
- };
532
- BigNumber4.random = function() {
533
- var pow2_53 = 9007199254740992;
534
- var random53bitInt = Math.random() * pow2_53 & 2097151 ? function() {
535
- return mathfloor(Math.random() * pow2_53);
536
- } : function() {
537
- return (Math.random() * 1073741824 | 0) * 8388608 + (Math.random() * 8388608 | 0);
538
- };
539
- return function(dp) {
540
- var a, b, e, k, v, i = 0, c = [], rand = new BigNumber4(ONE2);
541
- if (dp == null)
542
- dp = DECIMAL_PLACES2;
543
- else
544
- intCheck(dp, 0, MAX);
545
- k = mathceil(dp / LOG_BASE);
546
- if (CRYPTO) {
547
- if (crypto.getRandomValues) {
548
- a = crypto.getRandomValues(new Uint32Array(k *= 2));
549
- for (; i < k; ) {
550
- v = a[i] * 131072 + (a[i + 1] >>> 11);
551
- if (v >= 9e15) {
552
- b = crypto.getRandomValues(new Uint32Array(2));
553
- a[i] = b[0];
554
- a[i + 1] = b[1];
555
- } else {
556
- c.push(v % 1e14);
557
- i += 2;
558
- }
559
- }
560
- i = k / 2;
561
- } else if (crypto.randomBytes) {
562
- a = crypto.randomBytes(k *= 7);
563
- for (; i < k; ) {
564
- v = (a[i] & 31) * 281474976710656 + a[i + 1] * 1099511627776 + a[i + 2] * 4294967296 + a[i + 3] * 16777216 + (a[i + 4] << 16) + (a[i + 5] << 8) + a[i + 6];
565
- if (v >= 9e15) {
566
- crypto.randomBytes(7).copy(a, i);
567
- } else {
568
- c.push(v % 1e14);
569
- i += 7;
570
- }
571
- }
572
- i = k / 7;
573
- } else {
574
- CRYPTO = false;
575
- throw Error(bignumberError + "crypto unavailable");
576
- }
577
- }
578
- if (!CRYPTO) {
579
- for (; i < k; ) {
580
- v = random53bitInt();
581
- if (v < 9e15)
582
- c[i++] = v % 1e14;
583
- }
584
- }
585
- k = c[--i];
586
- dp %= LOG_BASE;
587
- if (k && dp) {
588
- v = POWS_TEN[LOG_BASE - dp];
589
- c[i] = mathfloor(k / v) * v;
590
- }
591
- for (; c[i] === 0; c.pop(), i--)
592
- ;
593
- if (i < 0) {
594
- c = [e = 0];
595
- } else {
596
- for (e = -1; c[0] === 0; c.splice(0, 1), e -= LOG_BASE)
597
- ;
598
- for (i = 1, v = c[0]; v >= 10; v /= 10, i++)
599
- ;
600
- if (i < LOG_BASE)
601
- e -= LOG_BASE - i;
602
- }
603
- rand.e = e;
604
- rand.c = c;
605
- return rand;
606
- };
607
- }();
608
- BigNumber4.sum = function() {
609
- var i = 1, args = arguments, sum = new BigNumber4(args[0]);
610
- for (; i < args.length; )
611
- sum = sum.plus(args[i++]);
612
- return sum;
613
- };
614
- convertBase = function() {
615
- var decimal = "0123456789";
616
- function toBaseOut(str, baseIn, baseOut, alphabet) {
617
- var j, arr = [0], arrL, i = 0, len = str.length;
618
- for (; i < len; ) {
619
- for (arrL = arr.length; arrL--; arr[arrL] *= baseIn)
620
- ;
621
- arr[0] += alphabet.indexOf(str.charAt(i++));
622
- for (j = 0; j < arr.length; j++) {
623
- if (arr[j] > baseOut - 1) {
624
- if (arr[j + 1] == null)
625
- arr[j + 1] = 0;
626
- arr[j + 1] += arr[j] / baseOut | 0;
627
- arr[j] %= baseOut;
628
- }
629
- }
630
- }
631
- return arr.reverse();
632
- }
633
- return function(str, baseIn, baseOut, sign, callerIsToString) {
634
- var alphabet, d, e, k, r, x, xc, y, i = str.indexOf("."), dp = DECIMAL_PLACES2, rm = ROUNDING_MODE;
635
- if (i >= 0) {
636
- k = POW_PRECISION;
637
- POW_PRECISION = 0;
638
- str = str.replace(".", "");
639
- y = new BigNumber4(baseIn);
640
- x = y.pow(str.length - i);
641
- POW_PRECISION = k;
642
- y.c = toBaseOut(
643
- toFixedPoint(coeffToString(x.c), x.e, "0"),
644
- 10,
645
- baseOut,
646
- decimal
647
- );
648
- y.e = y.c.length;
649
- }
650
- xc = toBaseOut(str, baseIn, baseOut, callerIsToString ? (alphabet = ALPHABET, decimal) : (alphabet = decimal, ALPHABET));
651
- e = k = xc.length;
652
- for (; xc[--k] == 0; xc.pop())
653
- ;
654
- if (!xc[0])
655
- return alphabet.charAt(0);
656
- if (i < 0) {
657
- --e;
658
- } else {
659
- x.c = xc;
660
- x.e = e;
661
- x.s = sign;
662
- x = div(x, y, dp, rm, baseOut);
663
- xc = x.c;
664
- r = x.r;
665
- e = x.e;
666
- }
667
- d = e + dp + 1;
668
- i = xc[d];
669
- k = baseOut / 2;
670
- r = r || d < 0 || xc[d + 1] != null;
671
- r = rm < 4 ? (i != null || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : i > k || i == k && (rm == 4 || r || rm == 6 && xc[d - 1] & 1 || rm == (x.s < 0 ? 8 : 7));
672
- if (d < 1 || !xc[0]) {
673
- str = r ? toFixedPoint(alphabet.charAt(1), -dp, alphabet.charAt(0)) : alphabet.charAt(0);
674
- } else {
675
- xc.length = d;
676
- if (r) {
677
- for (--baseOut; ++xc[--d] > baseOut; ) {
678
- xc[d] = 0;
679
- if (!d) {
680
- ++e;
681
- xc = [1].concat(xc);
682
- }
683
- }
684
- }
685
- for (k = xc.length; !xc[--k]; )
686
- ;
687
- for (i = 0, str = ""; i <= k; str += alphabet.charAt(xc[i++]))
688
- ;
689
- str = toFixedPoint(str, e, alphabet.charAt(0));
690
- }
691
- return str;
692
- };
693
- }();
694
- div = function() {
695
- function multiply(x, k, base) {
696
- var m, temp, xlo, xhi, carry = 0, i = x.length, klo = k % SQRT_BASE, khi = k / SQRT_BASE | 0;
697
- for (x = x.slice(); i--; ) {
698
- xlo = x[i] % SQRT_BASE;
699
- xhi = x[i] / SQRT_BASE | 0;
700
- m = khi * xlo + xhi * klo;
701
- temp = klo * xlo + m % SQRT_BASE * SQRT_BASE + carry;
702
- carry = (temp / base | 0) + (m / SQRT_BASE | 0) + khi * xhi;
703
- x[i] = temp % base;
704
- }
705
- if (carry)
706
- x = [carry].concat(x);
707
- return x;
708
- }
709
- function compare2(a, b, aL, bL) {
710
- var i, cmp;
711
- if (aL != bL) {
712
- cmp = aL > bL ? 1 : -1;
713
- } else {
714
- for (i = cmp = 0; i < aL; i++) {
715
- if (a[i] != b[i]) {
716
- cmp = a[i] > b[i] ? 1 : -1;
717
- break;
718
- }
719
- }
720
- }
721
- return cmp;
722
- }
723
- function subtract(a, b, aL, base) {
724
- var i = 0;
725
- for (; aL--; ) {
726
- a[aL] -= i;
727
- i = a[aL] < b[aL] ? 1 : 0;
728
- a[aL] = i * base + a[aL] - b[aL];
729
- }
730
- for (; !a[0] && a.length > 1; a.splice(0, 1))
731
- ;
732
- }
733
- return function(x, y, dp, rm, base) {
734
- var cmp, e, i, more, n, prod, prodL, q, qc, rem, remL, rem0, xi, xL, yc0, yL, yz, s = x.s == y.s ? 1 : -1, xc = x.c, yc = y.c;
735
- if (!xc || !xc[0] || !yc || !yc[0]) {
736
- return new BigNumber4(
737
- !x.s || !y.s || (xc ? yc && xc[0] == yc[0] : !yc) ? NaN : xc && xc[0] == 0 || !yc ? s * 0 : s / 0
738
- );
739
- }
740
- q = new BigNumber4(s);
741
- qc = q.c = [];
742
- e = x.e - y.e;
743
- s = dp + e + 1;
744
- if (!base) {
745
- base = BASE;
746
- e = bitFloor(x.e / LOG_BASE) - bitFloor(y.e / LOG_BASE);
747
- s = s / LOG_BASE | 0;
748
- }
749
- for (i = 0; yc[i] == (xc[i] || 0); i++)
750
- ;
751
- if (yc[i] > (xc[i] || 0))
752
- e--;
753
- if (s < 0) {
754
- qc.push(1);
755
- more = true;
756
- } else {
757
- xL = xc.length;
758
- yL = yc.length;
759
- i = 0;
760
- s += 2;
761
- n = mathfloor(base / (yc[0] + 1));
762
- if (n > 1) {
763
- yc = multiply(yc, n, base);
764
- xc = multiply(xc, n, base);
765
- yL = yc.length;
766
- xL = xc.length;
767
- }
768
- xi = yL;
769
- rem = xc.slice(0, yL);
770
- remL = rem.length;
771
- for (; remL < yL; rem[remL++] = 0)
772
- ;
773
- yz = yc.slice();
774
- yz = [0].concat(yz);
775
- yc0 = yc[0];
776
- if (yc[1] >= base / 2)
777
- yc0++;
778
- do {
779
- n = 0;
780
- cmp = compare2(yc, rem, yL, remL);
781
- if (cmp < 0) {
782
- rem0 = rem[0];
783
- if (yL != remL)
784
- rem0 = rem0 * base + (rem[1] || 0);
785
- n = mathfloor(rem0 / yc0);
786
- if (n > 1) {
787
- if (n >= base)
788
- n = base - 1;
789
- prod = multiply(yc, n, base);
790
- prodL = prod.length;
791
- remL = rem.length;
792
- while (compare2(prod, rem, prodL, remL) == 1) {
793
- n--;
794
- subtract(prod, yL < prodL ? yz : yc, prodL, base);
795
- prodL = prod.length;
796
- cmp = 1;
797
- }
798
- } else {
799
- if (n == 0) {
800
- cmp = n = 1;
801
- }
802
- prod = yc.slice();
803
- prodL = prod.length;
804
- }
805
- if (prodL < remL)
806
- prod = [0].concat(prod);
807
- subtract(rem, prod, remL, base);
808
- remL = rem.length;
809
- if (cmp == -1) {
810
- while (compare2(yc, rem, yL, remL) < 1) {
811
- n++;
812
- subtract(rem, yL < remL ? yz : yc, remL, base);
813
- remL = rem.length;
814
- }
815
- }
816
- } else if (cmp === 0) {
817
- n++;
818
- rem = [0];
819
- }
820
- qc[i++] = n;
821
- if (rem[0]) {
822
- rem[remL++] = xc[xi] || 0;
823
- } else {
824
- rem = [xc[xi]];
825
- remL = 1;
826
- }
827
- } while ((xi++ < xL || rem[0] != null) && s--);
828
- more = rem[0] != null;
829
- if (!qc[0])
830
- qc.splice(0, 1);
831
- }
832
- if (base == BASE) {
833
- for (i = 1, s = qc[0]; s >= 10; s /= 10, i++)
834
- ;
835
- round(q, dp + (q.e = i + e * LOG_BASE - 1) + 1, rm, more);
836
- } else {
837
- q.e = e;
838
- q.r = +more;
839
- }
840
- return q;
841
- };
842
- }();
843
- function format(n, i, rm, id) {
844
- var c0, e, ne, len, str;
845
- if (rm == null)
846
- rm = ROUNDING_MODE;
847
- else
848
- intCheck(rm, 0, 8);
849
- if (!n.c)
850
- return n.toString();
851
- c0 = n.c[0];
852
- ne = n.e;
853
- if (i == null) {
854
- str = coeffToString(n.c);
855
- str = id == 1 || id == 2 && (ne <= TO_EXP_NEG || ne >= TO_EXP_POS) ? toExponential(str, ne) : toFixedPoint(str, ne, "0");
856
- } else {
857
- n = round(new BigNumber4(n), i, rm);
858
- e = n.e;
859
- str = coeffToString(n.c);
860
- len = str.length;
861
- if (id == 1 || id == 2 && (i <= e || e <= TO_EXP_NEG)) {
862
- for (; len < i; str += "0", len++)
863
- ;
864
- str = toExponential(str, e);
865
- } else {
866
- i -= ne;
867
- str = toFixedPoint(str, e, "0");
868
- if (e + 1 > len) {
869
- if (--i > 0)
870
- for (str += "."; i--; str += "0")
871
- ;
872
- } else {
873
- i += e - len;
874
- if (i > 0) {
875
- if (e + 1 == len)
876
- str += ".";
877
- for (; i--; str += "0")
878
- ;
879
- }
880
- }
881
- }
882
- }
883
- return n.s < 0 && c0 ? "-" + str : str;
884
- }
885
- function maxOrMin(args, method) {
886
- var n, i = 1, m = new BigNumber4(args[0]);
887
- for (; i < args.length; i++) {
888
- n = new BigNumber4(args[i]);
889
- if (!n.s) {
890
- m = n;
891
- break;
892
- } else if (method.call(m, n)) {
893
- m = n;
894
- }
895
- }
896
- return m;
897
- }
898
- function normalise(n, c, e) {
899
- var i = 1, j = c.length;
900
- for (; !c[--j]; c.pop())
901
- ;
902
- for (j = c[0]; j >= 10; j /= 10, i++)
903
- ;
904
- if ((e = i + e * LOG_BASE - 1) > MAX_EXP) {
905
- n.c = n.e = null;
906
- } else if (e < MIN_EXP) {
907
- n.c = [n.e = 0];
908
- } else {
909
- n.e = e;
910
- n.c = c;
911
- }
912
- return n;
913
- }
914
- parseNumeric = function() {
915
- var basePrefix = /^(-?)0([xbo])(?=\w[\w.]*$)/i, dotAfter = /^([^.]+)\.$/, dotBefore = /^\.([^.]+)$/, isInfinityOrNaN = /^-?(Infinity|NaN)$/, whitespaceOrPlus = /^\s*\+(?=[\w.])|^\s+|\s+$/g;
916
- return function(x, str, isNum, b) {
917
- var base, s = isNum ? str : str.replace(whitespaceOrPlus, "");
918
- if (isInfinityOrNaN.test(s)) {
919
- x.s = isNaN(s) ? null : s < 0 ? -1 : 1;
920
- } else {
921
- if (!isNum) {
922
- s = s.replace(basePrefix, function(m, p1, p2) {
923
- base = (p2 = p2.toLowerCase()) == "x" ? 16 : p2 == "b" ? 2 : 8;
924
- return !b || b == base ? p1 : m;
925
- });
926
- if (b) {
927
- base = b;
928
- s = s.replace(dotAfter, "$1").replace(dotBefore, "0.$1");
929
- }
930
- if (str != s)
931
- return new BigNumber4(s, base);
932
- }
933
- if (BigNumber4.DEBUG) {
934
- throw Error(bignumberError + "Not a" + (b ? " base " + b : "") + " number: " + str);
935
- }
936
- x.s = null;
937
- }
938
- x.c = x.e = null;
939
- };
940
- }();
941
- function round(x, sd, rm, r) {
942
- var d, i, j, k, n, ni, rd, xc = x.c, pows10 = POWS_TEN;
943
- if (xc) {
944
- out: {
945
- for (d = 1, k = xc[0]; k >= 10; k /= 10, d++)
946
- ;
947
- i = sd - d;
948
- if (i < 0) {
949
- i += LOG_BASE;
950
- j = sd;
951
- n = xc[ni = 0];
952
- rd = n / pows10[d - j - 1] % 10 | 0;
953
- } else {
954
- ni = mathceil((i + 1) / LOG_BASE);
955
- if (ni >= xc.length) {
956
- if (r) {
957
- for (; xc.length <= ni; xc.push(0))
958
- ;
959
- n = rd = 0;
960
- d = 1;
961
- i %= LOG_BASE;
962
- j = i - LOG_BASE + 1;
963
- } else {
964
- break out;
965
- }
966
- } else {
967
- n = k = xc[ni];
968
- for (d = 1; k >= 10; k /= 10, d++)
969
- ;
970
- i %= LOG_BASE;
971
- j = i - LOG_BASE + d;
972
- rd = j < 0 ? 0 : n / pows10[d - j - 1] % 10 | 0;
973
- }
974
- }
975
- r = r || sd < 0 || xc[ni + 1] != null || (j < 0 ? n : n % pows10[d - j - 1]);
976
- r = rm < 4 ? (rd || r) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) : rd > 5 || rd == 5 && (rm == 4 || r || rm == 6 && (i > 0 ? j > 0 ? n / pows10[d - j] : 0 : xc[ni - 1]) % 10 & 1 || rm == (x.s < 0 ? 8 : 7));
977
- if (sd < 1 || !xc[0]) {
978
- xc.length = 0;
979
- if (r) {
980
- sd -= x.e + 1;
981
- xc[0] = pows10[(LOG_BASE - sd % LOG_BASE) % LOG_BASE];
982
- x.e = -sd || 0;
983
- } else {
984
- xc[0] = x.e = 0;
985
- }
986
- return x;
987
- }
988
- if (i == 0) {
989
- xc.length = ni;
990
- k = 1;
991
- ni--;
992
- } else {
993
- xc.length = ni + 1;
994
- k = pows10[LOG_BASE - i];
995
- xc[ni] = j > 0 ? mathfloor(n / pows10[d - j] % pows10[j]) * k : 0;
996
- }
997
- if (r) {
998
- for (; ; ) {
999
- if (ni == 0) {
1000
- for (i = 1, j = xc[0]; j >= 10; j /= 10, i++)
1001
- ;
1002
- j = xc[0] += k;
1003
- for (k = 1; j >= 10; j /= 10, k++)
1004
- ;
1005
- if (i != k) {
1006
- x.e++;
1007
- if (xc[0] == BASE)
1008
- xc[0] = 1;
1009
- }
1010
- break;
1011
- } else {
1012
- xc[ni] += k;
1013
- if (xc[ni] != BASE)
1014
- break;
1015
- xc[ni--] = 0;
1016
- k = 1;
1017
- }
1018
- }
1019
- }
1020
- for (i = xc.length; xc[--i] === 0; xc.pop())
1021
- ;
1022
- }
1023
- if (x.e > MAX_EXP) {
1024
- x.c = x.e = null;
1025
- } else if (x.e < MIN_EXP) {
1026
- x.c = [x.e = 0];
1027
- }
1028
- }
1029
- return x;
1030
- }
1031
- function valueOf(n) {
1032
- var str, e = n.e;
1033
- if (e === null)
1034
- return n.toString();
1035
- str = coeffToString(n.c);
1036
- str = e <= TO_EXP_NEG || e >= TO_EXP_POS ? toExponential(str, e) : toFixedPoint(str, e, "0");
1037
- return n.s < 0 ? "-" + str : str;
1038
- }
1039
- P.absoluteValue = P.abs = function() {
1040
- var x = new BigNumber4(this);
1041
- if (x.s < 0)
1042
- x.s = 1;
1043
- return x;
1044
- };
1045
- P.comparedTo = function(y, b) {
1046
- return compare(this, new BigNumber4(y, b));
1047
- };
1048
- P.decimalPlaces = P.dp = function(dp, rm) {
1049
- var c, n, v, x = this;
1050
- if (dp != null) {
1051
- intCheck(dp, 0, MAX);
1052
- if (rm == null)
1053
- rm = ROUNDING_MODE;
1054
- else
1055
- intCheck(rm, 0, 8);
1056
- return round(new BigNumber4(x), dp + x.e + 1, rm);
1057
- }
1058
- if (!(c = x.c))
1059
- return null;
1060
- n = ((v = c.length - 1) - bitFloor(this.e / LOG_BASE)) * LOG_BASE;
1061
- if (v = c[v])
1062
- for (; v % 10 == 0; v /= 10, n--)
1063
- ;
1064
- if (n < 0)
1065
- n = 0;
1066
- return n;
1067
- };
1068
- P.dividedBy = P.div = function(y, b) {
1069
- return div(this, new BigNumber4(y, b), DECIMAL_PLACES2, ROUNDING_MODE);
1070
- };
1071
- P.dividedToIntegerBy = P.idiv = function(y, b) {
1072
- return div(this, new BigNumber4(y, b), 0, 1);
1073
- };
1074
- P.exponentiatedBy = P.pow = function(n, m) {
1075
- var half, isModExp, i, k, more, nIsBig, nIsNeg, nIsOdd, y, x = this;
1076
- n = new BigNumber4(n);
1077
- if (n.c && !n.isInteger()) {
1078
- throw Error(bignumberError + "Exponent not an integer: " + valueOf(n));
1079
- }
1080
- if (m != null)
1081
- m = new BigNumber4(m);
1082
- nIsBig = n.e > 14;
1083
- if (!x.c || !x.c[0] || x.c[0] == 1 && !x.e && x.c.length == 1 || !n.c || !n.c[0]) {
1084
- y = new BigNumber4(Math.pow(+valueOf(x), nIsBig ? 2 - isOdd(n) : +valueOf(n)));
1085
- return m ? y.mod(m) : y;
1086
- }
1087
- nIsNeg = n.s < 0;
1088
- if (m) {
1089
- if (m.c ? !m.c[0] : !m.s)
1090
- return new BigNumber4(NaN);
1091
- isModExp = !nIsNeg && x.isInteger() && m.isInteger();
1092
- if (isModExp)
1093
- x = x.mod(m);
1094
- } else if (n.e > 9 && (x.e > 0 || x.e < -1 || (x.e == 0 ? x.c[0] > 1 || nIsBig && x.c[1] >= 24e7 : x.c[0] < 8e13 || nIsBig && x.c[0] <= 9999975e7))) {
1095
- k = x.s < 0 && isOdd(n) ? -0 : 0;
1096
- if (x.e > -1)
1097
- k = 1 / k;
1098
- return new BigNumber4(nIsNeg ? 1 / k : k);
1099
- } else if (POW_PRECISION) {
1100
- k = mathceil(POW_PRECISION / LOG_BASE + 2);
1101
- }
1102
- if (nIsBig) {
1103
- half = new BigNumber4(0.5);
1104
- if (nIsNeg)
1105
- n.s = 1;
1106
- nIsOdd = isOdd(n);
1107
- } else {
1108
- i = Math.abs(+valueOf(n));
1109
- nIsOdd = i % 2;
1110
- }
1111
- y = new BigNumber4(ONE2);
1112
- for (; ; ) {
1113
- if (nIsOdd) {
1114
- y = y.times(x);
1115
- if (!y.c)
1116
- break;
1117
- if (k) {
1118
- if (y.c.length > k)
1119
- y.c.length = k;
1120
- } else if (isModExp) {
1121
- y = y.mod(m);
1122
- }
1123
- }
1124
- if (i) {
1125
- i = mathfloor(i / 2);
1126
- if (i === 0)
1127
- break;
1128
- nIsOdd = i % 2;
1129
- } else {
1130
- n = n.times(half);
1131
- round(n, n.e + 1, 1);
1132
- if (n.e > 14) {
1133
- nIsOdd = isOdd(n);
1134
- } else {
1135
- i = +valueOf(n);
1136
- if (i === 0)
1137
- break;
1138
- nIsOdd = i % 2;
1139
- }
1140
- }
1141
- x = x.times(x);
1142
- if (k) {
1143
- if (x.c && x.c.length > k)
1144
- x.c.length = k;
1145
- } else if (isModExp) {
1146
- x = x.mod(m);
1147
- }
1148
- }
1149
- if (isModExp)
1150
- return y;
1151
- if (nIsNeg)
1152
- y = ONE2.div(y);
1153
- return m ? y.mod(m) : k ? round(y, POW_PRECISION, ROUNDING_MODE, more) : y;
1154
- };
1155
- P.integerValue = function(rm) {
1156
- var n = new BigNumber4(this);
1157
- if (rm == null)
1158
- rm = ROUNDING_MODE;
1159
- else
1160
- intCheck(rm, 0, 8);
1161
- return round(n, n.e + 1, rm);
1162
- };
1163
- P.isEqualTo = P.eq = function(y, b) {
1164
- return compare(this, new BigNumber4(y, b)) === 0;
1165
- };
1166
- P.isFinite = function() {
1167
- return !!this.c;
1168
- };
1169
- P.isGreaterThan = P.gt = function(y, b) {
1170
- return compare(this, new BigNumber4(y, b)) > 0;
1171
- };
1172
- P.isGreaterThanOrEqualTo = P.gte = function(y, b) {
1173
- return (b = compare(this, new BigNumber4(y, b))) === 1 || b === 0;
1174
- };
1175
- P.isInteger = function() {
1176
- return !!this.c && bitFloor(this.e / LOG_BASE) > this.c.length - 2;
1177
- };
1178
- P.isLessThan = P.lt = function(y, b) {
1179
- return compare(this, new BigNumber4(y, b)) < 0;
1180
- };
1181
- P.isLessThanOrEqualTo = P.lte = function(y, b) {
1182
- return (b = compare(this, new BigNumber4(y, b))) === -1 || b === 0;
1183
- };
1184
- P.isNaN = function() {
1185
- return !this.s;
1186
- };
1187
- P.isNegative = function() {
1188
- return this.s < 0;
1189
- };
1190
- P.isPositive = function() {
1191
- return this.s > 0;
1192
- };
1193
- P.isZero = function() {
1194
- return !!this.c && this.c[0] == 0;
1195
- };
1196
- P.minus = function(y, b) {
1197
- var i, j, t, xLTy, x = this, a = x.s;
1198
- y = new BigNumber4(y, b);
1199
- b = y.s;
1200
- if (!a || !b)
1201
- return new BigNumber4(NaN);
1202
- if (a != b) {
1203
- y.s = -b;
1204
- return x.plus(y);
1205
- }
1206
- var xe = x.e / LOG_BASE, ye = y.e / LOG_BASE, xc = x.c, yc = y.c;
1207
- if (!xe || !ye) {
1208
- if (!xc || !yc)
1209
- return xc ? (y.s = -b, y) : new BigNumber4(yc ? x : NaN);
1210
- if (!xc[0] || !yc[0]) {
1211
- return yc[0] ? (y.s = -b, y) : new BigNumber4(xc[0] ? x : ROUNDING_MODE == 3 ? -0 : 0);
1212
- }
1213
- }
1214
- xe = bitFloor(xe);
1215
- ye = bitFloor(ye);
1216
- xc = xc.slice();
1217
- if (a = xe - ye) {
1218
- if (xLTy = a < 0) {
1219
- a = -a;
1220
- t = xc;
1221
- } else {
1222
- ye = xe;
1223
- t = yc;
1224
- }
1225
- t.reverse();
1226
- for (b = a; b--; t.push(0))
1227
- ;
1228
- t.reverse();
1229
- } else {
1230
- j = (xLTy = (a = xc.length) < (b = yc.length)) ? a : b;
1231
- for (a = b = 0; b < j; b++) {
1232
- if (xc[b] != yc[b]) {
1233
- xLTy = xc[b] < yc[b];
1234
- break;
1235
- }
1236
- }
1237
- }
1238
- if (xLTy)
1239
- t = xc, xc = yc, yc = t, y.s = -y.s;
1240
- b = (j = yc.length) - (i = xc.length);
1241
- if (b > 0)
1242
- for (; b--; xc[i++] = 0)
1243
- ;
1244
- b = BASE - 1;
1245
- for (; j > a; ) {
1246
- if (xc[--j] < yc[j]) {
1247
- for (i = j; i && !xc[--i]; xc[i] = b)
1248
- ;
1249
- --xc[i];
1250
- xc[j] += BASE;
1251
- }
1252
- xc[j] -= yc[j];
1253
- }
1254
- for (; xc[0] == 0; xc.splice(0, 1), --ye)
1255
- ;
1256
- if (!xc[0]) {
1257
- y.s = ROUNDING_MODE == 3 ? -1 : 1;
1258
- y.c = [y.e = 0];
1259
- return y;
1260
- }
1261
- return normalise(y, xc, ye);
1262
- };
1263
- P.modulo = P.mod = function(y, b) {
1264
- var q, s, x = this;
1265
- y = new BigNumber4(y, b);
1266
- if (!x.c || !y.s || y.c && !y.c[0]) {
1267
- return new BigNumber4(NaN);
1268
- } else if (!y.c || x.c && !x.c[0]) {
1269
- return new BigNumber4(x);
1270
- }
1271
- if (MODULO_MODE == 9) {
1272
- s = y.s;
1273
- y.s = 1;
1274
- q = div(x, y, 0, 3);
1275
- y.s = s;
1276
- q.s *= s;
1277
- } else {
1278
- q = div(x, y, 0, MODULO_MODE);
1279
- }
1280
- y = x.minus(q.times(y));
1281
- if (!y.c[0] && MODULO_MODE == 1)
1282
- y.s = x.s;
1283
- return y;
1284
- };
1285
- P.multipliedBy = P.times = function(y, b) {
1286
- var c, e, i, j, k, m, xcL, xlo, xhi, ycL, ylo, yhi, zc, base, sqrtBase, x = this, xc = x.c, yc = (y = new BigNumber4(y, b)).c;
1287
- if (!xc || !yc || !xc[0] || !yc[0]) {
1288
- if (!x.s || !y.s || xc && !xc[0] && !yc || yc && !yc[0] && !xc) {
1289
- y.c = y.e = y.s = null;
1290
- } else {
1291
- y.s *= x.s;
1292
- if (!xc || !yc) {
1293
- y.c = y.e = null;
1294
- } else {
1295
- y.c = [0];
1296
- y.e = 0;
1297
- }
1298
- }
1299
- return y;
1300
- }
1301
- e = bitFloor(x.e / LOG_BASE) + bitFloor(y.e / LOG_BASE);
1302
- y.s *= x.s;
1303
- xcL = xc.length;
1304
- ycL = yc.length;
1305
- if (xcL < ycL)
1306
- zc = xc, xc = yc, yc = zc, i = xcL, xcL = ycL, ycL = i;
1307
- for (i = xcL + ycL, zc = []; i--; zc.push(0))
1308
- ;
1309
- base = BASE;
1310
- sqrtBase = SQRT_BASE;
1311
- for (i = ycL; --i >= 0; ) {
1312
- c = 0;
1313
- ylo = yc[i] % sqrtBase;
1314
- yhi = yc[i] / sqrtBase | 0;
1315
- for (k = xcL, j = i + k; j > i; ) {
1316
- xlo = xc[--k] % sqrtBase;
1317
- xhi = xc[k] / sqrtBase | 0;
1318
- m = yhi * xlo + xhi * ylo;
1319
- xlo = ylo * xlo + m % sqrtBase * sqrtBase + zc[j] + c;
1320
- c = (xlo / base | 0) + (m / sqrtBase | 0) + yhi * xhi;
1321
- zc[j--] = xlo % base;
1322
- }
1323
- zc[j] = c;
1324
- }
1325
- if (c) {
1326
- ++e;
1327
- } else {
1328
- zc.splice(0, 1);
1329
- }
1330
- return normalise(y, zc, e);
1331
- };
1332
- P.negated = function() {
1333
- var x = new BigNumber4(this);
1334
- x.s = -x.s || null;
1335
- return x;
1336
- };
1337
- P.plus = function(y, b) {
1338
- var t, x = this, a = x.s;
1339
- y = new BigNumber4(y, b);
1340
- b = y.s;
1341
- if (!a || !b)
1342
- return new BigNumber4(NaN);
1343
- if (a != b) {
1344
- y.s = -b;
1345
- return x.minus(y);
1346
- }
1347
- var xe = x.e / LOG_BASE, ye = y.e / LOG_BASE, xc = x.c, yc = y.c;
1348
- if (!xe || !ye) {
1349
- if (!xc || !yc)
1350
- return new BigNumber4(a / 0);
1351
- if (!xc[0] || !yc[0])
1352
- return yc[0] ? y : new BigNumber4(xc[0] ? x : a * 0);
1353
- }
1354
- xe = bitFloor(xe);
1355
- ye = bitFloor(ye);
1356
- xc = xc.slice();
1357
- if (a = xe - ye) {
1358
- if (a > 0) {
1359
- ye = xe;
1360
- t = yc;
1361
- } else {
1362
- a = -a;
1363
- t = xc;
1364
- }
1365
- t.reverse();
1366
- for (; a--; t.push(0))
1367
- ;
1368
- t.reverse();
1369
- }
1370
- a = xc.length;
1371
- b = yc.length;
1372
- if (a - b < 0)
1373
- t = yc, yc = xc, xc = t, b = a;
1374
- for (a = 0; b; ) {
1375
- a = (xc[--b] = xc[b] + yc[b] + a) / BASE | 0;
1376
- xc[b] = BASE === xc[b] ? 0 : xc[b] % BASE;
1377
- }
1378
- if (a) {
1379
- xc = [a].concat(xc);
1380
- ++ye;
1381
- }
1382
- return normalise(y, xc, ye);
1383
- };
1384
- P.precision = P.sd = function(sd, rm) {
1385
- var c, n, v, x = this;
1386
- if (sd != null && sd !== !!sd) {
1387
- intCheck(sd, 1, MAX);
1388
- if (rm == null)
1389
- rm = ROUNDING_MODE;
1390
- else
1391
- intCheck(rm, 0, 8);
1392
- return round(new BigNumber4(x), sd, rm);
1393
- }
1394
- if (!(c = x.c))
1395
- return null;
1396
- v = c.length - 1;
1397
- n = v * LOG_BASE + 1;
1398
- if (v = c[v]) {
1399
- for (; v % 10 == 0; v /= 10, n--)
1400
- ;
1401
- for (v = c[0]; v >= 10; v /= 10, n++)
1402
- ;
1403
- }
1404
- if (sd && x.e + 1 > n)
1405
- n = x.e + 1;
1406
- return n;
1407
- };
1408
- P.shiftedBy = function(k) {
1409
- intCheck(k, -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER);
1410
- return this.times("1e" + k);
1411
- };
1412
- P.squareRoot = P.sqrt = function() {
1413
- var m, n, r, rep, t, x = this, c = x.c, s = x.s, e = x.e, dp = DECIMAL_PLACES2 + 4, half = new BigNumber4("0.5");
1414
- if (s !== 1 || !c || !c[0]) {
1415
- return new BigNumber4(!s || s < 0 && (!c || c[0]) ? NaN : c ? x : 1 / 0);
1416
- }
1417
- s = Math.sqrt(+valueOf(x));
1418
- if (s == 0 || s == 1 / 0) {
1419
- n = coeffToString(c);
1420
- if ((n.length + e) % 2 == 0)
1421
- n += "0";
1422
- s = Math.sqrt(+n);
1423
- e = bitFloor((e + 1) / 2) - (e < 0 || e % 2);
1424
- if (s == 1 / 0) {
1425
- n = "5e" + e;
1426
- } else {
1427
- n = s.toExponential();
1428
- n = n.slice(0, n.indexOf("e") + 1) + e;
1429
- }
1430
- r = new BigNumber4(n);
1431
- } else {
1432
- r = new BigNumber4(s + "");
1433
- }
1434
- if (r.c[0]) {
1435
- e = r.e;
1436
- s = e + dp;
1437
- if (s < 3)
1438
- s = 0;
1439
- for (; ; ) {
1440
- t = r;
1441
- r = half.times(t.plus(div(x, t, dp, 1)));
1442
- if (coeffToString(t.c).slice(0, s) === (n = coeffToString(r.c)).slice(0, s)) {
1443
- if (r.e < e)
1444
- --s;
1445
- n = n.slice(s - 3, s + 1);
1446
- if (n == "9999" || !rep && n == "4999") {
1447
- if (!rep) {
1448
- round(t, t.e + DECIMAL_PLACES2 + 2, 0);
1449
- if (t.times(t).eq(x)) {
1450
- r = t;
1451
- break;
1452
- }
1453
- }
1454
- dp += 4;
1455
- s += 4;
1456
- rep = 1;
1457
- } else {
1458
- if (!+n || !+n.slice(1) && n.charAt(0) == "5") {
1459
- round(r, r.e + DECIMAL_PLACES2 + 2, 1);
1460
- m = !r.times(r).eq(x);
1461
- }
1462
- break;
1463
- }
1464
- }
1465
- }
1466
- }
1467
- return round(r, r.e + DECIMAL_PLACES2 + 1, ROUNDING_MODE, m);
1468
- };
1469
- P.toExponential = function(dp, rm) {
1470
- if (dp != null) {
1471
- intCheck(dp, 0, MAX);
1472
- dp++;
1473
- }
1474
- return format(this, dp, rm, 1);
1475
- };
1476
- P.toFixed = function(dp, rm) {
1477
- if (dp != null) {
1478
- intCheck(dp, 0, MAX);
1479
- dp = dp + this.e + 1;
1480
- }
1481
- return format(this, dp, rm);
1482
- };
1483
- P.toFormat = function(dp, rm, format2) {
1484
- var str, x = this;
1485
- if (format2 == null) {
1486
- if (dp != null && rm && typeof rm == "object") {
1487
- format2 = rm;
1488
- rm = null;
1489
- } else if (dp && typeof dp == "object") {
1490
- format2 = dp;
1491
- dp = rm = null;
1492
- } else {
1493
- format2 = FORMAT;
1494
- }
1495
- } else if (typeof format2 != "object") {
1496
- throw Error(bignumberError + "Argument not an object: " + format2);
1497
- }
1498
- str = x.toFixed(dp, rm);
1499
- if (x.c) {
1500
- var i, arr = str.split("."), g1 = +format2.groupSize, g2 = +format2.secondaryGroupSize, groupSeparator = format2.groupSeparator || "", intPart = arr[0], fractionPart = arr[1], isNeg = x.s < 0, intDigits = isNeg ? intPart.slice(1) : intPart, len = intDigits.length;
1501
- if (g2)
1502
- i = g1, g1 = g2, g2 = i, len -= i;
1503
- if (g1 > 0 && len > 0) {
1504
- i = len % g1 || g1;
1505
- intPart = intDigits.substr(0, i);
1506
- for (; i < len; i += g1)
1507
- intPart += groupSeparator + intDigits.substr(i, g1);
1508
- if (g2 > 0)
1509
- intPart += groupSeparator + intDigits.slice(i);
1510
- if (isNeg)
1511
- intPart = "-" + intPart;
1512
- }
1513
- str = fractionPart ? intPart + (format2.decimalSeparator || "") + ((g2 = +format2.fractionGroupSize) ? fractionPart.replace(
1514
- new RegExp("\\d{" + g2 + "}\\B", "g"),
1515
- "$&" + (format2.fractionGroupSeparator || "")
1516
- ) : fractionPart) : intPart;
1517
- }
1518
- return (format2.prefix || "") + str + (format2.suffix || "");
1519
- };
1520
- P.toFraction = function(md) {
1521
- var d, d0, d1, d2, e, exp, n, n0, n1, q, r, s, x = this, xc = x.c;
1522
- if (md != null) {
1523
- n = new BigNumber4(md);
1524
- if (!n.isInteger() && (n.c || n.s !== 1) || n.lt(ONE2)) {
1525
- throw Error(bignumberError + "Argument " + (n.isInteger() ? "out of range: " : "not an integer: ") + valueOf(n));
1526
- }
1527
- }
1528
- if (!xc)
1529
- return new BigNumber4(x);
1530
- d = new BigNumber4(ONE2);
1531
- n1 = d0 = new BigNumber4(ONE2);
1532
- d1 = n0 = new BigNumber4(ONE2);
1533
- s = coeffToString(xc);
1534
- e = d.e = s.length - x.e - 1;
1535
- d.c[0] = POWS_TEN[(exp = e % LOG_BASE) < 0 ? LOG_BASE + exp : exp];
1536
- md = !md || n.comparedTo(d) > 0 ? e > 0 ? d : n1 : n;
1537
- exp = MAX_EXP;
1538
- MAX_EXP = 1 / 0;
1539
- n = new BigNumber4(s);
1540
- n0.c[0] = 0;
1541
- for (; ; ) {
1542
- q = div(n, d, 0, 1);
1543
- d2 = d0.plus(q.times(d1));
1544
- if (d2.comparedTo(md) == 1)
1545
- break;
1546
- d0 = d1;
1547
- d1 = d2;
1548
- n1 = n0.plus(q.times(d2 = n1));
1549
- n0 = d2;
1550
- d = n.minus(q.times(d2 = d));
1551
- n = d2;
1552
- }
1553
- d2 = div(md.minus(d0), d1, 0, 1);
1554
- n0 = n0.plus(d2.times(n1));
1555
- d0 = d0.plus(d2.times(d1));
1556
- n0.s = n1.s = x.s;
1557
- e = e * 2;
1558
- r = div(n1, d1, e, ROUNDING_MODE).minus(x).abs().comparedTo(
1559
- div(n0, d0, e, ROUNDING_MODE).minus(x).abs()
1560
- ) < 1 ? [n1, d1] : [n0, d0];
1561
- MAX_EXP = exp;
1562
- return r;
1563
- };
1564
- P.toNumber = function() {
1565
- return +valueOf(this);
1566
- };
1567
- P.toPrecision = function(sd, rm) {
1568
- if (sd != null)
1569
- intCheck(sd, 1, MAX);
1570
- return format(this, sd, rm, 2);
1571
- };
1572
- P.toString = function(b) {
1573
- var str, n = this, s = n.s, e = n.e;
1574
- if (e === null) {
1575
- if (s) {
1576
- str = "Infinity";
1577
- if (s < 0)
1578
- str = "-" + str;
1579
- } else {
1580
- str = "NaN";
1581
- }
1582
- } else {
1583
- if (b == null) {
1584
- str = e <= TO_EXP_NEG || e >= TO_EXP_POS ? toExponential(coeffToString(n.c), e) : toFixedPoint(coeffToString(n.c), e, "0");
1585
- } else if (b === 10 && alphabetHasNormalDecimalDigits) {
1586
- n = round(new BigNumber4(n), DECIMAL_PLACES2 + e + 1, ROUNDING_MODE);
1587
- str = toFixedPoint(coeffToString(n.c), n.e, "0");
1588
- } else {
1589
- intCheck(b, 2, ALPHABET.length, "Base");
1590
- str = convertBase(toFixedPoint(coeffToString(n.c), e, "0"), 10, b, s, true);
1591
- }
1592
- if (s < 0 && n.c[0])
1593
- str = "-" + str;
1594
- }
1595
- return str;
1596
- };
1597
- P.valueOf = P.toJSON = function() {
1598
- return valueOf(this);
1599
- };
1600
- P._isBigNumber = true;
1601
- P[Symbol.toStringTag] = "BigNumber";
1602
- P[Symbol.for("nodejs.util.inspect.custom")] = P.valueOf;
1603
- if (configObject != null)
1604
- BigNumber4.set(configObject);
1605
- return BigNumber4;
1606
- }
1607
- function bitFloor(n) {
1608
- var i = n | 0;
1609
- return n > 0 || n === i ? i : i - 1;
1610
- }
1611
- function coeffToString(a) {
1612
- var s, z, i = 1, j = a.length, r = a[0] + "";
1613
- for (; i < j; ) {
1614
- s = a[i++] + "";
1615
- z = LOG_BASE - s.length;
1616
- for (; z--; s = "0" + s)
1617
- ;
1618
- r += s;
1619
- }
1620
- for (j = r.length; r.charCodeAt(--j) === 48; )
1621
- ;
1622
- return r.slice(0, j + 1 || 1);
1623
- }
1624
- function compare(x, y) {
1625
- var a, b, xc = x.c, yc = y.c, i = x.s, j = y.s, k = x.e, l = y.e;
1626
- if (!i || !j)
1627
- return null;
1628
- a = xc && !xc[0];
1629
- b = yc && !yc[0];
1630
- if (a || b)
1631
- return a ? b ? 0 : -j : i;
1632
- if (i != j)
1633
- return i;
1634
- a = i < 0;
1635
- b = k == l;
1636
- if (!xc || !yc)
1637
- return b ? 0 : !xc ^ a ? 1 : -1;
1638
- if (!b)
1639
- return k > l ^ a ? 1 : -1;
1640
- j = (k = xc.length) < (l = yc.length) ? k : l;
1641
- for (i = 0; i < j; i++)
1642
- if (xc[i] != yc[i])
1643
- return xc[i] > yc[i] ^ a ? 1 : -1;
1644
- return k == l ? 0 : k > l ^ a ? 1 : -1;
1645
- }
1646
- function intCheck(n, min, max, name) {
1647
- if (n < min || n > max || n !== mathfloor(n)) {
1648
- throw Error(bignumberError + (name || "Argument") + (typeof n == "number" ? n < min || n > max ? " out of range: " : " not an integer: " : " not a primitive number: ") + String(n));
1649
- }
1650
- }
1651
- function isOdd(n) {
1652
- var k = n.c.length - 1;
1653
- return bitFloor(n.e / LOG_BASE) == k && n.c[k] % 2 != 0;
1654
- }
1655
- function toExponential(str, e) {
1656
- return (str.length > 1 ? str.charAt(0) + "." + str.slice(1) : str) + (e < 0 ? "e" : "e+") + e;
1657
- }
1658
- function toFixedPoint(str, e, z) {
1659
- var len, zs;
1660
- if (e < 0) {
1661
- for (zs = z + "."; ++e; zs += z)
1662
- ;
1663
- str = zs + str;
1664
- } else {
1665
- len = str.length;
1666
- if (++e > len) {
1667
- for (zs = z, e -= len; --e; zs += z)
1668
- ;
1669
- str += zs;
1670
- } else if (e < len) {
1671
- str = str.slice(0, e) + "." + str.slice(e);
1672
- }
1673
- }
1674
- return str;
1675
- }
1676
- var BigNumber = clone();
1677
-
1678
- // src/utils/bignumber.ts
1679
- var DECIMAL_PLACES = 12;
1680
- BigNumber.config({
1681
- EXPONENTIAL_AT: [-100, 100],
1682
- ROUNDING_MODE: 1,
1683
- DECIMAL_PLACES
1684
- });
1685
- var ZERO = bnum(0);
1686
- var ONE = bnum(1);
1687
- var INFINITY = bnum("Infinity");
1688
- function scale(input, decimalPlaces) {
1689
- const scalePow = new BigNumber(decimalPlaces.toString());
1690
- const scaleMul = new BigNumber(10).pow(scalePow);
1691
- return input.times(scaleMul);
1692
- }
1693
- function bnum(val) {
1694
- return new BigNumber(val.toString());
1695
- }
1696
-
1697
- // src/utils/math.ts
1698
- function tradeFee(percentage) {
1699
- return bnum(parseFloat(percentage) / 100);
1700
- }
1701
- function calculateTradeFee(amount, tradeFee2) {
1702
- return amount.multipliedBy(tradeFee2).decimalPlaces(0, 1);
1703
- }
1704
- function normalizeAmount(amount, decimals) {
1705
- if (decimals == DECIMAL_PLACES) {
1706
- return amount;
1707
- }
1708
- const normalizedAmount = amount.shiftedBy(-1 * decimals);
1709
- return scale(normalizedAmount, 12);
1710
- }
1711
-
1712
- // node_modules/@galacticcouncil/math-xyk/index.esm.js
1713
- var WASM_VECTOR_LEN = 0;
1714
- var cachegetUint8Memory0 = null;
1715
- function getUint8Memory0() {
1716
- if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== (void 0).buffer) {
1717
- cachegetUint8Memory0 = new Uint8Array((void 0).buffer);
1718
- }
1719
- return cachegetUint8Memory0;
1720
- }
1721
- var lTextEncoder = typeof TextEncoder === "undefined" ? (0, module.require)("util").TextEncoder : TextEncoder;
1722
- var cachedTextEncoder = new lTextEncoder("utf-8");
1723
- var encodeString = typeof cachedTextEncoder.encodeInto === "function" ? function(arg, view) {
1724
- return cachedTextEncoder.encodeInto(arg, view);
1725
- } : function(arg, view) {
1726
- const buf = cachedTextEncoder.encode(arg);
1727
- view.set(buf);
1728
- return {
1729
- read: arg.length,
1730
- written: buf.length
1731
- };
1732
- };
1733
- function passStringToWasm0(arg, malloc, realloc) {
1734
- if (realloc === void 0) {
1735
- const buf = cachedTextEncoder.encode(arg);
1736
- const ptr2 = malloc(buf.length);
1737
- getUint8Memory0().subarray(ptr2, ptr2 + buf.length).set(buf);
1738
- WASM_VECTOR_LEN = buf.length;
1739
- return ptr2;
1740
- }
1741
- let len = arg.length;
1742
- let ptr = malloc(len);
1743
- const mem = getUint8Memory0();
1744
- let offset = 0;
1745
- for (; offset < len; offset++) {
1746
- const code = arg.charCodeAt(offset);
1747
- if (code > 127)
1748
- break;
1749
- mem[ptr + offset] = code;
1750
- }
1751
- if (offset !== len) {
1752
- if (offset !== 0) {
1753
- arg = arg.slice(offset);
1754
- }
1755
- ptr = realloc(ptr, len, len = offset + arg.length * 3);
1756
- const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
1757
- const ret = encodeString(arg, view);
1758
- offset += ret.written;
1759
- }
1760
- WASM_VECTOR_LEN = offset;
1761
- return ptr;
1762
- }
1763
- var cachegetInt32Memory0 = null;
1764
- function getInt32Memory0() {
1765
- if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== (void 0).buffer) {
1766
- cachegetInt32Memory0 = new Int32Array((void 0).buffer);
1767
- }
1768
- return cachegetInt32Memory0;
1769
- }
1770
- var lTextDecoder = typeof TextDecoder === "undefined" ? (0, module.require)("util").TextDecoder : TextDecoder;
1771
- var cachedTextDecoder = new lTextDecoder("utf-8", { ignoreBOM: true, fatal: true });
1772
- cachedTextDecoder.decode();
1773
- function getStringFromWasm0(ptr, len) {
1774
- return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
1775
- }
1776
- function get_spot_price2(s, b, a) {
1777
- try {
1778
- const retptr = (void 0)(-16);
1779
- const ptr0 = passStringToWasm0(s, void 0, void 0);
1780
- const len0 = WASM_VECTOR_LEN;
1781
- const ptr1 = passStringToWasm0(b, void 0, void 0);
1782
- const len1 = WASM_VECTOR_LEN;
1783
- const ptr2 = passStringToWasm0(a, void 0, void 0);
1784
- const len2 = WASM_VECTOR_LEN;
1785
- (void 0)(retptr, ptr0, len0, ptr1, len1, ptr2, len2);
1786
- var r0 = getInt32Memory0()[retptr / 4 + 0];
1787
- var r1 = getInt32Memory0()[retptr / 4 + 1];
1788
- return getStringFromWasm0(r0, r1);
1789
- } finally {
1790
- (void 0)(16);
1791
- (void 0)(r0, r1);
1792
- }
1793
- }
1794
- function calculate_out_given_in2(s, b, a) {
1795
- try {
1796
- const retptr = (void 0)(-16);
1797
- const ptr0 = passStringToWasm0(s, void 0, void 0);
1798
- const len0 = WASM_VECTOR_LEN;
1799
- const ptr1 = passStringToWasm0(b, void 0, void 0);
1800
- const len1 = WASM_VECTOR_LEN;
1801
- const ptr2 = passStringToWasm0(a, void 0, void 0);
1802
- const len2 = WASM_VECTOR_LEN;
1803
- (void 0)(retptr, ptr0, len0, ptr1, len1, ptr2, len2);
1804
- var r0 = getInt32Memory0()[retptr / 4 + 0];
1805
- var r1 = getInt32Memory0()[retptr / 4 + 1];
1806
- return getStringFromWasm0(r0, r1);
1807
- } finally {
1808
- (void 0)(16);
1809
- (void 0)(r0, r1);
1810
- }
1811
- }
1812
- function calculate_in_given_out2(s, b, a) {
1813
- try {
1814
- const retptr = (void 0)(-16);
1815
- const ptr0 = passStringToWasm0(s, void 0, void 0);
1816
- const len0 = WASM_VECTOR_LEN;
1817
- const ptr1 = passStringToWasm0(b, void 0, void 0);
1818
- const len1 = WASM_VECTOR_LEN;
1819
- const ptr2 = passStringToWasm0(a, void 0, void 0);
1820
- const len2 = WASM_VECTOR_LEN;
1821
- (void 0)(retptr, ptr0, len0, ptr1, len1, ptr2, len2);
1822
- var r0 = getInt32Memory0()[retptr / 4 + 0];
1823
- var r1 = getInt32Memory0()[retptr / 4 + 1];
1824
- return getStringFromWasm0(r0, r1);
1825
- } finally {
1826
- (void 0)(16);
1827
- (void 0)(r0, r1);
1828
- }
1829
- }
1830
-
1831
- // src/pool/xyk/xykMath.ts
1832
- function getSpotPrice(a, b, c) {
1833
- return get_spot_price2(a, b, c);
1834
- }
1835
- function calculateInGivenOut(a, b, c) {
1836
- return calculate_in_given_out2(a, b, c);
1837
- }
1838
- function calculateOutGivenIn(a, b, c) {
1839
- return calculate_out_given_in2(a, b, c);
1840
- }
1841
- var xykMath_default = { getSpotPrice, calculateInGivenOut, calculateOutGivenIn };
1842
-
1843
- // src/pool/xyk/xykPool.ts
1844
- var XykPool = class {
1845
- type;
1846
- address;
1847
- swapFee;
1848
- tokens;
1849
- static fromPool(pool) {
1850
- return new XykPool(pool.address, pool.swapFee, pool.tokens);
1851
- }
1852
- constructor(address, swapFee, tokens) {
1853
- this.type = "XYK" /* XYK */;
1854
- this.address = address;
1855
- this.swapFee = swapFee;
1856
- this.tokens = tokens;
1857
- }
1858
- validPair(_tokenIn, _tokenOut) {
1859
- return true;
1860
- }
1861
- parsePoolPair(tokenIn, tokenOut) {
1862
- const tokensMap = new Map(this.tokens.map((token) => [token.id, token]));
1863
- const tokenInMeta = tokensMap.get(tokenIn);
1864
- const tokenOutMeta = tokensMap.get(tokenOut);
1865
- if (tokenInMeta == null)
1866
- throw new Error("Pool does not contain tokenIn");
1867
- if (tokenOutMeta == null)
1868
- throw new Error("Pool does not contain tokenOut");
1869
- const balanceIn = bnum(tokenInMeta.balance);
1870
- const balanceOut = bnum(tokenOutMeta.balance);
1871
- return {
1872
- swapFee: tradeFee(this.swapFee),
1873
- tokenIn,
1874
- tokenOut,
1875
- balanceIn: normalizeAmount(balanceIn, tokenInMeta.decimals),
1876
- balanceOut: normalizeAmount(balanceOut, tokenOutMeta.decimals)
1877
- };
1878
- }
1879
- calculateInGivenOut(poolPair, amountOut) {
1880
- const price = xykMath_default.calculateInGivenOut(
1881
- poolPair.balanceIn.toString(),
1882
- poolPair.balanceOut.toString(),
1883
- amountOut.toString()
1884
- );
1885
- return bnum(price);
1886
- }
1887
- getSpotPriceIn(poolPair) {
1888
- const price = xykMath_default.getSpotPrice(
1889
- poolPair.balanceOut.toString(),
1890
- poolPair.balanceIn.toString(),
1891
- scale(bnum(1), 12).toString()
1892
- );
1893
- return bnum(price);
1894
- }
1895
- calculateOutGivenIn(poolPair, amountIn) {
1896
- const price = xykMath_default.calculateOutGivenIn(
1897
- poolPair.balanceIn.toString(),
1898
- poolPair.balanceOut.toString(),
1899
- amountIn.toString()
1900
- );
1901
- return bnum(price);
1902
- }
1903
- getSpotPriceOut(poolPair) {
1904
- const price = xykMath_default.getSpotPrice(
1905
- poolPair.balanceIn.toString(),
1906
- poolPair.balanceOut.toString(),
1907
- scale(bnum(1), 12).toString()
1908
- );
1909
- return bnum(price);
1910
- }
1911
- };
1912
-
1913
- // src/pool/poolFactory.ts
1914
- var PoolFactory = class {
1915
- static get(pool) {
1916
- switch (pool.type) {
1917
- case "XYK" /* XYK */:
1918
- return XykPool.fromPool(pool);
1919
- default: {
1920
- throw new Error("Pool type " + pool.type + " is not supported yet");
1921
- }
1922
- }
1923
- }
1924
- };
1925
-
1926
- // src/api/trade/router.ts
1927
- var TradeRouter = class {
1928
- routeSuggester;
1929
- poolService;
1930
- constructor(poolService) {
1931
- this.poolService = poolService;
1932
- this.routeSuggester = new RouteSuggester();
1933
- }
1934
- getPools() {
1935
- return this.poolService.getPools();
1936
- }
1937
- async getAllAssets() {
1938
- const asset = await this.getAssets();
1939
- return [...new Map(asset).values()];
1940
- }
1941
- async getAssetPairs(token) {
1942
- const pools = await this.poolService.getPools();
1943
- if (pools.length === 0)
1944
- return [];
1945
- const { assets, poolsMap } = await this.validateToken(token, pools);
1946
- const hops = this.getPaths(token, null, poolsMap, pools);
1947
- const dest = hops.map((hop) => hop[hop.length - 1].tokenOut);
1948
- return this.toPoolAssets([...new Set(dest)], assets);
1949
- }
1950
- async getAllPaths(tokenIn, tokenOut) {
1951
- const pools = await this.poolService.getPools();
1952
- if (pools.length === 0)
1953
- return [];
1954
- const { poolsMap } = await this.validateTokenPair(tokenIn, tokenOut, pools);
1955
- return this.getPaths(tokenIn, tokenOut, poolsMap, pools);
1956
- }
1957
- async getBestSellPrice(tokenIn, tokenOut, amountIn) {
1958
- const pools = await this.poolService.getPools();
1959
- if (pools.length === 0)
1960
- return [];
1961
- const { poolsMap } = await this.validateTokenPair(tokenIn, tokenOut, pools);
1962
- const paths = this.getPaths(tokenIn, tokenOut, poolsMap, pools);
1963
- const swaps = paths.map(
1964
- (path) => this.toSellSwaps(amountIn, path, poolsMap)
1965
- );
1966
- const sorted = swaps.sort((a, b) => {
1967
- const swapAFinal = a[a.length - 1].returnFinalAmount;
1968
- const swapBFinal = b[b.length - 1].returnFinalAmount;
1969
- return swapAFinal.isGreaterThan(swapBFinal) ? -1 : 1;
1970
- });
1971
- return sorted[0];
1972
- }
1973
- toSellSwaps(amountIn, path, poolsMap) {
1974
- const swaps = [];
1975
- for (let i = 0; i < path.length; i++) {
1976
- const hop = path[i];
1977
- const pool = poolsMap.get(hop.poolId);
1978
- if (pool == null)
1979
- throw new Error("Pool does not exit");
1980
- let aIn;
1981
- if (i > 0) {
1982
- aIn = swaps[i - 1].returnFinalAmount;
1983
- } else {
1984
- aIn = amountIn;
1985
- }
1986
- const poolPair = pool.parsePoolPair(hop.tokenIn, hop.tokenOut);
1987
- const calculated = pool.calculateOutGivenIn(poolPair, aIn);
1988
- const fee = calculateTradeFee(calculated, poolPair.swapFee);
1989
- const spotPrice = pool.getSpotPriceOut(poolPair);
1990
- swaps.push({
1991
- ...hop,
1992
- swapAmount: aIn,
1993
- returnAmount: calculated,
1994
- returnFinalAmount: calculated.minus(fee),
1995
- swapFee: fee,
1996
- spotPrice
1997
- });
1998
- }
1999
- return swaps;
2000
- }
2001
- async getBestBuyPrice(tokenIn, tokenOut, amountOut) {
2002
- const pools = await this.poolService.getPools();
2003
- if (pools.length === 0)
2004
- return [];
2005
- const { poolsMap } = await this.validateTokenPair(tokenIn, tokenOut, pools);
2006
- const paths = this.getPaths(tokenIn, tokenOut, poolsMap, pools);
2007
- const swaps = paths.map(
2008
- (path) => this.toBuySwaps(amountOut, path, poolsMap)
2009
- );
2010
- const sorted = swaps.sort((a, b) => {
2011
- const swapAFinal = a[0].returnFinalAmount;
2012
- const swapBFinal = b[0].returnFinalAmount;
2013
- return swapAFinal.isGreaterThan(swapBFinal) ? 1 : -1;
2014
- });
2015
- return sorted[0];
2016
- }
2017
- toBuySwaps(amountOut, path, poolsMap) {
2018
- const swaps = [];
2019
- for (let i = path.length - 1; i >= 0; i--) {
2020
- const hop = path[i];
2021
- const pool = poolsMap.get(hop.poolId);
2022
- if (pool == null)
2023
- throw new Error("Pool does not exit");
2024
- let aOut;
2025
- if (i == path.length - 1) {
2026
- aOut = amountOut;
2027
- } else {
2028
- aOut = swaps[0].returnFinalAmount;
2029
- }
2030
- const poolPair = pool.parsePoolPair(hop.tokenIn, hop.tokenOut);
2031
- const calculated = pool.calculateInGivenOut(poolPair, aOut);
2032
- const fee = calculateTradeFee(calculated, poolPair.swapFee);
2033
- const spotPrice = pool.getSpotPriceIn(poolPair);
2034
- swaps.unshift({
2035
- ...hop,
2036
- swapAmount: aOut,
2037
- returnAmount: calculated,
2038
- returnFinalAmount: calculated.plus(fee),
2039
- swapFee: fee,
2040
- spotPrice
2041
- });
2042
- }
2043
- return swaps;
2044
- }
2045
- async getAssets() {
2046
- const pools = await this.poolService.getPools();
2047
- if (pools.length === 0)
2048
- return /* @__PURE__ */ new Map();
2049
- const assets = pools.map((pool) => {
2050
- return pool.tokens.map(({ id, symbol }) => {
2051
- return { token: id, symbol };
2052
- });
2053
- }).flat();
2054
- return new Map(assets.map((asset) => [asset.token, asset]));
2055
- }
2056
- getPaths(tokenIn, tokenOut, poolsMap, pools) {
2057
- const routeProposals = this.routeSuggester.getProposals(
2058
- tokenIn,
2059
- tokenOut,
2060
- pools
2061
- );
2062
- const routes = routeProposals.filter((path) => this.validPath(path, poolsMap)).map((path) => this.toHops(path, poolsMap));
2063
- return routes;
2064
- }
2065
- async validateTokenPair(tokenIn, tokenOut, pools) {
2066
- const assets = await this.getAssets();
2067
- if (assets.get(tokenIn) == null)
2068
- throw new Error(tokenIn + " is not supported token");
2069
- if (assets.get(tokenOut) == null)
2070
- throw new Error(tokenOut + " is not supported token");
2071
- const poolsMap = this.getPoolMap(pools);
2072
- return { assets, poolsMap };
2073
- }
2074
- async validateToken(token, pools) {
2075
- const assets = await this.getAssets();
2076
- if (assets.get(token) == null)
2077
- throw new Error(token + " is not supported token");
2078
- const poolsMap = this.getPoolMap(pools);
2079
- return { assets, poolsMap };
2080
- }
2081
- getPoolMap(pools) {
2082
- return new Map(
2083
- pools.map((i) => [i.address, PoolFactory.get(i)])
2084
- );
2085
- }
2086
- validPath(proposedPath, poolsMap) {
2087
- return proposedPath.length > 0 && proposedPath.map((edge) => this.validEdge(edge, poolsMap)).reduce((prev, curr) => prev && curr);
2088
- }
2089
- validEdge([id, from, to], poolsMap) {
2090
- return poolsMap.get(id)?.validPair(from, to) || false;
2091
- }
2092
- toHops(path, poolsMap) {
2093
- return path.map(([id, from, to]) => {
2094
- const pool = poolsMap.get(id);
2095
- return {
2096
- poolId: id,
2097
- poolType: pool?.type,
2098
- tokenIn: from,
2099
- tokenOut: to,
2100
- fee: pool?.swapFee
2101
- };
2102
- });
2103
- }
2104
- toPoolAssets(tokens, assets) {
2105
- return tokens.map((token) => {
2106
- const asset = assets.get(token);
2107
- return {
2108
- token,
2109
- symbol: asset?.symbol
2110
- };
2111
- });
2112
- }
2113
- };
2114
- export {
2115
- BigNumber,
2116
- DECIMAL_PLACES,
2117
- INFINITY,
2118
- ONE,
2119
- PolkadotPoolService,
2120
- PoolFactory,
2121
- PoolType,
2122
- TradeRouter,
2123
- XykPool,
2124
- ZERO,
2125
- bnum,
2126
- scale
2127
- };
1
+ var re=Object.defineProperty;var ne=(g,r)=>{for(var a in r)re(g,a,{get:r[a],enumerable:!0})};var oe=(()=>{for(var g=new Uint8Array(128),r=0;r<64;r++)g[r<26?r+65:r<52?r+71:r<62?r-4:r*4-205]=r;return a=>{for(var p=a.length,o=new Uint8Array((p-(a[p-1]=="=")-(a[p-2]=="="))*3/4|0),_=0,h=0;_<p;){var B=g[a.charCodeAt(_++)],P=g[a.charCodeAt(_++)],v=g[a.charCodeAt(_++)],b=g[a.charCodeAt(_++)];o[h++]=B<<2|P>>4,o[h++]=P<<4|v>>2,o[h++]=v<<6|b}return o}})();var BA=class{constructor(r=1/0){this.capacity=r}storage=[];enqueue(r){if(this.size()===this.capacity)throw Error("Queue has reached max capacity, you cannot add more items");this.storage.push(r)}dequeue(){return this.storage.shift()}size(){return this.storage.length}};var cA=class{isNotVisited(r,a){let p=!0;return a.forEach(o=>{o[0]===r&&(p=!1)}),p}findPaths(r,a,p){let o=[],_=new BA,h=[];for(h.push([a,""]),_.enqueue(h);_.size()>0;){let B=_.dequeue();if(B==null)return o;let P=B[B.length-1];(p===null||P[0]===p)&&o.push(B),r[P[0]].forEach(b=>{if(this.isNotVisited(b[0],B)){let T=[...B];T.push(b),_.enqueue(T)}})}return o}buildAndPopulateGraph(r,a){let p=[];for(let o=0;o<r.length;o++)p.push([]);for(let[o,_,h]of a){let B=parseInt(_),P=parseInt(h);p[B].push([P,o])}return p}};function MA(g){let r={};for(let a of g){let p=a.tokens.length;for(let o=0;o<p;o++){r[a.tokens[o].id]||(r[a.tokens[o].id]=[]);for(let _=0;_<p;_++){if(o==_)continue;let h=[a.address,a.tokens[o].id,a.tokens[_].id];r[a.tokens[o].id].push(h)}}}return r}var uA=class{getProposals(r,a,p){let o=MA(p),_=Object.keys(o),h=_.map(b=>o[b]).flat(),B=new cA,P=B.buildAndPopulateGraph(_,h),v=B.findPaths(P,parseInt(r),a?parseInt(a):null);return this.parsePaths(v)}parsePaths(r){let a=[];for(let p of r){let o=[];for(let _=0;_<p.length;_++){let h=p[_],B=p[_+1];if(B==null)break;o.push(this.toEdge(h,B))}a.push(o)}return a}toEdge(r,a){return[a[1],r[0].toString(),a[0].toString()]}};var fA=class{api;constructor(r){this.api=r}getStorageKey(r,a){return r[0].toHuman()[a]}getStorageEntryArray(r){return r[1].toHuman()}async getAssetMetadata(r){return await this.api.query.assetRegistry.assetMetadataMap(r)}async getSystemAccountBalance(r){let{data:{free:a}}=await this.api.query.system.account(r);return a.toString()}async getTokenAccountBalance(r,a){let{free:p}=await this.api.query.tokens.accounts(r,a);return p.toString()}};var hA=(o=>(o.XYK="XYK",o.LBP="LBP",o.Stable="Stable",o.Omni="Omni",o))(hA||{});var wA=class extends fA{async getPools(){let a=(await this.api.query.xyk.poolAssets.entries()).map(async p=>{let o=this.getStorageKey(p,0),_=this.getStorageEntryArray(p),h=await this.getPoolTokens(o,_);return{address:o,type:"XYK",swapFee:this.getSwapFee(),tokens:h}});return Promise.all(a)}async getPoolTokens(r,a){let p=a.map(async o=>{let _=await this.getBalance(r,o),B=(await super.getAssetMetadata(o)).toHuman();return{id:o,balance:_,decimals:B?B.decimals:"12",symbol:B?B.symbol:"BSX"}});return Promise.all(p)}getBalance(r,a){return a==="0"?this.getSystemAccountBalance(r):this.getTokenAccountBalance(r,a)}getSwapFee(){let r=this.api.consts.xyk.getExchangeFee;return(r[0].toNumber()/r[1].toNumber()*100).toString()}};var kA=class{api;constructor(r){this.api=r}async getPools(){let r=[],a=await new wA(this.api).getPools();return r.push(a),r.flat()}};var je=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,GA=Math.ceil,V=Math.floor,K="[BigNumber Error] ",XA=K+"Number primitive has more than 15 significant digits: ",U=1e14,E=14,KA=9007199254740991,RA=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],tA=1e7,I=1e9;function zA(g){var r,a,p,o=d.prototype={constructor:d,toString:null,valueOf:null},_=new d(1),h=20,B=4,P=-7,v=21,b=-1e7,T=1e7,M=!1,aA=1,eA=0,OA={prefix:"",groupSize:3,secondaryGroupSize:0,groupSeparator:",",decimalSeparator:".",fractionGroupSize:0,fractionGroupSeparator:"\xA0",suffix:""},nA="0123456789abcdefghijklmnopqrstuvwxyz",NA=!0;function d(A,e){var t,c,j,s,f,n,i,u,l=this;if(!(l instanceof d))return new d(A,e);if(e==null){if(A&&A._isBigNumber===!0){l.s=A.s,!A.c||A.e>T?l.c=l.e=null:A.e<b?l.c=[l.e=0]:(l.e=A.e,l.c=A.c.slice());return}if((n=typeof A=="number")&&A*0==0){if(l.s=1/A<0?(A=-A,-1):1,A===~~A){for(s=0,f=A;f>=10;f/=10,s++);s>T?l.c=l.e=null:(l.e=s,l.c=[A]);return}u=String(A)}else{if(!je.test(u=String(A)))return p(l,u,n);l.s=u.charCodeAt(0)==45?(u=u.slice(1),-1):1}(s=u.indexOf("."))>-1&&(u=u.replace(".","")),(f=u.search(/e/i))>0?(s<0&&(s=f),s+=+u.slice(f+1),u=u.substring(0,f)):s<0&&(s=u.length)}else{if(O(e,2,nA.length,"Base"),e==10&&NA)return l=new d(A),H(l,h+l.e+1,B);if(u=String(A),n=typeof A=="number"){if(A*0!=0)return p(l,u,n,e);if(l.s=1/A<0?(u=u.slice(1),-1):1,d.DEBUG&&u.replace(/^0\.0*|\./,"").length>15)throw Error(XA+A)}else l.s=u.charCodeAt(0)===45?(u=u.slice(1),-1):1;for(t=nA.slice(0,e),s=f=0,i=u.length;f<i;f++)if(t.indexOf(c=u.charAt(f))<0){if(c=="."){if(f>s){s=i;continue}}else if(!j&&(u==u.toUpperCase()&&(u=u.toLowerCase())||u==u.toLowerCase()&&(u=u.toUpperCase()))){j=!0,f=-1,s=0;continue}return p(l,String(A),n,e)}n=!1,u=a(u,e,10,l.s),(s=u.indexOf("."))>-1?u=u.replace(".",""):s=u.length}for(f=0;u.charCodeAt(f)===48;f++);for(i=u.length;u.charCodeAt(--i)===48;);if(u=u.slice(f,++i)){if(i-=f,n&&d.DEBUG&&i>15&&(A>KA||A!==V(A)))throw Error(XA+l.s*A);if((s=s-f-1)>T)l.c=l.e=null;else if(s<b)l.c=[l.e=0];else{if(l.e=s,l.c=[],f=(s+1)%E,s<0&&(f+=E),f<i){for(f&&l.c.push(+u.slice(0,f)),i-=E;f<i;)l.c.push(+u.slice(f,f+=E));f=E-(u=u.slice(f)).length}else f-=i;for(;f--;u+="0");l.c.push(+u)}}else l.c=[l.e=0]}d.clone=zA,d.ROUND_UP=0,d.ROUND_DOWN=1,d.ROUND_CEIL=2,d.ROUND_FLOOR=3,d.ROUND_HALF_UP=4,d.ROUND_HALF_DOWN=5,d.ROUND_HALF_EVEN=6,d.ROUND_HALF_CEIL=7,d.ROUND_HALF_FLOOR=8,d.EUCLID=9,d.config=d.set=function(A){var e,t;if(A!=null)if(typeof A=="object"){if(A.hasOwnProperty(e="DECIMAL_PLACES")&&(t=A[e],O(t,0,I,e),h=t),A.hasOwnProperty(e="ROUNDING_MODE")&&(t=A[e],O(t,0,8,e),B=t),A.hasOwnProperty(e="EXPONENTIAL_AT")&&(t=A[e],t&&t.pop?(O(t[0],-I,0,e),O(t[1],0,I,e),P=t[0],v=t[1]):(O(t,-I,I,e),P=-(v=t<0?-t:t))),A.hasOwnProperty(e="RANGE"))if(t=A[e],t&&t.pop)O(t[0],-I,-1,e),O(t[1],1,I,e),b=t[0],T=t[1];else if(O(t,-I,I,e),t)b=-(T=t<0?-t:t);else throw Error(K+e+" cannot be zero: "+t);if(A.hasOwnProperty(e="CRYPTO"))if(t=A[e],t===!!t)if(t)if(typeof crypto<"u"&&crypto&&(crypto.getRandomValues||crypto.randomBytes))M=t;else throw M=!t,Error(K+"crypto unavailable");else M=t;else throw Error(K+e+" not true or false: "+t);if(A.hasOwnProperty(e="MODULO_MODE")&&(t=A[e],O(t,0,9,e),aA=t),A.hasOwnProperty(e="POW_PRECISION")&&(t=A[e],O(t,0,I,e),eA=t),A.hasOwnProperty(e="FORMAT"))if(t=A[e],typeof t=="object")OA=t;else throw Error(K+e+" not an object: "+t);if(A.hasOwnProperty(e="ALPHABET"))if(t=A[e],typeof t=="string"&&!/^.?$|[+\-.\s]|(.).*\1/.test(t))NA=t.slice(0,10)=="0123456789",nA=t;else throw Error(K+e+" invalid: "+t)}else throw Error(K+"Object expected: "+A);return{DECIMAL_PLACES:h,ROUNDING_MODE:B,EXPONENTIAL_AT:[P,v],RANGE:[b,T],CRYPTO:M,MODULO_MODE:aA,POW_PRECISION:eA,FORMAT:OA,ALPHABET:nA}},d.isBigNumber=function(A){if(!A||A._isBigNumber!==!0)return!1;if(!d.DEBUG)return!0;var e,t,c=A.c,j=A.e,s=A.s;A:if({}.toString.call(c)=="[object Array]"){if((s===1||s===-1)&&j>=-I&&j<=I&&j===V(j)){if(c[0]===0){if(j===0&&c.length===1)return!0;break A}if(e=(j+1)%E,e<1&&(e+=E),String(c[0]).length==e){for(e=0;e<c.length;e++)if(t=c[e],t<0||t>=U||t!==V(t))break A;if(t!==0)return!0}}}else if(c===null&&j===null&&(s===null||s===1||s===-1))return!0;throw Error(K+"Invalid BigNumber: "+A)},d.maximum=d.max=function(){return UA(arguments,o.lt)},d.minimum=d.min=function(){return UA(arguments,o.gt)},d.random=function(){var A=9007199254740992,e=Math.random()*A&2097151?function(){return V(Math.random()*A)}:function(){return(Math.random()*1073741824|0)*8388608+(Math.random()*8388608|0)};return function(t){var c,j,s,f,n,i=0,u=[],l=new d(_);if(t==null?t=h:O(t,0,I),f=GA(t/E),M)if(crypto.getRandomValues){for(c=crypto.getRandomValues(new Uint32Array(f*=2));i<f;)n=c[i]*131072+(c[i+1]>>>11),n>=9e15?(j=crypto.getRandomValues(new Uint32Array(2)),c[i]=j[0],c[i+1]=j[1]):(u.push(n%1e14),i+=2);i=f/2}else if(crypto.randomBytes){for(c=crypto.randomBytes(f*=7);i<f;)n=(c[i]&31)*281474976710656+c[i+1]*1099511627776+c[i+2]*4294967296+c[i+3]*16777216+(c[i+4]<<16)+(c[i+5]<<8)+c[i+6],n>=9e15?crypto.randomBytes(7).copy(c,i):(u.push(n%1e14),i+=7);i=f/7}else throw M=!1,Error(K+"crypto unavailable");if(!M)for(;i<f;)n=e(),n<9e15&&(u[i++]=n%1e14);for(f=u[--i],t%=E,f&&t&&(n=RA[E-t],u[i]=V(f/n)*n);u[i]===0;u.pop(),i--);if(i<0)u=[s=0];else{for(s=-1;u[0]===0;u.splice(0,1),s-=E);for(i=1,n=u[0];n>=10;n/=10,i++);i<E&&(s-=E-i)}return l.e=s,l.c=u,l}}(),d.sum=function(){for(var A=1,e=arguments,t=new d(e[0]);A<e.length;)t=t.plus(e[A++]);return t},a=function(){var A="0123456789";function e(t,c,j,s){for(var f,n=[0],i,u=0,l=t.length;u<l;){for(i=n.length;i--;n[i]*=c);for(n[0]+=s.indexOf(t.charAt(u++)),f=0;f<n.length;f++)n[f]>j-1&&(n[f+1]==null&&(n[f+1]=0),n[f+1]+=n[f]/j|0,n[f]%=j)}return n.reverse()}return function(t,c,j,s,f){var n,i,u,l,m,w,k,q,N=t.indexOf("."),$=h,y=B;for(N>=0&&(l=eA,eA=0,t=t.replace(".",""),q=new d(c),w=q.pow(t.length-N),eA=l,q.c=e(Z(C(w.c),w.e,"0"),10,j,A),q.e=q.c.length),k=e(t,c,j,f?(n=nA,A):(n=A,nA)),u=l=k.length;k[--l]==0;k.pop());if(!k[0])return n.charAt(0);if(N<0?--u:(w.c=k,w.e=u,w.s=s,w=r(w,q,$,y,j),k=w.c,m=w.r,u=w.e),i=u+$+1,N=k[i],l=j/2,m=m||i<0||k[i+1]!=null,m=y<4?(N!=null||m)&&(y==0||y==(w.s<0?3:2)):N>l||N==l&&(y==4||m||y==6&&k[i-1]&1||y==(w.s<0?8:7)),i<1||!k[0])t=m?Z(n.charAt(1),-$,n.charAt(0)):n.charAt(0);else{if(k.length=i,m)for(--j;++k[--i]>j;)k[i]=0,i||(++u,k=[1].concat(k));for(l=k.length;!k[--l];);for(N=0,t="";N<=l;t+=n.charAt(k[N++]));t=Z(t,u,n.charAt(0))}return t}}(),r=function(){function A(c,j,s){var f,n,i,u,l=0,m=c.length,w=j%tA,k=j/tA|0;for(c=c.slice();m--;)i=c[m]%tA,u=c[m]/tA|0,f=k*i+u*w,n=w*i+f%tA*tA+l,l=(n/s|0)+(f/tA|0)+k*u,c[m]=n%s;return l&&(c=[l].concat(c)),c}function e(c,j,s,f){var n,i;if(s!=f)i=s>f?1:-1;else for(n=i=0;n<s;n++)if(c[n]!=j[n]){i=c[n]>j[n]?1:-1;break}return i}function t(c,j,s,f){for(var n=0;s--;)c[s]-=n,n=c[s]<j[s]?1:0,c[s]=n*f+c[s]-j[s];for(;!c[0]&&c.length>1;c.splice(0,1));}return function(c,j,s,f,n){var i,u,l,m,w,k,q,N,$,y,x,S,dA,IA,SA,z,lA,W=c.s==j.s?1:-1,G=c.c,F=j.c;if(!G||!G[0]||!F||!F[0])return new d(!c.s||!j.s||(G?F&&G[0]==F[0]:!F)?NaN:G&&G[0]==0||!F?W*0:W/0);for(N=new d(W),$=N.c=[],u=c.e-j.e,W=s+u+1,n||(n=U,u=L(c.e/E)-L(j.e/E),W=W/E|0),l=0;F[l]==(G[l]||0);l++);if(F[l]>(G[l]||0)&&u--,W<0)$.push(1),m=!0;else{for(IA=G.length,z=F.length,l=0,W+=2,w=V(n/(F[0]+1)),w>1&&(F=A(F,w,n),G=A(G,w,n),z=F.length,IA=G.length),dA=z,y=G.slice(0,z),x=y.length;x<z;y[x++]=0);lA=F.slice(),lA=[0].concat(lA),SA=F[0],F[1]>=n/2&&SA++;do{if(w=0,i=e(F,y,z,x),i<0){if(S=y[0],z!=x&&(S=S*n+(y[1]||0)),w=V(S/SA),w>1)for(w>=n&&(w=n-1),k=A(F,w,n),q=k.length,x=y.length;e(k,y,q,x)==1;)w--,t(k,z<q?lA:F,q,n),q=k.length,i=1;else w==0&&(i=w=1),k=F.slice(),q=k.length;if(q<x&&(k=[0].concat(k)),t(y,k,x,n),x=y.length,i==-1)for(;e(F,y,z,x)<1;)w++,t(y,z<x?lA:F,x,n),x=y.length}else i===0&&(w++,y=[0]);$[l++]=w,y[0]?y[x++]=G[dA]||0:(y=[G[dA]],x=1)}while((dA++<IA||y[0]!=null)&&W--);m=y[0]!=null,$[0]||$.splice(0,1)}if(n==U){for(l=1,W=$[0];W>=10;W/=10,l++);H(N,s+(N.e=l+u*E-1)+1,f,m)}else N.e=u,N.r=+m;return N}}();function FA(A,e,t,c){var j,s,f,n,i;if(t==null?t=B:O(t,0,8),!A.c)return A.toString();if(j=A.c[0],f=A.e,e==null)i=C(A.c),i=c==1||c==2&&(f<=P||f>=v)?EA(i,f):Z(i,f,"0");else if(A=H(new d(A),e,t),s=A.e,i=C(A.c),n=i.length,c==1||c==2&&(e<=s||s<=P)){for(;n<e;i+="0",n++);i=EA(i,s)}else if(e-=f,i=Z(i,s,"0"),s+1>n){if(--e>0)for(i+=".";e--;i+="0");}else if(e+=s-n,e>0)for(s+1==n&&(i+=".");e--;i+="0");return A.s<0&&j?"-"+i:i}function UA(A,e){for(var t,c=1,j=new d(A[0]);c<A.length;c++)if(t=new d(A[c]),t.s)e.call(j,t)&&(j=t);else{j=t;break}return j}function $A(A,e,t){for(var c=1,j=e.length;!e[--j];e.pop());for(j=e[0];j>=10;j/=10,c++);return(t=c+t*E-1)>T?A.c=A.e=null:t<b?A.c=[A.e=0]:(A.e=t,A.c=e),A}p=function(){var A=/^(-?)0([xbo])(?=\w[\w.]*$)/i,e=/^([^.]+)\.$/,t=/^\.([^.]+)$/,c=/^-?(Infinity|NaN)$/,j=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(s,f,n,i){var u,l=n?f:f.replace(j,"");if(c.test(l))s.s=isNaN(l)?null:l<0?-1:1;else{if(!n&&(l=l.replace(A,function(m,w,k){return u=(k=k.toLowerCase())=="x"?16:k=="b"?2:8,!i||i==u?w:m}),i&&(u=i,l=l.replace(e,"$1").replace(t,"0.$1")),f!=l))return new d(l,u);if(d.DEBUG)throw Error(K+"Not a"+(i?" base "+i:"")+" number: "+f);s.s=null}s.c=s.e=null}}();function H(A,e,t,c){var j,s,f,n,i,u,l,m=A.c,w=RA;if(m){A:{for(j=1,n=m[0];n>=10;n/=10,j++);if(s=e-j,s<0)s+=E,f=e,i=m[u=0],l=i/w[j-f-1]%10|0;else if(u=GA((s+1)/E),u>=m.length)if(c){for(;m.length<=u;m.push(0));i=l=0,j=1,s%=E,f=s-E+1}else break A;else{for(i=n=m[u],j=1;n>=10;n/=10,j++);s%=E,f=s-E+j,l=f<0?0:i/w[j-f-1]%10|0}if(c=c||e<0||m[u+1]!=null||(f<0?i:i%w[j-f-1]),c=t<4?(l||c)&&(t==0||t==(A.s<0?3:2)):l>5||l==5&&(t==4||c||t==6&&(s>0?f>0?i/w[j-f]:0:m[u-1])%10&1||t==(A.s<0?8:7)),e<1||!m[0])return m.length=0,c?(e-=A.e+1,m[0]=w[(E-e%E)%E],A.e=-e||0):m[0]=A.e=0,A;if(s==0?(m.length=u,n=1,u--):(m.length=u+1,n=w[E-s],m[u]=f>0?V(i/w[j-f]%w[f])*n:0),c)for(;;)if(u==0){for(s=1,f=m[0];f>=10;f/=10,s++);for(f=m[0]+=n,n=1;f>=10;f/=10,n++);s!=n&&(A.e++,m[0]==U&&(m[0]=1));break}else{if(m[u]+=n,m[u]!=U)break;m[u--]=0,n=1}for(s=m.length;m[--s]===0;m.pop());}A.e>T?A.c=A.e=null:A.e<b&&(A.c=[A.e=0])}return A}function Q(A){var e,t=A.e;return t===null?A.toString():(e=C(A.c),e=t<=P||t>=v?EA(e,t):Z(e,t,"0"),A.s<0?"-"+e:e)}return o.absoluteValue=o.abs=function(){var A=new d(this);return A.s<0&&(A.s=1),A},o.comparedTo=function(A,e){return jA(this,new d(A,e))},o.decimalPlaces=o.dp=function(A,e){var t,c,j,s=this;if(A!=null)return O(A,0,I),e==null?e=B:O(e,0,8),H(new d(s),A+s.e+1,e);if(!(t=s.c))return null;if(c=((j=t.length-1)-L(this.e/E))*E,j=t[j])for(;j%10==0;j/=10,c--);return c<0&&(c=0),c},o.dividedBy=o.div=function(A,e){return r(this,new d(A,e),h,B)},o.dividedToIntegerBy=o.idiv=function(A,e){return r(this,new d(A,e),0,1)},o.exponentiatedBy=o.pow=function(A,e){var t,c,j,s,f,n,i,u,l,m=this;if(A=new d(A),A.c&&!A.isInteger())throw Error(K+"Exponent not an integer: "+Q(A));if(e!=null&&(e=new d(e)),n=A.e>14,!m.c||!m.c[0]||m.c[0]==1&&!m.e&&m.c.length==1||!A.c||!A.c[0])return l=new d(Math.pow(+Q(m),n?2-PA(A):+Q(A))),e?l.mod(e):l;if(i=A.s<0,e){if(e.c?!e.c[0]:!e.s)return new d(NaN);c=!i&&m.isInteger()&&e.isInteger(),c&&(m=m.mod(e))}else{if(A.e>9&&(m.e>0||m.e<-1||(m.e==0?m.c[0]>1||n&&m.c[1]>=24e7:m.c[0]<8e13||n&&m.c[0]<=9999975e7)))return s=m.s<0&&PA(A)?-0:0,m.e>-1&&(s=1/s),new d(i?1/s:s);eA&&(s=GA(eA/E+2))}for(n?(t=new d(.5),i&&(A.s=1),u=PA(A)):(j=Math.abs(+Q(A)),u=j%2),l=new d(_);;){if(u){if(l=l.times(m),!l.c)break;s?l.c.length>s&&(l.c.length=s):c&&(l=l.mod(e))}if(j){if(j=V(j/2),j===0)break;u=j%2}else if(A=A.times(t),H(A,A.e+1,1),A.e>14)u=PA(A);else{if(j=+Q(A),j===0)break;u=j%2}m=m.times(m),s?m.c&&m.c.length>s&&(m.c.length=s):c&&(m=m.mod(e))}return c?l:(i&&(l=_.div(l)),e?l.mod(e):s?H(l,eA,B,f):l)},o.integerValue=function(A){var e=new d(this);return A==null?A=B:O(A,0,8),H(e,e.e+1,A)},o.isEqualTo=o.eq=function(A,e){return jA(this,new d(A,e))===0},o.isFinite=function(){return!!this.c},o.isGreaterThan=o.gt=function(A,e){return jA(this,new d(A,e))>0},o.isGreaterThanOrEqualTo=o.gte=function(A,e){return(e=jA(this,new d(A,e)))===1||e===0},o.isInteger=function(){return!!this.c&&L(this.e/E)>this.c.length-2},o.isLessThan=o.lt=function(A,e){return jA(this,new d(A,e))<0},o.isLessThanOrEqualTo=o.lte=function(A,e){return(e=jA(this,new d(A,e)))===-1||e===0},o.isNaN=function(){return!this.s},o.isNegative=function(){return this.s<0},o.isPositive=function(){return this.s>0},o.isZero=function(){return!!this.c&&this.c[0]==0},o.minus=function(A,e){var t,c,j,s,f=this,n=f.s;if(A=new d(A,e),e=A.s,!n||!e)return new d(NaN);if(n!=e)return A.s=-e,f.plus(A);var i=f.e/E,u=A.e/E,l=f.c,m=A.c;if(!i||!u){if(!l||!m)return l?(A.s=-e,A):new d(m?f:NaN);if(!l[0]||!m[0])return m[0]?(A.s=-e,A):new d(l[0]?f:B==3?-0:0)}if(i=L(i),u=L(u),l=l.slice(),n=i-u){for((s=n<0)?(n=-n,j=l):(u=i,j=m),j.reverse(),e=n;e--;j.push(0));j.reverse()}else for(c=(s=(n=l.length)<(e=m.length))?n:e,n=e=0;e<c;e++)if(l[e]!=m[e]){s=l[e]<m[e];break}if(s&&(j=l,l=m,m=j,A.s=-A.s),e=(c=m.length)-(t=l.length),e>0)for(;e--;l[t++]=0);for(e=U-1;c>n;){if(l[--c]<m[c]){for(t=c;t&&!l[--t];l[t]=e);--l[t],l[c]+=U}l[c]-=m[c]}for(;l[0]==0;l.splice(0,1),--u);return l[0]?$A(A,l,u):(A.s=B==3?-1:1,A.c=[A.e=0],A)},o.modulo=o.mod=function(A,e){var t,c,j=this;return A=new d(A,e),!j.c||!A.s||A.c&&!A.c[0]?new d(NaN):!A.c||j.c&&!j.c[0]?new d(j):(aA==9?(c=A.s,A.s=1,t=r(j,A,0,3),A.s=c,t.s*=c):t=r(j,A,0,aA),A=j.minus(t.times(A)),!A.c[0]&&aA==1&&(A.s=j.s),A)},o.multipliedBy=o.times=function(A,e){var t,c,j,s,f,n,i,u,l,m,w,k,q,N,$,y=this,x=y.c,S=(A=new d(A,e)).c;if(!x||!S||!x[0]||!S[0])return!y.s||!A.s||x&&!x[0]&&!S||S&&!S[0]&&!x?A.c=A.e=A.s=null:(A.s*=y.s,!x||!S?A.c=A.e=null:(A.c=[0],A.e=0)),A;for(c=L(y.e/E)+L(A.e/E),A.s*=y.s,i=x.length,m=S.length,i<m&&(q=x,x=S,S=q,j=i,i=m,m=j),j=i+m,q=[];j--;q.push(0));for(N=U,$=tA,j=m;--j>=0;){for(t=0,w=S[j]%$,k=S[j]/$|0,f=i,s=j+f;s>j;)u=x[--f]%$,l=x[f]/$|0,n=k*u+l*w,u=w*u+n%$*$+q[s]+t,t=(u/N|0)+(n/$|0)+k*l,q[s--]=u%N;q[s]=t}return t?++c:q.splice(0,1),$A(A,q,c)},o.negated=function(){var A=new d(this);return A.s=-A.s||null,A},o.plus=function(A,e){var t,c=this,j=c.s;if(A=new d(A,e),e=A.s,!j||!e)return new d(NaN);if(j!=e)return A.s=-e,c.minus(A);var s=c.e/E,f=A.e/E,n=c.c,i=A.c;if(!s||!f){if(!n||!i)return new d(j/0);if(!n[0]||!i[0])return i[0]?A:new d(n[0]?c:j*0)}if(s=L(s),f=L(f),n=n.slice(),j=s-f){for(j>0?(f=s,t=i):(j=-j,t=n),t.reverse();j--;t.push(0));t.reverse()}for(j=n.length,e=i.length,j-e<0&&(t=i,i=n,n=t,e=j),j=0;e;)j=(n[--e]=n[e]+i[e]+j)/U|0,n[e]=U===n[e]?0:n[e]%U;return j&&(n=[j].concat(n),++f),$A(A,n,f)},o.precision=o.sd=function(A,e){var t,c,j,s=this;if(A!=null&&A!==!!A)return O(A,1,I),e==null?e=B:O(e,0,8),H(new d(s),A,e);if(!(t=s.c))return null;if(j=t.length-1,c=j*E+1,j=t[j]){for(;j%10==0;j/=10,c--);for(j=t[0];j>=10;j/=10,c++);}return A&&s.e+1>c&&(c=s.e+1),c},o.shiftedBy=function(A){return O(A,-KA,KA),this.times("1e"+A)},o.squareRoot=o.sqrt=function(){var A,e,t,c,j,s=this,f=s.c,n=s.s,i=s.e,u=h+4,l=new d("0.5");if(n!==1||!f||!f[0])return new d(!n||n<0&&(!f||f[0])?NaN:f?s:1/0);if(n=Math.sqrt(+Q(s)),n==0||n==1/0?(e=C(f),(e.length+i)%2==0&&(e+="0"),n=Math.sqrt(+e),i=L((i+1)/2)-(i<0||i%2),n==1/0?e="5e"+i:(e=n.toExponential(),e=e.slice(0,e.indexOf("e")+1)+i),t=new d(e)):t=new d(n+""),t.c[0]){for(i=t.e,n=i+u,n<3&&(n=0);;)if(j=t,t=l.times(j.plus(r(s,j,u,1))),C(j.c).slice(0,n)===(e=C(t.c)).slice(0,n))if(t.e<i&&--n,e=e.slice(n-3,n+1),e=="9999"||!c&&e=="4999"){if(!c&&(H(j,j.e+h+2,0),j.times(j).eq(s))){t=j;break}u+=4,n+=4,c=1}else{(!+e||!+e.slice(1)&&e.charAt(0)=="5")&&(H(t,t.e+h+2,1),A=!t.times(t).eq(s));break}}return H(t,t.e+h+1,B,A)},o.toExponential=function(A,e){return A!=null&&(O(A,0,I),A++),FA(this,A,e,1)},o.toFixed=function(A,e){return A!=null&&(O(A,0,I),A=A+this.e+1),FA(this,A,e)},o.toFormat=function(A,e,t){var c,j=this;if(t==null)A!=null&&e&&typeof e=="object"?(t=e,e=null):A&&typeof A=="object"?(t=A,A=e=null):t=OA;else if(typeof t!="object")throw Error(K+"Argument not an object: "+t);if(c=j.toFixed(A,e),j.c){var s,f=c.split("."),n=+t.groupSize,i=+t.secondaryGroupSize,u=t.groupSeparator||"",l=f[0],m=f[1],w=j.s<0,k=w?l.slice(1):l,q=k.length;if(i&&(s=n,n=i,i=s,q-=s),n>0&&q>0){for(s=q%n||n,l=k.substr(0,s);s<q;s+=n)l+=u+k.substr(s,n);i>0&&(l+=u+k.slice(s)),w&&(l="-"+l)}c=m?l+(t.decimalSeparator||"")+((i=+t.fractionGroupSize)?m.replace(new RegExp("\\d{"+i+"}\\B","g"),"$&"+(t.fractionGroupSeparator||"")):m):l}return(t.prefix||"")+c+(t.suffix||"")},o.toFraction=function(A){var e,t,c,j,s,f,n,i,u,l,m,w,k=this,q=k.c;if(A!=null&&(n=new d(A),!n.isInteger()&&(n.c||n.s!==1)||n.lt(_)))throw Error(K+"Argument "+(n.isInteger()?"out of range: ":"not an integer: ")+Q(n));if(!q)return new d(k);for(e=new d(_),u=t=new d(_),c=i=new d(_),w=C(q),s=e.e=w.length-k.e-1,e.c[0]=RA[(f=s%E)<0?E+f:f],A=!A||n.comparedTo(e)>0?s>0?e:u:n,f=T,T=1/0,n=new d(w),i.c[0]=0;l=r(n,e,0,1),j=t.plus(l.times(c)),j.comparedTo(A)!=1;)t=c,c=j,u=i.plus(l.times(j=u)),i=j,e=n.minus(l.times(j=e)),n=j;return j=r(A.minus(t),c,0,1),i=i.plus(j.times(u)),t=t.plus(j.times(c)),i.s=u.s=k.s,s=s*2,m=r(u,c,s,B).minus(k).abs().comparedTo(r(i,t,s,B).minus(k).abs())<1?[u,c]:[i,t],T=f,m},o.toNumber=function(){return+Q(this)},o.toPrecision=function(A,e){return A!=null&&O(A,1,I),FA(this,A,e,2)},o.toString=function(A){var e,t=this,c=t.s,j=t.e;return j===null?c?(e="Infinity",c<0&&(e="-"+e)):e="NaN":(A==null?e=j<=P||j>=v?EA(C(t.c),j):Z(C(t.c),j,"0"):A===10&&NA?(t=H(new d(t),h+j+1,B),e=Z(C(t.c),t.e,"0")):(O(A,2,nA.length,"Base"),e=a(Z(C(t.c),j,"0"),10,A,c,!0)),c<0&&t.c[0]&&(e="-"+e)),e},o.valueOf=o.toJSON=function(){return Q(this)},o._isBigNumber=!0,o[Symbol.toStringTag]="BigNumber",o[Symbol.for("nodejs.util.inspect.custom")]=o.valueOf,g!=null&&d.set(g),d}function L(g){var r=g|0;return g>0||g===r?r:r-1}function C(g){for(var r,a,p=1,o=g.length,_=g[0]+"";p<o;){for(r=g[p++]+"",a=E-r.length;a--;r="0"+r);_+=r}for(o=_.length;_.charCodeAt(--o)===48;);return _.slice(0,o+1||1)}function jA(g,r){var a,p,o=g.c,_=r.c,h=g.s,B=r.s,P=g.e,v=r.e;if(!h||!B)return null;if(a=o&&!o[0],p=_&&!_[0],a||p)return a?p?0:-B:h;if(h!=B)return h;if(a=h<0,p=P==v,!o||!_)return p?0:!o^a?1:-1;if(!p)return P>v^a?1:-1;for(B=(P=o.length)<(v=_.length)?P:v,h=0;h<B;h++)if(o[h]!=_[h])return o[h]>_[h]^a?1:-1;return P==v?0:P>v^a?1:-1}function O(g,r,a,p){if(g<r||g>a||g!==V(g))throw Error(K+(p||"Argument")+(typeof g=="number"?g<r||g>a?" out of range: ":" not an integer: ":" not a primitive number: ")+String(g))}function PA(g){var r=g.c.length-1;return L(g.e/E)==r&&g.c[r]%2!=0}function EA(g,r){return(g.length>1?g.charAt(0)+"."+g.slice(1):g)+(r<0?"e":"e+")+r}function Z(g,r,a){var p,o;if(r<0){for(o=a+".";++r;o+=a);g=o+g}else if(p=g.length,++r>p){for(o=a,r-=p;--r;o+=a);g+=o}else r<p&&(g=g.slice(0,r)+"."+g.slice(r));return g}var pA=zA();var DA=12;pA.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:1,DECIMAL_PLACES:DA});var Ze=R(0),At=R(1),et=R("Infinity");function gA(g,r){let a=new pA(r.toString()),p=new pA(10).pow(a);return g.times(p)}function R(g){return new pA(g.toString())}function VA(g){return R(parseFloat(g)/100)}function HA(g,r){return g.multipliedBy(r).decimalPlaces(0,1)}function WA(g,r){if(r==DA)return g;let a=g.shiftedBy(-1*r);return gA(a,12)}var ie={};ne(ie,{default:()=>CA});var CA=oe("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IQQDQCADQdABaiAEaiADQagBaiAEaikDACAeiDcDACAEQQhqIgRBIEcNAAsMBwsgB0EEEEQACyACQQQQRAALIAhBBBBEAAsgAEIANwMAIABBGGpCADcDACAAQRBqQgA3AwAgAEEIakIANwMAIAAgASkDADcDICAAQShqIAFBCGopAwA3AwAgAEEwaiABQRBqKQMANwMAIABBOGogAUEYaikDADcDAAwECyADQbwBakEANgIAIANBnITAADYCuAEgA0IBNwKsASADQbiFwAA2AqgBIANBqAFqQcCFwAAQWQALIANBwAFqIgkgAUEYaikDADcDACADQbgBaiIGIAFBEGopAwA3AwAgA0GwAWoiBCABQQhqKQMANwMAIAMgASkDADcDqAEgAyACKQMANwPQASADQgA3A2AgA0GoAWogA0HIAWogA0HgAGogA0HQAWoQPyAAQShqQgA3AwAgAEEwakIANwMAIABBOGpCADcDACAAQRhqIAkpAwA3AwAgAEEQaiAGKQMANwMAIABBCGogBCkDADcDACAAIAMpA6gBNwMAIAAgAykDYDcDIAwCCyACQQUQRAALAkAgEgRAQgAgG31CP4MhGEEBIQQDQEEDIQVBBCEBIARBBEYiBkUEQCAEQX9qIgVBA0sNAyAEQQFqIQELIANB0AFqIAVBA3RqIgIgAikDACADQagBaiAEQQN0aikDACAYhoQ3AwAgASEEIAZFDQALCyAAIAMpA4gBNwMAIAAgAykD0AE3AyAgAEEYaiADQaABaikDADcDACAAQRBqIANBmAFqKQMANwMAIABBCGogA0GQAWopAwA3AwAgAEEoaiADQdgBaikDADcDACAAQTBqIANB4AFqKQMANwMAIABBOGogA0HoAWopAwA3AwAMAQtBf0EEEEQACyADQfABaiQAC7IMAQ5/IwBB8ARrIgkkAAJAIAcgCIRQBEAgAEGBBjsBAAwBCyAJQYgBaiABIAIQYyAJQagBaiIMIAMgBBBjIAlByAFqIAUgBhBjIAlB6AFqIAcgCBBjIAlBIGoiDSAJQaABaiIKKQMANwMAIAlBGGoiDiAJQZgBaiILKQMANwMAIAlBEGoiDyAJQZABaiIQKQMANwMAIAkgCSkDiAE3AwggCUFAayAJQcABaikDADcDACAJQThqIAlBuAFqKQMANwMAIAlBMGogCUGwAWop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AwA3AwAgDCALKQMANwMAIA0gDykDADcDACAHIAcpAwA3A6ADIAdB2AJqIAdBgANqIAdBoANqECogBykD2AJCAVINASAHQbgDaiAHQfgCaikDADcDACAHQbADaiAHQfACaikDADcDACAHQagDaiAHQegCaikDADcDACAHIAcpA+ACNwOgAyAHQeAAahBgIAdBsAJqIAdBoANqIAdB4ABqEC8gBykDsAJCAVINASAHQfIBaiAHQcACaikDACIBNwEAIAdByAFqIgggATcDACAHQdgBaiAHQdACaikDACIBNwMAIAdB0AFqIAdByAJqKQMAIgI3AwAgByAHKQO4AiIDNwPAASAHQfgAaiABNwMAIAdB8ABqIgogAjcDACAHQegAaiAIKQMANwMAIAcgAzcDYEEAIQgDQCAIQQhqIglBGEYNAyAIIApqIAkhCCkDAFANAAsgAEEAOgABQQEMAwsgAEEAOgAAIABBEGpCADcDACAAQQhqQgA3AwAMAwsgAEEBOwEADAILIAcpA2AhASAAQRBqIAcpA2g3AwAgAEEIaiABNwMAQQALOgAACyAHQcADaiQAC/QGAQZ/AkACQAJAAkACQCAAKAIIIghBAUdBACAAKAIQIgRBAUcbRQRAIARBAUcNAyABIAJqIQcgAEEUaigCACIGDQEgASEEDAILIAAoAhggASACIABBHGooAgAoAgwRAwAhAwwDCyABIQQDQCAEIgMgB0YNAgJ/IANBAWogAywAACIEQX9KDQAaIANBAmogBEFgSQ0AGiADQQNqIARBcEkNABogBEH/AXFBEnRBgIDwAHEgAy0AA0E/cSADLQACQT9xQQZ0IAMtAAFBP3FBDHRycnJBgIDEAEYNAyADQQRqCyIEIAUgA2tqIQUgBkF/aiIGDQALCyAEIAdGDQAgBCwAACIDQX9KIANBYElyIANBcElyRQRAIANB/wFxQRJ0QYCA8ABxIAQtAANBP3EgBC0AAkE/cUEGdCAELQABQT9xQQx0cnJyQYCAxABGDQELAkACQCAFRQRAQQAhBAwBCyAFIAJPBEBBACEDIAUgAiIERg0BDAILQQAhAyAFIgQgAWosAABBQEgNAQsgBCEFIAEhAwsgBSACIAMbIQIgAyABIAMbIQELIAhBAUcNASAAQQxqKAIAIQcCQCACQRBPBEAgASACEAUhBAwBCyACRQRA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AyAENgIAIANB+IfAACABKAIIIAIgAS0AEBAxAAsgA0EANgIEIAMgADYCACADQeSHwAAgASgCCCACIAEtABAQMQALbgEGfiAAIANC/////w+DIgUgAUL/////D4MiBn4iByAFIAFCIIgiCH4iCSAGIANCIIgiBn58IgVCIIZ8Igo3AwAgACAKIAdUrSAGIAh+IAUgCVStQiCGIAVCIIiEfHwgASAEfiACIAN+fHw3AwgLfQEBfyMAQUBqIgQkACAEQTc2AgwgBCAANgIIIAQgAjYCFCAEIAE2AhAgBEEsakECNgIAIARBPGpBHjYCACAEQgI3AhwgBEHEicAANgIYIARBHzYCNCAEIARBMGo2AiggBCAEQRBqNgI4IAQgBEEIajYCMCAEQRhqIAMQWQALeAEDfyAAIAAQigEiAEEIEGogAGsiAhCIASEAQfiPwAAgASACayIBNgIAQYCQwAAgADYCACAAIAFBAXI2AgRBCEEIEGohAkEUQQgQaiEDQRBBCBBqIQQgACABEIgBIAQgAyACQQhramo2AgRBnJDAAEGAgIABNgIAC28BAX8jAEEwayICJAAgAiABNgIEIAIgADYCACACQRxqQQI2AgAgAkEsakEcNgIAIAJCAjcCDCACQbCJwAA2AgggAkEcNgIkIAIgAkEgajYCGCACIAI2AiggAiACQQRqNgIgIAJBCGpBwIXAABBZAAtvAQF/IwBBMGsiASQAIAFBBTYCBCABIAA2AgAgAUEcakECNgIAIAFBLGpBHDYCACABQgI3AgwgAUGYjMAANgIIIAFBHDYCJCABIAFBIGo2AhggASABQQRqNgIoIAEgATYCICABQQhqQcCFwAAQWQALWQEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakHEgsAAIAJBCGoQECACQSBqJAALWQEBfyMAQSBrIgIkACACIAAoAgA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakGMiMAAIAJBCGoQECACQSBqJAALVgEBfyMAQSBrIgIkACACIAA2AgQgAkEYaiABQRBqKQIANwMAIAJBEGogAUEIaikCADcDACACIAEpAgA3AwggAkEEakHEgsAAIAJBCGoQECACQSBqJAALVgECfgJAIAJBwABxRQRAIAJFDQFCACACQT9xrSIEhiABQQAgAmtBP3GtiIQhAyABIASGIQEMAQsgASACQT9xrYYhA0IAIQELIAAgATcDACAAIAM3AwgLJgEBf0EBQQEQciIBRQRAQQFBARCFAQALIABBATYCBCAAIAE2AgALTwECfyAAKAIAIgNBBGooAgAgA0EIaiIEKAIAIgBrIAJJBEAgAyAAIAIQNyAEKAIAIQALIAMoAgAgAGogASACEIcBGiAEIAAgAmo2AgBBAAtGAQF/IwBBEGsiAiQAIAIgACABEDMCQCACKAIAQQFGBEAgAkEIaigCACIARQ0BIAIoAgQgABCFAQALIAJBEGokAA8LEFgAC0gBAX8jAEEQayIDJAAgAyAAIAEgAhA0AkAgAygCAEEBRgRAIANBCGooAgAiAEUNASADKAIEIAAQhQEACyADQRBqJAAPCxBYAAtFAQF/IAAoAgQgACgCCCIDayACIAFrIgJJBEAgACADIAIQTSAAKAIIIQMLIAAoAgAgA2ogASACEIcBGiAAIAIgA2o2AggLRgEBfyMAQRBrIgIkACACIAAgARAyAkAgAigCAEEBRgRAIAJBCGooAgAiAEUNASACKAIEIAAQhQEACyACQRBqJAAPCxBYAAtLAAJAAn8gAUGAgMQARwRAQQEgACgCGCABIABBHGooAgAoAhARAAANARoLIAINAUEACw8LIAAoAhggAkEAIABBHGooAgAoAgwRAwALRwECfyMAQRBrIgEkACABQQhqEEogASgCCCECIAAgASgCDDYCBCAAIAI2AgAgAkHcgsAAQQEQhwEaIABBATYCCCABQRBqJAALRwEBfyMAQSBrIgMkACADQRRqQQA2AgAgA0HsiMAANgIQIANCATcCBCADIAE2AhwgAyAANgIYIAMgA0EYajYCACADIAIQWQALRQECfyABKAIEIQIgASgCACEDQQhBBBByIgFFBEBBCEEEEIUBAAsgASACNgIEIAEgAzYCACAAQdSHwAA2AgQgACABNgIACzkBAX8gAUEQdkAAIQIgAEEANgIIIABBACABQYCAfHEgAkF/RiIBGzYCBCAAQQAgAkEQdCABGzYCAAs5AQF/IwBBIGsiBCQAIAQgASACIAMQDCAEKQMAIQEgACAEQQhqKQMANwMIIAAgATcDACAEQSBqJAALaAEDfyMAQRBrIgEkACAAKAIMIgJFBEBB3IbAAEErQaSHwAAQUgALIAAoAggiA0UEQEHchsAAQStBtIfAABBSAAsgASACNgIIIAEgADYCBCABIAM2AgAgASgCACABKAIEIAEoAggQQAALNgEBfyABKAIEIAEoAggiAksEQCABIAIQTyABKAIIIQILIAEoAgAhASAAIAI2AgQgACABNgIACz8BAX8jAEEgayIAJAAgAEEcakEANgIAIABBwIjAADYCGCAAQgE3AgwgAEHUiMAANgIIIABBCGpB3IjAABBZAAs+AQF/IwBBIGsiAiQAIAJBAToAGCACIAE2AhQgAiAANgIQIAJB7IjAADYCDCACQeyIwAA2AgggAkEIahBWAAsqAAJAIABBfEsNACAARQRAQQQPCyAAIABBfUlBAnQQciIARQ0AIAAPCwALMQEBfyABKAIEIgIEQCAAIAI2AgQgAEEIakEBNgIAIAAgASgCADYCAA8LIABBADYCAAs0ACAAQQM6ACAgAEKAgICAgAQ3AgAgACABNgIYIABBADYCECAAQQA2AgggAEEcaiACNgIACycAIAAgACgCBEEBcSABckECcjYCBCAAIAFqIgAgACgCBEEBcjYCBAseAAJAIABBBGooAgBFDQAgACgCACIARQ0AIAAQBgsLIAEBfwJAIAAoAgQiAUUNACAAQQhqKAIARQ0AIAEQBgsLJAAgAEIANwMIIABCATcDACAAQRhqQgA3AwAgAEEQakIANwMACx4AAkAgAUF8TQRAIAAgAUEEIAIQbCIADQELAAsgAAsjACACIAIoAgRBfnE2AgQgACABQQFyNgIEIAAgAWogATYCAAshACAAQgA3AxAgACACNwMIIAAgATcDACAAQRhqQgA3AwALHgAgACABQQNyNgIEIAAgAWoiACAAKAIEQQFyNgIECxEAIAAoAgQEQCAAKAIAEAYLCxkBAX8gACgCECIBBH8gAQUgAEEUaigCAAsLEgBBAEEZIABBAXZrIABBH0YbCxYAIAAgAUEBcjYCBCAAIAFqIAE2AgALHAAgASgCGEGojMAAQQUgAUEcaigCACgCDBEDAAsQACAAIAFqQX9qQQAgAWtxCxMAIAApAwAgAEEIaikDACABEBQLDAAgACABIAIgAxANCxYAIAAgASgCCDYCBCAAIAEoAgA2AgALCwAgAQRAIAAQBgsLDwAgAEEBdCIAQQAgAGtyCxQAIAAoAgAgASAAKAIEKAIMEQAACw8AIAAoAgAgASACEHNBAAsIACAAIAEQFwsNACAAIAEgASACahBOCxMAIABB1IfAADYCBCAAIAE2AgALDQAgACgCACABEB9BAAsNACAALQAEQQJxQQF2CxAAIAEgACgCACAAKAIEEAoLDAAgACABIAIQc0EACwoAQQAgAGsgAHELCwAgAC0ABEEDcUULDAAgACABQQNyNgIECw0AIAAoAgAgACgCBGoLDgAgACgCABoDQAwACwALCwAgADUCACABECELCwAgACMAaiQAIwALBgAgABBlCwoAIAAoAgRBeHELCgAgACgCBEEBcQsKACAAKAIMQQFxCwoAIAAoAgxBAXYLGQAgACABQdCMwAAoAgAiAEEPIAAbEQEAAAsKACAAIAEgAhA6CwoAIAAgASACECALBwAgACABagsHACAAIAFrCwcAIABBCGoLBwAgAEF4agsMAEL9uPTL5bXvkX8LDQBC0a6YxJmDsveEfwsNAEKxyPiAt8utzNkACwMAAQsDAAELC7cMAQBBgIDAAAutDAEAAAAMAAAABAAAAAIAAAADAAAABAAAAGEgRGlzcGxheSBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBhbiBlcnJvciB1bmV4cGVjdGVkbHkvcnVzdGMvYjE3MjI2ZmNjMTE1ODdmZWQ2MTI2MzFiZTM3MmE1YjRjYjg5OTg4YS9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAAE8AEABLAAAAXwkAAA4AAAAFAAAAAAAAAAEAAAAGAAAAVHJpZWQgdG8gc2hyaW5rIHRvIGEgbGFyZ2VyIGNhcGFjaXR5vAAQACQAAAAvcnVzdGMvYjE3MjI2ZmNjMTE1ODdmZWQ2MTI2MzFiZTM3MmE1YjRjYjg5OTg4YS9saWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjLnJz6AAQAEwAAACrAQAACQAAAAcAAAAEAAAABAAAAAgAAAAJAAAACgAAADAAAAALAAAADAAAAAQAAAAMAAAADQAAAAQAAABhIERpc3BsYXkgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgYW4gZXJyb3IgdW5leHBlY3RlZGx5L3J1c3RjL2IxNzIyNmZjYzExNTg3ZmVkNjEyNjMxYmUzNzJhNWI0Y2I4OTk4OGEvbGlicmFyeS9hbGxvYy9zcmMvc3RyaW5nLnJzAACvARAASwAAAF8JAAAOAAAADgAAAAAAAAABAAAABgAAAC9Vc2Vycy9tYXJ0aW4vLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvcHJpbWl0aXZlLXR5cGVzLTAuOC4wL3NyYy9saWIucnNJbnRlZ2VyIG92ZXJmbG93IHdoZW4gY2FzdGluZyB0byB1c2l6ZXoCEAAmAAAAZGl2aXNpb24gYnkgemVyb6gCEAAQAAAAHAIQAF4AAAAmAAAAAQAAAC9Vc2Vycy9tYXJ0aW4vLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvcHJpbWl0aXZlLXR5cGVzLTAuOC4wL3NyYy9saWIucnMAAGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8AAADQAhAAXgAAACYAAAABAAAAY2FsbGVkIGBPcHRpb246OnVud3JhcCgpYCBvbiBhIGBOb25lYCB2YWx1ZWxpYnJhcnkvc3RkL3NyYy9wYW5pY2tpbmcucnMAhwMQABwAAABGAgAAHwAAAIcDEAAcAAAARwIAAB4AAAAQAAAADAAAAAQAAAARAAAAEgAAAAgAAAAEAAAAEwAAABQAAAAQAAAABAAAABUAAAAWAAAAEgAAAAgAAAAEAAAAFwAAABgAAAASAAAABAAAAAQAAAAZAAAAGgAAABsAAABsaWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjLnJzY2FwYWNpdHkgb3ZlcmZsb3cAAABABBAAEQAAACQEEAAcAAAABgIAAAUAAAAgAAAAAAAAAAEAAAAhAAAAaW5kZXggb3V0IG9mIGJvdW5kczogdGhlIGxlbiBpcyAgYnV0IHRoZSBpbmRleCBpcyAAAHwEEAAgAAAAnAQQABIAAAA6IAAAbAQQAAAAAADABBAAAgAAAGxpYnJhcnkvY29yZS9zcmMvZm10L251bS5yczAwMDEwMjAzMDQwNTA2MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgxODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5YXNzZXJ0aW9uIGZhaWxlZDogKmN1cnIgPiAxOQDUBBAAGwAAAOUBAAAFAAAAcmFuZ2Ugc3RhcnQgaW5kZXggIG91dCBvZiByYW5nZSBmb3Igc2xpY2Ugb2YgbGVuZ3RoIOQFEAASAAAA9gUQACIAAABFcnJvcgCDAQlwcm9kdWNlcnMCCGxhbmd1YWdlAQRSdXN0AAxwcm9jZXNzZWQtYnkDBXJ1c3RjJTEuNjAuMC1uaWdodGx5IChiMTcyMjZmY2MgMjAyMi0wMi0xOCkGd2FscnVzBjAuMTkuMAx3YXNtLWJpbmRnZW4SMC4yLjgwICg0Y2FhOTgxNjUp");var ae={};async function le(g,r){if(typeof g=="string"){let a=await fetch(g);if(typeof WebAssembly.instantiateStreaming=="function")try{return await WebAssembly.instantiateStreaming(a,r)}catch(p){if(a.headers.get("Content-Type")!="application/wasm")console.warn(p);else throw p}g=await a.arrayBuffer()}return await WebAssembly.instantiate(g,r)}var{instance:D,module:it}=await le(CA,ae),mA=D.exports.memory,ce=D.exports.calculate_pool_trade_fee,JA=D.exports.get_spot_price,YA=D.exports.calculate_out_given_in,QA=D.exports.calculate_in_given_out,ue=D.exports.calculate_liquidity_in,fe=D.exports.calculate_shares,pe=D.exports.calculate_liquidity_out_asset_a,ge=D.exports.calculate_liquidity_out_asset_b,oA=D.exports.__wbindgen_add_to_stack_pointer,J=D.exports.__wbindgen_malloc,Y=D.exports.__wbindgen_realloc,vA=D.exports.__wbindgen_free;var X=0,bA=null;function qA(){return(bA===null||bA.buffer!==mA.buffer)&&(bA=new Uint8Array(mA.buffer)),bA}var _e=typeof TextEncoder>"u"?(0,module.require)("util").TextEncoder:TextEncoder,xA=new _e("utf-8"),de=typeof xA.encodeInto=="function"?function(g,r){return xA.encodeInto(g,r)}:function(g,r){let a=xA.encode(g);return r.set(a),{read:g.length,written:a.length}};function AA(g,r,a){if(a===void 0){let B=xA.encode(g),P=r(B.length);return qA().subarray(P,P+B.length).set(B),X=B.length,P}let p=g.length,o=r(p),_=qA(),h=0;for(;h<p;h++){let B=g.charCodeAt(h);if(B>127)break;_[o+h]=B}if(h!==p){h!==0&&(g=g.slice(h)),o=a(o,p,p=h+g.length*3);let B=qA().subarray(o+h,o+p);h+=de(g,B).written}return X=h,o}var yA=null;function iA(){return(yA===null||yA.buffer!==mA.buffer)&&(yA=new Int32Array(mA.buffer)),yA}var Be=typeof TextDecoder>"u"?(0,module.require)("util").TextDecoder:TextDecoder,ZA=new Be("utf-8",{ignoreBOM:!0,fatal:!0});ZA.decode();function LA(g,r){return ZA.decode(qA().subarray(g,g+r))}function Ae(g,r,a){try{let _=oA(-16),h=AA(g,J,Y),B=X,P=AA(r,J,Y),v=X,b=AA(a,J,Y);JA(_,h,B,P,v,b,X);var p=iA()[_/4+0],o=iA()[_/4+1];return LA(p,o)}finally{oA(16),vA(p,o)}}function ee(g,r,a){try{let _=oA(-16),h=AA(g,J,Y),B=X,P=AA(r,J,Y),v=X,b=AA(a,J,Y);YA(_,h,B,P,v,b,X);var p=iA()[_/4+0],o=iA()[_/4+1];return LA(p,o)}finally{oA(16),vA(p,o)}}function te(g,r,a){try{let _=oA(-16),h=AA(g,J,Y),B=X,P=AA(r,J,Y),v=X,b=AA(a,J,Y);QA(_,h,B,P,v,b,X);var p=iA()[_/4+0],o=iA()[_/4+1];return LA(p,o)}finally{oA(16),vA(p,o)}}function he(g,r,a){return Ae(g,r,a)}function we(g,r,a){return te(g,r,a)}function ke(g,r,a){return ee(g,r,a)}var _A={getSpotPrice:he,calculateInGivenOut:we,calculateOutGivenIn:ke};var rA=class{type;address;swapFee;tokens;static fromPool(r){return new rA(r.address,r.swapFee,r.tokens)}constructor(r,a,p){this.type="XYK",this.address=r,this.swapFee=a,this.tokens=p}validPair(r,a){return!0}parsePoolPair(r,a){let p=new Map(this.tokens.map(P=>[P.id,P])),o=p.get(r),_=p.get(a);if(o==null)throw new Error("Pool does not contain tokenIn");if(_==null)throw new Error("Pool does not contain tokenOut");let h=R(o.balance),B=R(_.balance);return{swapFee:VA(this.swapFee),tokenIn:r,tokenOut:a,balanceIn:WA(h,o.decimals),balanceOut:WA(B,_.decimals)}}calculateInGivenOut(r,a){let p=_A.calculateInGivenOut(r.balanceIn.toString(),r.balanceOut.toString(),a.toString());return R(p)}getSpotPriceIn(r){let a=_A.getSpotPrice(r.balanceOut.toString(),r.balanceIn.toString(),gA(R(1),12).toString());return R(a)}calculateOutGivenIn(r,a){let p=_A.calculateOutGivenIn(r.balanceIn.toString(),r.balanceOut.toString(),a.toString());return R(p)}getSpotPriceOut(r){let a=_A.getSpotPrice(r.balanceIn.toString(),r.balanceOut.toString(),gA(R(1),12).toString());return R(a)}};var sA=class{static get(r){switch(r.type){case"XYK":return rA.fromPool(r);default:throw new Error("Pool type "+r.type+" is not supported yet")}}};var TA=class{routeSuggester;poolService;constructor(r){this.poolService=r,this.routeSuggester=new uA}getPools(){return this.poolService.getPools()}async getAllAssets(){let r=await this.getAssets();return[...new Map(r).values()]}async getAssetPairs(r){let a=await this.poolService.getPools();if(a.length===0)return[];let{assets:p,poolsMap:o}=await this.validateToken(r,a),h=this.getPaths(r,null,o,a).map(B=>B[B.length-1].tokenOut);return this.toPoolAssets([...new Set(h)],p)}async getAllPaths(r,a){let p=await this.poolService.getPools();if(p.length===0)return[];let{poolsMap:o}=await this.validateTokenPair(r,a,p);return this.getPaths(r,a,o,p)}async getBestSellPrice(r,a,p){let o=await this.poolService.getPools();if(o.length===0)return[];let{poolsMap:_}=await this.validateTokenPair(r,a,o);return this.getPaths(r,a,_,o).map(v=>this.toSellSwaps(p,v,_)).sort((v,b)=>{let T=v[v.length-1].returnFinalAmount,M=b[b.length-1].returnFinalAmount;return T.isGreaterThan(M)?-1:1})[0]}toSellSwaps(r,a,p){let o=[];for(let _=0;_<a.length;_++){let h=a[_],B=p.get(h.poolId);if(B==null)throw new Error("Pool does not exit");let P;_>0?P=o[_-1].returnFinalAmount:P=r;let v=B.parsePoolPair(h.tokenIn,h.tokenOut),b=B.calculateOutGivenIn(v,P),T=HA(b,v.swapFee),M=B.getSpotPriceOut(v);o.push({...h,swapAmount:P,returnAmount:b,returnFinalAmount:b.minus(T),swapFee:T,spotPrice:M})}return o}async getBestBuyPrice(r,a,p){let o=await this.poolService.getPools();if(o.length===0)return[];let{poolsMap:_}=await this.validateTokenPair(r,a,o);return this.getPaths(r,a,_,o).map(v=>this.toBuySwaps(p,v,_)).sort((v,b)=>{let T=v[0].returnFinalAmount,M=b[0].returnFinalAmount;return T.isGreaterThan(M)?1:-1})[0]}toBuySwaps(r,a,p){let o=[];for(let _=a.length-1;_>=0;_--){let h=a[_],B=p.get(h.poolId);if(B==null)throw new Error("Pool does not exit");let P;_==a.length-1?P=r:P=o[0].returnFinalAmount;let v=B.parsePoolPair(h.tokenIn,h.tokenOut),b=B.calculateInGivenOut(v,P),T=HA(b,v.swapFee),M=B.getSpotPriceIn(v);o.unshift({...h,swapAmount:P,returnAmount:b,returnFinalAmount:b.plus(T),swapFee:T,spotPrice:M})}return o}async getAssets(){let r=await this.poolService.getPools();if(r.length===0)return new Map;let a=r.map(p=>p.tokens.map(({id:o,symbol:_})=>({token:o,symbol:_}))).flat();return new Map(a.map(p=>[p.token,p]))}getPaths(r,a,p,o){return this.routeSuggester.getProposals(r,a,o).filter(B=>this.validPath(B,p)).map(B=>this.toHops(B,p))}async validateTokenPair(r,a,p){let o=await this.getAssets();if(o.get(r)==null)throw new Error(r+" is not supported token");if(o.get(a)==null)throw new Error(a+" is not supported token");let _=this.getPoolMap(p);return{assets:o,poolsMap:_}}async validateToken(r,a){let p=await this.getAssets();if(p.get(r)==null)throw new Error(r+" is not supported token");let o=this.getPoolMap(a);return{assets:p,poolsMap:o}}getPoolMap(r){return new Map(r.map(a=>[a.address,sA.get(a)]))}validPath(r,a){return r.length>0&&r.map(p=>this.validEdge(p,a)).reduce((p,o)=>p&&o)}validEdge([r,a,p],o){return o.get(r)?.validPair(a,p)||!1}toHops(r,a){return r.map(([p,o,_])=>{let h=a.get(p);return{poolId:p,poolType:h?.type,tokenIn:o,tokenOut:_,fee:h?.swapFee}})}toPoolAssets(r,a){return r.map(p=>{let o=a.get(p);return{token:p,symbol:o?.symbol}})}};export{pA as BigNumber,DA as DECIMAL_PLACES,et as INFINITY,At as ONE,kA as PolkadotPoolService,sA as PoolFactory,hA as PoolType,TA as TradeRouter,rA as XykPool,Ze as ZERO,R as bnum,gA as scale};
2128
2
  //# sourceMappingURL=index.esm.js.map