@gearbox-protocol/sdk 12.4.0-next.1 → 12.5.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.
Files changed (104) hide show
  1. package/dist/cjs/abi/errors.js +10 -1
  2. package/dist/cjs/dev/AccountOpener.js +2 -1
  3. package/dist/cjs/dev/RevolverTransport.js +4 -6
  4. package/dist/cjs/dev/ltUtils.js +2 -1
  5. package/dist/cjs/dev/migrateFaucet.js +2 -1
  6. package/dist/cjs/dev/providers.js +6 -2
  7. package/dist/cjs/dev/transports.js +3 -3
  8. package/dist/cjs/permissionless/bindings/compressors/token-compressor.js +7 -4
  9. package/dist/cjs/permissionless/bindings/governance/governor.js +3 -4
  10. package/dist/cjs/permissionless/bindings/market-configurator.js +4 -2
  11. package/dist/cjs/permissionless/bindings/price-feed-store.js +2 -1
  12. package/dist/cjs/permissionless/bindings/treasury-splitter.js +12 -1
  13. package/dist/cjs/permissionless/utils/format.js +0 -8
  14. package/dist/cjs/plugins/accounts-counter/AccountsCounterPlugin.js +2 -1
  15. package/dist/cjs/plugins/bots/BotsPlugin.js +4 -2
  16. package/dist/cjs/plugins/degen-distributors/DegenDistributorsPlugin.js +13 -7
  17. package/dist/cjs/plugins/delayed-withdrawal/DelayedWithdrawalPlugin.js +2 -1
  18. package/dist/cjs/plugins/pools-history/Pools7DAgoPlugin.js +2 -1
  19. package/dist/cjs/plugins/zappers/ZappersPlugin.js +2 -1
  20. package/dist/cjs/sdk/GearboxSDK.js +9 -5
  21. package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +71 -38
  22. package/dist/cjs/sdk/base/TokensMeta.js +2 -1
  23. package/dist/cjs/sdk/core/address-provider/AbstractAddressProviderContract.js +20 -3
  24. package/dist/cjs/sdk/core/address-provider/AddressProviderV300Contract.js +1 -1
  25. package/dist/cjs/sdk/core/address-provider/AddressProviderV310Contract.js +1 -1
  26. package/dist/cjs/sdk/core/address-provider/createAddressProvider.js +29 -7
  27. package/dist/cjs/sdk/gauges/GaugeStakingService.js +2 -1
  28. package/dist/cjs/sdk/index.js +2 -0
  29. package/dist/cjs/sdk/market/MarketConfiguratorContract.js +15 -0
  30. package/dist/cjs/sdk/market/credit/CreditFacadeV300Contract.js +1 -1
  31. package/dist/cjs/sdk/market/credit/CreditFacadeV310Contract.js +1 -1
  32. package/dist/cjs/sdk/market/oracle/PriceOracleBaseContract.js +6 -0
  33. package/dist/cjs/sdk/pools/AbstractPoolService.js +137 -0
  34. package/dist/cjs/sdk/pools/PoolServiceV300.js +30 -0
  35. package/dist/cjs/sdk/pools/PoolServiceV310.js +30 -0
  36. package/dist/cjs/sdk/pools/createPoolService.js +39 -0
  37. package/dist/cjs/sdk/pools/index.js +26 -0
  38. package/dist/cjs/sdk/pools/types.js +16 -0
  39. package/dist/cjs/sdk/sdk-legacy/core/endpoint.js +3 -9
  40. package/dist/cjs/sdk/sdk-legacy/gearboxRewards/api.js +2 -1
  41. package/dist/cjs/sdk/utils/formatter.js +8 -0
  42. package/dist/esm/abi/errors.js +9 -1
  43. package/dist/esm/dev/AccountOpener.js +2 -1
  44. package/dist/esm/dev/RevolverTransport.js +5 -7
  45. package/dist/esm/dev/ltUtils.js +2 -1
  46. package/dist/esm/dev/migrateFaucet.js +2 -1
  47. package/dist/esm/dev/providers.js +4 -1
  48. package/dist/esm/dev/transports.js +2 -2
  49. package/dist/esm/permissionless/bindings/compressors/token-compressor.js +7 -4
  50. package/dist/esm/permissionless/bindings/governance/governor.js +5 -2
  51. package/dist/esm/permissionless/bindings/market-configurator.js +4 -2
  52. package/dist/esm/permissionless/bindings/price-feed-store.js +2 -1
  53. package/dist/esm/permissionless/bindings/treasury-splitter.js +13 -2
  54. package/dist/esm/permissionless/utils/format.js +0 -7
  55. package/dist/esm/plugins/accounts-counter/AccountsCounterPlugin.js +2 -1
  56. package/dist/esm/plugins/bots/BotsPlugin.js +4 -2
  57. package/dist/esm/plugins/degen-distributors/DegenDistributorsPlugin.js +13 -7
  58. package/dist/esm/plugins/delayed-withdrawal/DelayedWithdrawalPlugin.js +2 -1
  59. package/dist/esm/plugins/pools-history/Pools7DAgoPlugin.js +2 -1
  60. package/dist/esm/plugins/zappers/ZappersPlugin.js +2 -1
  61. package/dist/esm/sdk/GearboxSDK.js +9 -5
  62. package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +71 -38
  63. package/dist/esm/sdk/base/TokensMeta.js +2 -1
  64. package/dist/esm/sdk/core/address-provider/AbstractAddressProviderContract.js +20 -3
  65. package/dist/esm/sdk/core/address-provider/AddressProviderV300Contract.js +1 -1
  66. package/dist/esm/sdk/core/address-provider/AddressProviderV310Contract.js +1 -1
  67. package/dist/esm/sdk/core/address-provider/createAddressProvider.js +36 -8
  68. package/dist/esm/sdk/gauges/GaugeStakingService.js +2 -1
  69. package/dist/esm/sdk/index.js +1 -0
  70. package/dist/esm/sdk/market/MarketConfiguratorContract.js +15 -0
  71. package/dist/esm/sdk/market/credit/CreditFacadeV300Contract.js +6 -2
  72. package/dist/esm/sdk/market/credit/CreditFacadeV310Contract.js +6 -2
  73. package/dist/esm/sdk/market/oracle/PriceOracleBaseContract.js +6 -0
  74. package/dist/esm/sdk/pools/AbstractPoolService.js +113 -0
  75. package/dist/esm/sdk/pools/PoolServiceV300.js +6 -0
  76. package/dist/esm/sdk/pools/PoolServiceV310.js +6 -0
  77. package/dist/esm/sdk/pools/createPoolService.js +15 -0
  78. package/dist/esm/sdk/pools/index.js +3 -0
  79. package/dist/esm/sdk/pools/types.js +0 -0
  80. package/dist/esm/sdk/sdk-legacy/core/endpoint.js +3 -9
  81. package/dist/esm/sdk/sdk-legacy/gearboxRewards/api.js +2 -1
  82. package/dist/esm/sdk/utils/formatter.js +7 -0
  83. package/dist/types/abi/errors.d.ts +33 -0
  84. package/dist/types/dev/RevolverTransport.d.ts +2 -20
  85. package/dist/types/dev/providers.d.ts +8 -1
  86. package/dist/types/dev/transports.d.ts +1 -1
  87. package/dist/types/permissionless/utils/format.d.ts +0 -1
  88. package/dist/types/sdk/GearboxSDK.d.ts +1 -1
  89. package/dist/types/sdk/core/address-provider/AbstractAddressProviderContract.d.ts +2 -2
  90. package/dist/types/sdk/core/address-provider/AddressProviderV300Contract.d.ts +2 -2
  91. package/dist/types/sdk/core/address-provider/AddressProviderV310Contract.d.ts +2 -2
  92. package/dist/types/sdk/core/address-provider/types.d.ts +15 -0
  93. package/dist/types/sdk/index.d.ts +1 -0
  94. package/dist/types/sdk/market/MarketConfiguratorContract.d.ts +9 -0
  95. package/dist/types/sdk/pools/AbstractPoolService.d.ts +9 -0
  96. package/dist/types/sdk/pools/PoolServiceV300.d.ts +4 -0
  97. package/dist/types/sdk/pools/PoolServiceV310.d.ts +4 -0
  98. package/dist/types/sdk/pools/createPoolService.d.ts +8 -0
  99. package/dist/types/sdk/pools/index.d.ts +3 -0
  100. package/dist/types/sdk/pools/types.d.ts +92 -0
  101. package/dist/types/sdk/sdk-legacy/core/endpoint.d.ts +1 -3
  102. package/dist/types/sdk/types/state-human.d.ts +1 -1
  103. package/dist/types/sdk/utils/formatter.d.ts +1 -0
  104. package/package.json +6 -6
@@ -25,7 +25,8 @@ class TokenCompressorContract extends BaseContract {
25
25
  args: []
26
26
  }));
27
27
  const results = await this.client.multicall({
28
- contracts
28
+ contracts,
29
+ batchSize: 0
29
30
  });
30
31
  const multivaultToToken = /* @__PURE__ */ new Map();
31
32
  const multivaults = [];
@@ -44,7 +45,8 @@ class TokenCompressorContract extends BaseContract {
44
45
  functionName: "symbol",
45
46
  args: []
46
47
  })),
47
- allowFailure: true
48
+ allowFailure: true,
49
+ batchSize: 0
48
50
  });
49
51
  const tokenToSymbol = /* @__PURE__ */ new Map();
50
52
  for (let i = 0; i < resultsSymbols.length; i++) {
@@ -66,7 +68,8 @@ class TokenCompressorContract extends BaseContract {
66
68
  abi,
67
69
  functionName: "getTokenInfo",
68
70
  args: [token]
69
- }))
71
+ })),
72
+ batchSize: 0
70
73
  });
71
74
  const tokenInfos = results.map((result, index) => {
72
75
  if (result.status === "failure") {
@@ -78,7 +81,7 @@ class TokenCompressorContract extends BaseContract {
78
81
  const postfix = multivaultSymbol ? `[${multivaultSymbol}]` : "";
79
82
  return {
80
83
  ...tokenInfo,
81
- symbol: `${tokenInfo.symbol} ${postfix}`
84
+ symbol: !postfix ? tokenInfo.symbol : `${tokenInfo.symbol} ${postfix}`
82
85
  };
83
86
  });
84
87
  return tokenInfos;
@@ -6,8 +6,11 @@ import {
6
6
  } from "viem";
7
7
  import { formatAbiItem } from "viem/utils";
8
8
  import { governorAbi } from "../../../abi/governance/governor.js";
9
- import { BaseContract, json_stringify } from "../../../sdk/index.js";
10
- import { formatTimestamp } from "../../utils/index.js";
9
+ import {
10
+ BaseContract,
11
+ formatTimestamp,
12
+ json_stringify
13
+ } from "../../../sdk/index.js";
11
14
  import { MarketConfiguratorContract } from "../market-configurator.js";
12
15
  import { TreasurySplitterContract } from "../treasury-splitter.js";
13
16
  import { BatchesChainContract } from "./batches-chain.js";
@@ -413,7 +413,8 @@ class MarketConfiguratorContract extends BaseContract {
413
413
  functionName: "getRoleHolders",
414
414
  args: [stringToHex("EMERGENCY_LIQUIDATOR", { size: 32 })]
415
415
  }
416
- ]
416
+ ],
417
+ batchSize: 0
417
418
  });
418
419
  return {
419
420
  admin,
@@ -442,7 +443,8 @@ class MarketConfiguratorContract extends BaseContract {
442
443
  address: admin,
443
444
  abi: parseAbi(["function contractType() view returns (bytes32)"]),
444
445
  functionName: "contractType"
445
- }))
446
+ })),
447
+ batchSize: 0
446
448
  });
447
449
  const pause = result.map((r, i) => ({
448
450
  ...r,
@@ -310,7 +310,8 @@ class PriceFeedStoreContract extends BaseContract {
310
310
  args: [priceFeed]
311
311
  }));
312
312
  const results = await this.client.multicall({
313
- contracts: multicallCalls
313
+ contracts: multicallCalls,
314
+ batchSize: 0
314
315
  });
315
316
  return results.map((result, index) => {
316
317
  if (result.status === "failure") {
@@ -2,7 +2,7 @@ import {
2
2
  decodeFunctionData
3
3
  } from "viem";
4
4
  import { ITreasurySplitterAbi } from "../../abi/310/iTreasurySplitter.js";
5
- import { BaseContract } from "../../sdk/index.js";
5
+ import { BaseContract, json_stringify } from "../../sdk/index.js";
6
6
  const abi = ITreasurySplitterAbi;
7
7
  class TreasurySplitterContract extends BaseContract {
8
8
  constructor(addr, client) {
@@ -78,7 +78,18 @@ class TreasurySplitterContract extends BaseContract {
78
78
  });
79
79
  return {
80
80
  functionName: decoded.functionName,
81
- ...super.parseFunctionParams(decoded)
81
+ ...this.parseFunctionParams(decoded)
82
+ };
83
+ }
84
+ case "setDefaultSplit": {
85
+ const [receivers, proportions] = args;
86
+ return {
87
+ receivers: json_stringify(receivers),
88
+ proportions: json_stringify(
89
+ proportions.map(
90
+ (proportion) => `${proportion / 100}% [${proportion}]`
91
+ )
92
+ )
82
93
  };
83
94
  }
84
95
  default:
@@ -9,12 +9,6 @@ function formatBytecodeVersion(version) {
9
9
  const patch = version % 10;
10
10
  return `v${major}.${minor}.${patch}`;
11
11
  }
12
- function formatTimestamp(timestamp) {
13
- return new Date(timestamp * 1e3).toLocaleString("en-GB", {
14
- dateStyle: "short",
15
- timeStyle: "short"
16
- });
17
- }
18
12
  function shortenHash(hash, chars = 4) {
19
13
  if (!hash) return "";
20
14
  const start = hash.slice(0, chars + 2);
@@ -61,7 +55,6 @@ export {
61
55
  deepJsonParse,
62
56
  formatBytecodeSize,
63
57
  formatBytecodeVersion,
64
- formatTimestamp,
65
58
  shortenHash,
66
59
  significantTrunc
67
60
  };
@@ -69,7 +69,8 @@ class AccountsCounterPlugin extends BasePlugin {
69
69
  }
70
70
  ]
71
71
  ),
72
- allowFailure: false
72
+ allowFailure: false,
73
+ batchSize: 0
73
74
  });
74
75
  this.#accounts = new AddressMap();
75
76
  for (let i = 0; i < cms.length; i++) {
@@ -62,7 +62,8 @@ class BotsPlugin extends BasePlugin {
62
62
  })
63
63
  ),
64
64
  allowFailure: true,
65
- blockNumber: this.sdk.currentBlock
65
+ blockNumber: this.sdk.currentBlock,
66
+ batchSize: 0
66
67
  });
67
68
  const expectedBots = new AddressMap();
68
69
  for (let i = 0; i < configs.length; i++) {
@@ -90,7 +91,8 @@ class BotsPlugin extends BasePlugin {
90
91
  })
91
92
  ),
92
93
  allowFailure: true,
93
- blockNumber: this.sdk.currentBlock
94
+ blockNumber: this.sdk.currentBlock,
95
+ batchSize: 0
94
96
  });
95
97
  for (let i = 0; i < botAddrs.length; i++) {
96
98
  const serialized = serializedBots[i];
@@ -1,4 +1,5 @@
1
1
  import { AddressMap, BasePlugin } from "../../sdk/index.js";
2
+ import { MarketConfiguratorContract } from "../../sdk/market/MarketConfiguratorContract.js";
2
3
  const MAP_LABEL = "degenDistributors";
3
4
  class DegenDistributorsPlugin extends BasePlugin {
4
5
  #distributors;
@@ -16,12 +17,15 @@ class DegenDistributorsPlugin extends BasePlugin {
16
17
  this.sdk.logger?.debug(
17
18
  `loading degen distributors for ${this.sdk.networkType}`
18
19
  );
19
- const distributors = await Promise.allSettled(
20
- configurators.map((cfg) => cfg.getPeripheryContract("DEGEN_DISTRIBUTOR"))
20
+ const distributors = await MarketConfiguratorContract.getPeripheryContractBatch(
21
+ Object.values(configurators),
22
+ this.sdk.client,
23
+ "DEGEN_DISTRIBUTOR"
21
24
  );
22
25
  const distributorByConfigurator = configurators.reduce((acc, cfg, index) => {
23
26
  const cfgLC = cfg.address.toLowerCase();
24
- acc[cfgLC] = distributors[index];
27
+ const distributor = distributors[index];
28
+ acc[cfgLC] = distributor;
25
29
  return acc;
26
30
  }, {});
27
31
  this.#distributors = new AddressMap(void 0, MAP_LABEL);
@@ -30,11 +34,13 @@ class DegenDistributorsPlugin extends BasePlugin {
30
34
  const cfg = m.configurator.address;
31
35
  const cfgLC = cfg.toLowerCase();
32
36
  const r = distributorByConfigurator?.[cfgLC];
33
- if (r.status === "fulfilled") {
34
- this.#distributors?.upsert(pool, r.value);
37
+ if (r.status === "success" && r.result.length > 0) {
38
+ this.#distributors?.upsert(pool, r.result[0]);
35
39
  } else {
36
- this.sdk.logger?.error(
37
- `failed to load degen distributor for market configurator ${this.labelAddress(cfg)} and pool ${this.labelAddress(pool)}: ${r.reason}`
40
+ this.sdk.logger?.warn(
41
+ `failed to load degen distributor for market configurator ${this.labelAddress(
42
+ cfg
43
+ )} and pool ${this.labelAddress(pool)}: ${r.error}`
38
44
  );
39
45
  }
40
46
  });
@@ -25,7 +25,8 @@ class DelayedWithdrawalPlugin extends BasePlugin {
25
25
  args: [cm.creditManager.address]
26
26
  })
27
27
  ) : [],
28
- allowFailure: true
28
+ allowFailure: true,
29
+ batchSize: 0
29
30
  });
30
31
  this.#withdrawableAssets = new AddressMap(void 0, MAP_LABEL);
31
32
  resp.forEach((r, index) => {
@@ -33,7 +33,8 @@ class Pools7DAgoPlugin extends BasePlugin {
33
33
  args: [m.pool.pool.address]
34
34
  })
35
35
  ),
36
- blockNumber: BigIntMath.max(0n, targetBlock)
36
+ blockNumber: BigIntMath.max(0n, targetBlock),
37
+ batchSize: 0
37
38
  });
38
39
  this.#pools7DAgo = new AddressMap(void 0, MAP_LABEL);
39
40
  resp.forEach((r, index) => {
@@ -34,7 +34,8 @@ class ZappersPlugin extends BasePlugin {
34
34
  args: [m.configurator.address, m.pool.pool.address]
35
35
  })
36
36
  ),
37
- allowFailure: true
37
+ allowFailure: true,
38
+ batchSize: 0
38
39
  });
39
40
  this.#zappers = new AddressMap(void 0, "zappers");
40
41
  for (let i = 0; i < resp.length; i++) {
@@ -45,7 +45,7 @@ function createClient(opts, network) {
45
45
  } else {
46
46
  const rpcs = opts.rpcURLs.map(
47
47
  (url) => http(url, {
48
- ...opts.httpClientOptions,
48
+ ...opts.httpTransportOptions,
49
49
  timeout: opts.timeout,
50
50
  retryCount: opts.retryCount
51
51
  })
@@ -61,11 +61,15 @@ function createClient(opts, network) {
61
61
  async function attachClient(options, network) {
62
62
  let { chainId, networkType } = network;
63
63
  const attachClient2 = createClient(options);
64
- if (!networkType) {
64
+ if (networkType) {
65
+ if (!chainId) {
66
+ chainId = getChain(networkType).id;
67
+ }
68
+ } else {
65
69
  networkType = await detectNetwork(attachClient2);
66
- }
67
- if (!chainId) {
68
- chainId = await attachClient2.getChainId();
70
+ if (!chainId) {
71
+ chainId = await attachClient2.getChainId();
72
+ }
69
73
  }
70
74
  return createClient(options, { networkType, chainId });
71
75
  }
@@ -202,9 +202,9 @@ class AbstractCreditAccountService extends SDKConstruct {
202
202
  * @returns call result of getConnectedBots for each credit account
203
203
  */
204
204
  async getConnectedBots(accountsToCheck, legacyMigrationBot, additionalBots) {
205
- const [resp, migration, additional] = await Promise.all([
206
- this.client.multicall({
207
- contracts: accountsToCheck.map((o) => {
205
+ const allResp = await this.client.multicall({
206
+ contracts: [
207
+ ...accountsToCheck.map((o) => {
208
208
  const pool = this.sdk.marketRegister.findByCreditManager(
209
209
  o.creditManager
210
210
  );
@@ -215,32 +215,72 @@ class AbstractCreditAccountService extends SDKConstruct {
215
215
  args: [pool.configurator.address, o.creditAccount]
216
216
  };
217
217
  }),
218
- allowFailure: true
219
- }),
220
- this.getActiveMigrationBots(accountsToCheck, legacyMigrationBot),
221
- this.getActiveBots(accountsToCheck, additionalBots)
222
- ]);
223
- return {
224
- legacy: resp,
225
- additionalBots: additional,
226
- legacyMigration: migration
227
- };
228
- }
229
- async getActiveBots(accountsToCheck, bots) {
230
- const result = await this.client.multicall({
231
- contracts: accountsToCheck.flatMap((ca) => {
232
- const cm = this.sdk.marketRegister.findCreditManager(ca.creditManager);
233
- return bots.map((bot) => {
218
+ ...legacyMigrationBot ? accountsToCheck.map((ca) => {
219
+ const cm = this.sdk.marketRegister.findCreditManager(
220
+ ca.creditManager
221
+ );
234
222
  return {
235
223
  abi: isV300(cm.creditFacade.version) ? iBotListV300Abi : iBotListV310Abi,
236
224
  address: cm.creditFacade.botList,
237
225
  functionName: "getBotStatus",
238
- args: isV300(cm.creditFacade.version) ? [bot, ca.creditManager, ca.creditAccount] : [bot, ca.creditAccount]
226
+ args: isV300(cm.creditFacade.version) ? [legacyMigrationBot, ca.creditManager, ca.creditAccount] : [legacyMigrationBot, ca.creditAccount]
239
227
  };
240
- });
241
- }),
242
- allowFailure: true
228
+ }) : [],
229
+ ...accountsToCheck.flatMap((ca) => {
230
+ const cm = this.sdk.marketRegister.findCreditManager(
231
+ ca.creditManager
232
+ );
233
+ return additionalBots.map((bot) => {
234
+ return {
235
+ abi: isV300(cm.creditFacade.version) ? iBotListV300Abi : iBotListV310Abi,
236
+ address: cm.creditFacade.botList,
237
+ functionName: "getBotStatus",
238
+ args: isV300(cm.creditFacade.version) ? [bot, ca.creditManager, ca.creditAccount] : [bot, ca.creditAccount]
239
+ };
240
+ });
241
+ })
242
+ ],
243
+ allowFailure: true,
244
+ batchSize: 0
243
245
  });
246
+ const legacyStart = 0;
247
+ const legacyEnd = accountsToCheck.length;
248
+ const legacy = allResp.slice(
249
+ legacyStart,
250
+ legacyEnd
251
+ );
252
+ const migrationStart = legacyEnd;
253
+ const migrationEnd = legacyMigrationBot ? migrationStart + accountsToCheck.length : migrationStart;
254
+ const migrationResp = allResp.slice(
255
+ migrationStart,
256
+ migrationEnd
257
+ );
258
+ const additionalStart = migrationEnd;
259
+ const additionalResp = allResp.slice(
260
+ additionalStart
261
+ );
262
+ return {
263
+ legacy,
264
+ additionalBots: this.getActiveBots(
265
+ accountsToCheck,
266
+ additionalBots,
267
+ additionalResp
268
+ ),
269
+ legacyMigration: this.getActiveMigrationBots(
270
+ accountsToCheck,
271
+ legacyMigrationBot,
272
+ migrationResp
273
+ )
274
+ };
275
+ }
276
+ getActiveBots(accountsToCheck, bots, result) {
277
+ if (result.length !== bots.length * accountsToCheck.length) {
278
+ console.error(
279
+ "result length mismatch",
280
+ result.length,
281
+ bots.length * accountsToCheck.length
282
+ );
283
+ }
244
284
  const botsByCAIndex = accountsToCheck.reduce((acc, _, index) => {
245
285
  const r = result.slice(index * bots.length, (index + 1) * bots.length);
246
286
  acc.push({
@@ -250,22 +290,15 @@ class AbstractCreditAccountService extends SDKConstruct {
250
290
  }, []);
251
291
  return botsByCAIndex;
252
292
  }
253
- async getActiveMigrationBots(accountsToCheck, bot) {
293
+ getActiveMigrationBots(accountsToCheck, bot, result) {
254
294
  if (bot) {
255
- const result = await this.client.multicall({
256
- contracts: accountsToCheck.map((ca) => {
257
- const cm = this.sdk.marketRegister.findCreditManager(
258
- ca.creditManager
259
- );
260
- return {
261
- abi: isV300(cm.creditFacade.version) ? iBotListV300Abi : iBotListV310Abi,
262
- address: cm.creditFacade.botList,
263
- functionName: "getBotStatus",
264
- args: isV300(cm.creditFacade.version) ? [bot, ca.creditManager, ca.creditAccount] : [bot, ca.creditAccount]
265
- };
266
- }),
267
- allowFailure: true
268
- });
295
+ if (result.length !== accountsToCheck.length) {
296
+ console.error(
297
+ "result length mismatch for migration bots",
298
+ result.length,
299
+ accountsToCheck.length
300
+ );
301
+ }
269
302
  return { result, botAddress: bot };
270
303
  }
271
304
  return void 0;
@@ -69,7 +69,8 @@ class TokensMeta extends AddressMap {
69
69
  functionName: "contractType"
70
70
  })
71
71
  ),
72
- allowFailure: true
72
+ allowFailure: true,
73
+ batchSize: 0
73
74
  });
74
75
  for (let i = 0; i < resp.length; i++) {
75
76
  if (resp[i].status === "success") {
@@ -3,10 +3,20 @@ import { BaseContract } from "../../base/index.js";
3
3
  import { NO_VERSION } from "../../constants/index.js";
4
4
  import { TypedObjectUtils } from "../../utils/mappers.js";
5
5
  class AbstractAddressProviderContract extends BaseContract {
6
- #addresses = {};
7
- constructor(options, args, addresses = {}) {
6
+ #addresses;
7
+ #overrides;
8
+ constructor(options, args, addresses) {
8
9
  super(options, args);
9
- this.#addresses = addresses;
10
+ this.#addresses = addresses?.addresses ?? {};
11
+ this.#overrides = addresses?.overrides ?? {};
12
+ for (const [contract, vs] of TypedObjectUtils.entries(this.#overrides)) {
13
+ for (const [version, address] of TypedObjectUtils.entries(vs)) {
14
+ this.#addresses[contract] = {
15
+ ...this.#addresses[contract],
16
+ [version]: address
17
+ };
18
+ }
19
+ }
10
20
  }
11
21
  setInternalAddress(key, address, version) {
12
22
  const k = isHex(key) ? hexToString(key, { size: 32 }) : key;
@@ -15,6 +25,13 @@ class AbstractAddressProviderContract extends BaseContract {
15
25
  }
16
26
  this.#addresses[k][version] = address;
17
27
  this.logger?.debug(`Set address for ${k}@${version} to ${address}`);
28
+ const overriden = this.#overrides[k]?.[version];
29
+ if (overriden) {
30
+ this.logger?.warn(
31
+ `address for ${k}@${version} was overriden, hardcode ${overriden} instead of ${address}`
32
+ );
33
+ this.#addresses[k][version] = overriden;
34
+ }
18
35
  }
19
36
  getAddress(contract, version = NO_VERSION) {
20
37
  if (!this.#addresses[contract]) {
@@ -4,7 +4,7 @@ import { getLogsSafe } from "../../utils/viem/index.js";
4
4
  import AbstractAddressProviderContract from "./AbstractAddressProviderContract.js";
5
5
  const abi = iAddressProviderV300Abi;
6
6
  class AddressProviderV300Contract extends AbstractAddressProviderContract {
7
- constructor(options, address, version, addresses = {}) {
7
+ constructor(options, address, version, addresses) {
8
8
  super(
9
9
  options,
10
10
  {
@@ -3,7 +3,7 @@ import { iAddressProviderV310Abi } from "../../../abi/310/generated.js";
3
3
  import AbstractAddressProviderContract from "./AbstractAddressProviderContract.js";
4
4
  const abi = iAddressProviderV310Abi;
5
5
  class AddressProviderV310Contract extends AbstractAddressProviderContract {
6
- constructor(options, address, version = 310, addresses = {}) {
6
+ constructor(options, address, version = 310, addresses) {
7
7
  super(
8
8
  options,
9
9
  {
@@ -1,13 +1,37 @@
1
1
  import { iVersionAbi } from "../../../abi/iVersion.js";
2
- import { isV300, isV310 } from "../../constants/index.js";
2
+ import {
3
+ ADDRESS_PROVIDER_V310,
4
+ AP_MARKET_COMPRESSOR,
5
+ AP_PRICE_FEED_COMPRESSOR,
6
+ isV300,
7
+ isV310
8
+ } from "../../constants/index.js";
9
+ import { hexEq } from "../../utils/hex.js";
3
10
  import { AddressProviderV300Contract } from "./AddressProviderV300Contract.js";
4
11
  import { AddressProviderV310Contract } from "./AddressProviderV310Contract.js";
12
+ const OVERRIDE_ADDRESSES = {
13
+ // Override price feed compressor and market feed compressor
14
+ // we urgently deployed fix and it has not been added to the address provider yet
15
+ Mainnet: {
16
+ [AP_PRICE_FEED_COMPRESSOR]: {
17
+ 311: "0x1fA2637B9fab0CD14290A7EE908DDc9688a15120"
18
+ },
19
+ [AP_MARKET_COMPRESSOR]: {
20
+ 311: "0x0C27F242f6e9F2A9AD3261bE6e439De3B948bcA2"
21
+ }
22
+ }
23
+ };
5
24
  async function createAddressProvider(sdk, address) {
6
- const v = await sdk.client.readContract({
7
- address,
8
- abi: iVersionAbi,
9
- functionName: "version"
10
- });
25
+ let v;
26
+ if (hexEq(address, ADDRESS_PROVIDER_V310)) {
27
+ v = 310n;
28
+ } else {
29
+ v = await sdk.client.readContract({
30
+ address,
31
+ abi: iVersionAbi,
32
+ functionName: "version"
33
+ });
34
+ }
11
35
  return newAddressProvider(sdk, address, Number(v));
12
36
  }
13
37
  function hydrateAddressProvider(sdk, state) {
@@ -15,11 +39,15 @@ function hydrateAddressProvider(sdk, state) {
15
39
  return newAddressProvider(sdk, addr, Number(version), state.addresses);
16
40
  }
17
41
  function newAddressProvider(sdk, address, version, addresses) {
42
+ const addrOptions = {
43
+ addresses,
44
+ overrides: OVERRIDE_ADDRESSES[sdk.networkType]
45
+ };
18
46
  if (isV300(version)) {
19
- return new AddressProviderV300Contract(sdk, address, version, addresses);
47
+ return new AddressProviderV300Contract(sdk, address, version, addrOptions);
20
48
  }
21
49
  if (isV310(version)) {
22
- return new AddressProviderV310Contract(sdk, address, version, addresses);
50
+ return new AddressProviderV310Contract(sdk, address, version, addrOptions);
23
51
  }
24
52
  throw new Error(`unsupported address provider version: ${version}`);
25
53
  }
@@ -57,7 +57,8 @@ class GaugeStakingService extends SDKConstruct {
57
57
  functionName: "getCurrentEpoch",
58
58
  args: []
59
59
  }
60
- ]
60
+ ],
61
+ batchSize: 0
61
62
  });
62
63
  return {
63
64
  availableBalance,
@@ -10,6 +10,7 @@ export * from "./market/index.js";
10
10
  export * from "./options.js";
11
11
  export * from "./plugins/index.js";
12
12
  export * from "./poolMigration/index.js";
13
+ export * from "./pools/index.js";
13
14
  export * from "./router/index.js";
14
15
  export * from "./sdk-gov-legacy/index.js";
15
16
  export * from "./sdk-legacy/index.js";
@@ -26,6 +26,21 @@ class MarketConfiguratorContract extends BaseContract {
26
26
  `Market configurator ${this.#curatorName}`
27
27
  );
28
28
  }
29
+ static async getPeripheryContractBatch(configurators, client, contract) {
30
+ const resp = await client.multicall({
31
+ allowFailure: true,
32
+ contracts: configurators.map(
33
+ (cfg) => ({
34
+ address: cfg.address,
35
+ abi: cfg.abi,
36
+ functionName: "getPeripheryContracts",
37
+ args: [stringToHex(contract, { size: 32 })]
38
+ })
39
+ ),
40
+ batchSize: 0
41
+ });
42
+ return resp;
43
+ }
29
44
  async getPeripheryContract(contract) {
30
45
  const resp = await this.client.readContract({
31
46
  address: this.address,
@@ -5,7 +5,11 @@ import {
5
5
  } from "../../../abi/v300.js";
6
6
  import { BaseContract } from "../../base/index.js";
7
7
  import { ADDRESS_0X0 } from "../../constants/index.js";
8
- import { fmtBinaryMask, formatBNvalue } from "../../utils/index.js";
8
+ import {
9
+ fmtBinaryMask,
10
+ formatBNvalue,
11
+ formatTimestamp
12
+ } from "../../utils/index.js";
9
13
  const abi = [
10
14
  ...iCreditFacadeV300Abi,
11
15
  ...iCreditFacadeV300MulticallAbi,
@@ -30,7 +34,7 @@ class CreditFacadeV300Contract extends BaseContract {
30
34
  expirable: this.expirable,
31
35
  isDegenMode: this.degenNFT !== ADDRESS_0X0,
32
36
  degenNFT: this.labelAddress(this.degenNFT),
33
- expirationDate: this.expirationDate,
37
+ expirationDate: formatTimestamp(this.expirationDate),
34
38
  maxDebtPerBlockMultiplier: this.maxDebtPerBlockMultiplier,
35
39
  botList: this.labelAddress(this.botList),
36
40
  minDebt: formatBNvalue(this.minDebt, decimals),
@@ -5,7 +5,11 @@ import {
5
5
  import { iPausableAbi } from "../../../abi/iPausable.js";
6
6
  import { BaseContract } from "../../base/index.js";
7
7
  import { ADDRESS_0X0 } from "../../constants/index.js";
8
- import { fmtBinaryMask, formatBNvalue } from "../../utils/index.js";
8
+ import {
9
+ fmtBinaryMask,
10
+ formatBNvalue,
11
+ formatTimestamp
12
+ } from "../../utils/index.js";
9
13
  const abi = [
10
14
  ...iCreditFacadeV310Abi,
11
15
  ...iCreditFacadeMulticallV310Abi,
@@ -30,7 +34,7 @@ class CreditFacadeV310Contract extends BaseContract {
30
34
  expirable: this.expirable,
31
35
  isDegenMode: this.degenNFT !== ADDRESS_0X0,
32
36
  degenNFT: this.labelAddress(this.degenNFT),
33
- expirationDate: this.expirationDate,
37
+ expirationDate: formatTimestamp(this.expirationDate),
34
38
  maxDebtPerBlockMultiplier: this.maxDebtPerBlockMultiplier,
35
39
  botList: this.labelAddress(this.botList),
36
40
  minDebt: formatBNvalue(this.minDebt, decimals),
@@ -113,6 +113,9 @@ class PriceOracleBaseContract extends BaseContract {
113
113
  * @param reserve use reserve price feed instead of main
114
114
  */
115
115
  convertToUSD(from, amount, reserve = false) {
116
+ if (amount === 0n) {
117
+ return 0n;
118
+ }
116
119
  const price = reserve ? this.reservePrice(from) : this.mainPrice(from);
117
120
  const scale = 10n ** BigInt(this.tokensMeta.decimals(from));
118
121
  return amount * price / scale;
@@ -124,6 +127,9 @@ class PriceOracleBaseContract extends BaseContract {
124
127
  * @param reserve use reserve price feed instead of main
125
128
  */
126
129
  convertFromUSD(to, amount, reserve = false) {
130
+ if (amount === 0n) {
131
+ return 0n;
132
+ }
127
133
  const price = reserve ? this.reservePrice(to) : this.mainPrice(to);
128
134
  const scale = 10n ** BigInt(this.tokensMeta.decimals(to));
129
135
  return amount * scale / price;