@orbs-network/twap 1.25.3 → 2.0.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/dist/src/lib.js DELETED
@@ -1,271 +0,0 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.TokensValidation = exports.OrderInputValidation = exports.Status = exports.TWAPLib = void 0;
16
- const web3_1 = __importDefault(require("web3"));
17
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
18
- const web3_candies_1 = require("@defi.org/web3-candies");
19
- const lodash_1 = __importDefault(require("lodash"));
20
- class TWAPLib {
21
- constructor(config, maker, provider) {
22
- this.config = config;
23
- this.maker = maker;
24
- this.provider = provider;
25
- this.isNativeToken = (token) => (0, web3_candies_1.isNativeAddress)(token.address);
26
- this.isWrappedToken = (token) => (0, web3_candies_1.eqIgnoreCase)(token.address, this.config.wToken.address);
27
- this.isValidChain = (chainId) => chainId === this.config.chainId;
28
- this.maxPossibleChunks = (srcToken, srcAmount, srcUsd) => bignumber_js_1.default.max(1, (0, bignumber_js_1.default)(srcAmount).div((0, bignumber_js_1.default)(10).pow(srcToken.decimals).div(srcUsd).times(this.config.minChunkSizeUsd)))
29
- .integerValue(bignumber_js_1.default.ROUND_FLOOR)
30
- .toNumber();
31
- this.srcChunkAmount = (srcAmount, totalChunks) => (0, bignumber_js_1.default)(srcAmount).div(totalChunks).integerValue(bignumber_js_1.default.ROUND_FLOOR);
32
- this.totalChunks = (srcAmount, srcChunkAmount) => (0, bignumber_js_1.default)(srcAmount).div(srcChunkAmount).integerValue(bignumber_js_1.default.ROUND_CEIL).toNumber();
33
- this.estimatedDelayBetweenChunksMillis = () => this.config.bidDelaySeconds * 1000 * 2;
34
- /**
35
- * includes the bidding war and block settelment
36
- */
37
- this.fillDelayUiMillis = (totalChunks, maxDurationMillis) => bignumber_js_1.default.max((0, bignumber_js_1.default)(totalChunks).gt(1) ? (0, bignumber_js_1.default)(maxDurationMillis).div(totalChunks) : 0, (0, bignumber_js_1.default)(this.estimatedDelayBetweenChunksMillis())).toNumber();
38
- this.fillDelayMillis = (totalChunks, maxDurationMillis) => this.fillDelayUiMillis(totalChunks, maxDurationMillis) - this.estimatedDelayBetweenChunksMillis();
39
- this.dstMinAmountOut = (srcToken, dstToken, srcChunkAmount, limitDstPriceFor1Src, isMarketOrder) => isMarketOrder
40
- ? (0, bignumber_js_1.default)(1)
41
- : bignumber_js_1.default.max(1, (0, web3_candies_1.convertDecimals)((0, bignumber_js_1.default)(srcChunkAmount).times(limitDstPriceFor1Src), srcToken.decimals, dstToken.decimals).integerValue(bignumber_js_1.default.ROUND_FLOOR));
42
- // TODO: REMOVE
43
- this.dstPriceFor1Src = (srcToken, dstToken, srcUsdMarket, dstUsdMarket, srcChunkAmount, dstMinAmountOut) => (0, bignumber_js_1.default)(dstMinAmountOut).eq(1)
44
- ? (0, bignumber_js_1.default)(srcUsdMarket).div(dstUsdMarket)
45
- : (0, bignumber_js_1.default)(dstMinAmountOut).div((0, web3_candies_1.convertDecimals)((0, bignumber_js_1.default)(srcChunkAmount), srcToken.decimals, dstToken.decimals));
46
- this.isMarketOrder = (order) => order.ask.dstMinAmount.lte(1);
47
- this.orderProgress = (order) => parseFloat(order.srcFilledAmount.div(order.ask.srcAmount).toFixed(4));
48
- this.percentAboveMarket = (srcUsdMarket, dstUsdMarket, limitDstPriceFor1Src) => parseFloat((0, bignumber_js_1.default)(limitDstPriceFor1Src).div((0, bignumber_js_1.default)(srcUsdMarket).div(dstUsdMarket)).minus(1).toFixed(4));
49
- this.status = (order) => order.status > Date.now() / 1000
50
- ? Status.Open
51
- : order.status === 1
52
- ? Status.Canceled
53
- : order.status === 2
54
- ? Status.Completed
55
- : Status.Expired;
56
- if (provider)
57
- (0, web3_candies_1.setWeb3Instance)(new web3_1.default(provider));
58
- this.twap = (0, web3_candies_1.contract)(config.twapAbi, config.twapAddress);
59
- this.lens = (0, web3_candies_1.contract)(config.lensAbi, config.lensAddress);
60
- }
61
- makerBalance(token) {
62
- return __awaiter(this, void 0, void 0, function* () {
63
- if (this.isNativeToken(token))
64
- return (0, web3_candies_1.web3)().eth.getBalance(this.maker).then(bignumber_js_1.default);
65
- else
66
- return (0, web3_candies_1.erc20)(token.symbol, token.address, token.decimals).methods.balanceOf(this.maker).call().then(bignumber_js_1.default);
67
- });
68
- }
69
- wrapNativeToken(amount, maxPriorityFeePerGas, maxFeePerGas) {
70
- return __awaiter(this, void 0, void 0, function* () {
71
- yield (0, web3_candies_1.sendAndWaitForConfirmations)((0, web3_candies_1.erc20)(this.config.wToken.symbol, this.config.wToken.address, this.config.wToken.decimals, web3_candies_1.iwethabi).methods.deposit(), { from: this.maker, maxPriorityFeePerGas, maxFeePerGas, value: amount });
72
- });
73
- }
74
- unwrapNativeToken(amount, maxPriorityFeePerGas, maxFeePerGas) {
75
- return __awaiter(this, void 0, void 0, function* () {
76
- yield (0, web3_candies_1.sendAndWaitForConfirmations)((0, web3_candies_1.erc20)(this.config.wToken.symbol, this.config.wToken.address, this.config.wToken.decimals, web3_candies_1.iwethabi).methods.withdraw((0, bignumber_js_1.default)(amount).toFixed(0)), { from: this.maker, maxPriorityFeePerGas, maxFeePerGas });
77
- });
78
- }
79
- hasAllowance(srcToken, amount) {
80
- return __awaiter(this, void 0, void 0, function* () {
81
- if (this.isNativeToken(srcToken))
82
- return true;
83
- const token = (0, web3_candies_1.erc20)(srcToken.symbol, srcToken.address, srcToken.decimals);
84
- const allowance = (0, bignumber_js_1.default)(yield token.methods.allowance(this.maker, this.config.twapAddress).call());
85
- return allowance.gte(amount);
86
- });
87
- }
88
- approve(srcToken, amount, maxPriorityFeePerGas, maxFeePerGas) {
89
- return __awaiter(this, void 0, void 0, function* () {
90
- const token = (0, web3_candies_1.erc20)(srcToken.symbol, srcToken.address, srcToken.decimals);
91
- yield (0, web3_candies_1.sendAndWaitForConfirmations)(token.methods.approve(this.config.twapAddress, (0, bignumber_js_1.default)(amount).toFixed(0)), {
92
- from: this.maker,
93
- maxPriorityFeePerGas,
94
- maxFeePerGas,
95
- });
96
- });
97
- }
98
- validateTokens(srcToken, dstToken) {
99
- if (lodash_1.default.isEqual(srcToken, dstToken) || (this.isNativeToken(srcToken) && this.isNativeToken(dstToken)))
100
- return TokensValidation.invalid;
101
- if (this.isNativeToken(srcToken)) {
102
- if (this.isWrappedToken(dstToken))
103
- return TokensValidation.wrapOnly;
104
- return TokensValidation.wrapAndOrder;
105
- }
106
- if (this.isWrappedToken(srcToken) && this.isNativeToken(dstToken))
107
- return TokensValidation.unwrapOnly;
108
- if (this.isNativeToken(dstToken))
109
- return TokensValidation.dstTokenZero;
110
- return TokensValidation.valid;
111
- }
112
- validateOrderInputs(srcToken, dstToken, srcAmount, srcChunkAmount, dstMinChunkAmountOut, deadline, fillDelaySeconds, srcUsd) {
113
- const tokensValidation = this.validateTokens(srcToken, dstToken);
114
- if (tokensValidation === TokensValidation.invalid)
115
- return OrderInputValidation.invalidTokens;
116
- if ((0, bignumber_js_1.default)(srcAmount).lte(0))
117
- return OrderInputValidation.invalidSrcAmount;
118
- if ((0, bignumber_js_1.default)(srcChunkAmount).lte(0) || (0, bignumber_js_1.default)(srcChunkAmount).gt(srcAmount))
119
- return OrderInputValidation.invalidSrcChunkAmount;
120
- if ((0, bignumber_js_1.default)(dstMinChunkAmountOut).lte(0))
121
- return OrderInputValidation.invalidDstMinChunkAmountOut;
122
- if ((0, bignumber_js_1.default)(deadline).integerValue(bignumber_js_1.default.ROUND_FLOOR).lte(Date.now()))
123
- return OrderInputValidation.invalidDeadline;
124
- if ((0, bignumber_js_1.default)(fillDelaySeconds).integerValue(bignumber_js_1.default.ROUND_FLOOR).lt(0))
125
- return OrderInputValidation.invalidFillDelaySeconds;
126
- if ((0, bignumber_js_1.default)(srcUsd).lte(0))
127
- return OrderInputValidation.invalidSrcUsd;
128
- if ((0, bignumber_js_1.default)(srcChunkAmount)
129
- .times(srcUsd)
130
- .lt((0, bignumber_js_1.default)(this.config.minChunkSizeUsd).times((0, bignumber_js_1.default)(10).pow(srcToken.decimals))))
131
- return OrderInputValidation.invalidSmallestSrcChunkUsd;
132
- return OrderInputValidation.valid;
133
- }
134
- submitOrder(srcToken, dstToken, srcAmount, srcChunkAmount, dstMinChunkAmountOut, deadline, fillDelaySeconds, srcUsd, askDataParams = [], maxPriorityFeePerGas, maxFeePerGas) {
135
- return __awaiter(this, void 0, void 0, function* () {
136
- const validation = this.validateOrderInputs(srcToken, dstToken, srcAmount, srcChunkAmount, dstMinChunkAmountOut, deadline, fillDelaySeconds, srcUsd);
137
- if (validation !== OrderInputValidation.valid)
138
- throw new Error(`invalid inputs: ${validation}`);
139
- const askData = this.config.exchangeType === "PangolinDaasExchange"
140
- ? (0, web3_candies_1.web3)().eth.abi.encodeParameters(["address"], askDataParams)
141
- : [];
142
- const askParams = [
143
- this.config.exchangeAddress,
144
- srcToken.address,
145
- dstToken.address,
146
- (0, bignumber_js_1.default)(srcAmount).toFixed(0),
147
- (0, bignumber_js_1.default)(srcChunkAmount).toFixed(0),
148
- (0, bignumber_js_1.default)(dstMinChunkAmountOut).toFixed(0),
149
- (0, bignumber_js_1.default)(deadline).div(1000).toFixed(0),
150
- (0, bignumber_js_1.default)(this.config.bidDelaySeconds).toFixed(0),
151
- (0, bignumber_js_1.default)(fillDelaySeconds).toFixed(0),
152
- ];
153
- let ask;
154
- if (this.config.twapVersion > 3) {
155
- askParams.push(askData);
156
- ask = this.twap.methods.ask(askParams);
157
- }
158
- else {
159
- ask = this.twap.methods.ask(...askParams);
160
- }
161
- const tx = yield (0, web3_candies_1.sendAndWaitForConfirmations)(ask, {
162
- from: this.maker,
163
- maxPriorityFeePerGas,
164
- maxFeePerGas,
165
- });
166
- const events = (0, web3_candies_1.parseEvents)(tx, this.twap.options.jsonInterface);
167
- return { txHash: tx.transactionHash, orderId: Number(events[0].returnValues.id) };
168
- });
169
- }
170
- getOrder(id) {
171
- return __awaiter(this, void 0, void 0, function* () {
172
- return this.parseOrder(yield this.twap.methods.order(id).call());
173
- });
174
- }
175
- cancelOrder(id, maxPriorityFeePerGas, maxFeePerGas) {
176
- return __awaiter(this, void 0, void 0, function* () {
177
- yield (0, web3_candies_1.sendAndWaitForConfirmations)(this.twap.methods.cancel(id), {
178
- from: this.maker,
179
- maxPriorityFeePerGas,
180
- maxFeePerGas,
181
- });
182
- });
183
- }
184
- getAllOrders() {
185
- return __awaiter(this, void 0, void 0, function* () {
186
- return lodash_1.default.filter(lodash_1.default.map(yield this.lens.methods.makerOrders(this.maker).call(), (o) => this.parseOrder(o)), (o) => (0, web3_candies_1.eqIgnoreCase)(o.ask.exchange, this.config.exchangeAddress));
187
- });
188
- }
189
- getAllOrdersWithTokens() {
190
- return __awaiter(this, void 0, void 0, function* () {
191
- const orders = yield this.getAllOrders();
192
- const tokens = yield Promise.all(lodash_1.default.map(lodash_1.default.uniq(lodash_1.default.concat(lodash_1.default.map(orders, (o) => o.ask.srcToken), lodash_1.default.map(orders, (o) => o.ask.dstToken))), (a) => this.getToken(a)));
193
- return lodash_1.default.map(orders, (o) => lodash_1.default.merge(o, {
194
- srcToken: lodash_1.default.find(tokens, (t) => (0, web3_candies_1.eqIgnoreCase)(t.address, o.ask.srcToken)),
195
- dstToken: lodash_1.default.find(tokens, (t) => (0, web3_candies_1.eqIgnoreCase)(t.address, o.ask.dstToken)),
196
- }));
197
- });
198
- }
199
- parseOrder(r) {
200
- var _a, _b, _c, _d, _e, _f;
201
- return {
202
- id: Number(r.id),
203
- status: Number(r.status),
204
- time: Number(r.time || r.ask.time),
205
- filledTime: Number(r.filledTime),
206
- srcFilledAmount: (0, bignumber_js_1.default)(r.srcFilledAmount),
207
- maker: web3_1.default.utils.toChecksumAddress(r.maker || r.ask.maker),
208
- ask: {
209
- deadline: Number(r.ask.deadline),
210
- bidDelay: Number(r.ask.bidDelay),
211
- fillDelay: Number(r.ask.fillDelay),
212
- exchange: web3_1.default.utils.toChecksumAddress(r.ask.exchange),
213
- srcToken: web3_1.default.utils.toChecksumAddress(r.ask.srcToken),
214
- dstToken: web3_1.default.utils.toChecksumAddress(r.ask.dstToken),
215
- srcAmount: (0, bignumber_js_1.default)(r.ask.srcAmount),
216
- srcBidAmount: (0, bignumber_js_1.default)(r.ask.srcBidAmount),
217
- dstMinAmount: (0, bignumber_js_1.default)(r.ask.dstMinAmount),
218
- },
219
- bid: {
220
- time: Number(((_a = r.bid) === null || _a === void 0 ? void 0 : _a.time) || 0),
221
- taker: web3_1.default.utils.toChecksumAddress(((_b = r.bid) === null || _b === void 0 ? void 0 : _b.taker) || web3_candies_1.zeroAddress),
222
- exchange: web3_1.default.utils.toChecksumAddress(((_c = r.bid) === null || _c === void 0 ? void 0 : _c.exchange) || web3_candies_1.zeroAddress),
223
- dstAmount: (0, bignumber_js_1.default)(((_d = r.bid) === null || _d === void 0 ? void 0 : _d.dstAmount) || web3_candies_1.zero),
224
- dstFee: (0, bignumber_js_1.default)(((_e = r.bid) === null || _e === void 0 ? void 0 : _e.dstFee) || web3_candies_1.zero),
225
- data: ((_f = r.bid) === null || _f === void 0 ? void 0 : _f.data) || "",
226
- },
227
- };
228
- }
229
- getToken(address) {
230
- return __awaiter(this, void 0, void 0, function* () {
231
- if ((0, web3_candies_1.isNativeAddress)(address))
232
- return this.config.nativeToken;
233
- if ((0, web3_candies_1.eqIgnoreCase)(address, this.config.wToken.address))
234
- return this.config.wToken;
235
- address = web3_1.default.utils.toChecksumAddress(address);
236
- const t = (0, web3_candies_1.erc20)(address, address);
237
- const [decimals, symbol] = yield Promise.all([t.decimals(), t.methods.symbol().call()]);
238
- return { address, decimals, symbol };
239
- });
240
- }
241
- }
242
- exports.TWAPLib = TWAPLib;
243
- TWAPLib.VERSION = 4;
244
- var Status;
245
- (function (Status) {
246
- Status["Open"] = "Open";
247
- Status["Canceled"] = "Canceled";
248
- Status["Completed"] = "Completed";
249
- Status["Expired"] = "Expired";
250
- })(Status = exports.Status || (exports.Status = {}));
251
- var OrderInputValidation;
252
- (function (OrderInputValidation) {
253
- OrderInputValidation["valid"] = "valid";
254
- OrderInputValidation["invalidTokens"] = "invalidTokens";
255
- OrderInputValidation["invalidSrcAmount"] = "invalidSrcAmount";
256
- OrderInputValidation["invalidSrcChunkAmount"] = "invalidSrcChunkAmount";
257
- OrderInputValidation["invalidDstMinChunkAmountOut"] = "invalidDstMinChunkAmountOut";
258
- OrderInputValidation["invalidDeadline"] = "invalidDeadline";
259
- OrderInputValidation["invalidFillDelaySeconds"] = "invalidFillDelaySeconds";
260
- OrderInputValidation["invalidSrcUsd"] = "invalidSrcUsd";
261
- OrderInputValidation["invalidSmallestSrcChunkUsd"] = "invalidSmallestSrcChunkUsd";
262
- })(OrderInputValidation = exports.OrderInputValidation || (exports.OrderInputValidation = {}));
263
- var TokensValidation;
264
- (function (TokensValidation) {
265
- TokensValidation["valid"] = "valid";
266
- TokensValidation["invalid"] = "invalid";
267
- TokensValidation["wrapOnly"] = "wrapOnly";
268
- TokensValidation["unwrapOnly"] = "unwrapOnly";
269
- TokensValidation["wrapAndOrder"] = "wrapAndOrder";
270
- TokensValidation["dstTokenZero"] = "dstTokenZero";
271
- })(TokensValidation = exports.TokensValidation || (exports.TokensValidation = {}));