@gearbox-protocol/sdk 13.7.0-kyc.3 → 14.0.0-next.10

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 (214) hide show
  1. package/dist/cjs/dev/AccountOpener.js +5 -45
  2. package/dist/cjs/dev/RevolverTransport.js +10 -4
  3. package/dist/cjs/dev/index.js +0 -2
  4. package/dist/cjs/dev/logSplitterTransport.js +10 -1
  5. package/dist/cjs/permissionless/utils/create2.js +2 -2
  6. package/dist/cjs/permissionless/utils/price-update/get-price-feeds.js +11 -5
  7. package/dist/cjs/permissionless/utils/price-update/get-price-update-tx.js +11 -5
  8. package/dist/cjs/permissionless/utils/price-update/get-prices.js +12 -6
  9. package/dist/cjs/sdk/MultichainSDK.js +232 -0
  10. package/dist/cjs/sdk/OnchainSDK.js +478 -0
  11. package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +16 -324
  12. package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +1 -7
  13. package/dist/cjs/sdk/base/TokensMeta.js +42 -22
  14. package/dist/cjs/sdk/base/token-types.js +0 -9
  15. package/dist/cjs/sdk/chain/chains.js +1 -2
  16. package/dist/cjs/sdk/constants/address-provider.js +0 -3
  17. package/dist/cjs/sdk/core/errors.js +77 -0
  18. package/dist/cjs/sdk/core/index.js +2 -0
  19. package/dist/cjs/sdk/index.js +4 -2
  20. package/dist/cjs/sdk/market/MarketRegister.js +116 -70
  21. package/dist/cjs/sdk/market/MarketSuite.js +0 -3
  22. package/dist/cjs/sdk/market/index.js +0 -2
  23. package/dist/cjs/sdk/market/pool/PoolSuite.js +0 -3
  24. package/dist/cjs/sdk/market/pool/PoolV310Contract.js +2 -11
  25. package/dist/cjs/sdk/market/pool/index.js +0 -2
  26. package/dist/cjs/sdk/market/pricefeeds/PriceFeedsRegister.js +10 -3
  27. package/dist/cjs/sdk/market/pricefeeds/updates/PythAccumulatorUpdateData.js +20 -23
  28. package/dist/cjs/sdk/market/pricefeeds/updates/PythUpdater.js +7 -4
  29. package/dist/cjs/sdk/market/pricefeeds/updates/RedstoneUpdater.js +4 -4
  30. package/dist/cjs/sdk/market/pricefeeds/updates/fetchPythPayloads.js +1 -1
  31. package/dist/cjs/sdk/market/pricefeeds/updates/index.js +3 -0
  32. package/dist/cjs/sdk/options.js +24 -52
  33. package/dist/cjs/sdk/plugins/BasePlugin.js +11 -4
  34. package/dist/cjs/sdk/pools/PoolService.js +12 -104
  35. package/dist/cjs/sdk/utils/formatter.js +99 -20
  36. package/dist/cjs/sdk/utils/viem/index.js +3 -3
  37. package/dist/cjs/sdk/utils/viem/watchBlocksAsync.js +76 -0
  38. package/dist/esm/dev/AccountOpener.js +6 -47
  39. package/dist/esm/dev/RevolverTransport.js +10 -4
  40. package/dist/esm/dev/index.js +0 -1
  41. package/dist/esm/dev/logSplitterTransport.js +10 -1
  42. package/dist/esm/permissionless/utils/create2.js +1 -1
  43. package/dist/esm/permissionless/utils/price-update/get-price-feeds.js +12 -6
  44. package/dist/esm/permissionless/utils/price-update/get-price-update-tx.js +13 -7
  45. package/dist/esm/permissionless/utils/price-update/get-prices.js +13 -7
  46. package/dist/esm/sdk/MultichainSDK.js +217 -0
  47. package/dist/esm/sdk/OnchainSDK.js +472 -0
  48. package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +17 -328
  49. package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +1 -7
  50. package/dist/esm/sdk/base/TokensMeta.js +44 -22
  51. package/dist/esm/sdk/base/token-types.js +0 -6
  52. package/dist/esm/sdk/chain/chains.js +1 -2
  53. package/dist/esm/sdk/constants/address-provider.js +0 -2
  54. package/dist/esm/sdk/core/errors.js +48 -0
  55. package/dist/esm/sdk/core/index.js +1 -0
  56. package/dist/esm/sdk/index.js +2 -1
  57. package/dist/esm/sdk/market/MarketRegister.js +118 -74
  58. package/dist/esm/sdk/market/MarketSuite.js +0 -3
  59. package/dist/esm/sdk/market/index.js +0 -1
  60. package/dist/esm/sdk/market/pool/PoolSuite.js +0 -3
  61. package/dist/esm/sdk/market/pool/PoolV310Contract.js +2 -11
  62. package/dist/esm/sdk/market/pool/index.js +0 -1
  63. package/dist/esm/sdk/market/pricefeeds/PriceFeedsRegister.js +10 -3
  64. package/dist/esm/sdk/market/pricefeeds/updates/PythAccumulatorUpdateData.js +20 -13
  65. package/dist/esm/sdk/market/pricefeeds/updates/PythUpdater.js +7 -4
  66. package/dist/esm/sdk/market/pricefeeds/updates/RedstoneUpdater.js +4 -4
  67. package/dist/esm/sdk/market/pricefeeds/updates/fetchPythPayloads.js +1 -1
  68. package/dist/esm/sdk/market/pricefeeds/updates/index.js +2 -0
  69. package/dist/esm/sdk/options.js +22 -51
  70. package/dist/esm/sdk/plugins/BasePlugin.js +11 -4
  71. package/dist/esm/sdk/pools/PoolService.js +13 -109
  72. package/dist/esm/sdk/utils/formatter.js +99 -10
  73. package/dist/esm/sdk/utils/viem/index.js +1 -1
  74. package/dist/esm/sdk/utils/viem/watchBlocksAsync.js +52 -0
  75. package/dist/types/dev/RevolverTransport.d.ts +2 -1
  76. package/dist/types/dev/calcLiquidatableLTs.d.ts +2 -2
  77. package/dist/types/dev/claimFromFaucet.d.ts +2 -2
  78. package/dist/types/dev/create2.d.ts +3 -4
  79. package/dist/types/dev/index.d.ts +0 -1
  80. package/dist/types/dev/logSplitterTransport.d.ts +3 -1
  81. package/dist/types/dev/migrateFaucet.d.ts +2 -2
  82. package/dist/types/dev/mint/AbstractMinter.d.ts +2 -2
  83. package/dist/types/dev/mint/FallbackMinter.d.ts +2 -2
  84. package/dist/types/dev/mint/factory.d.ts +2 -2
  85. package/dist/types/dev/replaceStorage.d.ts +1 -1
  86. package/dist/types/permissionless/utils/price-update/get-updatable-feeds.d.ts +2 -2
  87. package/dist/types/plugins/accounts/AccountsPlugin.d.ts +2 -2
  88. package/dist/types/plugins/accounts-counter/AccountsCounterPlugin.d.ts +2 -2
  89. package/dist/types/plugins/adapters/AdaptersPlugin.d.ts +2 -2
  90. package/dist/types/plugins/apy/ApyPlugin.d.ts +2 -2
  91. package/dist/types/plugins/bots/BotsPlugin.d.ts +2 -2
  92. package/dist/types/plugins/bots/PartialLiquidationBotV310Contract.d.ts +2 -2
  93. package/dist/types/plugins/degen-distributors/DegenDistributorsPlugin.d.ts +2 -2
  94. package/dist/types/plugins/delayed-withdrawal/DelayedWithdrawalPlugin.d.ts +2 -2
  95. package/dist/types/sdk/MultichainSDK.d.ts +144 -0
  96. package/dist/types/sdk/OnchainSDK.d.ts +257 -0
  97. package/dist/types/sdk/accounts/AbstractCreditAccountsService.d.ts +4 -54
  98. package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -1
  99. package/dist/types/sdk/accounts/createCreditAccountService.d.ts +2 -2
  100. package/dist/types/sdk/accounts/types.d.ts +15 -95
  101. package/dist/types/sdk/base/SDKConstruct.d.ts +4 -4
  102. package/dist/types/sdk/base/TokensMeta.d.ts +3 -14
  103. package/dist/types/sdk/base/token-types.d.ts +4 -44
  104. package/dist/types/sdk/base/types.d.ts +2 -116
  105. package/dist/types/sdk/chain/chains.d.ts +1 -5
  106. package/dist/types/sdk/constants/address-provider.d.ts +0 -1
  107. package/dist/types/sdk/core/createAddressProvider.d.ts +3 -3
  108. package/dist/types/sdk/core/errors.d.ts +51 -0
  109. package/dist/types/sdk/core/index.d.ts +1 -0
  110. package/dist/types/sdk/index.d.ts +2 -1
  111. package/dist/types/sdk/market/MarketRegister.d.ts +11 -8
  112. package/dist/types/sdk/market/MarketSuite.d.ts +2 -4
  113. package/dist/types/sdk/market/adapters/createAdapter.d.ts +2 -2
  114. package/dist/types/sdk/market/credit/CreditConfiguratorV310Contract.d.ts +3 -3
  115. package/dist/types/sdk/market/credit/CreditManagerV310Contract.d.ts +2 -2
  116. package/dist/types/sdk/market/credit/CreditSuite.d.ts +2 -2
  117. package/dist/types/sdk/market/credit/createCreditConfigurator.d.ts +2 -2
  118. package/dist/types/sdk/market/credit/createCreditFacade.d.ts +2 -2
  119. package/dist/types/sdk/market/credit/createCreditManager.d.ts +2 -2
  120. package/dist/types/sdk/market/credit/types.d.ts +1 -1
  121. package/dist/types/sdk/market/index.d.ts +0 -1
  122. package/dist/types/sdk/market/loss-policy/AliasLossPolicyV310Contract.d.ts +3 -3
  123. package/dist/types/sdk/market/loss-policy/createLossPolicy.d.ts +2 -2
  124. package/dist/types/sdk/market/oracle/PriceOracleBaseContract.d.ts +5 -6
  125. package/dist/types/sdk/market/oracle/PriceOracleV310Contract.d.ts +2 -2
  126. package/dist/types/sdk/market/oracle/createPriceOracle.d.ts +2 -2
  127. package/dist/types/sdk/market/oracle/types.d.ts +10 -3
  128. package/dist/types/sdk/market/pool/PoolSuite.d.ts +2 -4
  129. package/dist/types/sdk/market/pool/PoolV310Contract.d.ts +2 -6
  130. package/dist/types/sdk/market/pool/createInterestRateModel.d.ts +2 -2
  131. package/dist/types/sdk/market/pool/createPool.d.ts +2 -2
  132. package/dist/types/sdk/market/pool/createPoolQuotaKeeper.d.ts +2 -2
  133. package/dist/types/sdk/market/pool/createRateKeeper.d.ts +2 -2
  134. package/dist/types/sdk/market/pool/index.d.ts +0 -1
  135. package/dist/types/sdk/market/pricefeeds/PriceFeedsRegister.d.ts +8 -3
  136. package/dist/types/sdk/market/pricefeeds/updates/PythAccumulatorUpdateData.d.ts +12 -13
  137. package/dist/types/sdk/market/pricefeeds/updates/PythUpdater.d.ts +8 -3
  138. package/dist/types/sdk/market/pricefeeds/updates/RedstoneUpdater.d.ts +8 -3
  139. package/dist/types/sdk/market/pricefeeds/updates/index.d.ts +1 -0
  140. package/dist/types/sdk/market/pricefeeds/updates/types.d.ts +4 -0
  141. package/dist/types/sdk/market/types.d.ts +1 -1
  142. package/dist/types/sdk/options.d.ts +15 -16
  143. package/dist/types/sdk/plugins/BasePlugin.d.ts +12 -6
  144. package/dist/types/sdk/plugins/errors.d.ts +2 -2
  145. package/dist/types/sdk/plugins/types.d.ts +16 -6
  146. package/dist/types/sdk/pools/PoolService.d.ts +8 -8
  147. package/dist/types/sdk/pools/types.d.ts +2 -3
  148. package/dist/types/sdk/router/AbstractRouterContract.d.ts +3 -3
  149. package/dist/types/sdk/router/RouterV310Contract.d.ts +2 -2
  150. package/dist/types/sdk/router/createRouter.d.ts +2 -2
  151. package/dist/types/sdk/router/helpers.d.ts +1 -1
  152. package/dist/types/sdk/types/state-human.d.ts +10 -2
  153. package/dist/types/sdk/types/state.d.ts +14 -8
  154. package/dist/types/sdk/utils/filterDust.d.ts +2 -2
  155. package/dist/types/sdk/utils/formatter.d.ts +1 -1
  156. package/dist/types/sdk/utils/isDust.d.ts +2 -2
  157. package/dist/types/sdk/utils/toAddress.d.ts +1 -1
  158. package/dist/types/sdk/utils/viem/getLogsPaginated.d.ts +1 -2
  159. package/dist/types/sdk/utils/viem/getLogsSafe.d.ts +1 -1
  160. package/dist/types/sdk/utils/viem/index.d.ts +1 -1
  161. package/dist/types/sdk/utils/viem/simulateWithPriceUpdates.d.ts +1 -2
  162. package/dist/types/sdk/utils/viem/watchBlocksAsync.d.ts +74 -0
  163. package/package.json +3 -6
  164. package/dist/cjs/abi/kyc/iDSRegistryService.js +0 -70
  165. package/dist/cjs/abi/kyc/iDSToken.js +0 -71
  166. package/dist/cjs/abi/kyc/iKYCCompressor.js +0 -196
  167. package/dist/cjs/abi/kyc/iKYCFactory.js +0 -122
  168. package/dist/cjs/abi/kyc/iKYCUnderlying.js +0 -401
  169. package/dist/cjs/abi/kyc/iSecuritizeDegenNFT.js +0 -326
  170. package/dist/cjs/abi/kyc/iSecuritizeKYCFactory.js +0 -319
  171. package/dist/cjs/dev/CachedStateSubscriber.js +0 -78
  172. package/dist/cjs/sdk/GearboxSDK.js +0 -696
  173. package/dist/cjs/sdk/market/kyc/KYCRegistry.js +0 -269
  174. package/dist/cjs/sdk/market/kyc/index.js +0 -26
  175. package/dist/cjs/sdk/market/kyc/securitize/SecuritizeKYCFactory.js +0 -244
  176. package/dist/cjs/sdk/market/kyc/securitize/constants.js +0 -28
  177. package/dist/cjs/sdk/market/kyc/securitize/index.js +0 -26
  178. package/dist/cjs/sdk/market/kyc/securitize/types.js +0 -16
  179. package/dist/cjs/sdk/market/kyc/types.js +0 -34
  180. package/dist/cjs/sdk/utils/viem/executeDelegatedMulticalls.js +0 -38
  181. package/dist/esm/abi/kyc/iDSRegistryService.js +0 -46
  182. package/dist/esm/abi/kyc/iDSToken.js +0 -47
  183. package/dist/esm/abi/kyc/iKYCCompressor.js +0 -172
  184. package/dist/esm/abi/kyc/iKYCFactory.js +0 -98
  185. package/dist/esm/abi/kyc/iKYCUnderlying.js +0 -377
  186. package/dist/esm/abi/kyc/iSecuritizeDegenNFT.js +0 -302
  187. package/dist/esm/abi/kyc/iSecuritizeKYCFactory.js +0 -295
  188. package/dist/esm/dev/CachedStateSubscriber.js +0 -54
  189. package/dist/esm/sdk/GearboxSDK.js +0 -689
  190. package/dist/esm/sdk/market/kyc/KYCRegistry.js +0 -253
  191. package/dist/esm/sdk/market/kyc/index.js +0 -3
  192. package/dist/esm/sdk/market/kyc/securitize/SecuritizeKYCFactory.js +0 -220
  193. package/dist/esm/sdk/market/kyc/securitize/constants.js +0 -4
  194. package/dist/esm/sdk/market/kyc/securitize/index.js +0 -3
  195. package/dist/esm/sdk/market/kyc/securitize/types.js +0 -0
  196. package/dist/esm/sdk/market/kyc/types.js +0 -9
  197. package/dist/esm/sdk/utils/viem/executeDelegatedMulticalls.js +0 -14
  198. package/dist/types/abi/kyc/iDSRegistryService.d.ts +0 -71
  199. package/dist/types/abi/kyc/iDSToken.d.ts +0 -67
  200. package/dist/types/abi/kyc/iKYCCompressor.d.ts +0 -228
  201. package/dist/types/abi/kyc/iKYCFactory.d.ts +0 -139
  202. package/dist/types/abi/kyc/iKYCUnderlying.d.ts +0 -548
  203. package/dist/types/abi/kyc/iSecuritizeDegenNFT.d.ts +0 -404
  204. package/dist/types/abi/kyc/iSecuritizeKYCFactory.d.ts +0 -376
  205. package/dist/types/dev/CachedStateSubscriber.d.ts +0 -21
  206. package/dist/types/sdk/GearboxSDK.d.ts +0 -324
  207. package/dist/types/sdk/market/kyc/KYCRegistry.d.ts +0 -52
  208. package/dist/types/sdk/market/kyc/index.d.ts +0 -3
  209. package/dist/types/sdk/market/kyc/securitize/SecuritizeKYCFactory.d.ts +0 -428
  210. package/dist/types/sdk/market/kyc/securitize/constants.d.ts +0 -1
  211. package/dist/types/sdk/market/kyc/securitize/index.d.ts +0 -3
  212. package/dist/types/sdk/market/kyc/securitize/types.d.ts +0 -127
  213. package/dist/types/sdk/market/kyc/types.d.ts +0 -170
  214. package/dist/types/sdk/utils/viem/executeDelegatedMulticalls.d.ts +0 -28
@@ -70,8 +70,14 @@ const revolverTransportConfigSchema = z.union([
70
70
  })
71
71
  ]);
72
72
  class NoAvailableTransportsError extends BaseError {
73
- constructor(cause) {
74
- super("no available transports", { cause });
73
+ statuses;
74
+ constructor(statuses, cause) {
75
+ super("No available transports", {
76
+ cause,
77
+ metaMessages: statuses.length > 0 ? statuses.map((s) => `- ${s.id}: ${s.status}`) : ["No transports configured"],
78
+ name: "NoAvailableTransportsError"
79
+ });
80
+ this.statuses = statuses;
75
81
  }
76
82
  }
77
83
  class RevolverTransport {
@@ -129,7 +135,7 @@ class RevolverTransport {
129
135
  );
130
136
  }
131
137
  if (transports.length === 0) {
132
- throw new NoAvailableTransportsError();
138
+ throw new NoAvailableTransportsError([]);
133
139
  }
134
140
  this.#isSingle = transports.length === 1;
135
141
  const selectionStrategy = config.selectionStrategy ?? "simple";
@@ -180,7 +186,7 @@ class RevolverTransport {
180
186
  }
181
187
  } while (this.#selector.canRotate());
182
188
  this.#requests.delete(r);
183
- throw new NoAvailableTransportsError(error);
189
+ throw new NoAvailableTransportsError(this.#selector.statuses(), error);
184
190
  };
185
191
  get config() {
186
192
  return {
@@ -1,5 +1,4 @@
1
1
  export * from "./AccountOpener.js";
2
- export * from "./CachedStateSubscriber.js";
3
2
  export * from "./calcLiquidatableLTs.js";
4
3
  export * from "./claimFromFaucet.js";
5
4
  export * from "./create2.js";
@@ -21,7 +21,9 @@ const RANGE_ERROR_PATTERNS = [
21
21
  /eth_getLogs is limited to/i,
22
22
  /eth_getLogs requests with up to/i,
23
23
  /range is too large/i,
24
- /exceeded max allowed range/i
24
+ /exceeded max allowed range/i,
25
+ // Encountered on DRPC: "query exceeds max results 20000, retry with the range …"
26
+ /exceeds max results/i
25
27
  ];
26
28
  function isRangeError(error) {
27
29
  const msg = errorMessage(error);
@@ -29,10 +31,17 @@ function isRangeError(error) {
29
31
  }
30
32
  const GENERIC_BLOCKS_RE = /(\d+)\s*block/i;
31
33
  const ALCHEMY_RANGE_RE = /this block range should work: \[(0x[0-9a-fA-F]+),\s*(0x[0-9a-fA-F]+)\]/;
34
+ const DRPC_RANGE_RE = /retry with the range (\d+)-(\d+)/;
32
35
  function parsePageSizeHint(error) {
33
36
  const alchemy = tryAlchemyHint(error);
34
37
  if (alchemy != null) return alchemy;
35
38
  const msg = errorMessage(error);
39
+ const drpc = msg.match(DRPC_RANGE_RE);
40
+ if (drpc) {
41
+ const from = Number(drpc[1]);
42
+ const to = Number(drpc[2]);
43
+ return to - from + 1;
44
+ }
36
45
  const m = msg.match(GENERIC_BLOCKS_RE);
37
46
  return m ? Number(m[1]) : null;
38
47
  }
@@ -1,8 +1,8 @@
1
- import { formatAbiItem } from "abitype";
2
1
  import {
3
2
  getCreate2Address,
4
3
  stringToHex
5
4
  } from "viem";
5
+ import { formatAbiItem } from "viem/utils";
6
6
  const PUBLIC_CREATE2_FACTORY = "0x4e59b44847b379578588920ca78fbf26c0b4956c";
7
7
  function handleSalt(salt) {
8
8
  if (salt.slice(0, 2) !== "0x" || salt.length !== 66) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  AP_PRICE_FEED_COMPRESSOR,
3
- GearboxSDK
3
+ OnchainSDK
4
4
  } from "../../../sdk/index.js";
5
5
  import { AddressProviderContract } from "../../bindings/index.js";
6
6
  import { Addresses } from "../../deployment/addresses.js";
@@ -47,11 +47,17 @@ async function getCallsTouchedUpdatablePriceFeeds({
47
47
  AP_PRICE_FEED_COMPRESSOR,
48
48
  310n
49
49
  );
50
- const sdk = await GearboxSDK.attach({
51
- client,
52
- marketConfigurators: [],
53
- gasLimit
54
- });
50
+ const gearboxClient = client;
51
+ const chain = gearboxClient.chain;
52
+ if (!chain) {
53
+ throw new Error("Chain not defined on client");
54
+ }
55
+ const sdk = new OnchainSDK(
56
+ chain.network,
57
+ { client: gearboxClient },
58
+ { gasLimit }
59
+ );
60
+ await sdk.attach({ marketConfigurators: [] });
55
61
  const touchedFeeds = parsedCalls.flatMap(
56
62
  (call) => getCallTouchedPriceFeeds(call)
57
63
  );
@@ -3,8 +3,8 @@ import {
3
3
  } from "viem";
4
4
  import {
5
5
  createRawTx,
6
- GearboxSDK,
7
- getRawPriceUpdates
6
+ getRawPriceUpdates,
7
+ OnchainSDK
8
8
  } from "../../../sdk/index.js";
9
9
  import { PriceFeedStoreContract } from "../../bindings/index.js";
10
10
  import { Addresses } from "../../deployment/addresses.js";
@@ -18,11 +18,17 @@ async function getPriceUpdateTx({
18
18
  Addresses.PRICE_FEED_STORE,
19
19
  client
20
20
  );
21
- const sdk = await GearboxSDK.attach({
22
- client,
23
- marketConfigurators: [],
24
- gasLimit
25
- });
21
+ const gearboxClient = client;
22
+ const chain = gearboxClient.chain;
23
+ if (!chain) {
24
+ throw new Error("Chain not defined on client");
25
+ }
26
+ const sdk = new OnchainSDK(
27
+ chain.network,
28
+ { client: gearboxClient },
29
+ { gasLimit }
30
+ );
31
+ await sdk.attach({ marketConfigurators: [] });
26
32
  const updateTxs = await sdk.priceFeeds.generateExternalPriceFeedsUpdateTxs(priceFeeds);
27
33
  if (useMulticall3) {
28
34
  const multicallCalls = updateTxs.txs.map((tx) => ({
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  multicall3Abi
3
3
  } from "viem";
4
- import { GearboxSDK, simulateMulticall } from "../../../sdk/index.js";
4
+ import { OnchainSDK, simulateMulticall } from "../../../sdk/index.js";
5
5
  const latestRoundDataAbi = [
6
6
  {
7
7
  inputs: [],
@@ -80,12 +80,18 @@ async function getPrices({
80
80
  if (!client.chain) {
81
81
  throw new Error("Chain not defined");
82
82
  }
83
- const sdk = await GearboxSDK.attach({
84
- client,
85
- gasLimit,
86
- marketConfigurators: [],
87
- redstone: {},
88
- pyth: {}
83
+ const gearboxClient = client;
84
+ const chain = gearboxClient.chain;
85
+ if (!chain) {
86
+ throw new Error("Chain not defined on client");
87
+ }
88
+ const sdk = new OnchainSDK(
89
+ chain.network,
90
+ { client: gearboxClient },
91
+ { gasLimit }
92
+ );
93
+ await sdk.attach({
94
+ marketConfigurators: []
89
95
  });
90
96
  const chunks = [];
91
97
  for (let i = 0; i < priceFeeds.length; i += chunkSize) {
@@ -0,0 +1,217 @@
1
+ import { getNetworkType } from "./chain/chains.js";
2
+ import {
3
+ SdkMissingChainStateError,
4
+ SdkStateVersionMismatchError,
5
+ SdkSyncFailedError
6
+ } from "./core/index.js";
7
+ import {
8
+ PriceUpdatesCache
9
+ } from "./market/pricefeeds/updates/index.js";
10
+ import {
11
+ OnchainSDK,
12
+ STATE_VERSION
13
+ } from "./OnchainSDK.js";
14
+ class MultichainSDK {
15
+ #chains;
16
+ #redstoneCache;
17
+ #pythCache;
18
+ #logger;
19
+ constructor(options) {
20
+ this.#chains = /* @__PURE__ */ new Map();
21
+ this.#logger = options.logger;
22
+ for (const [network, chainConfig] of Object.entries(options.chains)) {
23
+ const { gasLimit, ...clientOptions } = chainConfig;
24
+ let plugins;
25
+ if (options.plugins) {
26
+ plugins = Object.fromEntries(
27
+ Object.entries(options.plugins).map(([name, factory]) => [
28
+ name,
29
+ factory()
30
+ ])
31
+ );
32
+ }
33
+ const sdkOptions = {
34
+ logger: options.logger?.child?.({ network }),
35
+ strictContractTypes: options.strictContractTypes,
36
+ gasLimit: gasLimit ?? options.gasLimit,
37
+ plugins
38
+ };
39
+ const sdk = new OnchainSDK(
40
+ network,
41
+ clientOptions,
42
+ sdkOptions
43
+ );
44
+ this.#chains.set(network, sdk);
45
+ }
46
+ }
47
+ /**
48
+ * Attach all configured chains in parallel.
49
+ *
50
+ * @param options - Shared and per-chain attach options.
51
+ */
52
+ async attach(options) {
53
+ if (options?.redstone) {
54
+ this.#redstoneCache = new PriceUpdatesCache({
55
+ ttl: options.redstone.cacheTTL ?? 225e3,
56
+ historical: !!options.redstone.historicTimestamp
57
+ });
58
+ }
59
+ if (options?.pyth) {
60
+ this.#pythCache = new PriceUpdatesCache({
61
+ ttl: options.pyth.cacheTTL ?? 225e3,
62
+ historical: !!options.pyth.historicTimestamp
63
+ });
64
+ }
65
+ await Promise.all(
66
+ [...this.#chains.entries()].map(([network, sdk]) => {
67
+ const perChainOpts = options?.perChain?.[network] ?? {};
68
+ return sdk.attach({
69
+ ...perChainOpts,
70
+ redstone: {
71
+ ...options?.redstone,
72
+ cache: this.#redstoneCache,
73
+ ...perChainOpts.redstone
74
+ },
75
+ pyth: {
76
+ ...options?.pyth,
77
+ cache: this.#pythCache,
78
+ ...perChainOpts.pyth
79
+ }
80
+ });
81
+ })
82
+ );
83
+ this.#logger?.info("Attached all chains");
84
+ }
85
+ /**
86
+ * Hydrate all configured chains from serialised state.
87
+ *
88
+ * @param state - Multichain serialised state.
89
+ * @param options - Shared and per-chain hydrate options.
90
+ * @throws {@link SdkStateVersionMismatchError} if version doesn't match.
91
+ * @throws {@link SdkMissingChainStateError} if a configured chain has no
92
+ * state and `allowMissingChains` is not set.
93
+ */
94
+ hydrate(state, options) {
95
+ if (state.version !== STATE_VERSION) {
96
+ throw new SdkStateVersionMismatchError(STATE_VERSION, state.version);
97
+ }
98
+ if (options?.redstone) {
99
+ this.#redstoneCache = new PriceUpdatesCache({
100
+ ttl: options.redstone.cacheTTL ?? 225e3,
101
+ historical: !!options.redstone.historicTimestamp
102
+ });
103
+ }
104
+ if (options?.pyth) {
105
+ this.#pythCache = new PriceUpdatesCache({
106
+ ttl: options.pyth.cacheTTL ?? 225e3,
107
+ historical: !!options.pyth.historicTimestamp
108
+ });
109
+ }
110
+ const stateByNetwork = new Map(state.chains.map((cs) => [cs.network, cs]));
111
+ for (const [network, sdk] of this.#chains) {
112
+ const chainState = stateByNetwork.get(network);
113
+ if (!chainState) {
114
+ if (options?.allowMissingChains) {
115
+ continue;
116
+ }
117
+ throw new SdkMissingChainStateError(network);
118
+ }
119
+ const perChainOpts = options?.perChain?.[network] ?? {};
120
+ sdk.hydrate(chainState, {
121
+ ...perChainOpts,
122
+ redstone: {
123
+ ...options?.redstone,
124
+ cache: this.#redstoneCache,
125
+ ...perChainOpts.redstone
126
+ },
127
+ pyth: {
128
+ ...options?.pyth,
129
+ cache: this.#pythCache,
130
+ ...perChainOpts.pyth
131
+ }
132
+ });
133
+ }
134
+ this.#logger?.info("Hydrated all chains");
135
+ }
136
+ /**
137
+ * Returns the {@link OnchainSDK} for a given network or chain ID.
138
+ *
139
+ * @param networkOrChainId - Network type string or numeric chain ID.
140
+ * @throws If the network/chain is not configured.
141
+ */
142
+ chain(networkOrChainId) {
143
+ let network;
144
+ if (typeof networkOrChainId === "number") {
145
+ network = getNetworkType(networkOrChainId);
146
+ } else {
147
+ network = networkOrChainId;
148
+ }
149
+ const sdk = this.#chains.get(network);
150
+ if (!sdk) {
151
+ throw new Error(
152
+ `Chain ${String(networkOrChainId)} is not configured in this MultichainSDK`
153
+ );
154
+ }
155
+ return sdk;
156
+ }
157
+ /**
158
+ * Read-only map of all configured chains.
159
+ **/
160
+ get chains() {
161
+ return this.#chains;
162
+ }
163
+ /**
164
+ * Sync state for all chains in parallel.
165
+ *
166
+ * @param opts - Sync options.
167
+ * @throws {@link SdkSyncFailedError} if any chain fails.
168
+ */
169
+ async syncState(opts) {
170
+ const errors = {};
171
+ const results = await Promise.allSettled(
172
+ [...this.#chains.entries()].map(async ([_network, sdk]) => {
173
+ const block = await sdk.client.getBlock({ blockTag: "latest" });
174
+ const synced = await sdk.syncState({
175
+ blockNumber: block.number,
176
+ timestamp: block.timestamp,
177
+ ignoreUpdateablePrices: opts?.ignoreUpdateablePrices
178
+ });
179
+ if (!synced) {
180
+ return;
181
+ }
182
+ })
183
+ );
184
+ for (const [i, result] of results.entries()) {
185
+ if (result.status === "rejected") {
186
+ const network = [...this.#chains.keys()][i];
187
+ errors[network] = result.reason;
188
+ }
189
+ }
190
+ if (Object.keys(errors).length > 0) {
191
+ throw new SdkSyncFailedError(errors);
192
+ }
193
+ this.#logger?.info("Synced state for all chains");
194
+ }
195
+ /**
196
+ * Serialisable snapshot of all chains' state.
197
+ **/
198
+ get state() {
199
+ return {
200
+ version: STATE_VERSION,
201
+ chains: [...this.#chains.values()].map((sdk) => sdk.state)
202
+ };
203
+ }
204
+ /**
205
+ * Human-readable snapshot of all chains' state.
206
+ * @param raw - When `true`, include raw numeric values.
207
+ */
208
+ stateHuman(raw) {
209
+ return {
210
+ version: STATE_VERSION,
211
+ chains: [...this.#chains.values()].map((sdk) => sdk.stateHuman(raw))
212
+ };
213
+ }
214
+ }
215
+ export {
216
+ MultichainSDK
217
+ };