@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.
- package/.eslintignore +1 -0
- package/.eslintrc.json +20 -0
- package/.nvmrc +1 -0
- package/.prettierrc.json +12 -0
- package/.vscode/settings.json +15 -0
- package/README.md +101 -0
- package/dist/cjs/hydra_dx_wasm_bg-ZX7K4FM7.wasm +0 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/esm/hydra_dx_wasm_bg-ZX7K4FM7.wasm +0 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/types/api/index.d.ts +1 -0
- package/dist/types/api/router.d.ts +129 -0
- package/dist/types/api/trader.d.ts +0 -0
- package/dist/types/client/capi.d.ts +0 -0
- package/dist/types/client/index.d.ts +1 -0
- package/dist/types/client/polkadot.d.ts +14 -0
- package/dist/types/client/types.d.ts +7 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/pool/index.d.ts +3 -0
- package/dist/types/pool/polkadotPoolService.d.ts +7 -0
- package/dist/types/pool/poolFactory.d.ts +4 -0
- package/dist/types/pool/xyk/math/bundler.d.ts +9 -0
- package/dist/types/pool/xyk/math/nodejs.d.ts +9 -0
- package/dist/types/pool/xyk/xykPolkadotClient.d.ts +8 -0
- package/dist/types/pool/xyk/xykPool.d.ts +16 -0
- package/dist/types/suggester/bfs.d.ts +37 -0
- package/dist/types/suggester/graph.d.ts +12 -0
- package/dist/types/suggester/index.d.ts +3 -0
- package/dist/types/suggester/suggester.d.ts +24 -0
- package/dist/types/types.d.ts +55 -0
- package/dist/types/utils/bignumber.d.ts +8 -0
- package/dist/types/utils/math.d.ts +4 -0
- package/dist/types/utils/queue.d.ts +13 -0
- package/dist/types/utils/stack.d.ts +15 -0
- package/dist/types/utils/traversal/bfs.d.ts +27 -0
- package/esbuild.mjs +36 -0
- package/jest.config.mjs +16 -0
- package/package.json +35 -0
- package/src/api/index.ts +1 -0
- package/src/api/router.ts +359 -0
- package/src/api/trader.ts +0 -0
- package/src/client/capi.ts +0 -0
- package/src/client/index.ts +1 -0
- package/src/client/polkadot.ts +47 -0
- package/src/client/types.ts +8 -0
- package/src/index.ts +4 -0
- package/src/pool/index.ts +3 -0
- package/src/pool/polkadotPoolService.ts +19 -0
- package/src/pool/poolFactory.ts +14 -0
- package/src/pool/xyk/math/bundler.ts +19 -0
- package/src/pool/xyk/math/nodejs.ts +19 -0
- package/src/pool/xyk/xykPolkadotClient.ts +58 -0
- package/src/pool/xyk/xykPool.ts +82 -0
- package/src/suggester/bfs.ts +106 -0
- package/src/suggester/graph.ts +31 -0
- package/src/suggester/index.ts +3 -0
- package/src/suggester/suggester.ts +66 -0
- package/src/types.ts +61 -0
- package/src/utils/bignumber.ts +25 -0
- package/src/utils/math.ts +24 -0
- package/src/utils/queue.ts +26 -0
- package/src/utils/stack.ts +31 -0
- package/src/utils/traversal/bfs.ts +74 -0
- package/test/api/router.spec.ts +87 -0
- package/test/data/xykPool.ts +21 -0
- package/test/data/xykPools.ts +61 -0
- package/test/lib/mockXykPoolService.ts +8 -0
- package/test/pool/xyk/xykPool.spec.ts +26 -0
- package/test/script/examples/router/getAllAssets.ts +14 -0
- package/test/script/examples/router/getAllPaths.ts +14 -0
- package/test/script/examples/router/getAssetPairs.ts +14 -0
- package/test/script/examples/router/getBestBuyPrice.ts +19 -0
- package/test/script/examples/router/getBestSellPrice.ts +19 -0
- package/test/script/executor.ts +45 -0
- package/test/suggester/bfs.spec.ts +34 -0
- package/test/suggester/graph.spec.ts +30 -0
- package/test/suggester/suggester.spec.ts +25 -0
- package/test/utils/traversal/bfs.spec.ts +28 -0
- 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
|
package/.prettierrc.json
ADDED
|
@@ -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.
|
|
Binary file
|
|
@@ -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
|