@gearbox-protocol/sdk 8.24.4 → 8.24.6

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.
@@ -24,6 +24,7 @@ module.exports = __toCommonJS(AbstractRouterContract_exports);
24
24
  var import_base = require("../base/index.js");
25
25
  var import_utils = require("../utils/index.js");
26
26
  var import_internal = require("../utils/internal/index.js");
27
+ var import_helpers = require("./helpers.js");
27
28
  class AbstractRouterContract extends import_base.BaseContract {
28
29
  hooks = new import_internal.Hooks();
29
30
  addHook = this.hooks.addHook.bind(this.hooks);
@@ -38,7 +39,7 @@ class AbstractRouterContract extends import_base.BaseContract {
38
39
  expected.upsert(token, { token, balance: actual > 10n ? actual : 0n });
39
40
  leftover.upsert(token, {
40
41
  token,
41
- balance: leftoverBalances.get(token)?.balance || 1n
42
+ balance: (0, import_helpers.limitLeftover)(leftoverBalances.get(token)?.balance || 1n, token) ?? 1n
42
43
  });
43
44
  }
44
45
  return {
@@ -58,7 +59,10 @@ class AbstractRouterContract extends import_base.BaseContract {
58
59
  const decimals = this.sdk.tokensMeta.decimals(token);
59
60
  const minBalance = 10n ** BigInt(Math.max(8, decimals) - 8);
60
61
  if (keepAssetsSet.has(token.toLowerCase()) || balance < minBalance || !isEnabled) {
61
- leftoverBalances.upsert(token, { token, balance });
62
+ leftoverBalances.upsert(token, {
63
+ token,
64
+ balance: (0, import_helpers.limitLeftover)(balance, token) ?? balance
65
+ });
62
66
  }
63
67
  }
64
68
  return {
@@ -77,7 +77,7 @@ class RouterV300Contract extends import_AbstractRouterContract.AbstractRouterCon
77
77
  tokenOut,
78
78
  connectors,
79
79
  amount,
80
- leftoverAmount
80
+ leftoverAmount: (0, import_helpers.limitLeftover)(leftoverAmount, tokenIn) ?? 0n
81
81
  };
82
82
  const { result } = await this.contract.simulate.findAllSwaps(
83
83
  [swapTask, BigInt(slippage)],
@@ -151,7 +151,7 @@ class RouterV300Contract extends import_AbstractRouterContract.AbstractRouterCon
151
151
  }));
152
152
  const leftover = cm.collateralTokens.map((token) => ({
153
153
  token,
154
- balance: leftoverMap.get(token) ?? 0n
154
+ balance: (0, import_helpers.limitLeftover)(leftoverMap.get(token), token) ?? 0n
155
155
  }));
156
156
  const connectors = this.getAvailableConnectors(cm.collateralTokens);
157
157
  const {
@@ -196,7 +196,12 @@ class RouterV300Contract extends import_AbstractRouterContract.AbstractRouterCon
196
196
  slippage,
197
197
  balances
198
198
  }) {
199
- const { pathOptions, expected, leftover, connectors } = this.getFindClosePathInput(
199
+ const {
200
+ pathOptions,
201
+ expected,
202
+ leftover: leftoverUnsafe,
203
+ connectors
204
+ } = this.getFindClosePathInput(
200
205
  ca,
201
206
  cm,
202
207
  balances ? {
@@ -205,6 +210,10 @@ class RouterV300Contract extends import_AbstractRouterContract.AbstractRouterCon
205
210
  tokensToClaim: (0, import_helpers.assetsMap)(balances.tokensToClaim || [])
206
211
  } : void 0
207
212
  );
213
+ const leftover = leftoverUnsafe.map((a) => ({
214
+ ...a,
215
+ balance: (0, import_helpers.limitLeftover)(a.balance, a.token) ?? 0n
216
+ }));
208
217
  await this.hooks.triggerHooks("foundPathOptions", {
209
218
  creditAccount: ca.creditAccount,
210
219
  pathOptions,
@@ -267,6 +276,10 @@ class RouterV300Contract extends import_AbstractRouterContract.AbstractRouterCon
267
276
  balances,
268
277
  keepAssets
269
278
  );
279
+ const leftover = leftoverBalances.values().map((a) => ({
280
+ ...a,
281
+ balance: (0, import_helpers.limitLeftover)(a.balance, a.token) ?? 0n
282
+ }));
270
283
  const pathOptions = import_PathOptionFactory.PathOptionFactory.generatePathOptions(
271
284
  ca.tokens,
272
285
  this.provider.networkType,
@@ -275,7 +288,7 @@ class RouterV300Contract extends import_AbstractRouterContract.AbstractRouterCon
275
288
  const connectors = this.getAvailableConnectors(cm.collateralTokens);
276
289
  return {
277
290
  expected: expectedBalances.values(),
278
- leftover: leftoverBalances.values(),
291
+ leftover,
279
292
  connectors,
280
293
  pathOptions
281
294
  };
@@ -103,7 +103,7 @@ class RouterV310Contract extends import_AbstractRouterContract.AbstractRouterCon
103
103
  (token) => ({
104
104
  token,
105
105
  balance: expectedMap.get(token) ?? 0n,
106
- leftoverBalance: leftoverMap.get(token) ?? 0n,
106
+ leftoverBalance: (0, import_helpers.limitLeftover)(leftoverMap.get(token), token) ?? 0n,
107
107
  numSplits: getNumSplits(token),
108
108
  claimRewards: false
109
109
  })
@@ -187,7 +187,7 @@ class RouterV310Contract extends import_AbstractRouterContract.AbstractRouterCon
187
187
  tData.push({
188
188
  token,
189
189
  balance: expectedBalances.get(token)?.balance || 0n,
190
- leftoverBalance: leftoverBalances.get(token)?.balance || 0n,
190
+ leftoverBalance: (0, import_helpers.limitLeftover)(leftoverBalances.get(token)?.balance, token) ?? 0n,
191
191
  numSplits: getNumSplits(token),
192
192
  claimRewards: !!tokensToClaim.get(token)
193
193
  });
@@ -319,7 +319,10 @@ function balancesAfterOpen(target, targetAmount, expected, leftover) {
319
319
  if (t === targetAddr) {
320
320
  result[t] = (expected.get(t) ?? 0n) + targetAmount;
321
321
  } else {
322
- result[t] = import_sdk_legacy.BigIntMath.min(expected.get(t) ?? 0n, leftover.get(t) ?? 0n);
322
+ result[t] = import_sdk_legacy.BigIntMath.min(
323
+ expected.get(t) ?? 0n,
324
+ (0, import_helpers.limitLeftover)(leftover.get(t), t) ?? 0n
325
+ );
323
326
  }
324
327
  }
325
328
  return result;
@@ -20,7 +20,8 @@ var helpers_exports = {};
20
20
  __export(helpers_exports, {
21
21
  assetsMap: () => assetsMap,
22
22
  balancesMap: () => balancesMap,
23
- compareRouterResults: () => compareRouterResults
23
+ compareRouterResults: () => compareRouterResults,
24
+ limitLeftover: () => limitLeftover
24
25
  });
25
26
  module.exports = __toCommonJS(helpers_exports);
26
27
  var import_utils = require("../utils/index.js");
@@ -33,9 +34,19 @@ function compareRouterResults(a, b) {
33
34
  function assetsMap(assets) {
34
35
  return new import_utils.AddressMap(assets.map((a) => [a.token, a]));
35
36
  }
37
+ const TOKEN = "0x19ebd191f7a24ece672ba13a302212b5ef7f35cb".toLowerCase();
38
+ const THRESHOLD = 5n * 10n ** 17n;
39
+ function limitLeftover(balance, token) {
40
+ const leftoverBalance = balance ?? 0n;
41
+ if (token.toLowerCase() === TOKEN && leftoverBalance < THRESHOLD) {
42
+ return THRESHOLD;
43
+ }
44
+ return balance;
45
+ }
36
46
  // Annotate the CommonJS export names for ESM import in node:
37
47
  0 && (module.exports = {
38
48
  assetsMap,
39
49
  balancesMap,
40
- compareRouterResults
50
+ compareRouterResults,
51
+ limitLeftover
41
52
  });
@@ -45,6 +45,7 @@ const HUMAN_READABLE_SYMBOLS = {
45
45
  PT_USDf_29JAN2026: "pt.USDf(29.01.26)",
46
46
  ["PT-wstUSR-25SEP2025"]: "pt.wstUSR(25.09.25)",
47
47
  ["PT-yUSD-27NOV2025"]: "pt.yUSD(27.11.25)",
48
+ ["PT-pUSDe-16OCT2025"]: "pt.pUSDe(16.10.25)",
48
49
  ["0xab7d50fc2486a1ac06516e2ece9dadc95ba8cd20"]: "cp0xLRT\xA0\u2192\xA0wstETH"
49
50
  };
50
51
  class TokenData {
@@ -1,6 +1,7 @@
1
1
  import { BaseContract } from "../base/index.js";
2
2
  import { AddressMap } from "../utils/index.js";
3
3
  import { Hooks } from "../utils/internal/index.js";
4
+ import { limitLeftover } from "./helpers.js";
4
5
  class AbstractRouterContract extends BaseContract {
5
6
  hooks = new Hooks();
6
7
  addHook = this.hooks.addHook.bind(this.hooks);
@@ -15,7 +16,7 @@ class AbstractRouterContract extends BaseContract {
15
16
  expected.upsert(token, { token, balance: actual > 10n ? actual : 0n });
16
17
  leftover.upsert(token, {
17
18
  token,
18
- balance: leftoverBalances.get(token)?.balance || 1n
19
+ balance: limitLeftover(leftoverBalances.get(token)?.balance || 1n, token) ?? 1n
19
20
  });
20
21
  }
21
22
  return {
@@ -35,7 +36,10 @@ class AbstractRouterContract extends BaseContract {
35
36
  const decimals = this.sdk.tokensMeta.decimals(token);
36
37
  const minBalance = 10n ** BigInt(Math.max(8, decimals) - 8);
37
38
  if (keepAssetsSet.has(token.toLowerCase()) || balance < minBalance || !isEnabled) {
38
- leftoverBalances.upsert(token, { token, balance });
39
+ leftoverBalances.upsert(token, {
40
+ token,
41
+ balance: limitLeftover(balance, token) ?? balance
42
+ });
39
43
  }
40
44
  }
41
45
  return {
@@ -7,7 +7,12 @@ import {
7
7
  getTokenAddress_Legacy
8
8
  } from "../sdk-gov-legacy/index.js";
9
9
  import { AbstractRouterContract } from "./AbstractRouterContract.js";
10
- import { assetsMap, balancesMap, compareRouterResults } from "./helpers.js";
10
+ import {
11
+ assetsMap,
12
+ balancesMap,
13
+ compareRouterResults,
14
+ limitLeftover
15
+ } from "./helpers.js";
11
16
  import { PathOptionFactory } from "./PathOptionFactory.js";
12
17
  const MAX_GAS_PER_ROUTE = 200000000n;
13
18
  const GAS_PER_BLOCK = 400000000n;
@@ -57,7 +62,7 @@ class RouterV300Contract extends AbstractRouterContract {
57
62
  tokenOut,
58
63
  connectors,
59
64
  amount,
60
- leftoverAmount
65
+ leftoverAmount: limitLeftover(leftoverAmount, tokenIn) ?? 0n
61
66
  };
62
67
  const { result } = await this.contract.simulate.findAllSwaps(
63
68
  [swapTask, BigInt(slippage)],
@@ -131,7 +136,7 @@ class RouterV300Contract extends AbstractRouterContract {
131
136
  }));
132
137
  const leftover = cm.collateralTokens.map((token) => ({
133
138
  token,
134
- balance: leftoverMap.get(token) ?? 0n
139
+ balance: limitLeftover(leftoverMap.get(token), token) ?? 0n
135
140
  }));
136
141
  const connectors = this.getAvailableConnectors(cm.collateralTokens);
137
142
  const {
@@ -176,7 +181,12 @@ class RouterV300Contract extends AbstractRouterContract {
176
181
  slippage,
177
182
  balances
178
183
  }) {
179
- const { pathOptions, expected, leftover, connectors } = this.getFindClosePathInput(
184
+ const {
185
+ pathOptions,
186
+ expected,
187
+ leftover: leftoverUnsafe,
188
+ connectors
189
+ } = this.getFindClosePathInput(
180
190
  ca,
181
191
  cm,
182
192
  balances ? {
@@ -185,6 +195,10 @@ class RouterV300Contract extends AbstractRouterContract {
185
195
  tokensToClaim: assetsMap(balances.tokensToClaim || [])
186
196
  } : void 0
187
197
  );
198
+ const leftover = leftoverUnsafe.map((a) => ({
199
+ ...a,
200
+ balance: limitLeftover(a.balance, a.token) ?? 0n
201
+ }));
188
202
  await this.hooks.triggerHooks("foundPathOptions", {
189
203
  creditAccount: ca.creditAccount,
190
204
  pathOptions,
@@ -247,6 +261,10 @@ class RouterV300Contract extends AbstractRouterContract {
247
261
  balances,
248
262
  keepAssets
249
263
  );
264
+ const leftover = leftoverBalances.values().map((a) => ({
265
+ ...a,
266
+ balance: limitLeftover(a.balance, a.token) ?? 0n
267
+ }));
250
268
  const pathOptions = PathOptionFactory.generatePathOptions(
251
269
  ca.tokens,
252
270
  this.provider.networkType,
@@ -255,7 +273,7 @@ class RouterV300Contract extends AbstractRouterContract {
255
273
  const connectors = this.getAvailableConnectors(cm.collateralTokens);
256
274
  return {
257
275
  expected: expectedBalances.values(),
258
- leftover: leftoverBalances.values(),
276
+ leftover,
259
277
  connectors,
260
278
  pathOptions
261
279
  };
@@ -4,7 +4,7 @@ import { BigIntMath } from "../sdk-legacy/index.js";
4
4
  import { AddressMap } from "../utils/AddressMap.js";
5
5
  import { formatBN } from "../utils/formatter.js";
6
6
  import { AbstractRouterContract } from "./AbstractRouterContract.js";
7
- import { assetsMap, balancesMap } from "./helpers.js";
7
+ import { assetsMap, balancesMap, limitLeftover } from "./helpers.js";
8
8
  const abi = iGearboxRouterV310Abi;
9
9
  const ERR_NOT_IMPLEMENTED = new Error("Not implemented in router v3.1");
10
10
  class RouterV310Contract extends AbstractRouterContract {
@@ -80,7 +80,7 @@ class RouterV310Contract extends AbstractRouterContract {
80
80
  (token) => ({
81
81
  token,
82
82
  balance: expectedMap.get(token) ?? 0n,
83
- leftoverBalance: leftoverMap.get(token) ?? 0n,
83
+ leftoverBalance: limitLeftover(leftoverMap.get(token), token) ?? 0n,
84
84
  numSplits: getNumSplits(token),
85
85
  claimRewards: false
86
86
  })
@@ -164,7 +164,7 @@ class RouterV310Contract extends AbstractRouterContract {
164
164
  tData.push({
165
165
  token,
166
166
  balance: expectedBalances.get(token)?.balance || 0n,
167
- leftoverBalance: leftoverBalances.get(token)?.balance || 0n,
167
+ leftoverBalance: limitLeftover(leftoverBalances.get(token)?.balance, token) ?? 0n,
168
168
  numSplits: getNumSplits(token),
169
169
  claimRewards: !!tokensToClaim.get(token)
170
170
  });
@@ -296,7 +296,10 @@ function balancesAfterOpen(target, targetAmount, expected, leftover) {
296
296
  if (t === targetAddr) {
297
297
  result[t] = (expected.get(t) ?? 0n) + targetAmount;
298
298
  } else {
299
- result[t] = BigIntMath.min(expected.get(t) ?? 0n, leftover.get(t) ?? 0n);
299
+ result[t] = BigIntMath.min(
300
+ expected.get(t) ?? 0n,
301
+ limitLeftover(leftover.get(t), t) ?? 0n
302
+ );
300
303
  }
301
304
  }
302
305
  return result;
@@ -8,8 +8,18 @@ function compareRouterResults(a, b) {
8
8
  function assetsMap(assets) {
9
9
  return new AddressMap(assets.map((a) => [a.token, a]));
10
10
  }
11
+ const TOKEN = "0x19ebd191f7a24ece672ba13a302212b5ef7f35cb".toLowerCase();
12
+ const THRESHOLD = 5n * 10n ** 17n;
13
+ function limitLeftover(balance, token) {
14
+ const leftoverBalance = balance ?? 0n;
15
+ if (token.toLowerCase() === TOKEN && leftoverBalance < THRESHOLD) {
16
+ return THRESHOLD;
17
+ }
18
+ return balance;
19
+ }
11
20
  export {
12
21
  assetsMap,
13
22
  balancesMap,
14
- compareRouterResults
23
+ compareRouterResults,
24
+ limitLeftover
15
25
  };
@@ -22,6 +22,7 @@ const HUMAN_READABLE_SYMBOLS = {
22
22
  PT_USDf_29JAN2026: "pt.USDf(29.01.26)",
23
23
  ["PT-wstUSR-25SEP2025"]: "pt.wstUSR(25.09.25)",
24
24
  ["PT-yUSD-27NOV2025"]: "pt.yUSD(27.11.25)",
25
+ ["PT-pUSDe-16OCT2025"]: "pt.pUSDe(16.10.25)",
25
26
  ["0xab7d50fc2486a1ac06516e2ece9dadc95ba8cd20"]: "cp0xLRT\xA0\u2192\xA0wstETH"
26
27
  };
27
28
  class TokenData {
@@ -1,5 +1,12 @@
1
+ import type { Address } from "abitype";
1
2
  import { AddressMap } from "../utils/index.js";
2
3
  import type { Asset, RouterResult } from "./types.js";
3
4
  export declare function balancesMap(assets: Array<Asset>): AddressMap<bigint>;
4
5
  export declare function compareRouterResults(a: RouterResult, b: RouterResult): RouterResult;
5
6
  export declare function assetsMap<T extends Asset>(assets: Array<T> | readonly T[]): AddressMap<T>;
7
+ /**
8
+ * According to van0k, leftover balance for 0x19ebd191f7a24ece672ba13a302212b5ef7f35cb
9
+ * should always be rounded up to 5e17 if amount is less than 5e17
10
+ * Should NEVER be compared with "||" since function will lose it's effect
11
+ */
12
+ export declare function limitLeftover(balance: bigint | undefined, token: Address): bigint | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gearbox-protocol/sdk",
3
- "version": "8.24.4",
3
+ "version": "8.24.6",
4
4
  "description": "Gearbox SDK",
5
5
  "license": "MIT",
6
6
  "main": "./dist/cjs/sdk/index.js",