@pioneer-platform/helpers 4.0.12 → 4.1.0
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/CHANGELOG.md +12 -0
- package/lib/helpers/asset.d.ts +1 -1
- package/lib/helpers/asset.js +83 -145
- package/lib/helpers/liquidity.js +52 -73
- package/lib/helpers/memo.js +19 -22
- package/lib/helpers/others.js +6 -7
- package/lib/helpers/request.d.ts +1 -1
- package/lib/helpers/request.js +30 -68
- package/lib/helpers/validators.js +7 -8
- package/lib/modules/assetValue.js +171 -258
- package/lib/modules/bigIntArithmetics.js +180 -225
- package/lib/modules/swapKitError.js +6 -25
- package/lib/modules/swapKitNumber.js +10 -30
- package/package.json +18 -15
- package/src/helpers/asset.ts +0 -5
- package/tsconfig.json +1 -1
- package/lib/modules/__tests__/assetValue.test.d.ts +0 -1
- package/lib/modules/__tests__/assetValue.test.js +0 -399
- package/lib/modules/__tests__/swapKitNumber.test.d.ts +0 -1
- package/lib/modules/__tests__/swapKitNumber.test.js +0 -425
package/CHANGELOG.md
ADDED
package/lib/helpers/asset.d.ts
CHANGED
@@ -16,7 +16,7 @@ export declare const getCommonAssetInfo: (assetString: CommonAssetString) => {
|
|
16
16
|
export declare const getAssetType: ({ chain, symbol }: {
|
17
17
|
chain: Chain;
|
18
18
|
symbol: string;
|
19
|
-
}) => Chain.Avalanche | Chain.Cosmos | Chain.Kujira | "Synth" | "Native" | "
|
19
|
+
}) => Chain.Avalanche | Chain.Cosmos | Chain.Kujira | "Synth" | "Native" | "ERC20" | "POLYGON" | "ARBITRUM" | "OPTIMISM" | undefined;
|
20
20
|
export declare const assetFromString: (assetString: string) => {
|
21
21
|
chain: Chain;
|
22
22
|
symbol: string;
|
package/lib/helpers/asset.js
CHANGED
@@ -8,127 +8,73 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
9
|
});
|
10
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
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
40
12
|
exports.filterAssets = exports.assetFromString = exports.getAssetType = exports.getCommonAssetInfo = exports.isGasAsset = exports.gasFeeMultiplier = exports.getDecimal = void 0;
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
-
}
|
13
|
+
const types_1 = require("@coinmasters/types");
|
14
|
+
const index_1 = require("../index");
|
15
|
+
const getDecimalMethodHex = '0x313ce567';
|
16
|
+
const getContractDecimals = (_a) => __awaiter(void 0, [_a], void 0, function* ({ chain, to }) {
|
17
|
+
try {
|
18
|
+
const { result } = yield index_1.RequestClient.post(types_1.ChainToRPC[chain], {
|
19
|
+
headers: {
|
20
|
+
accept: '*/*',
|
21
|
+
'content-type': 'application/json',
|
22
|
+
'cache-control': 'no-cache',
|
23
|
+
},
|
24
|
+
body: JSON.stringify({
|
25
|
+
id: 44,
|
26
|
+
jsonrpc: '2.0',
|
27
|
+
method: 'eth_call',
|
28
|
+
params: [{ to: to.toLowerCase(), data: getDecimalMethodHex }, 'latest'],
|
29
|
+
}),
|
75
30
|
});
|
76
|
-
|
77
|
-
}
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
});
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
default:
|
117
|
-
// @ts-ignore
|
118
|
-
return [2 /*return*/, types_1.BaseDecimal[chain]];
|
119
|
-
}
|
120
|
-
return [2 /*return*/];
|
121
|
-
});
|
122
|
-
});
|
123
|
-
};
|
31
|
+
return parseInt(BigInt(result).toString());
|
32
|
+
}
|
33
|
+
catch (error) {
|
34
|
+
console.error(error);
|
35
|
+
// @ts-ignore
|
36
|
+
return types_1.BaseDecimal[chain];
|
37
|
+
}
|
38
|
+
});
|
39
|
+
const getETHAssetDecimal = (symbol) => __awaiter(void 0, void 0, void 0, function* () {
|
40
|
+
if (symbol === types_1.Chain.Ethereum)
|
41
|
+
return types_1.BaseDecimal.ETH;
|
42
|
+
const [, address] = symbol.split('-');
|
43
|
+
return (address === null || address === void 0 ? void 0 : address.startsWith('0x'))
|
44
|
+
? getContractDecimals({ chain: types_1.Chain.Ethereum, to: address })
|
45
|
+
: types_1.BaseDecimal.ETH;
|
46
|
+
});
|
47
|
+
const getAVAXAssetDecimal = (symbol) => __awaiter(void 0, void 0, void 0, function* () {
|
48
|
+
const [, address] = symbol.split('-');
|
49
|
+
return (address === null || address === void 0 ? void 0 : address.startsWith('0x'))
|
50
|
+
? getContractDecimals({ chain: types_1.Chain.Avalanche, to: address.toLowerCase() })
|
51
|
+
: types_1.BaseDecimal.AVAX;
|
52
|
+
});
|
53
|
+
const getBSCAssetDecimal = (symbol) => __awaiter(void 0, void 0, void 0, function* () {
|
54
|
+
if (symbol === types_1.Chain.BinanceSmartChain)
|
55
|
+
return types_1.BaseDecimal.BSC;
|
56
|
+
return types_1.BaseDecimal.BSC;
|
57
|
+
});
|
58
|
+
const getDecimal = (_a) => __awaiter(void 0, [_a], void 0, function* ({ chain, symbol }) {
|
59
|
+
switch (chain) {
|
60
|
+
case types_1.Chain.Ethereum:
|
61
|
+
return getETHAssetDecimal(symbol);
|
62
|
+
case types_1.Chain.Avalanche:
|
63
|
+
return getAVAXAssetDecimal(symbol);
|
64
|
+
case types_1.Chain.BinanceSmartChain:
|
65
|
+
return getBSCAssetDecimal(symbol);
|
66
|
+
default:
|
67
|
+
// @ts-ignore
|
68
|
+
return types_1.BaseDecimal[chain];
|
69
|
+
}
|
70
|
+
});
|
124
71
|
exports.getDecimal = getDecimal;
|
125
|
-
exports.gasFeeMultiplier =
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
var chain = _a.chain, symbol = _a.symbol;
|
72
|
+
exports.gasFeeMultiplier = {
|
73
|
+
[types_1.FeeOption.Average]: 1.2,
|
74
|
+
[types_1.FeeOption.Fast]: 1.5,
|
75
|
+
[types_1.FeeOption.Fastest]: 2,
|
76
|
+
};
|
77
|
+
const isGasAsset = ({ chain, symbol }) => {
|
132
78
|
switch (chain) {
|
133
79
|
case types_1.Chain.Bitcoin:
|
134
80
|
case types_1.Chain.BitcoinCash:
|
@@ -138,7 +84,6 @@ var isGasAsset = function (_a) {
|
|
138
84
|
case types_1.Chain.Ripple:
|
139
85
|
case types_1.Chain.Litecoin:
|
140
86
|
case types_1.Chain.Dogecoin:
|
141
|
-
case types_1.Chain.Binance:
|
142
87
|
case types_1.Chain.Ethereum:
|
143
88
|
case types_1.Chain.Avalanche:
|
144
89
|
return symbol === chain;
|
@@ -162,7 +107,7 @@ var isGasAsset = function (_a) {
|
|
162
107
|
}
|
163
108
|
};
|
164
109
|
exports.isGasAsset = isGasAsset;
|
165
|
-
|
110
|
+
const getCommonAssetInfo = (assetString) => {
|
166
111
|
switch (assetString) {
|
167
112
|
case 'ETH.THOR':
|
168
113
|
return { identifier: 'ETH.THOR-0xa5f2211b9b8170f694421f2046281775e8468044', decimal: 18 };
|
@@ -194,16 +139,14 @@ var getCommonAssetInfo = function (assetString) {
|
|
194
139
|
case types_1.Chain.Dash:
|
195
140
|
case types_1.Chain.Litecoin:
|
196
141
|
case types_1.Chain.Dogecoin:
|
197
|
-
case types_1.Chain.Binance:
|
198
142
|
case types_1.Chain.Polygon:
|
199
143
|
case types_1.Chain.Bitcoin:
|
200
144
|
case types_1.Chain.Ethereum:
|
201
|
-
return { identifier:
|
145
|
+
return { identifier: `${assetString}.${assetString}`, decimal: types_1.BaseDecimal[assetString] };
|
202
146
|
}
|
203
147
|
};
|
204
148
|
exports.getCommonAssetInfo = getCommonAssetInfo;
|
205
|
-
|
206
|
-
var chain = _a.chain, symbol = _a.symbol;
|
149
|
+
const getAssetType = ({ chain, symbol }) => {
|
207
150
|
if (symbol.includes('/'))
|
208
151
|
return 'Synth';
|
209
152
|
switch (chain) {
|
@@ -223,10 +166,7 @@ var getAssetType = function (_a) {
|
|
223
166
|
return symbol === 'ATOM' ? 'Native' : types_1.Chain.Cosmos;
|
224
167
|
case types_1.Chain.Kujira:
|
225
168
|
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
169
|
case types_1.Chain.BinanceSmartChain:
|
229
|
-
return symbol === types_1.Chain.Binance ? 'Native' : 'BEP20';
|
230
170
|
case types_1.Chain.Ethereum:
|
231
171
|
return symbol === types_1.Chain.Ethereum ? 'Native' : 'ERC20';
|
232
172
|
case types_1.Chain.Avalanche:
|
@@ -242,29 +182,27 @@ var getAssetType = function (_a) {
|
|
242
182
|
}
|
243
183
|
};
|
244
184
|
exports.getAssetType = getAssetType;
|
245
|
-
|
185
|
+
const assetFromString = (assetString) => {
|
246
186
|
var _a;
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
return { chain
|
187
|
+
const [chain, ...symbolArray] = assetString.split('.');
|
188
|
+
const synth = assetString.includes('/');
|
189
|
+
const symbol = symbolArray.join('.');
|
190
|
+
const ticker = (_a = symbol === null || symbol === void 0 ? void 0 : symbol.split('-')) === null || _a === void 0 ? void 0 : _a[0];
|
191
|
+
return { chain, symbol, ticker, synth };
|
252
192
|
};
|
253
193
|
exports.assetFromString = assetFromString;
|
254
|
-
|
255
|
-
|
256
|
-
|
194
|
+
const potentialScamRegex = new RegExp(/(.)\1{6}|\.ORG|\.NET|\.FINANCE|\.COM|WWW|HTTP|\\\\|\/\/|[\s$%:[\]]/, 'gmi');
|
195
|
+
const evmAssetHasAddress = (assetString) => {
|
196
|
+
const [chain, symbol] = assetString.split('.');
|
257
197
|
if (!types_1.EVMChainList.includes(chain))
|
258
198
|
return true;
|
259
|
-
|
260
|
-
return (0, exports.isGasAsset)({ chain: chain, symbol
|
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
|
-
});
|
199
|
+
const [, address] = symbol.split('-');
|
200
|
+
return (0, exports.isGasAsset)({ chain: chain, symbol }) || !!address;
|
269
201
|
};
|
202
|
+
const filterAssets = (tokens) => tokens.filter((token) => {
|
203
|
+
const assetString = `${token.chain}.${token.symbol}`;
|
204
|
+
return (!potentialScamRegex.test(assetString) &&
|
205
|
+
evmAssetHasAddress(assetString) &&
|
206
|
+
token.value !== '0');
|
207
|
+
});
|
270
208
|
exports.filterAssets = filterAssets;
|
package/lib/helpers/liquidity.js
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.getLiquiditySlippage = exports.getEstimatedPoolShare = exports.getSymmetricWithdraw = exports.getSymmetricPoolShare = exports.getAsymmetricAssetWithdrawAmount = exports.getAsymmetricRuneWithdrawAmount = exports.getAsymmetricAssetShare = exports.getAsymmetricRuneShare = void 0;
|
4
|
-
|
5
|
-
|
4
|
+
const types_1 = require("@coinmasters/types");
|
5
|
+
const index_1 = require("../index");
|
6
6
|
/**
|
7
7
|
* Ref: https://gitlab.com/thorchain/thornode/-/issues/657
|
8
8
|
* share = (s * A * (2 * T^2 - 2 * T * s + s^2))/T^3
|
@@ -14,98 +14,77 @@ var index_1 = require("../index");
|
|
14
14
|
* share = (s * A * (2 * T^2 - 2 * T * s + s^2))/T^3
|
15
15
|
* (part1 * (part2 - part3 + part4)) / part5
|
16
16
|
*/
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
var numerator = part1.mul(part2.sub(part3).add(part4));
|
17
|
+
const getAsymmetricRuneShare = ({ liquidityUnits, poolUnits, runeDepth, }) => {
|
18
|
+
const s = toTCSwapKitNumber(liquidityUnits);
|
19
|
+
const T = toTCSwapKitNumber(poolUnits);
|
20
|
+
const A = toTCSwapKitNumber(runeDepth);
|
21
|
+
const part1 = s.mul(A);
|
22
|
+
const part2 = T.mul(T).mul(2);
|
23
|
+
const part3 = T.mul(s).mul(2);
|
24
|
+
const part4 = s.mul(s);
|
25
|
+
const part5 = T.mul(T).mul(T);
|
26
|
+
const numerator = part1.mul(part2.sub(part3).add(part4));
|
28
27
|
return numerator.div(part5);
|
29
28
|
};
|
30
29
|
exports.getAsymmetricRuneShare = getAsymmetricRuneShare;
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
var part5 = T.mul(T).mul(T);
|
30
|
+
const getAsymmetricAssetShare = ({ liquidityUnits, poolUnits, assetDepth, }) => {
|
31
|
+
const s = toTCSwapKitNumber(liquidityUnits);
|
32
|
+
const T = toTCSwapKitNumber(poolUnits);
|
33
|
+
const A = toTCSwapKitNumber(assetDepth);
|
34
|
+
const part1 = s.mul(A);
|
35
|
+
const part2 = T.mul(T).mul(2);
|
36
|
+
const part3 = T.mul(s).mul(2);
|
37
|
+
const part4 = s.mul(s);
|
38
|
+
const numerator = part1.mul(part2.sub(part3).add(part4));
|
39
|
+
const part5 = T.mul(T).mul(T);
|
42
40
|
return numerator.div(part5);
|
43
41
|
};
|
44
42
|
exports.getAsymmetricAssetShare = getAsymmetricAssetShare;
|
45
|
-
|
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
|
-
};
|
43
|
+
const getAsymmetricRuneWithdrawAmount = ({ percent, runeDepth, liquidityUnits, poolUnits, }) => (0, exports.getAsymmetricRuneShare)({ runeDepth, liquidityUnits, poolUnits }).mul(percent);
|
49
44
|
exports.getAsymmetricRuneWithdrawAmount = getAsymmetricRuneWithdrawAmount;
|
50
|
-
|
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
|
-
};
|
45
|
+
const getAsymmetricAssetWithdrawAmount = ({ percent, assetDepth, liquidityUnits, poolUnits, }) => (0, exports.getAsymmetricAssetShare)({ assetDepth, liquidityUnits, poolUnits }).mul(percent);
|
54
46
|
exports.getAsymmetricAssetWithdrawAmount = getAsymmetricAssetWithdrawAmount;
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
return ({
|
61
|
-
assetAmount: toTCSwapKitNumber(assetDepth).mul(liquidityUnits).div(poolUnits),
|
62
|
-
runeAmount: toTCSwapKitNumber(runeDepth).mul(liquidityUnits).div(poolUnits),
|
63
|
-
});
|
64
|
-
};
|
47
|
+
const toTCSwapKitNumber = (value) => index_1.SwapKitNumber.fromBigInt(BigInt(value), types_1.BaseDecimal.THOR);
|
48
|
+
const getSymmetricPoolShare = ({ liquidityUnits, poolUnits, runeDepth, assetDepth, }) => ({
|
49
|
+
assetAmount: toTCSwapKitNumber(assetDepth).mul(liquidityUnits).div(poolUnits),
|
50
|
+
runeAmount: toTCSwapKitNumber(runeDepth).mul(liquidityUnits).div(poolUnits),
|
51
|
+
});
|
65
52
|
exports.getSymmetricPoolShare = getSymmetricPoolShare;
|
66
|
-
|
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
|
-
};
|
53
|
+
const getSymmetricWithdraw = ({ liquidityUnits, poolUnits, runeDepth, assetDepth, percent, }) => Object.fromEntries(Object.entries((0, exports.getSymmetricPoolShare)({ liquidityUnits, poolUnits, runeDepth, assetDepth })).map(([name, value]) => [name, value.mul(percent)]));
|
73
54
|
exports.getSymmetricWithdraw = getSymmetricWithdraw;
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
var assetAddAmount = new index_1.SwapKitNumber({ value: assetAmount, decimal: 8 });
|
55
|
+
const getEstimatedPoolShare = ({ runeDepth, poolUnits, assetDepth, liquidityUnits, runeAmount, assetAmount, }) => {
|
56
|
+
const R = new index_1.SwapKitNumber({ value: runeDepth, decimal: 8 });
|
57
|
+
const A = new index_1.SwapKitNumber({ value: assetDepth, decimal: 8 });
|
58
|
+
const P = new index_1.SwapKitNumber({ value: poolUnits, decimal: 8 });
|
59
|
+
const runeAddAmount = new index_1.SwapKitNumber({ value: runeAmount, decimal: 8 });
|
60
|
+
const assetAddAmount = new index_1.SwapKitNumber({ value: assetAmount, decimal: 8 });
|
81
61
|
// liquidityUnits = P * (r*A + a*R + 2*r*a) / (r*A + a*R + 2*R*A)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
62
|
+
const rA = runeAddAmount.mul(A);
|
63
|
+
const aR = assetAddAmount.mul(R);
|
64
|
+
const ra = runeAddAmount.mul(assetAddAmount);
|
65
|
+
const RA = R.mul(A);
|
66
|
+
const numerator = P.mul(rA.add(aR.add(ra.mul(2))));
|
67
|
+
const denominator = rA.add(aR.add(RA.mul(2)));
|
68
|
+
const liquidityUnitsAfterAdd = numerator.div(denominator);
|
69
|
+
const estimatedLiquidityUnits = toTCSwapKitNumber(liquidityUnits).add(liquidityUnitsAfterAdd);
|
90
70
|
if (liquidityUnitsAfterAdd.getBaseValue('number') === 0) {
|
91
71
|
return estimatedLiquidityUnits.div(P).getBaseValue('number');
|
92
72
|
}
|
93
73
|
// get pool units after add
|
94
|
-
|
74
|
+
const newPoolUnits = P.add(estimatedLiquidityUnits);
|
95
75
|
return estimatedLiquidityUnits.div(newPoolUnits).getBaseValue('number');
|
96
76
|
};
|
97
77
|
exports.getEstimatedPoolShare = getEstimatedPoolShare;
|
98
|
-
|
99
|
-
var runeAmount = _a.runeAmount, assetAmount = _a.assetAmount, runeDepth = _a.runeDepth, assetDepth = _a.assetDepth;
|
78
|
+
const getLiquiditySlippage = ({ runeAmount, assetAmount, runeDepth, assetDepth, }) => {
|
100
79
|
if (runeAmount === '0' || assetAmount === '0' || runeDepth === '0' || assetDepth === '0')
|
101
80
|
return 0;
|
102
81
|
// formula: (t * R - T * r)/ (T*r + R*T)
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
82
|
+
const R = toTCSwapKitNumber(runeDepth);
|
83
|
+
const T = toTCSwapKitNumber(assetDepth);
|
84
|
+
const assetAddAmount = toTCSwapKitNumber(assetAmount);
|
85
|
+
const runeAddAmount = toTCSwapKitNumber(runeAmount);
|
86
|
+
const numerator = assetAddAmount.mul(R).sub(T.mul(runeAddAmount));
|
87
|
+
const denominator = T.mul(runeAddAmount).add(R.mul(T));
|
109
88
|
// set absolute value of percent, no negative allowed
|
110
89
|
return Math.abs(numerator.div(denominator).getBaseValue('number'));
|
111
90
|
};
|
package/lib/helpers/memo.js
CHANGED
@@ -1,43 +1,40 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.getMemoFor = void 0;
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
return (chain === 'ETH' && ticker !== 'ETH' ? "".concat(ticker, "-").concat(symbol.slice(-3)) : symbol);
|
8
|
-
};
|
9
|
-
var getMemoFor = function (memoType, options) {
|
4
|
+
const types_1 = require("@coinmasters/types");
|
5
|
+
const getShortenedSymbol = ({ symbol, ticker, chain, }) => (chain === 'ETH' && ticker !== 'ETH' ? `${ticker}-${symbol.slice(-3)}` : symbol);
|
6
|
+
const getMemoFor = (memoType, options) => {
|
10
7
|
switch (memoType) {
|
11
8
|
case types_1.MemoType.LEAVE:
|
12
9
|
case types_1.MemoType.BOND: {
|
13
|
-
|
14
|
-
return
|
10
|
+
const { address } = options;
|
11
|
+
return `${memoType}:${address}`;
|
15
12
|
}
|
16
13
|
case types_1.MemoType.UNBOND: {
|
17
|
-
|
18
|
-
return
|
14
|
+
const { address, unbondAmount } = options;
|
15
|
+
return `${memoType}:${address}:${unbondAmount * Math.pow(10, 8)}`;
|
19
16
|
}
|
20
17
|
case types_1.MemoType.THORNAME_REGISTER: {
|
21
|
-
|
22
|
-
return
|
18
|
+
const { name, chain, address, owner } = options;
|
19
|
+
return `${memoType}:${name}:${chain}:${address}${owner ? `:${owner}` : ''}`;
|
23
20
|
}
|
24
21
|
case types_1.MemoType.DEPOSIT: {
|
25
|
-
|
22
|
+
const { chain, symbol, address, singleSide } = options;
|
26
23
|
return singleSide
|
27
|
-
?
|
28
|
-
:
|
24
|
+
? `${memoType}:${chain}/${symbol}::t:0`
|
25
|
+
: `${memoType}:${chain}.${symbol}:${address || ''}:t:0`;
|
29
26
|
}
|
30
27
|
case types_1.MemoType.WITHDRAW: {
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
return
|
28
|
+
const { chain, ticker, symbol, basisPoints, targetAssetString, singleSide } = options;
|
29
|
+
const target = !singleSide && targetAssetString ? `:${targetAssetString}` : '';
|
30
|
+
const shortenedSymbol = getShortenedSymbol({ chain, symbol, ticker });
|
31
|
+
const assetDivider = singleSide ? '/' : '.';
|
32
|
+
return `${memoType}:${chain}${assetDivider}${shortenedSymbol}:${basisPoints}${target}`;
|
36
33
|
}
|
37
34
|
case types_1.MemoType.OPEN_LOAN:
|
38
35
|
case types_1.MemoType.CLOSE_LOAN: {
|
39
|
-
|
40
|
-
return
|
36
|
+
const { asset, address } = options;
|
37
|
+
return `${memoType}:${asset}:${address}`; //:${minAmount ? `${minAmount}` : ''}:t:0`;
|
41
38
|
}
|
42
39
|
default:
|
43
40
|
return '';
|
package/lib/helpers/others.js
CHANGED
@@ -3,22 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.derivationPathToString = exports.validateTHORName = exports.getTHORNameCost = void 0;
|
4
4
|
// 10 rune for register, 1 rune per year
|
5
5
|
// MINIMUM_REGISTRATION_FEE = 11
|
6
|
-
|
6
|
+
const getTHORNameCost = (year) => {
|
7
7
|
if (year < 0)
|
8
8
|
throw new Error('Invalid number of year');
|
9
9
|
return 10 + year;
|
10
10
|
};
|
11
11
|
exports.getTHORNameCost = getTHORNameCost;
|
12
|
-
|
12
|
+
const validateTHORName = (name) => {
|
13
13
|
if (name.length > 30)
|
14
14
|
return false;
|
15
|
-
|
15
|
+
const regex = /^[a-zA-Z0-9+_-]+$/g;
|
16
16
|
return !!name.match(regex);
|
17
17
|
};
|
18
18
|
exports.validateTHORName = validateTHORName;
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
return "".concat(network, "'/").concat(chainId, "'/").concat(account, "'/").concat(change).concat(shortPath ? '' : "/".concat(index));
|
19
|
+
const derivationPathToString = ([network, chainId, account, change, index]) => {
|
20
|
+
const shortPath = typeof index !== 'number';
|
21
|
+
return `${network}'/${chainId}'/${account}'/${change}${shortPath ? '' : `/${index}`}`;
|
23
22
|
};
|
24
23
|
exports.derivationPathToString = derivationPathToString;
|
package/lib/helpers/request.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import { type Options } from 'ky';
|
2
2
|
export declare const RequestClient: {
|
3
3
|
get: <T>(url: string | URL | Request, options?: Options) => Promise<T>;
|
4
|
-
post: <
|
4
|
+
post: <T>(url: string | URL | Request, options?: Options) => Promise<T>;
|
5
5
|
};
|