@pioneer-platform/helpers 0.0.0 → 0.0.2
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/lib/helpers/asset.d.ts +36 -0
- package/lib/helpers/asset.js +270 -0
- package/lib/helpers/liquidity.d.ts +58 -0
- package/lib/helpers/liquidity.js +112 -0
- package/lib/helpers/memo.d.ts +46 -0
- package/lib/helpers/memo.js +46 -0
- package/lib/helpers/others.d.ts +3 -0
- package/lib/helpers/others.js +24 -0
- package/lib/helpers/request.d.ts +5 -0
- package/lib/helpers/request.js +74 -0
- package/lib/helpers/validators.d.ts +1 -0
- package/lib/helpers/validators.js +17 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.js +31 -0
- package/lib/modules/__tests__/assetValue.test.d.ts +1 -0
- package/lib/modules/__tests__/assetValue.test.js +399 -0
- package/lib/modules/__tests__/swapKitNumber.test.d.ts +1 -0
- package/lib/modules/__tests__/swapKitNumber.test.js +425 -0
- package/lib/modules/assetValue.d.ts +55 -0
- package/lib/modules/assetValue.js +389 -0
- package/lib/modules/bigIntArithmetics.d.ts +58 -0
- package/lib/modules/bigIntArithmetics.js +344 -0
- package/lib/modules/swapKitError.d.ts +64 -0
- package/lib/modules/swapKitError.js +90 -0
- package/lib/modules/swapKitNumber.d.ts +6 -0
- package/lib/modules/swapKitNumber.js +36 -0
- package/package.json +22 -35
- package/src/helpers/asset.ts +232 -0
- package/src/helpers/liquidity.ts +174 -0
- package/src/helpers/memo.ts +90 -0
- package/src/helpers/others.ts +20 -0
- package/src/helpers/request.ts +33 -0
- package/src/helpers/validators.ts +17 -0
- package/src/index.ts +16 -6
- package/src/modules/assetValue.ts +358 -0
- package/src/modules/bigIntArithmetics.ts +416 -0
- package/src/{exceptions/SwapKitError.ts → modules/swapKitError.ts} +15 -4
- package/src/modules/swapKitNumber.ts +16 -0
- package/tsconfig.json +13 -0
- package/LICENSE +0 -21
- package/src/__tests__/asset.test.ts +0 -33
- package/src/__tests__/derivationPath.test.ts +0 -16
- package/src/amount.ts +0 -29
- package/src/asset.ts +0 -13
- package/src/derivationPath.ts +0 -5
- package/src/exceptions/index.ts +0 -1
- package/src/fees.ts +0 -13
- package/src/request.ts +0 -34
@@ -0,0 +1,36 @@
|
|
1
|
+
import { Chain, FeeOption } from '@coinmasters/types';
|
2
|
+
export type CommonAssetString = 'MAYA.MAYA' | 'ETH.THOR' | 'ETH.vTHOR' | Chain;
|
3
|
+
export declare const getDecimal: ({ chain, symbol }: {
|
4
|
+
chain: Chain;
|
5
|
+
symbol: string;
|
6
|
+
}) => Promise<any>;
|
7
|
+
export declare const gasFeeMultiplier: Record<FeeOption, number>;
|
8
|
+
export declare const isGasAsset: ({ chain, symbol }: {
|
9
|
+
chain: Chain;
|
10
|
+
symbol: string;
|
11
|
+
}) => boolean | undefined;
|
12
|
+
export declare const getCommonAssetInfo: (assetString: CommonAssetString) => {
|
13
|
+
identifier: string;
|
14
|
+
decimal: number;
|
15
|
+
};
|
16
|
+
export declare const getAssetType: ({ chain, symbol }: {
|
17
|
+
chain: Chain;
|
18
|
+
symbol: string;
|
19
|
+
}) => Chain.Avalanche | Chain.Cosmos | Chain.Kujira | "Synth" | "Native" | "BEP2" | "BEP20" | "ERC20" | "POLYGON" | "ARBITRUM" | "OPTIMISM" | undefined;
|
20
|
+
export declare const assetFromString: (assetString: string) => {
|
21
|
+
chain: Chain;
|
22
|
+
symbol: string;
|
23
|
+
ticker: string;
|
24
|
+
synth: boolean;
|
25
|
+
};
|
26
|
+
export declare const filterAssets: (tokens: {
|
27
|
+
value: string;
|
28
|
+
decimal: number;
|
29
|
+
chain: Chain;
|
30
|
+
symbol: string;
|
31
|
+
}[]) => {
|
32
|
+
value: string;
|
33
|
+
decimal: number;
|
34
|
+
chain: Chain;
|
35
|
+
symbol: string;
|
36
|
+
}[];
|
@@ -0,0 +1,270 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
+
});
|
10
|
+
};
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
15
|
+
function step(op) {
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
20
|
+
switch (op[0]) {
|
21
|
+
case 0: case 1: t = op; break;
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
25
|
+
default:
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
30
|
+
if (t[2]) _.ops.pop();
|
31
|
+
_.trys.pop(); continue;
|
32
|
+
}
|
33
|
+
op = body.call(thisArg, _);
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
36
|
+
}
|
37
|
+
};
|
38
|
+
var _a;
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
40
|
+
exports.filterAssets = exports.assetFromString = exports.getAssetType = exports.getCommonAssetInfo = exports.isGasAsset = exports.gasFeeMultiplier = exports.getDecimal = void 0;
|
41
|
+
var types_1 = require("@coinmasters/types");
|
42
|
+
var index_1 = require("../index");
|
43
|
+
var getDecimalMethodHex = '0x313ce567';
|
44
|
+
var getContractDecimals = function (_a) {
|
45
|
+
var chain = _a.chain, to = _a.to;
|
46
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
47
|
+
var result, error_1;
|
48
|
+
return __generator(this, function (_b) {
|
49
|
+
switch (_b.label) {
|
50
|
+
case 0:
|
51
|
+
_b.trys.push([0, 2, , 3]);
|
52
|
+
return [4 /*yield*/, index_1.RequestClient.post(types_1.ChainToRPC[chain], {
|
53
|
+
headers: {
|
54
|
+
accept: '*/*',
|
55
|
+
'content-type': 'application/json',
|
56
|
+
'cache-control': 'no-cache',
|
57
|
+
},
|
58
|
+
body: JSON.stringify({
|
59
|
+
id: 44,
|
60
|
+
jsonrpc: '2.0',
|
61
|
+
method: 'eth_call',
|
62
|
+
params: [{ to: to.toLowerCase(), data: getDecimalMethodHex }, 'latest'],
|
63
|
+
}),
|
64
|
+
})];
|
65
|
+
case 1:
|
66
|
+
result = (_b.sent()).result;
|
67
|
+
return [2 /*return*/, parseInt(BigInt(result).toString())];
|
68
|
+
case 2:
|
69
|
+
error_1 = _b.sent();
|
70
|
+
console.error(error_1);
|
71
|
+
// @ts-ignore
|
72
|
+
return [2 /*return*/, types_1.BaseDecimal[chain]];
|
73
|
+
case 3: return [2 /*return*/];
|
74
|
+
}
|
75
|
+
});
|
76
|
+
});
|
77
|
+
};
|
78
|
+
var getETHAssetDecimal = function (symbol) { return __awaiter(void 0, void 0, void 0, function () {
|
79
|
+
var _a, address;
|
80
|
+
return __generator(this, function (_b) {
|
81
|
+
if (symbol === types_1.Chain.Ethereum)
|
82
|
+
return [2 /*return*/, types_1.BaseDecimal.ETH];
|
83
|
+
_a = symbol.split('-'), address = _a[1];
|
84
|
+
return [2 /*return*/, (address === null || address === void 0 ? void 0 : address.startsWith('0x'))
|
85
|
+
? getContractDecimals({ chain: types_1.Chain.Ethereum, to: address })
|
86
|
+
: types_1.BaseDecimal.ETH];
|
87
|
+
});
|
88
|
+
}); };
|
89
|
+
var getAVAXAssetDecimal = function (symbol) { return __awaiter(void 0, void 0, void 0, function () {
|
90
|
+
var _a, address;
|
91
|
+
return __generator(this, function (_b) {
|
92
|
+
_a = symbol.split('-'), address = _a[1];
|
93
|
+
return [2 /*return*/, (address === null || address === void 0 ? void 0 : address.startsWith('0x'))
|
94
|
+
? getContractDecimals({ chain: types_1.Chain.Avalanche, to: address.toLowerCase() })
|
95
|
+
: types_1.BaseDecimal.AVAX];
|
96
|
+
});
|
97
|
+
}); };
|
98
|
+
var getBSCAssetDecimal = function (symbol) { return __awaiter(void 0, void 0, void 0, function () {
|
99
|
+
return __generator(this, function (_a) {
|
100
|
+
if (symbol === types_1.Chain.BinanceSmartChain)
|
101
|
+
return [2 /*return*/, types_1.BaseDecimal.BSC];
|
102
|
+
return [2 /*return*/, types_1.BaseDecimal.BSC];
|
103
|
+
});
|
104
|
+
}); };
|
105
|
+
var getDecimal = function (_a) {
|
106
|
+
var chain = _a.chain, symbol = _a.symbol;
|
107
|
+
return __awaiter(void 0, void 0, void 0, function () {
|
108
|
+
return __generator(this, function (_b) {
|
109
|
+
switch (chain) {
|
110
|
+
case types_1.Chain.Ethereum:
|
111
|
+
return [2 /*return*/, getETHAssetDecimal(symbol)];
|
112
|
+
case types_1.Chain.Avalanche:
|
113
|
+
return [2 /*return*/, getAVAXAssetDecimal(symbol)];
|
114
|
+
case types_1.Chain.BinanceSmartChain:
|
115
|
+
return [2 /*return*/, getBSCAssetDecimal(symbol)];
|
116
|
+
default:
|
117
|
+
// @ts-ignore
|
118
|
+
return [2 /*return*/, types_1.BaseDecimal[chain]];
|
119
|
+
}
|
120
|
+
return [2 /*return*/];
|
121
|
+
});
|
122
|
+
});
|
123
|
+
};
|
124
|
+
exports.getDecimal = getDecimal;
|
125
|
+
exports.gasFeeMultiplier = (_a = {},
|
126
|
+
_a[types_1.FeeOption.Average] = 1.2,
|
127
|
+
_a[types_1.FeeOption.Fast] = 1.5,
|
128
|
+
_a[types_1.FeeOption.Fastest] = 2,
|
129
|
+
_a);
|
130
|
+
var isGasAsset = function (_a) {
|
131
|
+
var chain = _a.chain, symbol = _a.symbol;
|
132
|
+
switch (chain) {
|
133
|
+
case types_1.Chain.Bitcoin:
|
134
|
+
case types_1.Chain.BitcoinCash:
|
135
|
+
case types_1.Chain.Dash:
|
136
|
+
case types_1.Chain.Digibyte:
|
137
|
+
case types_1.Chain.Zcash:
|
138
|
+
case types_1.Chain.Ripple:
|
139
|
+
case types_1.Chain.Litecoin:
|
140
|
+
case types_1.Chain.Dogecoin:
|
141
|
+
case types_1.Chain.Binance:
|
142
|
+
case types_1.Chain.Ethereum:
|
143
|
+
case types_1.Chain.Avalanche:
|
144
|
+
return symbol === chain;
|
145
|
+
case types_1.Chain.Arbitrum:
|
146
|
+
case types_1.Chain.Optimism:
|
147
|
+
case types_1.Chain.Base:
|
148
|
+
return 'ETH' === symbol;
|
149
|
+
// @ts-ignore
|
150
|
+
case types_1.Chain.Mayachain:
|
151
|
+
return symbol === 'CACAO';
|
152
|
+
case types_1.Chain.Kujira:
|
153
|
+
return symbol === 'KUJI';
|
154
|
+
case types_1.Chain.Cosmos:
|
155
|
+
return symbol === 'ATOM';
|
156
|
+
case types_1.Chain.Polygon:
|
157
|
+
return symbol === 'MATIC';
|
158
|
+
case types_1.Chain.BinanceSmartChain:
|
159
|
+
return symbol === 'BNB';
|
160
|
+
case types_1.Chain.THORChain:
|
161
|
+
return symbol === 'RUNE';
|
162
|
+
}
|
163
|
+
};
|
164
|
+
exports.isGasAsset = isGasAsset;
|
165
|
+
var getCommonAssetInfo = function (assetString) {
|
166
|
+
switch (assetString) {
|
167
|
+
case 'ETH.THOR':
|
168
|
+
return { identifier: 'ETH.THOR-0xa5f2211b9b8170f694421f2046281775e8468044', decimal: 18 };
|
169
|
+
case 'ETH.vTHOR':
|
170
|
+
return { identifier: 'ETH.vTHOR-0x815c23eca83261b6ec689b60cc4a58b54bc24d8d', decimal: 18 };
|
171
|
+
case types_1.Chain.Cosmos:
|
172
|
+
return { identifier: 'GAIA.ATOM', decimal: types_1.BaseDecimal[assetString] };
|
173
|
+
case types_1.Chain.THORChain:
|
174
|
+
return { identifier: 'THOR.RUNE', decimal: types_1.BaseDecimal[assetString] };
|
175
|
+
case types_1.Chain.BinanceSmartChain:
|
176
|
+
return { identifier: 'BSC.BNB', decimal: types_1.BaseDecimal[assetString] };
|
177
|
+
// @ts-ignore
|
178
|
+
case types_1.Chain.Mayachain:
|
179
|
+
return { identifier: 'MAYA.CACAO', decimal: types_1.BaseDecimal.MAYA };
|
180
|
+
case 'MAYA.MAYA':
|
181
|
+
return { identifier: 'MAYA.MAYA', decimal: 4 };
|
182
|
+
case types_1.Chain.Arbitrum:
|
183
|
+
return { identifier: 'ARB.ETH', decimal: 18 };
|
184
|
+
case types_1.Chain.Base:
|
185
|
+
return { identifier: 'BASE.ETH', decimal: 18 };
|
186
|
+
case types_1.Chain.Optimism:
|
187
|
+
return { identifier: 'OP.ETH', decimal: 18 };
|
188
|
+
case types_1.Chain.Avalanche:
|
189
|
+
return { identifier: 'AVAX.ETH', decimal: 18 };
|
190
|
+
case types_1.Chain.Ripple:
|
191
|
+
case types_1.Chain.Kujira:
|
192
|
+
case types_1.Chain.BitcoinCash:
|
193
|
+
case types_1.Chain.Zcash:
|
194
|
+
case types_1.Chain.Dash:
|
195
|
+
case types_1.Chain.Litecoin:
|
196
|
+
case types_1.Chain.Dogecoin:
|
197
|
+
case types_1.Chain.Binance:
|
198
|
+
case types_1.Chain.Polygon:
|
199
|
+
case types_1.Chain.Bitcoin:
|
200
|
+
case types_1.Chain.Ethereum:
|
201
|
+
return { identifier: "".concat(assetString, ".").concat(assetString), decimal: types_1.BaseDecimal[assetString] };
|
202
|
+
}
|
203
|
+
};
|
204
|
+
exports.getCommonAssetInfo = getCommonAssetInfo;
|
205
|
+
var getAssetType = function (_a) {
|
206
|
+
var chain = _a.chain, symbol = _a.symbol;
|
207
|
+
if (symbol.includes('/'))
|
208
|
+
return 'Synth';
|
209
|
+
switch (chain) {
|
210
|
+
case types_1.Chain.Bitcoin:
|
211
|
+
case types_1.Chain.BitcoinCash:
|
212
|
+
case types_1.Chain.Dogecoin:
|
213
|
+
case types_1.Chain.Dash:
|
214
|
+
case types_1.Chain.Zcash:
|
215
|
+
case types_1.Chain.Litecoin:
|
216
|
+
// @ts-ignore
|
217
|
+
case types_1.Chain.Mayachain:
|
218
|
+
case types_1.Chain.THORChain:
|
219
|
+
return 'Native';
|
220
|
+
case types_1.Chain.Osmosis:
|
221
|
+
return 'Native';
|
222
|
+
case types_1.Chain.Cosmos:
|
223
|
+
return symbol === 'ATOM' ? 'Native' : types_1.Chain.Cosmos;
|
224
|
+
case types_1.Chain.Kujira:
|
225
|
+
return symbol === types_1.Chain.Kujira ? 'Native' : types_1.Chain.Kujira;
|
226
|
+
case types_1.Chain.Binance:
|
227
|
+
return symbol === types_1.Chain.Binance ? 'Native' : 'BEP2';
|
228
|
+
case types_1.Chain.BinanceSmartChain:
|
229
|
+
return symbol === types_1.Chain.Binance ? 'Native' : 'BEP20';
|
230
|
+
case types_1.Chain.Ethereum:
|
231
|
+
return symbol === types_1.Chain.Ethereum ? 'Native' : 'ERC20';
|
232
|
+
case types_1.Chain.Avalanche:
|
233
|
+
return symbol === types_1.Chain.Avalanche ? 'Native' : types_1.Chain.Avalanche;
|
234
|
+
case types_1.Chain.Polygon:
|
235
|
+
return symbol === types_1.Chain.Polygon ? 'Native' : 'POLYGON';
|
236
|
+
case types_1.Chain.Base:
|
237
|
+
return symbol === types_1.Chain.Ethereum ? 'Native' : 'ERC20';
|
238
|
+
case types_1.Chain.Arbitrum:
|
239
|
+
return [types_1.Chain.Ethereum, types_1.Chain.Arbitrum].includes(symbol) ? 'Native' : 'ARBITRUM';
|
240
|
+
case types_1.Chain.Optimism:
|
241
|
+
return [types_1.Chain.Ethereum, types_1.Chain.Optimism].includes(symbol) ? 'Native' : 'OPTIMISM';
|
242
|
+
}
|
243
|
+
};
|
244
|
+
exports.getAssetType = getAssetType;
|
245
|
+
var assetFromString = function (assetString) {
|
246
|
+
var _a;
|
247
|
+
var _b = assetString.split('.'), chain = _b[0], symbolArray = _b.slice(1);
|
248
|
+
var synth = assetString.includes('/');
|
249
|
+
var symbol = symbolArray.join('.');
|
250
|
+
var ticker = (_a = symbol === null || symbol === void 0 ? void 0 : symbol.split('-')) === null || _a === void 0 ? void 0 : _a[0];
|
251
|
+
return { chain: chain, symbol: symbol, ticker: ticker, synth: synth };
|
252
|
+
};
|
253
|
+
exports.assetFromString = assetFromString;
|
254
|
+
var potentialScamRegex = new RegExp(/(.)\1{6}|\.ORG|\.NET|\.FINANCE|\.COM|WWW|HTTP|\\\\|\/\/|[\s$%:[\]]/, 'gmi');
|
255
|
+
var evmAssetHasAddress = function (assetString) {
|
256
|
+
var _a = assetString.split('.'), chain = _a[0], symbol = _a[1];
|
257
|
+
if (!types_1.EVMChainList.includes(chain))
|
258
|
+
return true;
|
259
|
+
var _b = symbol.split('-'), address = _b[1];
|
260
|
+
return (0, exports.isGasAsset)({ chain: chain, symbol: symbol }) || !!address;
|
261
|
+
};
|
262
|
+
var filterAssets = function (tokens) {
|
263
|
+
return tokens.filter(function (token) {
|
264
|
+
var assetString = "".concat(token.chain, ".").concat(token.symbol);
|
265
|
+
return (!potentialScamRegex.test(assetString) &&
|
266
|
+
evmAssetHasAddress(assetString) &&
|
267
|
+
token.value !== '0');
|
268
|
+
});
|
269
|
+
};
|
270
|
+
exports.filterAssets = filterAssets;
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import { SwapKitNumber } from '../index';
|
2
|
+
type ShareParams<T = {}> = T & {
|
3
|
+
liquidityUnits: string;
|
4
|
+
poolUnits: string;
|
5
|
+
};
|
6
|
+
type PoolParams<T = {}> = T & {
|
7
|
+
runeAmount: string;
|
8
|
+
assetAmount: string;
|
9
|
+
runeDepth: string;
|
10
|
+
assetDepth: string;
|
11
|
+
};
|
12
|
+
/**
|
13
|
+
* Ref: https://gitlab.com/thorchain/thornode/-/issues/657
|
14
|
+
* share = (s * A * (2 * T^2 - 2 * T * s + s^2))/T^3
|
15
|
+
* s = stakeUnits for member (after factoring in withdrawBasisPoints)
|
16
|
+
* T = totalPoolUnits for pool
|
17
|
+
* A = assetDepth to be withdrawn
|
18
|
+
*
|
19
|
+
* Formula:
|
20
|
+
* share = (s * A * (2 * T^2 - 2 * T * s + s^2))/T^3
|
21
|
+
* (part1 * (part2 - part3 + part4)) / part5
|
22
|
+
*/
|
23
|
+
export declare const getAsymmetricRuneShare: ({ liquidityUnits, poolUnits, runeDepth, }: ShareParams<{
|
24
|
+
runeDepth: string;
|
25
|
+
}>) => SwapKitNumber;
|
26
|
+
export declare const getAsymmetricAssetShare: ({ liquidityUnits, poolUnits, assetDepth, }: ShareParams<{
|
27
|
+
assetDepth: string;
|
28
|
+
}>) => SwapKitNumber;
|
29
|
+
export declare const getAsymmetricRuneWithdrawAmount: ({ percent, runeDepth, liquidityUnits, poolUnits, }: ShareParams<{
|
30
|
+
percent: number;
|
31
|
+
runeDepth: string;
|
32
|
+
}>) => SwapKitNumber;
|
33
|
+
export declare const getAsymmetricAssetWithdrawAmount: ({ percent, assetDepth, liquidityUnits, poolUnits, }: ShareParams<{
|
34
|
+
percent: number;
|
35
|
+
assetDepth: string;
|
36
|
+
}>) => SwapKitNumber;
|
37
|
+
export declare const getSymmetricPoolShare: ({ liquidityUnits, poolUnits, runeDepth, assetDepth, }: ShareParams<{
|
38
|
+
runeDepth: string;
|
39
|
+
assetDepth: string;
|
40
|
+
}>) => {
|
41
|
+
assetAmount: SwapKitNumber;
|
42
|
+
runeAmount: SwapKitNumber;
|
43
|
+
};
|
44
|
+
export declare const getSymmetricWithdraw: ({ liquidityUnits, poolUnits, runeDepth, assetDepth, percent, }: ShareParams<{
|
45
|
+
runeDepth: string;
|
46
|
+
assetDepth: string;
|
47
|
+
percent: number;
|
48
|
+
}>) => {
|
49
|
+
[k: string]: SwapKitNumber;
|
50
|
+
};
|
51
|
+
export declare const getEstimatedPoolShare: ({ runeDepth, poolUnits, assetDepth, liquidityUnits, runeAmount, assetAmount, }: ShareParams<{
|
52
|
+
runeAmount: string;
|
53
|
+
assetAmount: string;
|
54
|
+
runeDepth: string;
|
55
|
+
assetDepth: string;
|
56
|
+
}>) => number;
|
57
|
+
export declare const getLiquiditySlippage: ({ runeAmount, assetAmount, runeDepth, assetDepth, }: PoolParams) => number;
|
58
|
+
export {};
|
@@ -0,0 +1,112 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getLiquiditySlippage = exports.getEstimatedPoolShare = exports.getSymmetricWithdraw = exports.getSymmetricPoolShare = exports.getAsymmetricAssetWithdrawAmount = exports.getAsymmetricRuneWithdrawAmount = exports.getAsymmetricAssetShare = exports.getAsymmetricRuneShare = void 0;
|
4
|
+
var types_1 = require("@coinmasters/types");
|
5
|
+
var index_1 = require("../index");
|
6
|
+
/**
|
7
|
+
* Ref: https://gitlab.com/thorchain/thornode/-/issues/657
|
8
|
+
* share = (s * A * (2 * T^2 - 2 * T * s + s^2))/T^3
|
9
|
+
* s = stakeUnits for member (after factoring in withdrawBasisPoints)
|
10
|
+
* T = totalPoolUnits for pool
|
11
|
+
* A = assetDepth to be withdrawn
|
12
|
+
*
|
13
|
+
* Formula:
|
14
|
+
* share = (s * A * (2 * T^2 - 2 * T * s + s^2))/T^3
|
15
|
+
* (part1 * (part2 - part3 + part4)) / part5
|
16
|
+
*/
|
17
|
+
var getAsymmetricRuneShare = function (_a) {
|
18
|
+
var liquidityUnits = _a.liquidityUnits, poolUnits = _a.poolUnits, runeDepth = _a.runeDepth;
|
19
|
+
var s = toTCSwapKitNumber(liquidityUnits);
|
20
|
+
var T = toTCSwapKitNumber(poolUnits);
|
21
|
+
var A = toTCSwapKitNumber(runeDepth);
|
22
|
+
var part1 = s.mul(A);
|
23
|
+
var part2 = T.mul(T).mul(2);
|
24
|
+
var part3 = T.mul(s).mul(2);
|
25
|
+
var part4 = s.mul(s);
|
26
|
+
var part5 = T.mul(T).mul(T);
|
27
|
+
var numerator = part1.mul(part2.sub(part3).add(part4));
|
28
|
+
return numerator.div(part5);
|
29
|
+
};
|
30
|
+
exports.getAsymmetricRuneShare = getAsymmetricRuneShare;
|
31
|
+
var getAsymmetricAssetShare = function (_a) {
|
32
|
+
var liquidityUnits = _a.liquidityUnits, poolUnits = _a.poolUnits, assetDepth = _a.assetDepth;
|
33
|
+
var s = toTCSwapKitNumber(liquidityUnits);
|
34
|
+
var T = toTCSwapKitNumber(poolUnits);
|
35
|
+
var A = toTCSwapKitNumber(assetDepth);
|
36
|
+
var part1 = s.mul(A);
|
37
|
+
var part2 = T.mul(T).mul(2);
|
38
|
+
var part3 = T.mul(s).mul(2);
|
39
|
+
var part4 = s.mul(s);
|
40
|
+
var numerator = part1.mul(part2.sub(part3).add(part4));
|
41
|
+
var part5 = T.mul(T).mul(T);
|
42
|
+
return numerator.div(part5);
|
43
|
+
};
|
44
|
+
exports.getAsymmetricAssetShare = getAsymmetricAssetShare;
|
45
|
+
var getAsymmetricRuneWithdrawAmount = function (_a) {
|
46
|
+
var percent = _a.percent, runeDepth = _a.runeDepth, liquidityUnits = _a.liquidityUnits, poolUnits = _a.poolUnits;
|
47
|
+
return (0, exports.getAsymmetricRuneShare)({ runeDepth: runeDepth, liquidityUnits: liquidityUnits, poolUnits: poolUnits }).mul(percent);
|
48
|
+
};
|
49
|
+
exports.getAsymmetricRuneWithdrawAmount = getAsymmetricRuneWithdrawAmount;
|
50
|
+
var getAsymmetricAssetWithdrawAmount = function (_a) {
|
51
|
+
var percent = _a.percent, assetDepth = _a.assetDepth, liquidityUnits = _a.liquidityUnits, poolUnits = _a.poolUnits;
|
52
|
+
return (0, exports.getAsymmetricAssetShare)({ assetDepth: assetDepth, liquidityUnits: liquidityUnits, poolUnits: poolUnits }).mul(percent);
|
53
|
+
};
|
54
|
+
exports.getAsymmetricAssetWithdrawAmount = getAsymmetricAssetWithdrawAmount;
|
55
|
+
var toTCSwapKitNumber = function (value) {
|
56
|
+
return index_1.SwapKitNumber.fromBigInt(BigInt(value), types_1.BaseDecimal.THOR);
|
57
|
+
};
|
58
|
+
var getSymmetricPoolShare = function (_a) {
|
59
|
+
var liquidityUnits = _a.liquidityUnits, poolUnits = _a.poolUnits, runeDepth = _a.runeDepth, assetDepth = _a.assetDepth;
|
60
|
+
return ({
|
61
|
+
assetAmount: toTCSwapKitNumber(assetDepth).mul(liquidityUnits).div(poolUnits),
|
62
|
+
runeAmount: toTCSwapKitNumber(runeDepth).mul(liquidityUnits).div(poolUnits),
|
63
|
+
});
|
64
|
+
};
|
65
|
+
exports.getSymmetricPoolShare = getSymmetricPoolShare;
|
66
|
+
var getSymmetricWithdraw = function (_a) {
|
67
|
+
var liquidityUnits = _a.liquidityUnits, poolUnits = _a.poolUnits, runeDepth = _a.runeDepth, assetDepth = _a.assetDepth, percent = _a.percent;
|
68
|
+
return Object.fromEntries(Object.entries((0, exports.getSymmetricPoolShare)({ liquidityUnits: liquidityUnits, poolUnits: poolUnits, runeDepth: runeDepth, assetDepth: assetDepth })).map(function (_a) {
|
69
|
+
var name = _a[0], value = _a[1];
|
70
|
+
return [name, value.mul(percent)];
|
71
|
+
}));
|
72
|
+
};
|
73
|
+
exports.getSymmetricWithdraw = getSymmetricWithdraw;
|
74
|
+
var getEstimatedPoolShare = function (_a) {
|
75
|
+
var runeDepth = _a.runeDepth, poolUnits = _a.poolUnits, assetDepth = _a.assetDepth, liquidityUnits = _a.liquidityUnits, runeAmount = _a.runeAmount, assetAmount = _a.assetAmount;
|
76
|
+
var R = new index_1.SwapKitNumber({ value: runeDepth, decimal: 8 });
|
77
|
+
var A = new index_1.SwapKitNumber({ value: assetDepth, decimal: 8 });
|
78
|
+
var P = new index_1.SwapKitNumber({ value: poolUnits, decimal: 8 });
|
79
|
+
var runeAddAmount = new index_1.SwapKitNumber({ value: runeAmount, decimal: 8 });
|
80
|
+
var assetAddAmount = new index_1.SwapKitNumber({ value: assetAmount, decimal: 8 });
|
81
|
+
// liquidityUnits = P * (r*A + a*R + 2*r*a) / (r*A + a*R + 2*R*A)
|
82
|
+
var rA = runeAddAmount.mul(A);
|
83
|
+
var aR = assetAddAmount.mul(R);
|
84
|
+
var ra = runeAddAmount.mul(assetAddAmount);
|
85
|
+
var RA = R.mul(A);
|
86
|
+
var numerator = P.mul(rA.add(aR.add(ra.mul(2))));
|
87
|
+
var denominator = rA.add(aR.add(RA.mul(2)));
|
88
|
+
var liquidityUnitsAfterAdd = numerator.div(denominator);
|
89
|
+
var estimatedLiquidityUnits = toTCSwapKitNumber(liquidityUnits).add(liquidityUnitsAfterAdd);
|
90
|
+
if (liquidityUnitsAfterAdd.getBaseValue('number') === 0) {
|
91
|
+
return estimatedLiquidityUnits.div(P).getBaseValue('number');
|
92
|
+
}
|
93
|
+
// get pool units after add
|
94
|
+
var newPoolUnits = P.add(estimatedLiquidityUnits);
|
95
|
+
return estimatedLiquidityUnits.div(newPoolUnits).getBaseValue('number');
|
96
|
+
};
|
97
|
+
exports.getEstimatedPoolShare = getEstimatedPoolShare;
|
98
|
+
var getLiquiditySlippage = function (_a) {
|
99
|
+
var runeAmount = _a.runeAmount, assetAmount = _a.assetAmount, runeDepth = _a.runeDepth, assetDepth = _a.assetDepth;
|
100
|
+
if (runeAmount === '0' || assetAmount === '0' || runeDepth === '0' || assetDepth === '0')
|
101
|
+
return 0;
|
102
|
+
// formula: (t * R - T * r)/ (T*r + R*T)
|
103
|
+
var R = toTCSwapKitNumber(runeDepth);
|
104
|
+
var T = toTCSwapKitNumber(assetDepth);
|
105
|
+
var assetAddAmount = toTCSwapKitNumber(assetAmount);
|
106
|
+
var runeAddAmount = toTCSwapKitNumber(runeAmount);
|
107
|
+
var numerator = assetAddAmount.mul(R).sub(T.mul(runeAddAmount));
|
108
|
+
var denominator = T.mul(runeAddAmount).add(R.mul(T));
|
109
|
+
// set absolute value of percent, no negative allowed
|
110
|
+
return Math.abs(numerator.div(denominator).getBaseValue('number'));
|
111
|
+
};
|
112
|
+
exports.getLiquiditySlippage = getLiquiditySlippage;
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import type { Chain } from '@coinmasters/types';
|
2
|
+
import { MemoType } from '@coinmasters/types';
|
3
|
+
export type ThornameRegisterParam = {
|
4
|
+
name: string;
|
5
|
+
chain: string;
|
6
|
+
address: string;
|
7
|
+
owner?: string;
|
8
|
+
preferredAsset?: string;
|
9
|
+
expiryBlock?: string;
|
10
|
+
};
|
11
|
+
type WithAddress<T = {}> = T & {
|
12
|
+
address: string;
|
13
|
+
};
|
14
|
+
type WithChain<T = {}> = T & {
|
15
|
+
chain: Chain;
|
16
|
+
};
|
17
|
+
export type MemoOptions<T extends MemoType> = {
|
18
|
+
[MemoType.BOND]: WithAddress;
|
19
|
+
[MemoType.LEAVE]: WithAddress;
|
20
|
+
[MemoType.CLOSE_LOAN]: WithAddress<{
|
21
|
+
asset: string;
|
22
|
+
minAmount?: string;
|
23
|
+
}>;
|
24
|
+
[MemoType.OPEN_LOAN]: WithAddress<{
|
25
|
+
asset: string;
|
26
|
+
minAmount?: string;
|
27
|
+
}>;
|
28
|
+
[MemoType.UNBOND]: WithAddress<{
|
29
|
+
unbondAmount: number;
|
30
|
+
}>;
|
31
|
+
[MemoType.DEPOSIT]: WithChain<{
|
32
|
+
symbol: string;
|
33
|
+
address?: string;
|
34
|
+
singleSide?: boolean;
|
35
|
+
}>;
|
36
|
+
[MemoType.WITHDRAW]: WithChain<{
|
37
|
+
ticker: string;
|
38
|
+
symbol: string;
|
39
|
+
basisPoints: number;
|
40
|
+
targetAssetString?: string;
|
41
|
+
singleSide?: boolean;
|
42
|
+
}>;
|
43
|
+
[MemoType.THORNAME_REGISTER]: Omit<ThornameRegisterParam, 'preferredAsset' | 'expiryBlock'>;
|
44
|
+
}[T];
|
45
|
+
export declare const getMemoFor: <T extends MemoType>(memoType: T, options: MemoOptions<T>) => string;
|
46
|
+
export {};
|
@@ -0,0 +1,46 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.getMemoFor = void 0;
|
4
|
+
var types_1 = require("@coinmasters/types");
|
5
|
+
var getShortenedSymbol = function (_a) {
|
6
|
+
var symbol = _a.symbol, ticker = _a.ticker, chain = _a.chain;
|
7
|
+
return (chain === 'ETH' && ticker !== 'ETH' ? "".concat(ticker, "-").concat(symbol.slice(-3)) : symbol);
|
8
|
+
};
|
9
|
+
var getMemoFor = function (memoType, options) {
|
10
|
+
switch (memoType) {
|
11
|
+
case types_1.MemoType.LEAVE:
|
12
|
+
case types_1.MemoType.BOND: {
|
13
|
+
var address = options.address;
|
14
|
+
return "".concat(memoType, ":").concat(address);
|
15
|
+
}
|
16
|
+
case types_1.MemoType.UNBOND: {
|
17
|
+
var _a = options, address = _a.address, unbondAmount = _a.unbondAmount;
|
18
|
+
return "".concat(memoType, ":").concat(address, ":").concat(unbondAmount * Math.pow(10, 8));
|
19
|
+
}
|
20
|
+
case types_1.MemoType.THORNAME_REGISTER: {
|
21
|
+
var _b = options, name_1 = _b.name, chain = _b.chain, address = _b.address, owner = _b.owner;
|
22
|
+
return "".concat(memoType, ":").concat(name_1, ":").concat(chain, ":").concat(address).concat(owner ? ":".concat(owner) : '');
|
23
|
+
}
|
24
|
+
case types_1.MemoType.DEPOSIT: {
|
25
|
+
var _c = options, chain = _c.chain, symbol = _c.symbol, address = _c.address, singleSide = _c.singleSide;
|
26
|
+
return singleSide
|
27
|
+
? "".concat(memoType, ":").concat(chain, "/").concat(symbol, "::t:0")
|
28
|
+
: "".concat(memoType, ":").concat(chain, ".").concat(symbol, ":").concat(address || '', ":t:0");
|
29
|
+
}
|
30
|
+
case types_1.MemoType.WITHDRAW: {
|
31
|
+
var _d = options, chain = _d.chain, ticker = _d.ticker, symbol = _d.symbol, basisPoints = _d.basisPoints, targetAssetString = _d.targetAssetString, singleSide = _d.singleSide;
|
32
|
+
var target = !singleSide && targetAssetString ? ":".concat(targetAssetString) : '';
|
33
|
+
var shortenedSymbol = getShortenedSymbol({ chain: chain, symbol: symbol, ticker: ticker });
|
34
|
+
var assetDivider = singleSide ? '/' : '.';
|
35
|
+
return "".concat(memoType, ":").concat(chain).concat(assetDivider).concat(shortenedSymbol, ":").concat(basisPoints).concat(target);
|
36
|
+
}
|
37
|
+
case types_1.MemoType.OPEN_LOAN:
|
38
|
+
case types_1.MemoType.CLOSE_LOAN: {
|
39
|
+
var _e = options, asset = _e.asset, address = _e.address;
|
40
|
+
return "".concat(memoType, ":").concat(asset, ":").concat(address); //:${minAmount ? `${minAmount}` : ''}:t:0`;
|
41
|
+
}
|
42
|
+
default:
|
43
|
+
return '';
|
44
|
+
}
|
45
|
+
};
|
46
|
+
exports.getMemoFor = getMemoFor;
|
@@ -0,0 +1,24 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.derivationPathToString = exports.validateTHORName = exports.getTHORNameCost = void 0;
|
4
|
+
// 10 rune for register, 1 rune per year
|
5
|
+
// MINIMUM_REGISTRATION_FEE = 11
|
6
|
+
var getTHORNameCost = function (year) {
|
7
|
+
if (year < 0)
|
8
|
+
throw new Error('Invalid number of year');
|
9
|
+
return 10 + year;
|
10
|
+
};
|
11
|
+
exports.getTHORNameCost = getTHORNameCost;
|
12
|
+
var validateTHORName = function (name) {
|
13
|
+
if (name.length > 30)
|
14
|
+
return false;
|
15
|
+
var regex = /^[a-zA-Z0-9+_-]+$/g;
|
16
|
+
return !!name.match(regex);
|
17
|
+
};
|
18
|
+
exports.validateTHORName = validateTHORName;
|
19
|
+
var derivationPathToString = function (_a) {
|
20
|
+
var network = _a[0], chainId = _a[1], account = _a[2], change = _a[3], index = _a[4];
|
21
|
+
var shortPath = typeof index !== 'number';
|
22
|
+
return "".concat(network, "'/").concat(chainId, "'/").concat(account, "'/").concat(change).concat(shortPath ? '' : "/".concat(index));
|
23
|
+
};
|
24
|
+
exports.derivationPathToString = derivationPathToString;
|