@galacticcouncil/sdk 0.0.1-beta.1 → 0.0.1-beta.10

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.
Files changed (75) hide show
  1. package/README.md +34 -31
  2. package/dist/index.esm.js +2 -0
  3. package/dist/index.esm.js.map +7 -0
  4. package/dist/index.js +2 -0
  5. package/dist/index.js.map +7 -0
  6. package/dist/types/api/index.d.ts +1 -0
  7. package/dist/types/api/router.d.ts +18 -46
  8. package/dist/types/api/tradeRouter.d.ts +44 -0
  9. package/dist/types/index.d.ts +2 -2
  10. package/dist/types/pool/xyk/{math/bundler.d.ts → xykMath.d.ts} +0 -0
  11. package/dist/types/pool/xyk/xykPolkadotClient.d.ts +1 -1
  12. package/dist/types/pool/xyk/xykPool.d.ts +1 -1
  13. package/dist/types/{suggester → route}/bfs.d.ts +0 -0
  14. package/dist/types/{suggester → route}/graph.d.ts +0 -0
  15. package/dist/types/{suggester → route}/index.d.ts +0 -0
  16. package/dist/types/{suggester → route}/suggester.d.ts +0 -0
  17. package/dist/types/types.d.ts +34 -8
  18. package/dist/types/utils/math.d.ts +14 -2
  19. package/package.json +5 -5
  20. package/.eslintignore +0 -1
  21. package/.eslintrc.json +0 -20
  22. package/.nvmrc +0 -1
  23. package/.prettierrc.json +0 -12
  24. package/.vscode/settings.json +0 -15
  25. package/dist/cjs/hydra_dx_wasm_bg-ZX7K4FM7.wasm +0 -0
  26. package/dist/cjs/index.js +0 -2
  27. package/dist/cjs/index.js.map +0 -7
  28. package/dist/esm/hydra_dx_wasm_bg-ZX7K4FM7.wasm +0 -0
  29. package/dist/esm/index.js +0 -2
  30. package/dist/esm/index.js.map +0 -7
  31. package/dist/types/api/trader.d.ts +0 -0
  32. package/dist/types/pool/xyk/math/nodejs.d.ts +0 -9
  33. package/esbuild.mjs +0 -36
  34. package/jest.config.mjs +0 -16
  35. package/src/api/index.ts +0 -1
  36. package/src/api/router.ts +0 -359
  37. package/src/api/trader.ts +0 -0
  38. package/src/client/capi.ts +0 -0
  39. package/src/client/index.ts +0 -1
  40. package/src/client/polkadot.ts +0 -47
  41. package/src/client/types.ts +0 -8
  42. package/src/index.ts +0 -4
  43. package/src/pool/index.ts +0 -3
  44. package/src/pool/polkadotPoolService.ts +0 -19
  45. package/src/pool/poolFactory.ts +0 -14
  46. package/src/pool/xyk/math/bundler.ts +0 -19
  47. package/src/pool/xyk/math/nodejs.ts +0 -19
  48. package/src/pool/xyk/xykPolkadotClient.ts +0 -58
  49. package/src/pool/xyk/xykPool.ts +0 -82
  50. package/src/suggester/bfs.ts +0 -106
  51. package/src/suggester/graph.ts +0 -31
  52. package/src/suggester/index.ts +0 -3
  53. package/src/suggester/suggester.ts +0 -66
  54. package/src/types.ts +0 -61
  55. package/src/utils/bignumber.ts +0 -25
  56. package/src/utils/math.ts +0 -24
  57. package/src/utils/queue.ts +0 -26
  58. package/src/utils/stack.ts +0 -31
  59. package/src/utils/traversal/bfs.ts +0 -74
  60. package/test/api/router.spec.ts +0 -87
  61. package/test/data/xykPool.ts +0 -21
  62. package/test/data/xykPools.ts +0 -61
  63. package/test/lib/mockXykPoolService.ts +0 -8
  64. package/test/pool/xyk/xykPool.spec.ts +0 -26
  65. package/test/script/examples/router/getAllAssets.ts +0 -14
  66. package/test/script/examples/router/getAllPaths.ts +0 -14
  67. package/test/script/examples/router/getAssetPairs.ts +0 -14
  68. package/test/script/examples/router/getBestBuyPrice.ts +0 -19
  69. package/test/script/examples/router/getBestSellPrice.ts +0 -19
  70. package/test/script/executor.ts +0 -45
  71. package/test/suggester/bfs.spec.ts +0 -34
  72. package/test/suggester/graph.spec.ts +0 -30
  73. package/test/suggester/suggester.spec.ts +0 -25
  74. package/test/utils/traversal/bfs.spec.ts +0 -28
  75. package/tsconfig.json +0 -14
@@ -0,0 +1,44 @@
1
+ import { Router } from './router';
2
+ import { Trade } from '../types';
3
+ import { BigNumber } from '../utils/bignumber';
4
+ export declare class TradeRouter extends Router {
5
+ /**
6
+ * Calculate and return best possible sell trade for tokenIn>tokenOut
7
+ *
8
+ * @param {string} tokenIn - Storage key of tokenIn
9
+ * @param {string} tokenOut - Storage key of tokenOut
10
+ * @param {BigNumber} amountIn - Amount of tokenIn to sell for tokenOut
11
+ * @returns Best possible sell trade of given token pair
12
+ */
13
+ getBestSell(tokenIn: string, tokenOut: string, amountIn: BigNumber | string | number): Promise<Trade>;
14
+ /**
15
+ * Calculate and return sell swaps for given path
16
+ * - final amount of previous swap is entry to next one
17
+ *
18
+ * @param amountIn - Amount of tokenIn to sell for tokenOut
19
+ * @param path - current path
20
+ * @param poolsMap - pools map
21
+ * @returns Sell swaps for given path with corresponding pool pairs
22
+ */
23
+ private toSellSwaps;
24
+ /**
25
+ * Calculate and return best possible buy trade for tokenIn>tokenOut
26
+ *
27
+ * @param {string} tokenIn - Storage key of tokenIn
28
+ * @param {string} tokenOut - Storage key of tokenOut
29
+ * @param {BigNumber} amountOut - Amount of tokenOut to buy for tokenIn
30
+ * @returns Best possible buy trade of given token pair
31
+ */
32
+ getBestBuy(tokenIn: string, tokenOut: string, amountOut: BigNumber | string | number): Promise<Trade>;
33
+ /**
34
+ * Calculate and return buy swaps for given path
35
+ * - final amount of previous swap is entry to next one
36
+ * - calculation is done backwards
37
+ *
38
+ * @param amountOut - Amount of tokenOut to buy for tokenIn
39
+ * @param path - current path
40
+ * @param poolsMap - pools map
41
+ * @returns Buy swaps for given path
42
+ */
43
+ private toBuySwaps;
44
+ }
@@ -1,4 +1,4 @@
1
- export { Router } from './api';
1
+ export { Router, TradeRouter } from './api';
2
2
  export { PolkadotPoolService, PoolFactory, XykPool } from './pool';
3
+ export * from './types';
3
4
  export * from './utils/bignumber';
4
- export * from './utils/math';
@@ -4,5 +4,5 @@ export declare class XykPolkadotClient extends PolkadotClient {
4
4
  getPools(): Promise<PoolBase[]>;
5
5
  getPoolTokens(poolAddress: string, assetKeys: string[]): Promise<PoolToken[]>;
6
6
  getBalance(poolAddress: string, assetKey: string): Promise<string>;
7
- getSwapFee(): string;
7
+ getTradeFee(): string;
8
8
  }
@@ -3,7 +3,7 @@ import { BigNumber } from '../../utils/bignumber';
3
3
  export declare class XykPool implements Pool {
4
4
  type: PoolType;
5
5
  address: string;
6
- swapFee: string;
6
+ tradeFee: string;
7
7
  tokens: PoolToken[];
8
8
  static fromPool(pool: PoolBase): XykPool;
9
9
  constructor(address: string, swapFee: string, tokens: PoolToken[]);
File without changes
File without changes
File without changes
File without changes
@@ -10,16 +10,18 @@ export declare enum PoolType {
10
10
  Omni = "Omni"
11
11
  }
12
12
  export interface PoolPair {
13
- swapFee: BigNumber;
13
+ tradeFee: BigNumber;
14
14
  tokenIn: string;
15
15
  tokenOut: string;
16
+ decimalsIn: number;
17
+ decimalsOut: number;
16
18
  balanceIn: BigNumber;
17
19
  balanceOut: BigNumber;
18
20
  }
19
21
  export declare type PoolBase = {
20
22
  address: string;
21
23
  type: PoolType;
22
- swapFee: string;
24
+ tradeFee: string;
23
25
  tokens: PoolToken[];
24
26
  };
25
27
  export declare type PoolToken = {
@@ -44,12 +46,36 @@ export declare type Hop = {
44
46
  poolId: string;
45
47
  tokenIn: string;
46
48
  tokenOut: string;
47
- fee: string;
49
+ tradeFeePct: string;
48
50
  };
49
- export declare type Swap = Hop & {
50
- swapAmount: BigNumber;
51
- returnAmount: BigNumber;
52
- returnFinalAmount: BigNumber;
53
- swapFee: BigNumber;
51
+ export declare type Swap = Humanizer & Hop & {
52
+ tokenInDecimals: number;
53
+ tokenOutDecimals: number;
54
+ amountIn: BigNumber;
55
+ amountOut: BigNumber;
56
+ finalAmount: BigNumber;
57
+ tradeFee: BigNumber;
54
58
  spotPrice: BigNumber;
59
+ priceImpactPct: BigNumber;
55
60
  };
61
+ export declare type SellSwap = Swap & {
62
+ calculatedOut: BigNumber;
63
+ };
64
+ export declare type BuySwap = Swap & {
65
+ calculatedIn: BigNumber;
66
+ };
67
+ export declare enum TradeType {
68
+ Buy = "Buy",
69
+ Sell = "Sell"
70
+ }
71
+ export declare type Trade = Humanizer & {
72
+ type: TradeType;
73
+ amountIn: BigNumber;
74
+ amountOut: BigNumber;
75
+ spotPrice: BigNumber;
76
+ priceImpactPct: BigNumber;
77
+ swaps: Swap[];
78
+ };
79
+ export interface Humanizer {
80
+ toHuman(): any;
81
+ }
@@ -1,4 +1,16 @@
1
1
  import { BigNumber } from './bignumber';
2
- export declare function tradeFee(percentage: string): BigNumber;
2
+ export declare function pctToBn(pct: string): BigNumber;
3
3
  export declare function calculateTradeFee(amount: BigNumber, tradeFee: BigNumber): BigNumber;
4
- export declare function normalizeAmount(amount: BigNumber, decimals: number): BigNumber;
4
+ /**
5
+ * Percentage Difference Formula
6
+ *
7
+ * (|𝑉1−𝑉2| / [(𝑉1+𝑉2)/2]) × 100
8
+ *
9
+ * @param amount - Amount of token in/out
10
+ * @param decimals - Decimals of given token
11
+ * @param spotPrice - Spot price
12
+ * @param calculatedPrice - Calculated price
13
+ * @returns Price impact percentage
14
+ */
15
+ export declare function calculatePriceImpact(amount: BigNumber, decimals: number, spotPrice: BigNumber, calculatedPrice: BigNumber): BigNumber;
16
+ export declare function formatAmount(amount: BigNumber, decimals: number): string;
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@galacticcouncil/sdk",
3
- "version": "0.0.1-beta.1",
3
+ "version": "0.0.1-beta.10",
4
4
  "private": false,
5
5
  "description": "Galactic SDK",
6
6
  "author": "Pavol Noha <palo@hydradx.io>",
7
- "main": "dist/cjs/index.js",
8
- "module": "dist/esm/index.js",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.esm.js",
9
9
  "types": "dist/types/index.d.ts",
10
10
  "scripts": {
11
11
  "test": "jest",
12
+ "test:coverage": "jest --coverage",
12
13
  "build": "node ./esbuild.mjs && tsc --emitDeclarationOnly --outDir dist/types/",
13
14
  "cleanup": "rimraf out && rimraf dist"
14
15
  },
@@ -16,7 +17,6 @@
16
17
  "@types/jest": "^28.1.8",
17
18
  "es-jest": "^2.0.0",
18
19
  "esbuild": "^0.14.53",
19
- "esbuild-plugin-resolve": "^1.0.3",
20
20
  "esbuild-plugin-wasm": "^1.0.0",
21
21
  "fs-extra": "^10.1.0",
22
22
  "prettier": "^2.3.2",
@@ -26,10 +26,10 @@
26
26
  "typescript": "^4.7.4"
27
27
  },
28
28
  "dependencies": {
29
+ "@galacticcouncil/math-xyk": "^0.0.0-beta-1",
29
30
  "@polkadot/api": "^9.0.1",
30
31
  "bignumber.js": "^9.1.0",
31
32
  "capi": "^0.1.0-beta.12",
32
- "hydra-dx-wasm": "https://github.com/galacticcouncil/HydraDX-wasm#0e3d625c22c32525a4619047223cac019c0cfa46",
33
33
  "lodash.clonedeep": "^4.5.0"
34
34
  }
35
35
  }
package/.eslintignore DELETED
@@ -1 +0,0 @@
1
- node_modules/
package/.eslintrc.json DELETED
@@ -1,20 +0,0 @@
1
- {
2
- "root": true,
3
- "env": {
4
- "browser": true,
5
- "es6": true,
6
- "node": true
7
- },
8
- "plugins": [
9
- "es",
10
- "prettier",
11
- "promise"
12
- ],
13
- "extends": [
14
- "prettier",
15
- "plugin:promise/recommended"
16
- ],
17
- "rules": {
18
- "prettier/prettier": "error"
19
- }
20
- }
package/.nvmrc DELETED
@@ -1 +0,0 @@
1
- 18
package/.prettierrc.json DELETED
@@ -1,12 +0,0 @@
1
- {
2
- "trailingComma": "es5",
3
- "printWidth": 80,
4
- "tabWidth": 2,
5
- "singleQuote": true,
6
- "bracketSpacing": true,
7
- "arrowParens": "always",
8
- "semi": true,
9
- "newline-before-return": true,
10
- "no-duplicate-variable": [true, "check-parameters"],
11
- "no-var-keyword": true
12
- }
@@ -1,15 +0,0 @@
1
- {
2
- "[jsonc]": {
3
- "editor.defaultFormatter": "esbenp.prettier-vscode"
4
- },
5
- "[yaml]": {
6
- "editor.defaultFormatter": "esbenp.prettier-vscode"
7
- },
8
- "[typescript]": {
9
- "editor.defaultFormatter": "esbenp.prettier-vscode"
10
- },
11
- "editor.defaultFormatter": "esbenp.prettier-vscode",
12
- "editor.formatOnSave": true,
13
- "editor.tabSize": 2,
14
- "prettier.printWidth": 100
15
- }
package/dist/cjs/index.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";var Qe=Object.create;var be=Object.defineProperty;var Je=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var je=Object.getPrototypeOf,et=Object.prototype.hasOwnProperty;var tt=(d,r)=>()=>(r||d((r={exports:{}}).exports,r),r.exports),nt=(d,r)=>{for(var a in r)be(d,a,{get:r[a],enumerable:!0})},ze=(d,r,a,_)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of Ze(r))!et.call(d,o)&&o!==a&&be(d,o,{get:()=>r[o],enumerable:!(_=Je(r,o))||_.enumerable});return d};var rt=(d,r,a)=>(a=d!=null?Qe(je(d)):{},ze(r||!d||!d.__esModule?be(a,"default",{value:d,enumerable:!0}):a,d)),ot=d=>ze(be({},"__esModule",{value:!0}),d);var Ye=tt((Zt,j)=>{var ct={},b,{TextEncoder:ut,TextDecoder:ft}=require("util"),T=0,ve=null;function xe(){return(ve===null||ve.buffer!==b.memory.buffer)&&(ve=new Uint8Array(b.memory.buffer)),ve}var Oe=new ut("utf-8"),pt=typeof Oe.encodeInto=="function"?function(d,r){return Oe.encodeInto(d,r)}:function(d,r){let a=Oe.encode(d);return r.set(a),{read:d.length,written:a.length}};function M(d,r,a){if(a===void 0){let P=Oe.encode(d),A=r(P.length);return xe().subarray(A,A+P.length).set(P),T=P.length,A}let _=d.length,o=r(_),h=xe(),w=0;for(;w<_;w++){let P=d.charCodeAt(w);if(P>127)break;h[o+w]=P}if(w!==_){w!==0&&(d=d.slice(w)),o=a(o,_,_=w+d.length*3);let P=xe().subarray(o+w,o+_);w+=pt(d,P).written}return T=w,o}var Be=null;function U(){return(Be===null||Be.buffer!==b.memory.buffer)&&(Be=new Int32Array(b.memory.buffer)),Be}var $e=new ft("utf-8",{ignoreBOM:!0,fatal:!0});$e.decode();function ie(d,r){return $e.decode(xe().subarray(d,d+r))}j.exports.calculate_pool_trade_fee=function(d,r,a){try{let h=b.__wbindgen_add_to_stack_pointer(-16),w=M(d,b.__wbindgen_malloc,b.__wbindgen_realloc),P=T;b.calculate_pool_trade_fee(h,w,P,r,a);var _=U()[h/4+0],o=U()[h/4+1];return ie(_,o)}finally{b.__wbindgen_add_to_stack_pointer(16),b.__wbindgen_free(_,o)}};j.exports.get_spot_price=function(d,r,a){try{let h=b.__wbindgen_add_to_stack_pointer(-16),w=M(d,b.__wbindgen_malloc,b.__wbindgen_realloc),P=T,A=M(r,b.__wbindgen_malloc,b.__wbindgen_realloc),S=T,B=M(a,b.__wbindgen_malloc,b.__wbindgen_realloc),x=T;b.get_spot_price(h,w,P,A,S,B,x);var _=U()[h/4+0],o=U()[h/4+1];return ie(_,o)}finally{b.__wbindgen_add_to_stack_pointer(16),b.__wbindgen_free(_,o)}};j.exports.calculate_out_given_in=function(d,r,a){try{let h=b.__wbindgen_add_to_stack_pointer(-16),w=M(d,b.__wbindgen_malloc,b.__wbindgen_realloc),P=T,A=M(r,b.__wbindgen_malloc,b.__wbindgen_realloc),S=T,B=M(a,b.__wbindgen_malloc,b.__wbindgen_realloc),x=T;b.calculate_out_given_in(h,w,P,A,S,B,x);var _=U()[h/4+0],o=U()[h/4+1];return ie(_,o)}finally{b.__wbindgen_add_to_stack_pointer(16),b.__wbindgen_free(_,o)}};j.exports.calculate_in_given_out=function(d,r,a){try{let h=b.__wbindgen_add_to_stack_pointer(-16),w=M(d,b.__wbindgen_malloc,b.__wbindgen_realloc),P=T,A=M(r,b.__wbindgen_malloc,b.__wbindgen_realloc),S=T,B=M(a,b.__wbindgen_malloc,b.__wbindgen_realloc),x=T;b.calculate_in_given_out(h,w,P,A,S,B,x);var _=U()[h/4+0],o=U()[h/4+1];return ie(_,o)}finally{b.__wbindgen_add_to_stack_pointer(16),b.__wbindgen_free(_,o)}};j.exports.calculate_liquidity_in=function(d,r,a){try{let h=b.__wbindgen_add_to_stack_pointer(-16),w=M(d,b.__wbindgen_malloc,b.__wbindgen_realloc),P=T,A=M(r,b.__wbindgen_malloc,b.__wbindgen_realloc),S=T,B=M(a,b.__wbindgen_malloc,b.__wbindgen_realloc),x=T;b.calculate_liquidity_in(h,w,P,A,S,B,x);var _=U()[h/4+0],o=U()[h/4+1];return ie(_,o)}finally{b.__wbindgen_add_to_stack_pointer(16),b.__wbindgen_free(_,o)}};j.exports.calculate_shares=function(d,r,a){try{let h=b.__wbindgen_add_to_stack_pointer(-16),w=M(d,b.__wbindgen_malloc,b.__wbindgen_realloc),P=T,A=M(r,b.__wbindgen_malloc,b.__wbindgen_realloc),S=T,B=M(a,b.__wbindgen_malloc,b.__wbindgen_realloc),x=T;b.calculate_shares(h,w,P,A,S,B,x);var _=U()[h/4+0],o=U()[h/4+1];return ie(_,o)}finally{b.__wbindgen_add_to_stack_pointer(16),b.__wbindgen_free(_,o)}};j.exports.calculate_liquidity_out_asset_a=function(d,r,a,_){try{let w=b.__wbindgen_add_to_stack_pointer(-16),P=M(d,b.__wbindgen_malloc,b.__wbindgen_realloc),A=T,S=M(r,b.__wbindgen_malloc,b.__wbindgen_realloc),B=T,x=M(a,b.__wbindgen_malloc,b.__wbindgen_realloc),R=T,ee=M(_,b.__wbindgen_malloc,b.__wbindgen_realloc),K=T;b.calculate_liquidity_out_asset_a(w,P,A,S,B,x,R,ee,K);var o=U()[w/4+0],h=U()[w/4+1];return ie(o,h)}finally{b.__wbindgen_add_to_stack_pointer(16),b.__wbindgen_free(o,h)}};j.exports.calculate_liquidity_out_asset_b=function(d,r,a,_){try{let w=b.__wbindgen_add_to_stack_pointer(-16),P=M(d,b.__wbindgen_malloc,b.__wbindgen_realloc),A=T,S=M(r,b.__wbindgen_malloc,b.__wbindgen_realloc),B=T,x=M(a,b.__wbindgen_malloc,b.__wbindgen_realloc),R=T,ee=M(_,b.__wbindgen_malloc,b.__wbindgen_realloc),K=T;b.calculate_liquidity_out_asset_b(w,P,A,S,B,x,R,ee,K);var o=U()[w/4+0],h=U()[w/4+1];return ie(o,h)}finally{b.__wbindgen_add_to_stack_pointer(16),b.__wbindgen_free(o,h)}};var gt=require("path").join(__dirname,"hydra_dx_wasm_bg.wasm"),_t=require("fs").readFileSync(gt),dt=new WebAssembly.Module(_t),ht=new WebAssembly.Instance(dt,ct);b=ht.exports;j.exports.__wasm=b});var bt={};nt(bt,{BigNumber:()=>ce,DECIMAL_PLACES:()=>Se,INFINITY:()=>at,ONE:()=>lt,PolkadotPoolService:()=>he,PoolFactory:()=>le,Router:()=>we,XykPool:()=>re,ZERO:()=>st,bnum:()=>X,calculateTradeFee:()=>ke,normalizeAmount:()=>Ie,scale:()=>ue,tradeFee:()=>He});module.exports=ot(bt);var ye=class{constructor(r=1/0){this.capacity=r;this.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 ge=class{isNotVisited(r,a){let _=!0;return a.forEach(o=>{o[0]===r&&(_=!1)}),_}findPaths(r,a,_){let o=[],h=new ye,w=[];for(w.push([a,""]),h.enqueue(w);h.size()>0;){let P=h.dequeue();if(P==null)return o;let A=P[P.length-1];(_===null||A[0]===_)&&o.push(P),r[A[0]].forEach(B=>{if(this.isNotVisited(B[0],P)){let x=[...P];x.push(B),h.enqueue(x)}})}return o}buildAndPopulateGraph(r,a){let _=[];for(let o=0;o<r.length;o++)_.push([]);for(let[o,h,w]of a){let P=parseInt(h),A=parseInt(w);_[P].push([A,o])}return _}};function Le(d){let r={};for(let a of d){let _=a.tokens.length;for(let o=0;o<_;o++){r[a.tokens[o].id]||(r[a.tokens[o].id]=[]);for(let h=0;h<_;h++){if(o==h)continue;let w=[a.address,a.tokens[o].id,a.tokens[h].id];r[a.tokens[o].id].push(w)}}}return r}var _e=class{getProposals(r,a,_){let o=Le(_),h=Object.keys(o),w=h.map(B=>o[B]).flat(),P=new ge,A=P.buildAndPopulateGraph(h,w),S=P.findPaths(A,parseInt(r),a?parseInt(a):null);return this.parsePaths(S)}parsePaths(r){let a=[];for(let _ of r){let o=[];for(let h=0;h<_.length;h++){let w=_[h],P=_[h+1];if(P==null)break;o.push(this.toEdge(w,P))}a.push(o)}return a}toEdge(r,a){return[a[1],r[0].toString(),a[0].toString()]}};var de=class{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:_}=await this.api.query.tokens.accounts(r,a);return _.toString()}};var Ae=class extends de{async getPools(){let a=(await this.api.query.xyk.poolAssets.entries()).map(async _=>{let o=this.getStorageKey(_,0),h=this.getStorageEntryArray(_),w=await this.getPoolTokens(o,h);return{address:o,type:"XYK",swapFee:this.getSwapFee(),tokens:w}});return Promise.all(a)}async getPoolTokens(r,a){let _=a.map(async o=>{let h=await this.getBalance(r,o),P=(await super.getAssetMetadata(o)).toHuman();return{id:o,balance:h,decimals:P?P.decimals:"12",symbol:P?P.symbol:"BSX"}});return Promise.all(_)}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 he=class{constructor(r){this.api=r}async getPools(){let r=[],a=await new Ae(this.api).getPools();return r.push(a),r.flat()}};var it=/^-?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,qe=Math.ceil,Z=Math.floor,z="[BigNumber Error] ",Ve=z+"Number primitive has more than 15 significant digits: ",Q=1e14,v=14,Ge=9007199254740991,Ue=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],oe=1e7,q=1e9;function We(d){var r,a,_,o=y.prototype={constructor:y,toString:null,valueOf:null},h=new y(1),w=20,P=4,A=-7,S=21,B=-1e7,x=1e7,R=!1,ee=1,K=0,Te={prefix:"",groupSize:3,secondaryGroupSize:0,groupSeparator:",",decimalSeparator:".",fractionGroupSize:0,fractionGroupSeparator:"\xA0",suffix:""},se="0123456789abcdefghijklmnopqrstuvwxyz",Me=!0;function y(e,t){var n,f,s,c,g,i,l,p,u=this;if(!(u instanceof y))return new y(e,t);if(t==null){if(e&&e._isBigNumber===!0){u.s=e.s,!e.c||e.e>x?u.c=u.e=null:e.e<B?u.c=[u.e=0]:(u.e=e.e,u.c=e.c.slice());return}if((i=typeof e=="number")&&e*0==0){if(u.s=1/e<0?(e=-e,-1):1,e===~~e){for(c=0,g=e;g>=10;g/=10,c++);c>x?u.c=u.e=null:(u.e=c,u.c=[e]);return}p=String(e)}else{if(!it.test(p=String(e)))return _(u,p,i);u.s=p.charCodeAt(0)==45?(p=p.slice(1),-1):1}(c=p.indexOf("."))>-1&&(p=p.replace(".","")),(g=p.search(/e/i))>0?(c<0&&(c=g),c+=+p.slice(g+1),p=p.substring(0,g)):c<0&&(c=p.length)}else{if(F(t,2,se.length,"Base"),t==10&&Me)return u=new y(e),V(u,w+u.e+1,P);if(p=String(e),i=typeof e=="number"){if(e*0!=0)return _(u,p,i,t);if(u.s=1/e<0?(p=p.slice(1),-1):1,y.DEBUG&&p.replace(/^0\.0*|\./,"").length>15)throw Error(Ve+e)}else u.s=p.charCodeAt(0)===45?(p=p.slice(1),-1):1;for(n=se.slice(0,t),c=g=0,l=p.length;g<l;g++)if(n.indexOf(f=p.charAt(g))<0){if(f=="."){if(g>c){c=l;continue}}else if(!s&&(p==p.toUpperCase()&&(p=p.toLowerCase())||p==p.toLowerCase()&&(p=p.toUpperCase()))){s=!0,g=-1,c=0;continue}return _(u,String(e),i,t)}i=!1,p=a(p,t,10,u.s),(c=p.indexOf("."))>-1?p=p.replace(".",""):c=p.length}for(g=0;p.charCodeAt(g)===48;g++);for(l=p.length;p.charCodeAt(--l)===48;);if(p=p.slice(g,++l)){if(l-=g,i&&y.DEBUG&&l>15&&(e>Ge||e!==Z(e)))throw Error(Ve+u.s*e);if((c=c-g-1)>x)u.c=u.e=null;else if(c<B)u.c=[u.e=0];else{if(u.e=c,u.c=[],g=(c+1)%v,c<0&&(g+=v),g<l){for(g&&u.c.push(+p.slice(0,g)),l-=v;g<l;)u.c.push(+p.slice(g,g+=v));g=v-(p=p.slice(g)).length}else g-=l;for(;g--;p+="0");u.c.push(+p)}}else u.c=[u.e=0]}y.clone=We,y.ROUND_UP=0,y.ROUND_DOWN=1,y.ROUND_CEIL=2,y.ROUND_FLOOR=3,y.ROUND_HALF_UP=4,y.ROUND_HALF_DOWN=5,y.ROUND_HALF_EVEN=6,y.ROUND_HALF_CEIL=7,y.ROUND_HALF_FLOOR=8,y.EUCLID=9,y.config=y.set=function(e){var t,n;if(e!=null)if(typeof e=="object"){if(e.hasOwnProperty(t="DECIMAL_PLACES")&&(n=e[t],F(n,0,q,t),w=n),e.hasOwnProperty(t="ROUNDING_MODE")&&(n=e[t],F(n,0,8,t),P=n),e.hasOwnProperty(t="EXPONENTIAL_AT")&&(n=e[t],n&&n.pop?(F(n[0],-q,0,t),F(n[1],0,q,t),A=n[0],S=n[1]):(F(n,-q,q,t),A=-(S=n<0?-n:n))),e.hasOwnProperty(t="RANGE"))if(n=e[t],n&&n.pop)F(n[0],-q,-1,t),F(n[1],1,q,t),B=n[0],x=n[1];else if(F(n,-q,q,t),n)B=-(x=n<0?-n:n);else throw Error(z+t+" cannot be zero: "+n);if(e.hasOwnProperty(t="CRYPTO"))if(n=e[t],n===!!n)if(n)if(typeof crypto<"u"&&crypto&&(crypto.getRandomValues||crypto.randomBytes))R=n;else throw R=!n,Error(z+"crypto unavailable");else R=n;else throw Error(z+t+" not true or false: "+n);if(e.hasOwnProperty(t="MODULO_MODE")&&(n=e[t],F(n,0,9,t),ee=n),e.hasOwnProperty(t="POW_PRECISION")&&(n=e[t],F(n,0,q,t),K=n),e.hasOwnProperty(t="FORMAT"))if(n=e[t],typeof n=="object")Te=n;else throw Error(z+t+" not an object: "+n);if(e.hasOwnProperty(t="ALPHABET"))if(n=e[t],typeof n=="string"&&!/^.?$|[+\-.\s]|(.).*\1/.test(n))Me=n.slice(0,10)=="0123456789",se=n;else throw Error(z+t+" invalid: "+n)}else throw Error(z+"Object expected: "+e);return{DECIMAL_PLACES:w,ROUNDING_MODE:P,EXPONENTIAL_AT:[A,S],RANGE:[B,x],CRYPTO:R,MODULO_MODE:ee,POW_PRECISION:K,FORMAT:Te,ALPHABET:se}},y.isBigNumber=function(e){if(!e||e._isBigNumber!==!0)return!1;if(!y.DEBUG)return!0;var t,n,f=e.c,s=e.e,c=e.s;e:if({}.toString.call(f)=="[object Array]"){if((c===1||c===-1)&&s>=-q&&s<=q&&s===Z(s)){if(f[0]===0){if(s===0&&f.length===1)return!0;break e}if(t=(s+1)%v,t<1&&(t+=v),String(f[0]).length==t){for(t=0;t<f.length;t++)if(n=f[t],n<0||n>=Q||n!==Z(n))break e;if(n!==0)return!0}}}else if(f===null&&s===null&&(c===null||c===1||c===-1))return!0;throw Error(z+"Invalid BigNumber: "+e)},y.maximum=y.max=function(){return Xe(arguments,o.lt)},y.minimum=y.min=function(){return Xe(arguments,o.gt)},y.random=function(){var e=9007199254740992,t=Math.random()*e&2097151?function(){return Z(Math.random()*e)}:function(){return(Math.random()*1073741824|0)*8388608+(Math.random()*8388608|0)};return function(n){var f,s,c,g,i,l=0,p=[],u=new y(h);if(n==null?n=w:F(n,0,q),g=qe(n/v),R)if(crypto.getRandomValues){for(f=crypto.getRandomValues(new Uint32Array(g*=2));l<g;)i=f[l]*131072+(f[l+1]>>>11),i>=9e15?(s=crypto.getRandomValues(new Uint32Array(2)),f[l]=s[0],f[l+1]=s[1]):(p.push(i%1e14),l+=2);l=g/2}else if(crypto.randomBytes){for(f=crypto.randomBytes(g*=7);l<g;)i=(f[l]&31)*281474976710656+f[l+1]*1099511627776+f[l+2]*4294967296+f[l+3]*16777216+(f[l+4]<<16)+(f[l+5]<<8)+f[l+6],i>=9e15?crypto.randomBytes(7).copy(f,l):(p.push(i%1e14),l+=7);l=g/7}else throw R=!1,Error(z+"crypto unavailable");if(!R)for(;l<g;)i=t(),i<9e15&&(p[l++]=i%1e14);for(g=p[--l],n%=v,g&&n&&(i=Ue[v-n],p[l]=Z(g/i)*i);p[l]===0;p.pop(),l--);if(l<0)p=[c=0];else{for(c=-1;p[0]===0;p.splice(0,1),c-=v);for(l=1,i=p[0];i>=10;i/=10,l++);l<v&&(c-=v-l)}return u.e=c,u.c=p,u}}(),y.sum=function(){for(var e=1,t=arguments,n=new y(t[0]);e<t.length;)n=n.plus(t[e++]);return n},a=function(){var e="0123456789";function t(n,f,s,c){for(var g,i=[0],l,p=0,u=n.length;p<u;){for(l=i.length;l--;i[l]*=f);for(i[0]+=c.indexOf(n.charAt(p++)),g=0;g<i.length;g++)i[g]>s-1&&(i[g+1]==null&&(i[g+1]=0),i[g+1]+=i[g]/s|0,i[g]%=s)}return i.reverse()}return function(n,f,s,c,g){var i,l,p,u,m,N,E,k,C=n.indexOf("."),L=w,O=P;for(C>=0&&(u=K,K=0,n=n.replace(".",""),k=new y(f),N=k.pow(n.length-C),K=u,k.c=t(ne($(N.c),N.e,"0"),10,s,e),k.e=k.c.length),E=t(n,f,s,g?(i=se,e):(i=e,se)),p=u=E.length;E[--u]==0;E.pop());if(!E[0])return i.charAt(0);if(C<0?--p:(N.c=E,N.e=p,N.s=c,N=r(N,k,L,O,s),E=N.c,m=N.r,p=N.e),l=p+L+1,C=E[l],u=s/2,m=m||l<0||E[l+1]!=null,m=O<4?(C!=null||m)&&(O==0||O==(N.s<0?3:2)):C>u||C==u&&(O==4||m||O==6&&E[l-1]&1||O==(N.s<0?8:7)),l<1||!E[0])n=m?ne(i.charAt(1),-L,i.charAt(0)):i.charAt(0);else{if(E.length=l,m)for(--s;++E[--l]>s;)E[l]=0,l||(++p,E=[1].concat(E));for(u=E.length;!E[--u];);for(C=0,n="";C<=u;n+=i.charAt(E[C++]));n=ne(n,p,i.charAt(0))}return n}}(),r=function(){function e(f,s,c){var g,i,l,p,u=0,m=f.length,N=s%oe,E=s/oe|0;for(f=f.slice();m--;)l=f[m]%oe,p=f[m]/oe|0,g=E*l+p*N,i=N*l+g%oe*oe+u,u=(i/c|0)+(g/oe|0)+E*p,f[m]=i%c;return u&&(f=[u].concat(f)),f}function t(f,s,c,g){var i,l;if(c!=g)l=c>g?1:-1;else for(i=l=0;i<c;i++)if(f[i]!=s[i]){l=f[i]>s[i]?1:-1;break}return l}function n(f,s,c,g){for(var i=0;c--;)f[c]-=i,i=f[c]<s[c]?1:0,f[c]=i*g+f[c]-s[c];for(;!f[0]&&f.length>1;f.splice(0,1));}return function(f,s,c,g,i){var l,p,u,m,N,E,k,C,L,O,I,G,Pe,De,Re,J,pe,W=f.s==s.s?1:-1,H=f.c,D=s.c;if(!H||!H[0]||!D||!D[0])return new y(!f.s||!s.s||(H?D&&H[0]==D[0]:!D)?NaN:H&&H[0]==0||!D?W*0:W/0);for(C=new y(W),L=C.c=[],p=f.e-s.e,W=c+p+1,i||(i=Q,p=Y(f.e/v)-Y(s.e/v),W=W/v|0),u=0;D[u]==(H[u]||0);u++);if(D[u]>(H[u]||0)&&p--,W<0)L.push(1),m=!0;else{for(De=H.length,J=D.length,u=0,W+=2,N=Z(i/(D[0]+1)),N>1&&(D=e(D,N,i),H=e(H,N,i),J=D.length,De=H.length),Pe=J,O=H.slice(0,J),I=O.length;I<J;O[I++]=0);pe=D.slice(),pe=[0].concat(pe),Re=D[0],D[1]>=i/2&&Re++;do{if(N=0,l=t(D,O,J,I),l<0){if(G=O[0],J!=I&&(G=G*i+(O[1]||0)),N=Z(G/Re),N>1)for(N>=i&&(N=i-1),E=e(D,N,i),k=E.length,I=O.length;t(E,O,k,I)==1;)N--,n(E,J<k?pe:D,k,i),k=E.length,l=1;else N==0&&(l=N=1),E=D.slice(),k=E.length;if(k<I&&(E=[0].concat(E)),n(O,E,I,i),I=O.length,l==-1)for(;t(D,O,J,I)<1;)N++,n(O,J<I?pe:D,I,i),I=O.length}else l===0&&(N++,O=[0]);L[u++]=N,O[0]?O[I++]=H[Pe]||0:(O=[H[Pe]],I=1)}while((Pe++<De||O[0]!=null)&&W--);m=O[0]!=null,L[0]||L.splice(0,1)}if(i==Q){for(u=1,W=L[0];W>=10;W/=10,u++);V(C,c+(C.e=u+p*v-1)+1,g,m)}else C.e=p,C.r=+m;return C}}();function Fe(e,t,n,f){var s,c,g,i,l;if(n==null?n=P:F(n,0,8),!e.c)return e.toString();if(s=e.c[0],g=e.e,t==null)l=$(e.c),l=f==1||f==2&&(g<=A||g>=S)?Ee(l,g):ne(l,g,"0");else if(e=V(new y(e),t,n),c=e.e,l=$(e.c),i=l.length,f==1||f==2&&(t<=c||c<=A)){for(;i<t;l+="0",i++);l=Ee(l,c)}else if(t-=g,l=ne(l,c,"0"),c+1>i){if(--t>0)for(l+=".";t--;l+="0");}else if(t+=c-i,t>0)for(c+1==i&&(l+=".");t--;l+="0");return e.s<0&&s?"-"+l:l}function Xe(e,t){for(var n,f=1,s=new y(e[0]);f<e.length;f++)if(n=new y(e[f]),n.s)t.call(s,n)&&(s=n);else{s=n;break}return s}function Ce(e,t,n){for(var f=1,s=t.length;!t[--s];t.pop());for(s=t[0];s>=10;s/=10,f++);return(n=f+n*v-1)>x?e.c=e.e=null:n<B?e.c=[e.e=0]:(e.e=n,e.c=t),e}_=function(){var e=/^(-?)0([xbo])(?=\w[\w.]*$)/i,t=/^([^.]+)\.$/,n=/^\.([^.]+)$/,f=/^-?(Infinity|NaN)$/,s=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(c,g,i,l){var p,u=i?g:g.replace(s,"");if(f.test(u))c.s=isNaN(u)?null:u<0?-1:1;else{if(!i&&(u=u.replace(e,function(m,N,E){return p=(E=E.toLowerCase())=="x"?16:E=="b"?2:8,!l||l==p?N:m}),l&&(p=l,u=u.replace(t,"$1").replace(n,"0.$1")),g!=u))return new y(u,p);if(y.DEBUG)throw Error(z+"Not a"+(l?" base "+l:"")+" number: "+g);c.s=null}c.c=c.e=null}}();function V(e,t,n,f){var s,c,g,i,l,p,u,m=e.c,N=Ue;if(m){e:{for(s=1,i=m[0];i>=10;i/=10,s++);if(c=t-s,c<0)c+=v,g=t,l=m[p=0],u=l/N[s-g-1]%10|0;else if(p=qe((c+1)/v),p>=m.length)if(f){for(;m.length<=p;m.push(0));l=u=0,s=1,c%=v,g=c-v+1}else break e;else{for(l=i=m[p],s=1;i>=10;i/=10,s++);c%=v,g=c-v+s,u=g<0?0:l/N[s-g-1]%10|0}if(f=f||t<0||m[p+1]!=null||(g<0?l:l%N[s-g-1]),f=n<4?(u||f)&&(n==0||n==(e.s<0?3:2)):u>5||u==5&&(n==4||f||n==6&&(c>0?g>0?l/N[s-g]:0:m[p-1])%10&1||n==(e.s<0?8:7)),t<1||!m[0])return m.length=0,f?(t-=e.e+1,m[0]=N[(v-t%v)%v],e.e=-t||0):m[0]=e.e=0,e;if(c==0?(m.length=p,i=1,p--):(m.length=p+1,i=N[v-c],m[p]=g>0?Z(l/N[s-g]%N[g])*i:0),f)for(;;)if(p==0){for(c=1,g=m[0];g>=10;g/=10,c++);for(g=m[0]+=i,i=1;g>=10;g/=10,i++);c!=i&&(e.e++,m[0]==Q&&(m[0]=1));break}else{if(m[p]+=i,m[p]!=Q)break;m[p--]=0,i=1}for(c=m.length;m[--c]===0;m.pop());}e.e>x?e.c=e.e=null:e.e<B&&(e.c=[e.e=0])}return e}function te(e){var t,n=e.e;return n===null?e.toString():(t=$(e.c),t=n<=A||n>=S?Ee(t,n):ne(t,n,"0"),e.s<0?"-"+t:t)}return o.absoluteValue=o.abs=function(){var e=new y(this);return e.s<0&&(e.s=1),e},o.comparedTo=function(e,t){return ae(this,new y(e,t))},o.decimalPlaces=o.dp=function(e,t){var n,f,s,c=this;if(e!=null)return F(e,0,q),t==null?t=P:F(t,0,8),V(new y(c),e+c.e+1,t);if(!(n=c.c))return null;if(f=((s=n.length-1)-Y(this.e/v))*v,s=n[s])for(;s%10==0;s/=10,f--);return f<0&&(f=0),f},o.dividedBy=o.div=function(e,t){return r(this,new y(e,t),w,P)},o.dividedToIntegerBy=o.idiv=function(e,t){return r(this,new y(e,t),0,1)},o.exponentiatedBy=o.pow=function(e,t){var n,f,s,c,g,i,l,p,u,m=this;if(e=new y(e),e.c&&!e.isInteger())throw Error(z+"Exponent not an integer: "+te(e));if(t!=null&&(t=new y(t)),i=e.e>14,!m.c||!m.c[0]||m.c[0]==1&&!m.e&&m.c.length==1||!e.c||!e.c[0])return u=new y(Math.pow(+te(m),i?2-Ne(e):+te(e))),t?u.mod(t):u;if(l=e.s<0,t){if(t.c?!t.c[0]:!t.s)return new y(NaN);f=!l&&m.isInteger()&&t.isInteger(),f&&(m=m.mod(t))}else{if(e.e>9&&(m.e>0||m.e<-1||(m.e==0?m.c[0]>1||i&&m.c[1]>=24e7:m.c[0]<8e13||i&&m.c[0]<=9999975e7)))return c=m.s<0&&Ne(e)?-0:0,m.e>-1&&(c=1/c),new y(l?1/c:c);K&&(c=qe(K/v+2))}for(i?(n=new y(.5),l&&(e.s=1),p=Ne(e)):(s=Math.abs(+te(e)),p=s%2),u=new y(h);;){if(p){if(u=u.times(m),!u.c)break;c?u.c.length>c&&(u.c.length=c):f&&(u=u.mod(t))}if(s){if(s=Z(s/2),s===0)break;p=s%2}else if(e=e.times(n),V(e,e.e+1,1),e.e>14)p=Ne(e);else{if(s=+te(e),s===0)break;p=s%2}m=m.times(m),c?m.c&&m.c.length>c&&(m.c.length=c):f&&(m=m.mod(t))}return f?u:(l&&(u=h.div(u)),t?u.mod(t):c?V(u,K,P,g):u)},o.integerValue=function(e){var t=new y(this);return e==null?e=P:F(e,0,8),V(t,t.e+1,e)},o.isEqualTo=o.eq=function(e,t){return ae(this,new y(e,t))===0},o.isFinite=function(){return!!this.c},o.isGreaterThan=o.gt=function(e,t){return ae(this,new y(e,t))>0},o.isGreaterThanOrEqualTo=o.gte=function(e,t){return(t=ae(this,new y(e,t)))===1||t===0},o.isInteger=function(){return!!this.c&&Y(this.e/v)>this.c.length-2},o.isLessThan=o.lt=function(e,t){return ae(this,new y(e,t))<0},o.isLessThanOrEqualTo=o.lte=function(e,t){return(t=ae(this,new y(e,t)))===-1||t===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(e,t){var n,f,s,c,g=this,i=g.s;if(e=new y(e,t),t=e.s,!i||!t)return new y(NaN);if(i!=t)return e.s=-t,g.plus(e);var l=g.e/v,p=e.e/v,u=g.c,m=e.c;if(!l||!p){if(!u||!m)return u?(e.s=-t,e):new y(m?g:NaN);if(!u[0]||!m[0])return m[0]?(e.s=-t,e):new y(u[0]?g:P==3?-0:0)}if(l=Y(l),p=Y(p),u=u.slice(),i=l-p){for((c=i<0)?(i=-i,s=u):(p=l,s=m),s.reverse(),t=i;t--;s.push(0));s.reverse()}else for(f=(c=(i=u.length)<(t=m.length))?i:t,i=t=0;t<f;t++)if(u[t]!=m[t]){c=u[t]<m[t];break}if(c&&(s=u,u=m,m=s,e.s=-e.s),t=(f=m.length)-(n=u.length),t>0)for(;t--;u[n++]=0);for(t=Q-1;f>i;){if(u[--f]<m[f]){for(n=f;n&&!u[--n];u[n]=t);--u[n],u[f]+=Q}u[f]-=m[f]}for(;u[0]==0;u.splice(0,1),--p);return u[0]?Ce(e,u,p):(e.s=P==3?-1:1,e.c=[e.e=0],e)},o.modulo=o.mod=function(e,t){var n,f,s=this;return e=new y(e,t),!s.c||!e.s||e.c&&!e.c[0]?new y(NaN):!e.c||s.c&&!s.c[0]?new y(s):(ee==9?(f=e.s,e.s=1,n=r(s,e,0,3),e.s=f,n.s*=f):n=r(s,e,0,ee),e=s.minus(n.times(e)),!e.c[0]&&ee==1&&(e.s=s.s),e)},o.multipliedBy=o.times=function(e,t){var n,f,s,c,g,i,l,p,u,m,N,E,k,C,L,O=this,I=O.c,G=(e=new y(e,t)).c;if(!I||!G||!I[0]||!G[0])return!O.s||!e.s||I&&!I[0]&&!G||G&&!G[0]&&!I?e.c=e.e=e.s=null:(e.s*=O.s,!I||!G?e.c=e.e=null:(e.c=[0],e.e=0)),e;for(f=Y(O.e/v)+Y(e.e/v),e.s*=O.s,l=I.length,m=G.length,l<m&&(k=I,I=G,G=k,s=l,l=m,m=s),s=l+m,k=[];s--;k.push(0));for(C=Q,L=oe,s=m;--s>=0;){for(n=0,N=G[s]%L,E=G[s]/L|0,g=l,c=s+g;c>s;)p=I[--g]%L,u=I[g]/L|0,i=E*p+u*N,p=N*p+i%L*L+k[c]+n,n=(p/C|0)+(i/L|0)+E*u,k[c--]=p%C;k[c]=n}return n?++f:k.splice(0,1),Ce(e,k,f)},o.negated=function(){var e=new y(this);return e.s=-e.s||null,e},o.plus=function(e,t){var n,f=this,s=f.s;if(e=new y(e,t),t=e.s,!s||!t)return new y(NaN);if(s!=t)return e.s=-t,f.minus(e);var c=f.e/v,g=e.e/v,i=f.c,l=e.c;if(!c||!g){if(!i||!l)return new y(s/0);if(!i[0]||!l[0])return l[0]?e:new y(i[0]?f:s*0)}if(c=Y(c),g=Y(g),i=i.slice(),s=c-g){for(s>0?(g=c,n=l):(s=-s,n=i),n.reverse();s--;n.push(0));n.reverse()}for(s=i.length,t=l.length,s-t<0&&(n=l,l=i,i=n,t=s),s=0;t;)s=(i[--t]=i[t]+l[t]+s)/Q|0,i[t]=Q===i[t]?0:i[t]%Q;return s&&(i=[s].concat(i),++g),Ce(e,i,g)},o.precision=o.sd=function(e,t){var n,f,s,c=this;if(e!=null&&e!==!!e)return F(e,1,q),t==null?t=P:F(t,0,8),V(new y(c),e,t);if(!(n=c.c))return null;if(s=n.length-1,f=s*v+1,s=n[s]){for(;s%10==0;s/=10,f--);for(s=n[0];s>=10;s/=10,f++);}return e&&c.e+1>f&&(f=c.e+1),f},o.shiftedBy=function(e){return F(e,-Ge,Ge),this.times("1e"+e)},o.squareRoot=o.sqrt=function(){var e,t,n,f,s,c=this,g=c.c,i=c.s,l=c.e,p=w+4,u=new y("0.5");if(i!==1||!g||!g[0])return new y(!i||i<0&&(!g||g[0])?NaN:g?c:1/0);if(i=Math.sqrt(+te(c)),i==0||i==1/0?(t=$(g),(t.length+l)%2==0&&(t+="0"),i=Math.sqrt(+t),l=Y((l+1)/2)-(l<0||l%2),i==1/0?t="5e"+l:(t=i.toExponential(),t=t.slice(0,t.indexOf("e")+1)+l),n=new y(t)):n=new y(i+""),n.c[0]){for(l=n.e,i=l+p,i<3&&(i=0);;)if(s=n,n=u.times(s.plus(r(c,s,p,1))),$(s.c).slice(0,i)===(t=$(n.c)).slice(0,i))if(n.e<l&&--i,t=t.slice(i-3,i+1),t=="9999"||!f&&t=="4999"){if(!f&&(V(s,s.e+w+2,0),s.times(s).eq(c))){n=s;break}p+=4,i+=4,f=1}else{(!+t||!+t.slice(1)&&t.charAt(0)=="5")&&(V(n,n.e+w+2,1),e=!n.times(n).eq(c));break}}return V(n,n.e+w+1,P,e)},o.toExponential=function(e,t){return e!=null&&(F(e,0,q),e++),Fe(this,e,t,1)},o.toFixed=function(e,t){return e!=null&&(F(e,0,q),e=e+this.e+1),Fe(this,e,t)},o.toFormat=function(e,t,n){var f,s=this;if(n==null)e!=null&&t&&typeof t=="object"?(n=t,t=null):e&&typeof e=="object"?(n=e,e=t=null):n=Te;else if(typeof n!="object")throw Error(z+"Argument not an object: "+n);if(f=s.toFixed(e,t),s.c){var c,g=f.split("."),i=+n.groupSize,l=+n.secondaryGroupSize,p=n.groupSeparator||"",u=g[0],m=g[1],N=s.s<0,E=N?u.slice(1):u,k=E.length;if(l&&(c=i,i=l,l=c,k-=c),i>0&&k>0){for(c=k%i||i,u=E.substr(0,c);c<k;c+=i)u+=p+E.substr(c,i);l>0&&(u+=p+E.slice(c)),N&&(u="-"+u)}f=m?u+(n.decimalSeparator||"")+((l=+n.fractionGroupSize)?m.replace(new RegExp("\\d{"+l+"}\\B","g"),"$&"+(n.fractionGroupSeparator||"")):m):u}return(n.prefix||"")+f+(n.suffix||"")},o.toFraction=function(e){var t,n,f,s,c,g,i,l,p,u,m,N,E=this,k=E.c;if(e!=null&&(i=new y(e),!i.isInteger()&&(i.c||i.s!==1)||i.lt(h)))throw Error(z+"Argument "+(i.isInteger()?"out of range: ":"not an integer: ")+te(i));if(!k)return new y(E);for(t=new y(h),p=n=new y(h),f=l=new y(h),N=$(k),c=t.e=N.length-E.e-1,t.c[0]=Ue[(g=c%v)<0?v+g:g],e=!e||i.comparedTo(t)>0?c>0?t:p:i,g=x,x=1/0,i=new y(N),l.c[0]=0;u=r(i,t,0,1),s=n.plus(u.times(f)),s.comparedTo(e)!=1;)n=f,f=s,p=l.plus(u.times(s=p)),l=s,t=i.minus(u.times(s=t)),i=s;return s=r(e.minus(n),f,0,1),l=l.plus(s.times(p)),n=n.plus(s.times(f)),l.s=p.s=E.s,c=c*2,m=r(p,f,c,P).minus(E).abs().comparedTo(r(l,n,c,P).minus(E).abs())<1?[p,f]:[l,n],x=g,m},o.toNumber=function(){return+te(this)},o.toPrecision=function(e,t){return e!=null&&F(e,1,q),Fe(this,e,t,2)},o.toString=function(e){var t,n=this,f=n.s,s=n.e;return s===null?f?(t="Infinity",f<0&&(t="-"+t)):t="NaN":(e==null?t=s<=A||s>=S?Ee($(n.c),s):ne($(n.c),s,"0"):e===10&&Me?(n=V(new y(n),w+s+1,P),t=ne($(n.c),n.e,"0")):(F(e,2,se.length,"Base"),t=a(ne($(n.c),s,"0"),10,e,f,!0)),f<0&&n.c[0]&&(t="-"+t)),t},o.valueOf=o.toJSON=function(){return te(this)},o._isBigNumber=!0,o[Symbol.toStringTag]="BigNumber",o[Symbol.for("nodejs.util.inspect.custom")]=o.valueOf,d!=null&&y.set(d),y}function Y(d){var r=d|0;return d>0||d===r?r:r-1}function $(d){for(var r,a,_=1,o=d.length,h=d[0]+"";_<o;){for(r=d[_++]+"",a=v-r.length;a--;r="0"+r);h+=r}for(o=h.length;h.charCodeAt(--o)===48;);return h.slice(0,o+1||1)}function ae(d,r){var a,_,o=d.c,h=r.c,w=d.s,P=r.s,A=d.e,S=r.e;if(!w||!P)return null;if(a=o&&!o[0],_=h&&!h[0],a||_)return a?_?0:-P:w;if(w!=P)return w;if(a=w<0,_=A==S,!o||!h)return _?0:!o^a?1:-1;if(!_)return A>S^a?1:-1;for(P=(A=o.length)<(S=h.length)?A:S,w=0;w<P;w++)if(o[w]!=h[w])return o[w]>h[w]^a?1:-1;return A==S?0:A>S^a?1:-1}function F(d,r,a,_){if(d<r||d>a||d!==Z(d))throw Error(z+(_||"Argument")+(typeof d=="number"?d<r||d>a?" out of range: ":" not an integer: ":" not a primitive number: ")+String(d))}function Ne(d){var r=d.c.length-1;return Y(d.e/v)==r&&d.c[r]%2!=0}function Ee(d,r){return(d.length>1?d.charAt(0)+"."+d.slice(1):d)+(r<0?"e":"e+")+r}function ne(d,r,a){var _,o;if(r<0){for(o=a+".";++r;o+=a);d=o+d}else if(_=d.length,++r>_){for(o=a,r-=_;--r;o+=a);d+=o}else r<_&&(d=d.slice(0,r)+"."+d.slice(r));return d}var ce=We();var Se=12;ce.config({EXPONENTIAL_AT:[-100,100],ROUNDING_MODE:1,DECIMAL_PLACES:Se});var st=X(0),lt=X(1),at=X("Infinity");function ue(d,r){let a=new ce(r.toString()),_=new ce(10).pow(a);return d.times(_)}function X(d){return new ce(d.toString())}var fe=rt(Ye());function mt(d,r,a){return(0,fe.get_spot_price)(d,r,a)}function wt(d,r,a){return(0,fe.calculate_in_given_out)(d,r,a)}function Pt(d,r,a){return(0,fe.calculate_out_given_in)(d,r,a)}var me={getSpotPrice:mt,calculateInGivenOut:wt,calculateOutGivenIn:Pt};function He(d){return X(parseFloat(d)/100)}function ke(d,r){return d.multipliedBy(r).decimalPlaces(0,1)}function Ie(d,r){if(r==Se)return d;let a=d.shiftedBy(-1*r);return ue(a,12)}var re=class{static fromPool(r){return new re(r.address,r.swapFee,r.tokens)}constructor(r,a,_){this.type="XYK",this.address=r,this.swapFee=a,this.tokens=_}validPair(r,a){return!0}parsePoolPair(r,a){let _=new Map(this.tokens.map(A=>[A.id,A])),o=_.get(r),h=_.get(a);if(o==null)throw new Error("Pool does not contain tokenIn");if(h==null)throw new Error("Pool does not contain tokenOut");let w=X(o.balance),P=X(h.balance);return{swapFee:He(this.swapFee),tokenIn:r,tokenOut:a,balanceIn:Ie(w,o.decimals),balanceOut:Ie(P,h.decimals)}}calculateInGivenOut(r,a){let _=me.calculateInGivenOut(r.balanceIn.toString(),r.balanceOut.toString(),a.toString());return X(_)}getSpotPriceIn(r){let a=me.getSpotPrice(r.balanceOut.toString(),r.balanceIn.toString(),ue(X(1),12).toString());return X(a)}calculateOutGivenIn(r,a){let _=me.calculateOutGivenIn(r.balanceIn.toString(),r.balanceOut.toString(),a.toString());return X(_)}getSpotPriceOut(r){let a=me.getSpotPrice(r.balanceIn.toString(),r.balanceOut.toString(),ue(X(1),12).toString());return X(a)}};var le=class{static get(r){switch(r.type){case"XYK":return re.fromPool(r);default:throw new Error("Pool type "+r.type+" is not supported yet")}}};var we=class{constructor(r){this.poolService=r,this.routeSuggester=new _e}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:_,poolsMap:o}=await this.validateToken(r,a),w=this.getPaths(r,null,o,a).map(P=>P[P.length-1].tokenOut);return this.toPoolAssets([...new Set(w)],_)}async getAllPaths(r,a){let _=await this.poolService.getPools();if(_.length===0)return[];let{poolsMap:o}=await this.validateTokenPair(r,a,_);return this.getPaths(r,a,o,_)}async getBestSellPrice(r,a,_){let o=await this.poolService.getPools();if(o.length===0)return[];let{poolsMap:h}=await this.validateTokenPair(r,a,o);return this.getPaths(r,a,h,o).map(S=>this.toSellSwaps(_,S,h)).sort((S,B)=>{let x=S[S.length-1].returnFinalAmount,R=B[B.length-1].returnFinalAmount;return x.isGreaterThan(R)?-1:1})[0]}toSellSwaps(r,a,_){let o=[];for(let h=0;h<a.length;h++){let w=a[h],P=_.get(w.poolId);if(P==null)throw new Error("Pool does not exit");let A;h>0?A=o[h-1].returnFinalAmount:A=r;let S=P.parsePoolPair(w.tokenIn,w.tokenOut),B=P.calculateOutGivenIn(S,A),x=ke(B,S.swapFee),R=P.getSpotPriceOut(S);o.push({...w,swapAmount:A,returnAmount:B,returnFinalAmount:B.minus(x),swapFee:x,spotPrice:R})}return o}async getBestBuyPrice(r,a,_){let o=await this.poolService.getPools();if(o.length===0)return[];let{poolsMap:h}=await this.validateTokenPair(r,a,o);return this.getPaths(r,a,h,o).map(S=>this.toBuySwaps(_,S,h)).sort((S,B)=>{let x=S[0].returnFinalAmount,R=B[0].returnFinalAmount;return x.isGreaterThan(R)?1:-1})[0]}toBuySwaps(r,a,_){let o=[];for(let h=a.length-1;h>=0;h--){let w=a[h],P=_.get(w.poolId);if(P==null)throw new Error("Pool does not exit");let A;h==a.length-1?A=r:A=o[0].returnFinalAmount;let S=P.parsePoolPair(w.tokenIn,w.tokenOut),B=P.calculateInGivenOut(S,A),x=ke(B,S.swapFee),R=P.getSpotPriceIn(S);o.unshift({...w,swapAmount:A,returnAmount:B,returnFinalAmount:B.plus(x),swapFee:x,spotPrice:R})}return o}async getAssets(){let r=await this.poolService.getPools();if(r.length===0)return new Map;let a=r.map(_=>_.tokens.map(({id:o,symbol:h})=>({token:o,symbol:h}))).flat();return new Map(a.map(_=>[_.token,_]))}getPaths(r,a,_,o){return this.routeSuggester.getProposals(r,a,o).filter(P=>this.validPath(P,_)).map(P=>this.toHops(P,_))}async validateTokenPair(r,a,_){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 h=this.getPoolMap(_);return{assets:o,poolsMap:h}}async validateToken(r,a){let _=await this.getAssets();if(_.get(r)==null)throw new Error(r+" is not supported token");let o=this.getPoolMap(a);return{assets:_,poolsMap:o}}getPoolMap(r){return new Map(r.map(a=>[a.address,le.get(a)]))}validPath(r,a){return r.length>0&&r.map(_=>this.validEdge(_,a)).reduce((_,o)=>_&&o)}validEdge([r,a,_],o){return o.get(r)?.validPair(a,_)||!1}toHops(r,a){return r.map(([_,o,h])=>{let w=a.get(_);return{poolId:_,poolType:w?.type,tokenIn:o,tokenOut:h,fee:w?.swapFee}})}toPoolAssets(r,a){return r.map(_=>{let o=a.get(_);return{token:_,symbol:o?.symbol}})}};0&&(module.exports={BigNumber,DECIMAL_PLACES,INFINITY,ONE,PolkadotPoolService,PoolFactory,Router,XykPool,ZERO,bnum,calculateTradeFee,normalizeAmount,scale,tradeFee});
2
- //# sourceMappingURL=index.js.map