@orbs-network/twap 1.10.3 → 1.10.5

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.
@@ -1,4 +1,5 @@
1
1
  import { Paraswap } from "./paraswap";
2
+ import { Odos } from "./odos";
2
3
  export interface TokenData {
3
4
  address: string;
4
5
  decimals: number;
@@ -20,8 +21,8 @@ export interface Config {
20
21
  takerAbi: any;
21
22
  partner: string;
22
23
  exchangeAddress: string;
23
- exchangeType: "UniswapV2Exchange" | "ParaswapExchange" | "PangolinDaasExchange";
24
- pathfinderKey: Paraswap.OnlyDex;
24
+ exchangeType: "UniswapV2Exchange" | "ParaswapExchange" | "PangolinDaasExchange" | "OdosExchange";
25
+ pathfinderKey: Paraswap.OnlyDex | Odos.OnlyDex;
25
26
  }
26
27
  export declare const ChainConfigs: {
27
28
  eth: {
@@ -243,6 +244,225 @@ export declare const ChainConfigs: {
243
244
  logoUrl: string;
244
245
  };
245
246
  };
247
+ arb: {
248
+ twapAbi: ({
249
+ inputs: {
250
+ internalType: string;
251
+ name: string;
252
+ type: string;
253
+ }[];
254
+ stateMutability: string;
255
+ type: string;
256
+ anonymous?: undefined;
257
+ name?: undefined;
258
+ outputs?: undefined;
259
+ } | {
260
+ anonymous: boolean;
261
+ inputs: ({
262
+ indexed: boolean;
263
+ internalType: string;
264
+ name: string;
265
+ type: string;
266
+ components?: undefined;
267
+ } | {
268
+ components: {
269
+ internalType: string;
270
+ name: string;
271
+ type: string;
272
+ }[];
273
+ indexed: boolean;
274
+ internalType: string;
275
+ name: string;
276
+ type: string;
277
+ })[];
278
+ name: string;
279
+ type: string;
280
+ stateMutability?: undefined;
281
+ outputs?: undefined;
282
+ } | {
283
+ inputs: {
284
+ components: {
285
+ internalType: string;
286
+ name: string;
287
+ type: string;
288
+ }[];
289
+ internalType: string;
290
+ name: string;
291
+ type: string;
292
+ }[];
293
+ name: string;
294
+ outputs: {
295
+ internalType: string;
296
+ name: string;
297
+ type: string;
298
+ }[];
299
+ stateMutability: string;
300
+ type: string;
301
+ anonymous?: undefined;
302
+ } | {
303
+ inputs: {
304
+ internalType: string;
305
+ name: string;
306
+ type: string;
307
+ }[];
308
+ name: string;
309
+ outputs: ({
310
+ internalType: string;
311
+ name: string;
312
+ type: string;
313
+ components?: undefined;
314
+ } | {
315
+ components: {
316
+ internalType: string;
317
+ name: string;
318
+ type: string;
319
+ }[];
320
+ internalType: string;
321
+ name: string;
322
+ type: string;
323
+ })[];
324
+ stateMutability: string;
325
+ type: string;
326
+ anonymous?: undefined;
327
+ } | {
328
+ inputs: {
329
+ internalType: string;
330
+ name: string;
331
+ type: string;
332
+ }[];
333
+ name: string;
334
+ outputs: {
335
+ components: ({
336
+ internalType: string;
337
+ name: string;
338
+ type: string;
339
+ components?: undefined;
340
+ } | {
341
+ components: {
342
+ internalType: string;
343
+ name: string;
344
+ type: string;
345
+ }[];
346
+ internalType: string;
347
+ name: string;
348
+ type: string;
349
+ })[];
350
+ internalType: string;
351
+ name: string;
352
+ type: string;
353
+ }[];
354
+ stateMutability: string;
355
+ type: string;
356
+ anonymous?: undefined;
357
+ } | {
358
+ stateMutability: string;
359
+ type: string;
360
+ inputs?: undefined;
361
+ anonymous?: undefined;
362
+ name?: undefined;
363
+ outputs?: undefined;
364
+ })[];
365
+ lensAbi: ({
366
+ inputs: {
367
+ internalType: string;
368
+ name: string;
369
+ type: string;
370
+ }[];
371
+ stateMutability: string;
372
+ type: string;
373
+ name?: undefined;
374
+ outputs?: undefined;
375
+ } | {
376
+ inputs: never[];
377
+ name: string;
378
+ outputs: {
379
+ internalType: string;
380
+ name: string;
381
+ type: string;
382
+ }[];
383
+ stateMutability: string;
384
+ type: string;
385
+ } | {
386
+ inputs: {
387
+ internalType: string;
388
+ name: string;
389
+ type: string;
390
+ }[];
391
+ name: string;
392
+ outputs: {
393
+ components: ({
394
+ internalType: string;
395
+ name: string;
396
+ type: string;
397
+ components?: undefined;
398
+ } | {
399
+ components: {
400
+ internalType: string;
401
+ name: string;
402
+ type: string;
403
+ }[];
404
+ internalType: string;
405
+ name: string;
406
+ type: string;
407
+ })[];
408
+ internalType: string;
409
+ name: string;
410
+ type: string;
411
+ }[];
412
+ stateMutability: string;
413
+ type: string;
414
+ })[];
415
+ takerAbi: ({
416
+ inputs: {
417
+ internalType: string;
418
+ name: string;
419
+ type: string;
420
+ }[];
421
+ stateMutability: string;
422
+ type: string;
423
+ name?: undefined;
424
+ outputs?: undefined;
425
+ } | {
426
+ inputs: {
427
+ internalType: string;
428
+ name: string;
429
+ type: string;
430
+ }[];
431
+ name: string;
432
+ outputs: {
433
+ internalType: string;
434
+ name: string;
435
+ type: string;
436
+ }[];
437
+ stateMutability: string;
438
+ type: string;
439
+ } | {
440
+ stateMutability: string;
441
+ type: string;
442
+ inputs?: undefined;
443
+ name?: undefined;
444
+ outputs?: undefined;
445
+ })[];
446
+ chainName: string;
447
+ chainId: number;
448
+ twapVersion: number;
449
+ twapAddress: string;
450
+ lensAddress: string;
451
+ bidDelaySeconds: number;
452
+ minChunkSizeUsd: number;
453
+ nativeToken: {
454
+ address: string;
455
+ decimals: number;
456
+ symbol: string;
457
+ logoUrl: string;
458
+ };
459
+ wToken: {
460
+ address: string;
461
+ decimals: number;
462
+ symbol: string;
463
+ logoUrl: string;
464
+ };
465
+ };
246
466
  ftm: {
247
467
  chainName: string;
248
468
  chainId: number;
@@ -887,6 +1107,7 @@ export declare const Configs: {
887
1107
  Pangolin: Config;
888
1108
  PangolinDaas: Config;
889
1109
  QuickSwap: Config;
1110
+ Chronos: Config;
890
1111
  };
891
1112
  export declare const nativeTokenAddresses: string[];
892
1113
  export declare const isNativeAddress: (address: string) => boolean;
@@ -1108,6 +1329,224 @@ export declare const chainConfig: (chainId: number) => {
1108
1329
  symbol: string;
1109
1330
  logoUrl: string;
1110
1331
  };
1332
+ } | {
1333
+ twapAbi: ({
1334
+ inputs: {
1335
+ internalType: string;
1336
+ name: string;
1337
+ type: string;
1338
+ }[];
1339
+ stateMutability: string;
1340
+ type: string;
1341
+ anonymous?: undefined;
1342
+ name?: undefined;
1343
+ outputs?: undefined;
1344
+ } | {
1345
+ anonymous: boolean;
1346
+ inputs: ({
1347
+ indexed: boolean;
1348
+ internalType: string;
1349
+ name: string;
1350
+ type: string;
1351
+ components?: undefined;
1352
+ } | {
1353
+ components: {
1354
+ internalType: string;
1355
+ name: string;
1356
+ type: string;
1357
+ }[];
1358
+ indexed: boolean;
1359
+ internalType: string;
1360
+ name: string;
1361
+ type: string;
1362
+ })[];
1363
+ name: string;
1364
+ type: string;
1365
+ stateMutability?: undefined;
1366
+ outputs?: undefined;
1367
+ } | {
1368
+ inputs: {
1369
+ components: {
1370
+ internalType: string;
1371
+ name: string;
1372
+ type: string;
1373
+ }[];
1374
+ internalType: string;
1375
+ name: string;
1376
+ type: string;
1377
+ }[];
1378
+ name: string;
1379
+ outputs: {
1380
+ internalType: string;
1381
+ name: string;
1382
+ type: string;
1383
+ }[];
1384
+ stateMutability: string;
1385
+ type: string;
1386
+ anonymous?: undefined;
1387
+ } | {
1388
+ inputs: {
1389
+ internalType: string;
1390
+ name: string;
1391
+ type: string;
1392
+ }[];
1393
+ name: string;
1394
+ outputs: ({
1395
+ internalType: string;
1396
+ name: string;
1397
+ type: string;
1398
+ components?: undefined;
1399
+ } | {
1400
+ components: {
1401
+ internalType: string;
1402
+ name: string;
1403
+ type: string;
1404
+ }[];
1405
+ internalType: string;
1406
+ name: string;
1407
+ type: string;
1408
+ })[];
1409
+ stateMutability: string;
1410
+ type: string;
1411
+ anonymous?: undefined;
1412
+ } | {
1413
+ inputs: {
1414
+ internalType: string;
1415
+ name: string;
1416
+ type: string;
1417
+ }[];
1418
+ name: string;
1419
+ outputs: {
1420
+ components: ({
1421
+ internalType: string;
1422
+ name: string;
1423
+ type: string;
1424
+ components?: undefined;
1425
+ } | {
1426
+ components: {
1427
+ internalType: string;
1428
+ name: string;
1429
+ type: string;
1430
+ }[];
1431
+ internalType: string;
1432
+ name: string;
1433
+ type: string;
1434
+ })[];
1435
+ internalType: string;
1436
+ name: string;
1437
+ type: string;
1438
+ }[];
1439
+ stateMutability: string;
1440
+ type: string;
1441
+ anonymous?: undefined;
1442
+ } | {
1443
+ stateMutability: string;
1444
+ type: string;
1445
+ inputs?: undefined;
1446
+ anonymous?: undefined;
1447
+ name?: undefined;
1448
+ outputs?: undefined;
1449
+ })[];
1450
+ lensAbi: ({
1451
+ inputs: {
1452
+ internalType: string;
1453
+ name: string;
1454
+ type: string;
1455
+ }[];
1456
+ stateMutability: string;
1457
+ type: string;
1458
+ name?: undefined;
1459
+ outputs?: undefined;
1460
+ } | {
1461
+ inputs: never[];
1462
+ name: string;
1463
+ outputs: {
1464
+ internalType: string;
1465
+ name: string;
1466
+ type: string;
1467
+ }[];
1468
+ stateMutability: string;
1469
+ type: string;
1470
+ } | {
1471
+ inputs: {
1472
+ internalType: string;
1473
+ name: string;
1474
+ type: string;
1475
+ }[];
1476
+ name: string;
1477
+ outputs: {
1478
+ components: ({
1479
+ internalType: string;
1480
+ name: string;
1481
+ type: string;
1482
+ components?: undefined;
1483
+ } | {
1484
+ components: {
1485
+ internalType: string;
1486
+ name: string;
1487
+ type: string;
1488
+ }[];
1489
+ internalType: string;
1490
+ name: string;
1491
+ type: string;
1492
+ })[];
1493
+ internalType: string;
1494
+ name: string;
1495
+ type: string;
1496
+ }[];
1497
+ stateMutability: string;
1498
+ type: string;
1499
+ })[];
1500
+ takerAbi: ({
1501
+ inputs: {
1502
+ internalType: string;
1503
+ name: string;
1504
+ type: string;
1505
+ }[];
1506
+ stateMutability: string;
1507
+ type: string;
1508
+ name?: undefined;
1509
+ outputs?: undefined;
1510
+ } | {
1511
+ inputs: {
1512
+ internalType: string;
1513
+ name: string;
1514
+ type: string;
1515
+ }[];
1516
+ name: string;
1517
+ outputs: {
1518
+ internalType: string;
1519
+ name: string;
1520
+ type: string;
1521
+ }[];
1522
+ stateMutability: string;
1523
+ type: string;
1524
+ } | {
1525
+ stateMutability: string;
1526
+ type: string;
1527
+ inputs?: undefined;
1528
+ name?: undefined;
1529
+ outputs?: undefined;
1530
+ })[];
1531
+ chainName: string;
1532
+ chainId: number;
1533
+ twapVersion: number;
1534
+ twapAddress: string;
1535
+ lensAddress: string;
1536
+ bidDelaySeconds: number;
1537
+ minChunkSizeUsd: number;
1538
+ nativeToken: {
1539
+ address: string;
1540
+ decimals: number;
1541
+ symbol: string;
1542
+ logoUrl: string;
1543
+ };
1544
+ wToken: {
1545
+ address: string;
1546
+ decimals: number;
1547
+ symbol: string;
1548
+ logoUrl: string;
1549
+ };
1111
1550
  } | {
1112
1551
  chainName: string;
1113
1552
  chainId: number;
@@ -11,6 +11,7 @@ const TWAP_json_1 = __importDefault(require("../artifacts/contracts/TWAP.sol/TWA
11
11
  const Lens_json_1 = __importDefault(require("../artifacts/contracts/periphery/Lens.sol/Lens.json"));
12
12
  const Taker_json_1 = __importDefault(require("../artifacts/contracts/periphery/Taker.sol/Taker.json"));
13
13
  const legacy_abi_1 = require("./legacy-abi");
14
+ const odos_1 = require("./odos");
14
15
  const defaultAbis = {
15
16
  twapAbi: TWAP_json_1.default.abi,
16
17
  lensAbi: Lens_json_1.default.abi,
@@ -28,6 +29,17 @@ exports.ChainConfigs = {
28
29
  symbol: "WETH",
29
30
  logoUrl: "https://tokens.1inch.io/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.png",
30
31
  } }, defaultAbis),
32
+ arb: Object.assign({ chainName: "arb", chainId: 42161, twapVersion: 4, twapAddress: "0xD63430c74C8E70D9dbdCA04C6a9E6E9E929028DA", lensAddress: "0xD13609A8ace04D11Ea2FFE176B69dF77C6d9375E", bidDelaySeconds: 60, minChunkSizeUsd: 10, nativeToken: {
33
+ address: web3_candies_1.zeroAddress,
34
+ decimals: 18,
35
+ symbol: "ETH",
36
+ logoUrl: "https://app.1inch.io/assets/images/network-logos/arbitrum.svg",
37
+ }, wToken: {
38
+ address: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
39
+ decimals: 18,
40
+ symbol: "WETH",
41
+ logoUrl: "https://tokens.1inch.io/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.png",
42
+ } }, defaultAbis),
31
43
  ftm: {
32
44
  chainName: "ftm",
33
45
  chainId: 250,
@@ -81,6 +93,7 @@ exports.Configs = {
81
93
  Pangolin: Object.assign(Object.assign({}, exports.ChainConfigs.avax), { partner: "Pangolin", exchangeAddress: "0xf2d96E7BE676153d202e1453804E2749923C7c5b", exchangeType: "UniswapV2Exchange", pathfinderKey: paraswap_1.Paraswap.OnlyDex.Pangolin }),
82
94
  PangolinDaas: Object.assign(Object.assign({}, exports.ChainConfigs.avax), { partner: "PangolinDaas", exchangeAddress: "0x1579EED0527781B1A748043AA1f59a3858Ace4a7", exchangeType: "PangolinDaasExchange", pathfinderKey: paraswap_1.Paraswap.OnlyDex.Pangolin }),
83
95
  QuickSwap: Object.assign(Object.assign({}, exports.ChainConfigs.poly), { partner: "QuickSwap", exchangeAddress: "0x26D0ec4Be402BCE03AAa8aAf0CF67e9428ba54eF", exchangeType: "ParaswapExchange", pathfinderKey: paraswap_1.Paraswap.OnlyDex.QuickSwap }),
96
+ Chronos: Object.assign(Object.assign({}, exports.ChainConfigs.arb), { partner: "Chronos", exchangeAddress: "0xA0b07F9a11dFb01388149abBdbc5B4f2196600AB", exchangeType: "OdosExchange", pathfinderKey: odos_1.Odos.OnlyDex.Chronos }),
84
97
  };
85
98
  exports.nativeTokenAddresses = [
86
99
  web3_candies_1.zeroAddress,
@@ -1,3 +1,4 @@
1
1
  export * from "./lib";
2
2
  export * from "./configs";
3
3
  export * from "./paraswap";
4
+ export * from "./odos";
package/dist/src/index.js CHANGED
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./lib"), exports);
18
18
  __exportStar(require("./configs"), exports);
19
19
  __exportStar(require("./paraswap"), exports);
20
+ __exportStar(require("./odos"), exports);
package/dist/src/lib.d.ts CHANGED
@@ -3,6 +3,7 @@ import BN from "bignumber.js";
3
3
  import type { TWAP } from "../typechain-hardhat/contracts";
4
4
  import type { Lens } from "../typechain-hardhat/contracts/periphery";
5
5
  import { Paraswap } from "./paraswap";
6
+ import { Odos } from "./odos";
6
7
  export declare class TWAPLib {
7
8
  config: Config;
8
9
  maker: string;
@@ -47,19 +48,27 @@ export declare class TWAPLib {
47
48
  })[]>;
48
49
  parseOrder(r: any): Order;
49
50
  getToken(address: string): Promise<TokenData>;
51
+ findRoute(srcToken: TokenData, dstToken: TokenData, srcAmount: BN.Value): Promise<{
52
+ srcToken: TokenData;
53
+ dstToken: TokenData;
54
+ srcAmount: BN.Value;
55
+ dstAmount: BN;
56
+ raw: string[] | Paraswap.ParaswapRoute | Odos.OdosRoute;
57
+ data: string;
58
+ }>;
50
59
  findSwapDataForBid(order: Order): Promise<{
51
60
  srcToken: TokenData;
52
61
  dstToken: TokenData;
53
- srcNextChunkAmountIn: BN;
54
- dstNextChunkAmountOut: BN;
55
- raw: string[] | Paraswap.ParaswapRoute;
62
+ srcAmount: BN.Value;
63
+ dstAmount: BN;
64
+ raw: string[] | Paraswap.ParaswapRoute | Odos.OdosRoute;
56
65
  data: string;
57
66
  }>;
58
- convertRouteToSwapData(route: Paraswap.ParaswapRoute): Promise<{
67
+ convertRouteToSwapData(route: Paraswap.ParaswapRoute | Odos.OdosRoute): Promise<{
59
68
  raw: string[];
60
69
  data: string;
61
70
  } | {
62
- raw: Paraswap.ParaswapRoute;
71
+ raw: Paraswap.ParaswapRoute | Odos.OdosRoute;
63
72
  data: string;
64
73
  }>;
65
74
  }
package/dist/src/lib.js CHANGED
@@ -19,6 +19,7 @@ const bignumber_js_1 = __importDefault(require("bignumber.js"));
19
19
  const web3_candies_1 = require("@defi.org/web3-candies");
20
20
  const paraswap_1 = require("./paraswap");
21
21
  const lodash_1 = __importDefault(require("lodash"));
22
+ const odos_1 = require("./odos");
22
23
  class TWAPLib {
23
24
  constructor(config, maker, provider) {
24
25
  this.config = config;
@@ -240,6 +241,22 @@ class TWAPLib {
240
241
  return { address, decimals, symbol };
241
242
  });
242
243
  }
244
+ findRoute(srcToken, dstToken, srcAmount) {
245
+ return __awaiter(this, void 0, void 0, function* () {
246
+ if (this.config.exchangeType === "OdosExchange") {
247
+ const route = yield odos_1.Odos.findRoute(this.config.chainId, srcToken, dstToken, srcAmount, this.config.exchangeAddress, this.config.pathfinderKey);
248
+ const dstAmount = route.dstAmountOut;
249
+ const { raw, data } = yield this.convertRouteToSwapData(route);
250
+ return { srcToken, dstToken, srcAmount, dstAmount, raw, data };
251
+ }
252
+ else {
253
+ const route = yield paraswap_1.Paraswap.findRoute(this.config.chainId, srcToken, dstToken, srcAmount, this.config.pathfinderKey);
254
+ const dstAmount = (0, bignumber_js_1.default)(route.destAmount);
255
+ const { raw, data } = yield this.convertRouteToSwapData(route);
256
+ return { srcToken, dstToken, srcAmount, dstAmount, raw, data };
257
+ }
258
+ });
259
+ }
243
260
  findSwapDataForBid(order) {
244
261
  return __awaiter(this, void 0, void 0, function* () {
245
262
  if (order.ask.exchange !== web3_candies_1.zeroAddress && !(0, web3_candies_1.eqIgnoreCase)(order.ask.exchange, this.config.exchangeAddress))
@@ -249,10 +266,7 @@ class TWAPLib {
249
266
  this.getToken(order.ask.srcToken),
250
267
  this.getToken(order.ask.dstToken),
251
268
  ]);
252
- const route = yield paraswap_1.Paraswap.findRoute(this.config.chainId, srcToken, dstToken, srcNextChunkAmountIn, this.config.pathfinderKey);
253
- const dstNextChunkAmountOut = (0, bignumber_js_1.default)(route.destAmount);
254
- const { raw, data } = yield this.convertRouteToSwapData(route);
255
- return { srcToken, dstToken, srcNextChunkAmountIn, dstNextChunkAmountOut, raw, data };
269
+ return this.findRoute(srcToken, dstToken, srcNextChunkAmountIn);
256
270
  });
257
271
  }
258
272
  convertRouteToSwapData(route) {
@@ -270,6 +284,11 @@ class TWAPLib {
270
284
  raw: route,
271
285
  data: yield paraswap_1.Paraswap.buildSwapData(route, this.config.twapAddress),
272
286
  };
287
+ case "OdosExchange":
288
+ return {
289
+ raw: route,
290
+ data: route.data,
291
+ };
273
292
  default:
274
293
  throw new Error(`unhandled exchange ${this.config.exchangeType}`);
275
294
  }
@@ -0,0 +1,15 @@
1
+ import { BN } from "@defi.org/web3-candies";
2
+ import { TokenData } from "./configs";
3
+ export declare namespace Odos {
4
+ enum OnlyDex {
5
+ Chronos = "Chronos Stable,Chronos Volatile,Wrapped Ether"
6
+ }
7
+ interface OdosRoute {
8
+ pathId: string;
9
+ dstAmountOut: BN;
10
+ srcUsd: BN;
11
+ data: string;
12
+ }
13
+ function priceUsd(chainId: number, token: TokenData): Promise<BN>;
14
+ function findRoute(chainId: number, src: TokenData, dst: TokenData, amountIn: BN.Value, exchangeAdapter: string, onlyDex?: OnlyDex): Promise<OdosRoute>;
15
+ }
@@ -0,0 +1,81 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.Odos = void 0;
13
+ const web3_candies_1 = require("@defi.org/web3-candies");
14
+ const configs_1 = require("./configs");
15
+ var Odos;
16
+ (function (Odos) {
17
+ const URL = "https://api.odos.xyz";
18
+ let OnlyDex;
19
+ (function (OnlyDex) {
20
+ OnlyDex["Chronos"] = "Chronos Stable,Chronos Volatile,Wrapped Ether";
21
+ })(OnlyDex = Odos.OnlyDex || (Odos.OnlyDex = {}));
22
+ function priceUsd(chainId, token) {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ token = (0, configs_1.isNativeAddress)(token.address) ? (0, configs_1.chainConfig)(chainId).wToken : token;
25
+ const r = yield findRoute(chainId, token, (0, configs_1.chainConfig)(chainId).nativeToken, (0, web3_candies_1.BN)(10).pow(token.decimals), web3_candies_1.zeroAddress);
26
+ return r.srcUsd;
27
+ });
28
+ }
29
+ Odos.priceUsd = priceUsd;
30
+ function findRoute(chainId, src, dst, amountIn, exchangeAdapter, onlyDex) {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ const response = yield fetch(`${URL}/sor/quote`, {
33
+ method: "POST",
34
+ headers: { "Content-Type": "application/json", accept: "application/json" },
35
+ body: JSON.stringify({
36
+ chainId,
37
+ inputTokens: [{ tokenAddress: src.address, amount: amountIn.toString() }],
38
+ outputTokens: [{ tokenAddress: dst.address, proportion: 1 }],
39
+ slippageLimitPercent: 50,
40
+ userAddr: exchangeAdapter,
41
+ sourceWhitelist: (onlyDex === null || onlyDex === void 0 ? void 0 : onlyDex.split(",")) || [],
42
+ simulate: false,
43
+ }),
44
+ });
45
+ if (response.status < 200 || response.status >= 400)
46
+ throw new Error(`${response.statusText}`);
47
+ const j = yield response.json();
48
+ const pathId = j.pathId;
49
+ const srcUsd = (0, web3_candies_1.bn)(j.inValues[0]);
50
+ const dstAmountOut = (0, web3_candies_1.bn)(j.outAmounts[0]);
51
+ const data = yield buildSwapData(pathId, dstAmountOut, exchangeAdapter);
52
+ return {
53
+ pathId,
54
+ dstAmountOut,
55
+ srcUsd,
56
+ data,
57
+ };
58
+ });
59
+ }
60
+ Odos.findRoute = findRoute;
61
+ function buildSwapData(pathId, dstAmountOut, exchangeAdapter) {
62
+ var _a, _b;
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ const response = yield fetch(`${URL}/sor/assemble`, {
65
+ method: "POST",
66
+ headers: { accept: "application/json", "Content-Type": "application/json" },
67
+ body: JSON.stringify({
68
+ pathId,
69
+ userAddr: exchangeAdapter,
70
+ simulate: false,
71
+ }),
72
+ });
73
+ if (response.status < 200 || response.status >= 400)
74
+ throw new Error(`${response.statusText}`);
75
+ const swapData = (_b = (_a = (yield response.json())) === null || _a === void 0 ? void 0 : _a.transaction) === null || _b === void 0 ? void 0 : _b.data;
76
+ if (!swapData)
77
+ throw new Error(`invalid swap data from Odos`);
78
+ return (0, web3_candies_1.web3)().eth.abi.encodeParameters(["uint256", "bytes"], [dstAmountOut.toFixed(0), swapData]);
79
+ });
80
+ }
81
+ })(Odos = exports.Odos || (exports.Odos = {}));
@@ -64,7 +64,7 @@ var Paraswap;
64
64
  amount: amountIn.toString(),
65
65
  network: chainId.toString(),
66
66
  side: "SELL",
67
- maxImpact: "100",
67
+ maxImpact: "50",
68
68
  includeDEXS: onlyDex || "",
69
69
  partner: ((_b = (_a = onlyDex === null || onlyDex === void 0 ? void 0 : onlyDex.toLowerCase()) === null || _a === void 0 ? void 0 : _a.split(",")) === null || _b === void 0 ? void 0 : _b[0]) || "",
70
70
  otherExchangePrices: otherExchanges.toString(),
@@ -0,0 +1,23 @@
1
+ /// <reference types="node" />
2
+ import type BigNumber from "bignumber.js";
3
+ import type { ContractOptions } from "web3-eth-contract";
4
+ import type { EventLog } from "web3-core";
5
+ import type { EventEmitter } from "events";
6
+ import type { Callback, NonPayableTransactionObject, BlockType, BaseContract } from "../../types";
7
+ export interface EventOptions {
8
+ filter?: object;
9
+ fromBlock?: BlockType;
10
+ topics?: string[];
11
+ }
12
+ export interface OdosExchange extends BaseContract {
13
+ constructor(jsonInterface: any[], address?: string, options?: ContractOptions): OdosExchange;
14
+ clone(): OdosExchange;
15
+ methods: {
16
+ getAmountOut(arg0: string, arg1: string, arg2: number | string | BigNumber, arg3: string | number[], bidData: string | number[]): NonPayableTransactionObject<string>;
17
+ odos(): NonPayableTransactionObject<string>;
18
+ swap(_srcToken: string, _dstToken: string, amountIn: number | string | BigNumber, amountOutMin: number | string | BigNumber, arg4: string | number[], bidData: string | number[]): NonPayableTransactionObject<void>;
19
+ };
20
+ events: {
21
+ allEvents(options?: EventOptions, cb?: Callback<EventLog>): EventEmitter;
22
+ };
23
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /* Autogenerated file. Do not edit manually. */
3
+ /* tslint:disable */
4
+ /* eslint-disable */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -4,3 +4,4 @@ import type * as paraswapExchangeSol from "./ParaswapExchange.sol";
4
4
  export type { paraswapExchangeSol };
5
5
  import type * as uniswapV2ExchangeSol from "./UniswapV2Exchange.sol";
6
6
  export type { uniswapV2ExchangeSol };
7
+ export type { OdosExchange } from "./OdosExchange";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbs-network/twap",
3
- "version": "1.10.3",
3
+ "version": "1.10.5",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/orbs-network/twap.git"
@@ -25,12 +25,13 @@
25
25
  "prebuild": "npm run prettier && npm run typechain",
26
26
  "build": "hardhat compile && solhint 'contracts/**/*.sol' && tsc && hardhat github-pages",
27
27
  "prepublishOnly": "npm run build",
28
- "test:logs": "for t in eth ftm poly avax; do DEBUG=web3-candies npm run test:$t -- --logs; done",
29
- "test": "for t in eth ftm poly avax; do npm run test:$t; done",
28
+ "test:logs": "for t in eth ftm poly avax arb; do DEBUG=web3-candies npm run test:$t -- --logs; done",
29
+ "test": "for t in eth ftm poly avax arb; do npm run test:$t; done",
30
30
  "test:eth": "NETWORK=ETH BLOCK=14905987 hardhat test",
31
31
  "test:ftm": "NETWORK=FTM BLOCK=39800909 hardhat test",
32
32
  "test:poly": "NETWORK=POLY BLOCK=29174252 hardhat test",
33
- "test:avax": "NETWORK=AVAX BLOCK=15609313 hardhat test"
33
+ "test:avax": "NETWORK=AVAX BLOCK=15609313 hardhat test",
34
+ "test:arb": "NETWORK=ARB hardhat test"
34
35
  },
35
36
  "prettier": {
36
37
  "printWidth": 120