@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 +1 -2127
- package/dist/index.esm.js.map +4 -4
- package/package.json +1 -1
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("AGFzbQEAAAABpwEYYAJ/fwF/YAJ/fwBgA39/fwBgA39/fwF/YAF/AX9gAX8AYAR/f39/AGAHf39/f39/fwBgB39+fn5+fn4AYAV/f39/fwBgAX8BfmAJf39/f39/f39/AGAEf35+fgBgBH9/f38Bf2AAAGADf35/AGADf35+AGAFf35+f38AYAV/fn5+fgBgCX9+fn5+fn5+fgBgA35/fwBgAAF/YAJ+fwF/YAN+fn8BfwOTAZEBBAITCAgABQIICAMDDA0IFAMBAgIXCQkACwsGBgYGBgEDFgcHBwcHAgEFAgAVAAECAgkCAgYGEQIBCQIBAgICBgISBgEBBQAAAA8FAwECAgEDBQIBAQwFAQ4BBAECAQUFBQMCEAEFBAQBAAAADQEBBAADAAIBAAQAAwQEAQQAAAQFBAQEBAECAwAABAQKCgoFAQQFAXABIiIFAwEAEQYJAX8BQYCAwAALB7UCDQZtZW1vcnkCABhjYWxjdWxhdGVfcG9vbF90cmFkZV9mZWUAOQ5nZXRfc3BvdF9wcmljZQAiFmNhbGN1bGF0ZV9vdXRfZ2l2ZW5faW4AIxZjYWxjdWxhdGVfaW5fZ2l2ZW5fb3V0ACQWY2FsY3VsYXRlX2xpcXVpZGl0eV9pbgAlEGNhbGN1bGF0ZV9zaGFyZXMAJh9jYWxjdWxhdGVfbGlxdWlkaXR5X291dF9hc3NldF9hABgfY2FsY3VsYXRlX2xpcXVpZGl0eV9vdXRfYXNzZXRfYgAZH19fd2JpbmRnZW5fYWRkX3RvX3N0YWNrX3BvaW50ZXIAfxFfX3diaW5kZ2VuX21hbGxvYwBaEl9fd2JpbmRnZW5fcmVhbGxvYwBhD19fd2JpbmRnZW5fZnJlZQBuCTIBAEEBCyGAAXgtSI8BaY8BcStGgAF4LY8BkAFejAGPAY0BXy47U3RLdUd+fXB3jwGOAQqSpQKRAfYfAg9/AX4jAEEQayIIJAACQAJAIABB9QFPBEBBgIB8QQhBCBBqQRRBCBBqakEQQQgQamprQXdxQX1qIgJBAEEQQQgQakECdGsiBSAFIAJLGyAATQ0CIABBBGpBCBBqIQRB6IzAACgCAEUNAUEAIARrIQECQAJAAn9BACAEQYACSQ0AGkEfIARB////B0sNABogBEEGIARBCHZnIgBrdkEBcSAAQQF0a0E+agsiB0ECdEH0jsAAaigCACIABEAgBCAHEGd0IQZBACECA0ACQCAAEIEBIgUgBEkNACAFIARrIgUgAU8NACAAIQIgBSIBDQBBACEBDAMLIABBFGooAgAiBSADIAUgACAGQR12QQRxakEQaigCACIARxsgAyAFGyEDIAZBAXQhBiAADQALIAMEQCADIQAMAgsgAg0CC0EAIQJBASAHdBBvQeiMwAAoAgBxIgBFDQMgABB5aEECdEH0jsAAaigCACIARQ0DCwNAIAAgAiAAEIEBIgIgBE8gAiAEayIDIAFJcSIFGyECIAMgASAFGyEBIAAQZiIADQALIAJFDQILQfSPwAAoAgAiACAET0EAIAEgACAEa08bDQEgAiAEEIgBIQAgAhApAkAgAUEQQQgQak8EQCACIAQQeyAAIAEQaCABQYACTwRAIAAgARAoDAILIAFBA3YiA0EDdEHsjMAAaiEBAn9B5IzAACgCACIFQQEgA3QiA3EEQCABKAIIDAELQeSMwAAgAyAFcjYCACABCyEDIAEgADYCCCADIAA2AgwgACABNgIMIAAgAzYCCAwBCyACIAEgBGoQZAsgAhCKASIBRQ0BDAILQRAgAEEEakEQQQgQakF7aiAASxtBCBBqIQQCQAJAAkACfwJAAkBB5IzAACgCACIFIARBA3YiAXYiAEEDcUUEQCAEQfSPwAAoAgBNDQcgAA0BQeiMwAAoAgAiAEUNByAAEHloQQJ0QfSOwABqKAIAIgIQgQEgBGshASACEGYiAARAA0AgABCBASAEayIDIAEgAyABSSIDGyEBIAAgAiADGyECIAAQZiIADQALCyACIAQQiAEhBSACECkgAUEQQQgQakkNBSACIAQQeyAFIAEQaEH0j8AAKAIAIgBFDQQgAEEDdiIGQQN0QeyMwABqIQBB/I/AACgCACEDQeSMwAAoAgAiB0EBIAZ0IgZxRQ0CIAAoAggMAwsCQCAAQX9zQQFxIAFqIgBBA3QiA0H0jMAAaigCACIBQQhqKAIAIgIgA0HsjMAAaiIDRwRAIAIgAzYCDCADIAI2AggMAQtB5IzAACAFQX4gAHdxNgIACyABIABBA3QQZCABEIoBIQEMBwsCQEEBIAFBH3EiAXQQbyAAIAF0cRB5aCIAQQN0IgNB9IzAAGooAgAiAkEIaigCACIBIANB7IzAAGoiA0cEQCABIAM2AgwgAyABNgIIDAELQeSMwABB5IzAACgCAEF+IAB3cTYCAAsgAiAEEHsgAiAEEIgBIgUgAEEDdCAEayIEEGhB9I/AACgCACIABEAgAEEDdiIDQQN0QeyMwABqIQBB/I/AACgCACEBAn9B5IzAACgCACIGQQEgA3QiA3EEQCAAKAIIDAELQeSMwAAgAyAGcjYCACAACyEDIAAgATYCCCADIAE2AgwgASAANgIMIAEgAzYCCAtB/I/AACAFNgIAQfSPwAAgBDYCACACEIoBIQEMBgtB5IzAACAGIAdyNgIAIAALIQYgACADNgIIIAYgAzYCDCADIAA2AgwgAyAGNgIIC0H8j8AAIAU2AgBB9I/AACABNgIADAELIAIgASAEahBkCyACEIoBIgENAQsCQAJAAkACQAJAAkACQAJAQfSPwAAoAgAiASAESQRAQfiPwAAoAgAiACAESw0CIAhBCEEIEGogBGpBFEEIEGpqQRBBCBBqakGAgAQQahBUIAgoAgAiAQ0BQQAhAQwJC0H8j8AAKAIAIQAgASAEayIBQRBBCBBqSQRAQfyPwABBADYCAEH0j8AAKAIAIQFB9I/AAEEANgIAIAAgARBkIAAQigEhAQwJCyAAIAQQiAEhAkH0j8AAIAE2AgBB/I/AACACNgIAIAIgARBoIAAgBBB7IAAQigEhAQwICyAIKAIIIQVBhJDAACAIKAIEIgNBhJDAACgCAGoiADYCAEGIkMAAQYiQwAAoAgAiAiAAIAIgAEsbNgIAAkACQEGAkMAAKAIABEBBjJDAACEAA0AgABB8IAFGDQIgACgCCCIADQALDAILQaCQwAAoAgAiAEUgASAASXINAwwHCyAAEIMBDQAgABCEASAFRw0AIAAoAgAiAkGAkMAAKAIAIgZNBH8gAiAAKAIEaiAGSwVBAAsNAwtBoJDAAEGgkMAAKAIAIgAgASABIABLGzYCACABIANqIQJBjJDAACEAAkACQANAIAIgACgCAEcEQCAAKAIIIgANAQwCCwsgABCDAQ0AIAAQhAEgBUYNAQtBgJDAACgCACECQYyQwAAhAAJAA0AgACgCACACTQRAIAAQfCACSw0CCyAAKAIIIgANAAtBACEACyACIAAQfCIPQRRBCBBqIg5rQWlqIgAQigEiBkEIEGogBmsgAGoiACAAQRBBCBBqIAJqSRsiBhCKASEHIAYgDhCIASEAQQhBCBBqIQlBFEEIEGohC0EQQQgQaiEMQYCQwAAgASABEIoBIgpBCBBqIAprIg0QiAEiCjYCAEH4j8AAIANBCGogDCAJIAtqaiANamsiCTYCACAKIAlBAXI2AgRBCEEIEGohC0EUQQgQaiEMQRBBCBBqIQ0gCiAJEIgBIA0gDCALQQhramo2AgRBnJDAAEGAgIABNgIAIAYgDhB7QYyQwAApAgAhECAHQQhqQZSQwAApAgA3AgAgByAQNwIAQZiQwAAgBTYCAEGQkMAAIAM2AgBBjJDAACABNgIAQZSQwAAgBzYCAANAIABBBBCIASEBIABBBzYCBCAPIAEiAEEEaksNAAsgAiAGRg0HIAIgBiACayIAIAIgABCIARBiIABBgAJPBEAgAiAAECgMCAsgAEEDdiIBQQN0QeyMwABqIQACf0HkjMAAKAIAIgNBASABdCIBcQRAIAAoAggMAQtB5IzAACABIANyNgIAIAALIQEgACACNgIIIAEgAjYCDCACIAA2AgwgAiABNgIIDAcLIAAoAgAhBSAAIAE2AgAgACAAKAIEIANqNgIEIAEQigEiAEEIEGohAiAFEIoBIgNBCBBqIQYgASACIABraiICIAQQiAEhASACIAQQeyAFIAYgA2tqIgAgAiAEamshBCAAQYCQwAAoAgBHBEBB/I/AACgCACAARg0EIAAoAgRBA3FBAUcNBQJAIAAQgQEiA0GAAk8EQCAAECkMAQsgAEEMaigCACIFIABBCGooAgAiBkcEQCAGIAU2AgwgBSAGNgIIDAELQeSMwABB5IzAACgCAEF+IANBA3Z3cTYCAAsgAyAEaiEEIAAgAxCIASEADAULQYCQwAAgATYCAEH4j8AAQfiPwAAoAgAgBGoiADYCACABIABBAXI2AgQgAhCKASEBDAcLQfiPwAAgACAEayIBNgIAQYCQwABBgJDAACgCACIAIAQQiAEiAjYCACACIAFBAXI2AgQgACAEEHsgABCKASEBDAYLQaCQwAAgATYCAAwDCyAAIAAoAgQgA2o2AgRBgJDAACgCAEH4j8AAKAIAIANqEEMMAwtB/I/AACABNgIAQfSPwABB9I/AACgCACAEaiIANgIAIAEgABBoIAIQigEhAQwDCyABIAQgABBiIARBgAJPBEAgASAEECggAhCKASEBDAMLIARBA3YiA0EDdEHsjMAAaiEAAn9B5IzAACgCACIFQQEgA3QiA3EEQCAAKAIIDAELQeSMwAAgAyAFcjYCACAACyEDIAAgATYCCCADIAE2AgwgASAANgIMIAEgAzYCCCACEIoBIQEMAgtBpJDAAEH/HzYCAEGYkMAAIAU2AgBBkJDAACADNgIAQYyQwAAgATYCAEH4jMAAQeyMwAA2AgBBgI3AAEH0jMAANgIAQfSMwABB7IzAADYCAEGIjcAAQfyMwAA2AgBB/IzAAEH0jMAANgIAQZCNwABBhI3AADYCAEGEjcAAQfyMwAA2AgBBmI3AAEGMjcAANgIAQYyNwABBhI3AADYCAEGgjcAAQZSNwAA2AgBBlI3AAEGMjcAANgIAQaiNwABBnI3AADYCAEGcjcAAQZSNwAA2AgBBsI3AAEGkjcAANgIAQaSNwABBnI3AADYCAEG4jcAAQayNwAA2AgBBrI3AAEGkjcAANgIAQbSNwABBrI3AADYCAEHAjcAAQbSNwAA2AgBBvI3AAEG0jcAANgIAQciNwABBvI3AADYCAEHEjcAAQbyNwAA2AgBB0I3AAEHEjcAANgIAQcyNwABBxI3AADYCAEHYjcAAQcyNwAA2AgBB1I3AAEHMjcAANgIAQeCNwABB1I3AADYCAEHcjcAAQdSNwAA2AgBB6I3AAEHcjcAANgIAQeSNwABB3I3AADYCAEHwjcAAQeSNwAA2AgBB7I3AAEHkjcAANgIAQfiNwABB7I3AADYCAEGAjsAAQfSNwAA2AgBB9I3AAEHsjcAANgIAQYiOwABB/I3AADYCAEH8jcAAQfSNwAA2AgBBkI7AAEGEjsAANgIAQYSOwABB/I3AADYCAEGYjsAAQYyOwAA2AgBBjI7AAEGEjsAANgIAQaCOwABBlI7AADYCAEGUjsAAQYyOwAA2AgBBqI7AAEGcjsAANgIAQZyOwABBlI7AADYCAEGwjsAAQaSOwAA2AgBBpI7AAEGcjsAANgIAQbiOwABBrI7AADYCAEGsjsAAQaSOwAA2AgBBwI7AAEG0jsAANgIAQbSOwABBrI7AADYCAEHIjsAAQbyOwAA2AgBBvI7AAEG0jsAANgIAQdCOwABBxI7AADYCAEHEjsAAQbyOwAA2AgBB2I7AAEHMjsAANgIAQcyOwABBxI7AADYCAEHgjsAAQdSOwAA2AgBB1I7AAEHMjsAANgIAQeiOwABB3I7AADYCAEHcjsAAQdSOwAA2AgBB8I7AAEHkjsAANgIAQeSOwABB3I7AADYCAEHsjsAAQeSOwAA2AgBBCEEIEGohAkEUQQgQaiEFQRBBCBBqIQZBgJDAACABIAEQigEiAEEIEGogAGsiARCIASIANgIAQfiPwAAgA0EIaiAGIAIgBWpqIAFqayIBNgIAIAAgAUEBcjYCBEEIQQgQaiECQRRBCBBqIQNBEEEIEGohBSAAIAEQiAEgBSADIAJBCGtqajYCBEGckMAAQYCAgAE2AgALQQAhAUH4j8AAKAIAIgAgBE0NAEH4j8AAIAAgBGsiATYCAEGAkMAAQYCQwAAoAgAiACAEEIgBIgI2AgAgAiABQQFyNgIEIAAgBBB7IAAQigEhAQsgCEEQaiQAIAELhxECFH8JfiMAQfABayIDJAAgAUEYaiEEQcACIQUCfgNAIAVBQGoiBUHAAEYEQEHAACEFIAEpAwB5DAILIAQpAwAhGCAEQXhqIQQgGFANAAsgGHkLIRcgAkEYaiEEIAUgF6drIQpBwAIhBQJ+A0AgBUFAaiIFQcAARgRAQcAAIQUgAikDAHkMAgsgBCkDACEYIARBeGohBCAYUA0ACyAYeQshFwJAAkACQAJAIAUgF6drIgQEQCAKIARPBEAgBEHBAEkNAiABKQMAIRcgA0HYAGogAkEYaiIMKQMANwMAIANB0ABqIAJBEGoiDSkDADcDACADQcgAaiACQQhqIgcpAwA3AwAgAyACKQMANwNAIARBf2oiBEEGdiEIIARB/wFNBEAgCEEDdCILIANBQGtqIgkpAwAhGCADQcABaiIGIAwpAwA3AwAgA0G4AWoiBCANKQMANwMAIANBsAFqIAcpAwA3AwAgAyACKQMANwOoASADQUBrIANBqAFqIBh5IhunIhIQEyAEIAFBEGopAwA3AwAgBiABQRhqKQMANwMAIAMgASkDCDcDsAEgAyAXNwOoASADQegAaiADQagBakHAACASaxASIAMgFyAbhjcDYCADQaABakIANwMAIANBmAFqQgA3AwAgA0GQAWpCADcDACADQgA3A4gBIAhBf2oiAkEESQRAIAhBAWohDiAbQj+DIR4gCSkDACEaIAsgCkF/akEGdiIBQQN0a0EoaiEPIAhBAmohECADQeAAaiABIAhrIglBA3RqIQsgA0FAayACQQN0aikDACEfIANBOGohFSAJQQZJIRYgCSECAkADQCACIgcgDmoiAkEFTw0HQn8hGQJAAkACQAJAAkAgA0HgAGogAkEDdGoiEykDACIXIBpaDQAgByAIaiIBQQRLDQEgAkF+aiICQQRLDQIgA0HgAGogAkEDdGohAiADQTBqIANB4ABqIAFBA3RqKQMAIhggFyAaEFUgA0EgaiADKQMwIhkgFSkDACAaQgAQQSAYIAMpAyB9IRcDQCADQRBqIBlCACAfQgAQQQJAIANBGGopAwAiGCAXUgRAIBcgGFQNAQwDCyACKQMAIAMpAxBaDQILIBlCf3whGSAXIBp8IhggF1ogGCEXDQALC0EAIA9BA3YiESAQIBEgEEkbayEBIAcgB0EAR2shAiADQegBaiIKIANB2ABqKQMANwMAIANB4AFqIgwgA0HQAGopAwA3AwAgA0HYAWoiDSADQcgAaikDADcDACADIAMpA0A3A9ABQgAhF0EAIQQDQCADIANB0AFqIARqIgYpAwBCACAZQgAQQSAGIBcgAykDACIXfCIYNwMAIANBCGopAwAgGCAXVK18IRcgBEEIaiIEQSBHDQALIANBwAFqIAopAwA3AwAgA0G4AWogDCkDADcDACADQbABaiANKQMANwMAIAMgAykD0AE3A6gBIAMgFzcDyAEgFkUNAkEAQSggB0EDdCIKayIEQQN2IhQgEE0gBBsNA0IAIRcgA0GoAWohBSALIQQDQCAEIAQpAwAiHCAFKQMAIh0gF3wiF30iGDcDACAXIB1UIBggHFZyIgytIRcgBEEIaiEEIAVBCGohBSABQQFqIgYgAU8gBiEBDQALIAxFDQMgESAOIBEgDkkbQQN0IQYCQCAOIBQgFCAOSxtFBEBBACEFDAELQgAhF0EAIQQDQCAEIAtqIgEgASkDACIcIANBQGsgBGopAwAiHSAXfCIXfCIYNwMAIBcgHVQgGCAcVHIiBa0hFyAGIARBCGoiBEcNAAsLIBlCf3whGSATIBMpAwAgBa18NwMADAMLQX9BBRBEAAsgAkEFEEQACyAHEEUACyAJQQRPDQEgA0GIAWogCmogGTcDACALQXhqIQsgD0EIaiEPIAcNAAsgA0GoAWogA0HgAGpBKBCHARogA0HoAWpCADcDACADQeABakIANwMAIANB2AFqQgA3AwAgA0IANwPQAUEAIQQDQCADQdABaiAEaiADQagBaiAEaikDACAeiDcDACAEQQhqIgRBIEcNAAsMBwsgB0EEEEQACyACQQQQRAALIAhBBBBEAAsgAEIANwMAIABBGGpCADcDACAAQRBqQgA3AwAgAEEIakIANwMAIAAgASkDADcDICAAQShqIAFBCGopAwA3AwAgAEEwaiABQRBqKQMANwMAIABBOGogAUEYaikDADcDAAwECyADQbwBakEANgIAIANBnITAADYCuAEgA0IBNwKsASADQbiFwAA2AqgBIANBqAFqQcCFwAAQWQALIANBwAFqIgkgAUEYaikDADcDACADQbgBaiIGIAFBEGopAwA3AwAgA0GwAWoiBCABQQhqKQMANwMAIAMgASkDADcDqAEgAyACKQMANwPQASADQgA3A2AgA0GoAWogA0HIAWogA0HgAGogA0HQAWoQPyAAQShqQgA3AwAgAEEwakIANwMAIABBOGpCADcDACAAQRhqIAkpAwA3AwAgAEEQaiAGKQMANwMAIABBCGogBCkDADcDACAAIAMpA6gBNwMAIAAgAykDYDcDIAwCCyACQQUQRAALAkAgEgRAQgAgG31CP4MhGEEBIQQDQEEDIQVBBCEBIARBBEYiBkUEQCAEQX9qIgVBA0sNAyAEQQFqIQELIANB0AFqIAVBA3RqIgIgAikDACADQagBaiAEQQN0aikDACAYhoQ3AwAgASEEIAZFDQALCyAAIAMpA4gBNwMAIAAgAykD0AE3AyAgAEEYaiADQaABaikDADcDACAAQRBqIANBmAFqKQMANwMAIABBCGogA0GQAWopAwA3AwAgAEEoaiADQdgBaikDADcDACAAQTBqIANB4AFqKQMANwMAIABBOGogA0HoAWopAwA3AwAMAQtBf0EEEEQACyADQfABaiQAC7IMAQ5/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
|