@galacticcouncil/sdk 0.0.1-beta.1

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 (81) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc.json +20 -0
  3. package/.nvmrc +1 -0
  4. package/.prettierrc.json +12 -0
  5. package/.vscode/settings.json +15 -0
  6. package/README.md +101 -0
  7. package/dist/cjs/hydra_dx_wasm_bg-ZX7K4FM7.wasm +0 -0
  8. package/dist/cjs/index.js +2 -0
  9. package/dist/cjs/index.js.map +7 -0
  10. package/dist/esm/hydra_dx_wasm_bg-ZX7K4FM7.wasm +0 -0
  11. package/dist/esm/index.js +2 -0
  12. package/dist/esm/index.js.map +7 -0
  13. package/dist/types/api/index.d.ts +1 -0
  14. package/dist/types/api/router.d.ts +129 -0
  15. package/dist/types/api/trader.d.ts +0 -0
  16. package/dist/types/client/capi.d.ts +0 -0
  17. package/dist/types/client/index.d.ts +1 -0
  18. package/dist/types/client/polkadot.d.ts +14 -0
  19. package/dist/types/client/types.d.ts +7 -0
  20. package/dist/types/index.d.ts +4 -0
  21. package/dist/types/pool/index.d.ts +3 -0
  22. package/dist/types/pool/polkadotPoolService.d.ts +7 -0
  23. package/dist/types/pool/poolFactory.d.ts +4 -0
  24. package/dist/types/pool/xyk/math/bundler.d.ts +9 -0
  25. package/dist/types/pool/xyk/math/nodejs.d.ts +9 -0
  26. package/dist/types/pool/xyk/xykPolkadotClient.d.ts +8 -0
  27. package/dist/types/pool/xyk/xykPool.d.ts +16 -0
  28. package/dist/types/suggester/bfs.d.ts +37 -0
  29. package/dist/types/suggester/graph.d.ts +12 -0
  30. package/dist/types/suggester/index.d.ts +3 -0
  31. package/dist/types/suggester/suggester.d.ts +24 -0
  32. package/dist/types/types.d.ts +55 -0
  33. package/dist/types/utils/bignumber.d.ts +8 -0
  34. package/dist/types/utils/math.d.ts +4 -0
  35. package/dist/types/utils/queue.d.ts +13 -0
  36. package/dist/types/utils/stack.d.ts +15 -0
  37. package/dist/types/utils/traversal/bfs.d.ts +27 -0
  38. package/esbuild.mjs +36 -0
  39. package/jest.config.mjs +16 -0
  40. package/package.json +35 -0
  41. package/src/api/index.ts +1 -0
  42. package/src/api/router.ts +359 -0
  43. package/src/api/trader.ts +0 -0
  44. package/src/client/capi.ts +0 -0
  45. package/src/client/index.ts +1 -0
  46. package/src/client/polkadot.ts +47 -0
  47. package/src/client/types.ts +8 -0
  48. package/src/index.ts +4 -0
  49. package/src/pool/index.ts +3 -0
  50. package/src/pool/polkadotPoolService.ts +19 -0
  51. package/src/pool/poolFactory.ts +14 -0
  52. package/src/pool/xyk/math/bundler.ts +19 -0
  53. package/src/pool/xyk/math/nodejs.ts +19 -0
  54. package/src/pool/xyk/xykPolkadotClient.ts +58 -0
  55. package/src/pool/xyk/xykPool.ts +82 -0
  56. package/src/suggester/bfs.ts +106 -0
  57. package/src/suggester/graph.ts +31 -0
  58. package/src/suggester/index.ts +3 -0
  59. package/src/suggester/suggester.ts +66 -0
  60. package/src/types.ts +61 -0
  61. package/src/utils/bignumber.ts +25 -0
  62. package/src/utils/math.ts +24 -0
  63. package/src/utils/queue.ts +26 -0
  64. package/src/utils/stack.ts +31 -0
  65. package/src/utils/traversal/bfs.ts +74 -0
  66. package/test/api/router.spec.ts +87 -0
  67. package/test/data/xykPool.ts +21 -0
  68. package/test/data/xykPools.ts +61 -0
  69. package/test/lib/mockXykPoolService.ts +8 -0
  70. package/test/pool/xyk/xykPool.spec.ts +26 -0
  71. package/test/script/examples/router/getAllAssets.ts +14 -0
  72. package/test/script/examples/router/getAllPaths.ts +14 -0
  73. package/test/script/examples/router/getAssetPairs.ts +14 -0
  74. package/test/script/examples/router/getBestBuyPrice.ts +19 -0
  75. package/test/script/examples/router/getBestSellPrice.ts +19 -0
  76. package/test/script/executor.ts +45 -0
  77. package/test/suggester/bfs.spec.ts +34 -0
  78. package/test/suggester/graph.spec.ts +30 -0
  79. package/test/suggester/suggester.spec.ts +25 -0
  80. package/test/utils/traversal/bfs.spec.ts +28 -0
  81. package/tsconfig.json +14 -0
package/.eslintignore ADDED
@@ -0,0 +1 @@
1
+ node_modules/
package/.eslintrc.json ADDED
@@ -0,0 +1,20 @@
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 ADDED
@@ -0,0 +1 @@
1
+ 18
@@ -0,0 +1,12 @@
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
+ }
@@ -0,0 +1,15 @@
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/README.md ADDED
@@ -0,0 +1,101 @@
1
+ <h1><code>Galactic SDK</code></h1>
2
+ Galactic SDK is collection of components crafted to ease Basilisk & HydraDX chains integration.
3
+ <br />
4
+ <br />
5
+ Table of content:
6
+
7
+ - [Components](#components)
8
+ - [Router](#router)
9
+ - [Trader](#trader)
10
+ - [Examples](#examples)
11
+ - [Packaging](#packaging)
12
+ - [Roadmap](#roadmap)
13
+ - [Issue reporting](#issue-reporting)
14
+
15
+ ## Components
16
+
17
+ ### Router
18
+
19
+ Off-chain optimization of orders across pools for best price execution. Router does not perform any on-chain transations.
20
+
21
+ #### API
22
+
23
+ ```typescript
24
+ getPools(): PoolBase[]
25
+ getAllAssets(): PoolAsset[]
26
+ getAssetPairs(token: string): PoolAsset[]
27
+ getAllPaths(tokenIn: string, tokenOut: string): Hop[][]
28
+ getBestSellPrice(tokenIn: string, tokenOut: string, amountIn: BigNumber): Swap[]
29
+ getBestBuyPrice(tokenIn: string, tokenOut: string, amountOut: BigNumber): Swap[]
30
+ ```
31
+
32
+ For type signature visit [types.ts](src/types.ts)<br />
33
+ **Note:** All amount args are formatted as bignumber 1^12!!!
34
+
35
+ #### Usage
36
+
37
+ ```typescript
38
+ // Import
39
+ import { ApiPromise, WsProvider } from '@polkadot/api';
40
+ import { PolkadotPoolService } from '@galactic/pool';
41
+ import { Router } from '@galactic/api';
42
+
43
+ // Initialize Polkadot API
44
+ const wsProvider = new WsProvider('wss://rpc.basilisk.cloud');
45
+ const api = await ApiPromise.create({ provider: wsProvider });
46
+
47
+ // Initialize Router
48
+ const poolService = new PolkadotPoolService(api);
49
+ const router = new Router(poolService);
50
+
51
+ // Do something
52
+ const result = await router.getAllAssets();
53
+ console.log(result);
54
+ ```
55
+
56
+ ### Trader
57
+
58
+ On-chain transaction executor using data from router to perform best possible trade.
59
+
60
+ Not supported yet. 🛠
61
+
62
+ ## Examples
63
+
64
+ SDK Examples and testing helpers.
65
+
66
+ ### Run
67
+
68
+ Run: `$ npx tsx ./test/script/examples/${{examplePackage}}/${{exampleName}}.ts` with valid example package & name.
69
+
70
+ To demonstrate full working examples on real chain see [script](test/script/examples) section.
71
+
72
+ ## Packaging
73
+
74
+ - api - Router & Trader impl
75
+ - client - Substrate chain based clients
76
+ - pool - Pool specific logic, math, clients
77
+ - suggester - Route proposing, graph utils, BFS, DFS
78
+ - utils - bignumber, math, collections
79
+
80
+ ## Roadmap
81
+
82
+ Component list and current status ⬇️
83
+
84
+ - 🧪 Done
85
+ - 🛠 Work in progress
86
+ - ⏳ Planning to build
87
+
88
+ | Name | Type | |
89
+ | -------- | :----: | --: |
90
+ | Router | API | 🧪 |
91
+ | Trader | API | 🛠 |
92
+ | Polkadot | Client | 🧪 |
93
+ | Capi | Client | ⏳ |
94
+ | XYK | Pool | 🧪 |
95
+ | LBP | Pool | ⏳ |
96
+ | Stable | Pool | ⏳ |
97
+ | Omni | Pool | ⏳ |
98
+
99
+ ## Issue reporting
100
+
101
+ In case of unexpected sdk behaviour, please create well-written issue [here](https://https://github.com/nohaapav/router-sdk/issues/new). It makes it easier to find & fix the problem accordingly.
@@ -0,0 +1,2 @@
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