@alcorexchange/alcor-swap-sdk 1.1.0 → 1.1.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.
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.CurrencyAmount = void 0;
7
- var _msgpackLite = _interopRequireDefault(require("msgpack-lite"));
7
+ var _msgpack = require("@msgpack/msgpack");
8
8
  var _tinyInvariant = _interopRequireDefault(require("tiny-invariant"));
9
9
  var _token = require("../token");
10
10
  var _fraction = require("./fraction");
@@ -153,12 +153,12 @@ let CurrencyAmount = exports.CurrencyAmount = /*#__PURE__*/function (_Fraction)
153
153
  numerator: amount.numerator.toString(),
154
154
  denominator: amount.denominator.toString()
155
155
  };
156
- return _msgpackLite.default.encode(json);
156
+ return (0, _msgpack.encode)(json);
157
157
  }
158
158
  }, {
159
159
  key: "fromBuffer",
160
160
  value: function fromBuffer(buffer) {
161
- const json = _msgpackLite.default.decode(buffer);
161
+ const json = (0, _msgpack.decode)(buffer);
162
162
  return this.fromJSON(json);
163
163
  }
164
164
  }]);
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Pool = void 0;
7
- var _msgpackLite = _interopRequireDefault(require("msgpack-lite"));
7
+ var _msgpack = require("@msgpack/msgpack");
8
8
  var _fractions = require("./fractions");
9
9
  var _token = require("./token");
10
10
  var _internalConstants = require("../internalConstants");
@@ -195,7 +195,7 @@ let Pool = exports.Pool = /*#__PURE__*/function () {
195
195
  } = this.swap(zeroForOne, outputAmount.quotient * _internalConstants.NEGATIVE_ONE, sqrtPriceLimitX64);
196
196
  const inputToken = zeroForOne ? this.tokenA : this.tokenB;
197
197
  const inputAmount = zeroForOne ? amountA : amountB;
198
- const amountOutReceived = zeroForOne ? amountB : amountA * _internalConstants.NEGATIVE_ONE;
198
+ const amountOutReceived = zeroForOne ? amountB * _internalConstants.NEGATIVE_ONE : amountA * _internalConstants.NEGATIVE_ONE;
199
199
  if (!(amountOutReceived === outputAmount.quotient)) {
200
200
  throw new _errors.InsufficientReservesError();
201
201
  }
@@ -355,7 +355,7 @@ let Pool = exports.Pool = /*#__PURE__*/function () {
355
355
  value: function toBuffer(pool) {
356
356
  if (pool.buffer) return pool.buffer;
357
357
  const json = Pool.toJSON(pool);
358
- pool.buffer = _msgpackLite.default.encode(json);
358
+ pool.buffer = (0, _msgpack.encode)(json);
359
359
  const hash = Pool.createHash(pool.buffer, pool);
360
360
  if (hash) pool.bufferHash = hash;
361
361
  return pool.buffer;
@@ -374,7 +374,7 @@ let Pool = exports.Pool = /*#__PURE__*/function () {
374
374
  if (bufferHash && this.hashToPoolMap.has(bufferHash)) {
375
375
  return this.hashToPoolMap.get(bufferHash);
376
376
  }
377
- const json = _msgpackLite.default.decode(bytes);
377
+ const json = (0, _msgpack.decode)(bytes);
378
378
  const pool = Pool.fromJSON(json);
379
379
  if (bufferHash) this.hashToPoolMap.set(bufferHash, pool);
380
380
  this.idToPoolMap.set(pool.id, pool);
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Route = void 0;
7
- var _msgpackLite = _interopRequireDefault(require("msgpack-lite"));
7
+ var _msgpack = require("@msgpack/msgpack");
8
8
  var _tinyInvariant = _interopRequireDefault(require("tiny-invariant"));
9
9
  var _fractions = require("./fractions");
10
10
  var _token = require("./token");
@@ -127,12 +127,12 @@ let Route = exports.Route = /*#__PURE__*/function () {
127
127
  key: "toBuffer",
128
128
  value: function toBuffer(route, lightWeightVersion = false) {
129
129
  const json = this.toJSON(route, lightWeightVersion);
130
- return _msgpackLite.default.encode(json);
130
+ return (0, _msgpack.encode)(json);
131
131
  }
132
132
  }, {
133
133
  key: "fromBuffer",
134
134
  value: function fromBuffer(buffer) {
135
- const json = _msgpackLite.default.decode(buffer);
135
+ const json = (0, _msgpack.decode)(buffer);
136
136
  return this.fromJSON(json);
137
137
  }
138
138
  }, {
@@ -151,7 +151,7 @@ let Route = exports.Route = /*#__PURE__*/function () {
151
151
  output: _token.Token.toJSON(route.output),
152
152
  _midPrice: route._midPrice
153
153
  };
154
- return _msgpackLite.default.encode(json);
154
+ return (0, _msgpack.encode)(json);
155
155
  }
156
156
  }]);
157
157
  }();
@@ -492,8 +492,38 @@ let Trade = exports.Trade = /*#__PURE__*/function () {
492
492
  key: "bestTradeExactOut",
493
493
  value: function bestTradeExactOut(routes, currencyAmountOut, maxNumResults = 1) {
494
494
  (0, _tinyInvariant.default)(routes.length > 0, 'ROUTES');
495
+
496
+ // Pre-filter: remove routes with zero-liquidity pools
497
+ const validRoutes = routes.filter(route => route.pools.every(pool => pool.active && pool.liquidity > _internalConstants.ZERO));
498
+
499
+ // Helper: compute min liquidity (no overflow)
500
+ const getMinLiquidity = route => {
501
+ let min = route.pools[0].liquidity;
502
+ for (let i = 1; i < route.pools.length; i++) {
503
+ if (route.pools[i].liquidity < min) {
504
+ min = route.pools[i].liquidity;
505
+ }
506
+ }
507
+ return min;
508
+ };
509
+
510
+ // Precompute min liquidity for sorting
511
+ const routeMinLiq = new Map();
512
+ for (const route of validRoutes) {
513
+ routeMinLiq.set(route, getMinLiquidity(route));
514
+ }
515
+
516
+ // Sort routes: fewer hops first, then by min liquidity desc
517
+ validRoutes.sort((a, b) => {
518
+ if (a.pools.length !== b.pools.length) return a.pools.length - b.pools.length;
519
+ const minLiqA = routeMinLiq.get(a);
520
+ const minLiqB = routeMinLiq.get(b);
521
+ if (minLiqA > minLiqB) return -1;
522
+ if (minLiqA < minLiqB) return 1;
523
+ return 0;
524
+ });
495
525
  const bestTrades = [];
496
- for (const route of routes) {
526
+ for (const route of validRoutes) {
497
527
  let trade;
498
528
  try {
499
529
  trade = Trade.fromRoute(route, currencyAmountOut, _internalConstants.TradeType.EXACT_OUTPUT);
@@ -504,7 +534,7 @@ let Trade = exports.Trade = /*#__PURE__*/function () {
504
534
  }
505
535
  throw error;
506
536
  }
507
- if (!trade.inputAmount.greaterThan(0) || !trade.priceImpact.greaterThan(0)) continue;
537
+ if (!trade.inputAmount.greaterThan(0)) continue;
508
538
  (0, _sortedInsert.sortedInsert)(bestTrades, trade, maxNumResults, tradeComparator);
509
539
  }
510
540
  return bestTrades;
@@ -14,7 +14,7 @@ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf
14
14
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
15
15
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
16
16
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
17
- import msgpack from "msgpack-lite";
17
+ import { decode, encode } from "@msgpack/msgpack";
18
18
  import invariant from "tiny-invariant";
19
19
  import { Token } from "../token";
20
20
  import { Fraction } from "./fraction";
@@ -146,12 +146,12 @@ export let CurrencyAmount = /*#__PURE__*/function (_Fraction) {
146
146
  numerator: amount.numerator.toString(),
147
147
  denominator: amount.denominator.toString()
148
148
  };
149
- return msgpack.encode(json);
149
+ return encode(json);
150
150
  }
151
151
  }, {
152
152
  key: "fromBuffer",
153
153
  value: function fromBuffer(buffer) {
154
- const json = msgpack.decode(buffer);
154
+ const json = decode(buffer);
155
155
  return this.fromJSON(json);
156
156
  }
157
157
  }]);
@@ -5,7 +5,7 @@ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r),
5
5
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
6
6
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
7
7
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
- import msgpack from "msgpack-lite";
8
+ import { decode, encode } from "@msgpack/msgpack";
9
9
  // Avoid importing node crypto at module load so browser bundles can tree-shake/ignore it.
10
10
  const getNodeCrypto = () => {
11
11
  try {
@@ -189,7 +189,7 @@ export let Pool = /*#__PURE__*/function () {
189
189
  } = this.swap(zeroForOne, outputAmount.quotient * NEGATIVE_ONE, sqrtPriceLimitX64);
190
190
  const inputToken = zeroForOne ? this.tokenA : this.tokenB;
191
191
  const inputAmount = zeroForOne ? amountA : amountB;
192
- const amountOutReceived = zeroForOne ? amountB : amountA * NEGATIVE_ONE;
192
+ const amountOutReceived = zeroForOne ? amountB * NEGATIVE_ONE : amountA * NEGATIVE_ONE;
193
193
  if (!(amountOutReceived === outputAmount.quotient)) {
194
194
  throw new InsufficientReservesError();
195
195
  }
@@ -349,7 +349,7 @@ export let Pool = /*#__PURE__*/function () {
349
349
  value: function toBuffer(pool) {
350
350
  if (pool.buffer) return pool.buffer;
351
351
  const json = Pool.toJSON(pool);
352
- pool.buffer = msgpack.encode(json);
352
+ pool.buffer = encode(json);
353
353
  const hash = Pool.createHash(pool.buffer, pool);
354
354
  if (hash) pool.bufferHash = hash;
355
355
  return pool.buffer;
@@ -368,7 +368,7 @@ export let Pool = /*#__PURE__*/function () {
368
368
  if (bufferHash && this.hashToPoolMap.has(bufferHash)) {
369
369
  return this.hashToPoolMap.get(bufferHash);
370
370
  }
371
- const json = msgpack.decode(bytes);
371
+ const json = decode(bytes);
372
372
  const pool = Pool.fromJSON(json);
373
373
  if (bufferHash) this.hashToPoolMap.set(bufferHash, pool);
374
374
  this.idToPoolMap.set(pool.id, pool);
@@ -4,7 +4,7 @@ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r),
4
4
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
5
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
6
6
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
- import msgpack from "msgpack-lite";
7
+ import { decode, encode } from "@msgpack/msgpack";
8
8
  import invariant from 'tiny-invariant';
9
9
  import { Price } from './fractions';
10
10
  import { Token } from './token';
@@ -121,12 +121,12 @@ export let Route = /*#__PURE__*/function () {
121
121
  key: "toBuffer",
122
122
  value: function toBuffer(route, lightWeightVersion = false) {
123
123
  const json = this.toJSON(route, lightWeightVersion);
124
- return msgpack.encode(json);
124
+ return encode(json);
125
125
  }
126
126
  }, {
127
127
  key: "fromBuffer",
128
128
  value: function fromBuffer(buffer) {
129
- const json = msgpack.decode(buffer);
129
+ const json = decode(buffer);
130
130
  return this.fromJSON(json);
131
131
  }
132
132
  }, {
@@ -145,7 +145,7 @@ export let Route = /*#__PURE__*/function () {
145
145
  output: Token.toJSON(route.output),
146
146
  _midPrice: route._midPrice
147
147
  };
148
- return msgpack.encode(json);
148
+ return encode(json);
149
149
  }
150
150
  }]);
151
151
  }();
@@ -483,8 +483,38 @@ export let Trade = /*#__PURE__*/function () {
483
483
  key: "bestTradeExactOut",
484
484
  value: function bestTradeExactOut(routes, currencyAmountOut, maxNumResults = 1) {
485
485
  invariant(routes.length > 0, 'ROUTES');
486
+
487
+ // Pre-filter: remove routes with zero-liquidity pools
488
+ const validRoutes = routes.filter(route => route.pools.every(pool => pool.active && pool.liquidity > ZERO));
489
+
490
+ // Helper: compute min liquidity (no overflow)
491
+ const getMinLiquidity = route => {
492
+ let min = route.pools[0].liquidity;
493
+ for (let i = 1; i < route.pools.length; i++) {
494
+ if (route.pools[i].liquidity < min) {
495
+ min = route.pools[i].liquidity;
496
+ }
497
+ }
498
+ return min;
499
+ };
500
+
501
+ // Precompute min liquidity for sorting
502
+ const routeMinLiq = new Map();
503
+ for (const route of validRoutes) {
504
+ routeMinLiq.set(route, getMinLiquidity(route));
505
+ }
506
+
507
+ // Sort routes: fewer hops first, then by min liquidity desc
508
+ validRoutes.sort((a, b) => {
509
+ if (a.pools.length !== b.pools.length) return a.pools.length - b.pools.length;
510
+ const minLiqA = routeMinLiq.get(a);
511
+ const minLiqB = routeMinLiq.get(b);
512
+ if (minLiqA > minLiqB) return -1;
513
+ if (minLiqA < minLiqB) return 1;
514
+ return 0;
515
+ });
486
516
  const bestTrades = [];
487
- for (const route of routes) {
517
+ for (const route of validRoutes) {
488
518
  let trade;
489
519
  try {
490
520
  trade = Trade.fromRoute(route, currencyAmountOut, TradeType.EXACT_OUTPUT);
@@ -495,7 +525,7 @@ export let Trade = /*#__PURE__*/function () {
495
525
  }
496
526
  throw error;
497
527
  }
498
- if (!trade.inputAmount.greaterThan(0) || !trade.priceImpact.greaterThan(0)) continue;
528
+ if (!trade.inputAmount.greaterThan(0)) continue;
499
529
  sortedInsert(bestTrades, trade, maxNumResults, tradeComparator);
500
530
  }
501
531
  return bestTrades;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alcorexchange/alcor-swap-sdk",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "module": "build/esm/index.js",
@@ -72,6 +72,7 @@
72
72
  "workerpool": "^9.2.0"
73
73
  },
74
74
  "dependencies": {
75
+ "@msgpack/msgpack": "^3.1.2",
75
76
  "big.js": "^5.2.2",
76
77
  "decimal.js-light": "^2.5.0",
77
78
  "eos-common": "^0.12.0",
@@ -79,7 +80,6 @@
79
80
  "eosjs-account-name": "2.3.0",
80
81
  "lodash": "^4.17.21",
81
82
  "mnemonist": "^0.39.8",
82
- "msgpack-lite": "^0.1.26",
83
83
  "node-fetch": "2",
84
84
  "tiny-invariant": "^1.1.0",
85
85
  "tiny-warning": "^1.0.3",