@gearbox-protocol/sdk 13.3.3 → 13.3.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.
Files changed (80) hide show
  1. package/dist/cjs/sdk/GearboxSDK.js +135 -20
  2. package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +78 -157
  3. package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +5 -5
  4. package/dist/cjs/sdk/base/BaseContract.js +26 -6
  5. package/dist/cjs/sdk/base/ChainContractsRegister.js +39 -2
  6. package/dist/cjs/sdk/base/Construct.js +15 -3
  7. package/dist/cjs/sdk/base/TokensMeta.js +23 -0
  8. package/dist/cjs/sdk/constants/address-provider.js +0 -22
  9. package/dist/cjs/sdk/core/AbstractAddressProviderContract.js +15 -0
  10. package/dist/cjs/sdk/market/MarketRegister.js +74 -3
  11. package/dist/cjs/sdk/market/oracle/PriceOracleBaseContract.js +31 -50
  12. package/dist/cjs/sdk/market/pricefeeds/PriceFeedRef.js +16 -0
  13. package/dist/cjs/sdk/market/pricefeeds/PriceFeedsRegister.js +55 -12
  14. package/dist/cjs/sdk/options.js +30 -24
  15. package/dist/cjs/sdk/plugins/BasePlugin.js +24 -0
  16. package/dist/cjs/sdk/pools/AbstractPoolService.js +6 -0
  17. package/dist/cjs/sdk/router/AbstractRouterContract.js +4 -1
  18. package/dist/cjs/sdk/router/RouterV310Contract.js +20 -15
  19. package/dist/cjs/sdk/utils/AddressMap.js +53 -17
  20. package/dist/cjs/sdk/utils/AddressSet.js +9 -0
  21. package/dist/cjs/sdk/utils/viem/sendRawTx.js +16 -0
  22. package/dist/esm/sdk/GearboxSDK.js +135 -20
  23. package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +78 -157
  24. package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +5 -5
  25. package/dist/esm/sdk/base/BaseContract.js +26 -6
  26. package/dist/esm/sdk/base/ChainContractsRegister.js +39 -2
  27. package/dist/esm/sdk/base/Construct.js +15 -3
  28. package/dist/esm/sdk/base/TokensMeta.js +23 -0
  29. package/dist/esm/sdk/constants/address-provider.js +0 -21
  30. package/dist/esm/sdk/core/AbstractAddressProviderContract.js +15 -0
  31. package/dist/esm/sdk/market/MarketRegister.js +74 -3
  32. package/dist/esm/sdk/market/oracle/PriceOracleBaseContract.js +31 -50
  33. package/dist/esm/sdk/market/pricefeeds/PriceFeedRef.js +16 -0
  34. package/dist/esm/sdk/market/pricefeeds/PriceFeedsRegister.js +55 -12
  35. package/dist/esm/sdk/options.js +30 -24
  36. package/dist/esm/sdk/plugins/BasePlugin.js +24 -0
  37. package/dist/esm/sdk/pools/AbstractPoolService.js +6 -0
  38. package/dist/esm/sdk/router/AbstractRouterContract.js +4 -1
  39. package/dist/esm/sdk/router/RouterV310Contract.js +20 -15
  40. package/dist/esm/sdk/utils/AddressMap.js +53 -17
  41. package/dist/esm/sdk/utils/AddressSet.js +9 -0
  42. package/dist/esm/sdk/utils/viem/sendRawTx.js +19 -1
  43. package/dist/types/sdk/GearboxSDK.d.ts +236 -34
  44. package/dist/types/sdk/accounts/AbstractCreditAccountsService.d.ts +56 -142
  45. package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +14 -5
  46. package/dist/types/sdk/accounts/types.d.ts +230 -18
  47. package/dist/types/sdk/base/BaseContract.d.ts +67 -6
  48. package/dist/types/sdk/base/ChainContractsRegister.d.ts +51 -2
  49. package/dist/types/sdk/base/Construct.d.ts +31 -0
  50. package/dist/types/sdk/base/PlaceholderContract.d.ts +3 -0
  51. package/dist/types/sdk/base/SDKConstruct.d.ts +10 -0
  52. package/dist/types/sdk/base/TokensMeta.d.ts +59 -2
  53. package/dist/types/sdk/base/types.d.ts +185 -25
  54. package/dist/types/sdk/chain/chains.d.ts +78 -18
  55. package/dist/types/sdk/chain/detectNetwork.d.ts +7 -0
  56. package/dist/types/sdk/constants/address-provider.d.ts +4 -3
  57. package/dist/types/sdk/core/AbstractAddressProviderContract.d.ts +23 -0
  58. package/dist/types/sdk/core/types.d.ts +46 -0
  59. package/dist/types/sdk/market/MarketRegister.d.ts +81 -0
  60. package/dist/types/sdk/market/adapters/PlaceholderAdapterContracts.d.ts +3 -0
  61. package/dist/types/sdk/market/oracle/PriceOracleBaseContract.d.ts +40 -50
  62. package/dist/types/sdk/market/oracle/types.d.ts +76 -57
  63. package/dist/types/sdk/market/pricefeeds/AbstractLPPriceFeed.d.ts +3 -0
  64. package/dist/types/sdk/market/pricefeeds/AbstractPriceFeed.d.ts +3 -0
  65. package/dist/types/sdk/market/pricefeeds/PriceFeedRef.d.ts +22 -2
  66. package/dist/types/sdk/market/pricefeeds/PriceFeedsRegister.d.ts +77 -13
  67. package/dist/types/sdk/market/pricefeeds/types.d.ts +70 -10
  68. package/dist/types/sdk/options.d.ts +13 -4
  69. package/dist/types/sdk/plugins/BasePlugin.d.ts +39 -0
  70. package/dist/types/sdk/plugins/types.d.ts +73 -43
  71. package/dist/types/sdk/pools/AbstractPoolService.d.ts +12 -0
  72. package/dist/types/sdk/pools/types.d.ts +75 -6
  73. package/dist/types/sdk/router/AbstractRouterContract.d.ts +21 -2
  74. package/dist/types/sdk/router/RouterV310Contract.d.ts +27 -15
  75. package/dist/types/sdk/router/types.d.ts +51 -69
  76. package/dist/types/sdk/types/state.d.ts +32 -3
  77. package/dist/types/sdk/utils/AddressMap.d.ts +61 -17
  78. package/dist/types/sdk/utils/AddressSet.d.ts +15 -0
  79. package/dist/types/sdk/utils/viem/sendRawTx.d.ts +5 -1
  80. package/package.json +4 -2
@@ -1,4 +1,3 @@
1
- import { NOT_DEPLOYED } from "./addresses.js";
2
1
  const NO_VERSION = 0;
3
2
  const AP_ACCOUNT_FACTORY = "ACCOUNT_FACTORY";
4
3
  const AP_ACL = "ACL";
@@ -32,28 +31,8 @@ const AP_WETH_GATEWAY = "WETH_GATEWAY";
32
31
  const AP_WETH_TOKEN = "WETH_TOKEN";
33
32
  const AP_ZAPPER_REGISTER = "ZAPPER_REGISTER";
34
33
  const AP_ZERO_PRICE_FEED = "ZERO_PRICE_FEED";
35
- const ADDRESS_PROVIDER = {
36
- Mainnet: "0x9ea7b04Da02a5373317D745c1571c84aaD03321D",
37
- Arbitrum: "0x7d04eCdb892Ae074f03B5D0aBA03796F90F3F2af",
38
- Optimism: "0x3761ca4BFAcFCFFc1B8034e69F19116dD6756726",
39
- Base: NOT_DEPLOYED,
40
- Sonic: "0x4b27b296273B72d7c7bfee1ACE93DC081467C41B",
41
- // New networks
42
- MegaETH: NOT_DEPLOYED,
43
- Monad: NOT_DEPLOYED,
44
- Berachain: NOT_DEPLOYED,
45
- Avalanche: NOT_DEPLOYED,
46
- BNB: NOT_DEPLOYED,
47
- WorldChain: NOT_DEPLOYED,
48
- Etherlink: NOT_DEPLOYED,
49
- Hemi: NOT_DEPLOYED,
50
- Lisk: NOT_DEPLOYED,
51
- Plasma: NOT_DEPLOYED,
52
- Somnia: NOT_DEPLOYED
53
- };
54
34
  const ADDRESS_PROVIDER_V310 = "0xF7f0a609BfAb9a0A98786951ef10e5FE26cC1E38";
55
35
  export {
56
- ADDRESS_PROVIDER,
57
36
  ADDRESS_PROVIDER_V310,
58
37
  AP_ACCOUNT_FACTORY,
59
38
  AP_ACL,
@@ -33,6 +33,9 @@ class AbstractAddressProviderContract extends BaseContract {
33
33
  this.#addresses[k][version] = overriden;
34
34
  }
35
35
  }
36
+ /**
37
+ * {@inheritDoc IAddressProviderContract.getAddress}
38
+ **/
36
39
  getAddress(contract, version = NO_VERSION) {
37
40
  if (!this.#addresses[contract]) {
38
41
  throw new Error(`Address ${contract}, version: ${version} not found`);
@@ -43,6 +46,9 @@ class AbstractAddressProviderContract extends BaseContract {
43
46
  }
44
47
  return result;
45
48
  }
49
+ /**
50
+ * {@inheritDoc IAddressProviderContract.getLatest}
51
+ **/
46
52
  getLatest(contract, range) {
47
53
  const allVersions = this.#addresses[contract];
48
54
  if (!allVersions) {
@@ -62,6 +68,9 @@ class AbstractAddressProviderContract extends BaseContract {
62
68
  }
63
69
  return [address, version];
64
70
  }
71
+ /**
72
+ * {@inheritDoc IAddressProviderContract.mustGetLatest}
73
+ **/
65
74
  mustGetLatest(contract, range) {
66
75
  const result = this.getLatest(contract, range);
67
76
  if (!result) {
@@ -69,6 +78,9 @@ class AbstractAddressProviderContract extends BaseContract {
69
78
  }
70
79
  return result;
71
80
  }
81
+ /**
82
+ * {@inheritDoc IAddressProviderContract.state}
83
+ **/
72
84
  get state() {
73
85
  return {
74
86
  baseParams: {
@@ -80,6 +92,9 @@ class AbstractAddressProviderContract extends BaseContract {
80
92
  addresses: this.#addresses
81
93
  };
82
94
  }
95
+ /**
96
+ * {@inheritDoc IAddressProviderContract.stateHuman}
97
+ **/
83
98
  stateHuman(raw = true) {
84
99
  return {
85
100
  ...super.stateHuman(raw),
@@ -10,9 +10,6 @@ import { simulateWithPriceUpdates } from "../utils/viem/index.js";
10
10
  import { MarketConfiguratorContract } from "./MarketConfiguratorContract.js";
11
11
  import { MarketSuite } from "./MarketSuite.js";
12
12
  class MarketRegister extends SDKConstruct {
13
- /**
14
- * Mapping pool.address -> MarketSuite
15
- */
16
13
  #markets = new AddressMap(void 0, "markets");
17
14
  #marketFilter;
18
15
  #marketConfigurators = new AddressMap(
@@ -20,12 +17,21 @@ class MarketRegister extends SDKConstruct {
20
17
  "marketConfigurators"
21
18
  );
22
19
  #ignoreMarkets;
20
+ /**
21
+ * @param sdk - Top-level SDK instance.
22
+ * @param ignoreMarkets - Pool addresses of markets to exclude from loading.
23
+ **/
23
24
  constructor(sdk, ignoreMarkets = []) {
24
25
  super(sdk);
25
26
  this.#ignoreMarkets = new Set(
26
27
  ignoreMarkets.map((m) => m.toLowerCase())
27
28
  );
28
29
  }
30
+ /**
31
+ * Restores market state from a previously serialized snapshot,
32
+ * bypassing on-chain reads.
33
+ * @param state - Array of market data snapshots.
34
+ **/
29
35
  hydrate(state) {
30
36
  this.#markets.clear();
31
37
  const configurators = new Set(state.map((m) => m.configurator));
@@ -44,6 +50,13 @@ class MarketRegister extends SDKConstruct {
44
50
  );
45
51
  }
46
52
  }
53
+ /**
54
+ * Fetches all markets from the on-chain for the given market configurators.
55
+ *
56
+ * @param marketConfigurators - Addresses of market configurator contracts to query.
57
+ * @param ignoreUpdateablePrices - When `true`, skips generating off-chain
58
+ * price updates before loading
59
+ **/
47
60
  async loadMarkets(marketConfigurators, ignoreUpdateablePrices) {
48
61
  if (!marketConfigurators.length) {
49
62
  this.logger?.warn(
@@ -66,6 +79,10 @@ class MarketRegister extends SDKConstruct {
66
79
  underlying: ADDRESS_0X0
67
80
  };
68
81
  }
82
+ /**
83
+ * The active filter used to scope market compressor queries.
84
+ * @throws If the register has not been hydrated or attached yet.
85
+ **/
69
86
  get marketFilter() {
70
87
  if (!this.#marketFilter) {
71
88
  throw new Error(
@@ -74,6 +91,15 @@ class MarketRegister extends SDKConstruct {
74
91
  }
75
92
  return this.#marketFilter;
76
93
  }
94
+ /**
95
+ * Re-synchronizes market state with the chain. If during sdk synchronization
96
+ * we detected that some markets or market configurators were changed,
97
+ * we reload everything.
98
+ *
99
+ * Otherwise only prices are refreshed.
100
+ *
101
+ * @param ignoreUpdateablePrices - When `true`, skips off-chain price updates.
102
+ **/
77
103
  async syncState(ignoreUpdateablePrices) {
78
104
  const dirty = this.markets.some((m) => m.dirty) || this.marketConfigurators.some((c) => c.dirty);
79
105
  if (dirty) {
@@ -184,26 +210,50 @@ class MarketRegister extends SDKConstruct {
184
210
  ...this.marketFilter.configurators
185
211
  ]);
186
212
  }
213
+ /**
214
+ * Serializable snapshot of all loaded markets, suitable for hydration.
215
+ **/
187
216
  get state() {
188
217
  return this.markets.map((market) => market.state);
189
218
  }
219
+ /**
220
+ * Returns a human-readable snapshot of all markets.
221
+ * @param raw - When `true`, includes raw/unformatted values.
222
+ **/
190
223
  stateHuman(raw = true) {
191
224
  return {
192
225
  markets: this.markets.map((market) => market.stateHuman(raw))
193
226
  };
194
227
  }
228
+ /**
229
+ * All pool suites across loaded markets.
230
+ **/
195
231
  get pools() {
196
232
  return this.markets.map((market) => market.pool);
197
233
  }
234
+ /**
235
+ * All price oracles across loaded markets.
236
+ **/
198
237
  get priceOracles() {
199
238
  return this.markets.map((market) => market.priceOracle);
200
239
  }
240
+ /**
241
+ * All credit manager suites across loaded markets.
242
+ **/
201
243
  get creditManagers() {
202
244
  return this.markets.flatMap((market) => market.creditManagers);
203
245
  }
246
+ /**
247
+ * All known market configurator contracts.
248
+ **/
204
249
  get marketConfigurators() {
205
250
  return this.#marketConfigurators.values();
206
251
  }
252
+ /**
253
+ * Finds a credit manager suite by its on-chain address.
254
+ * @param creditManager - Credit manager contract address.
255
+ * @throws If no loaded market contains the given credit manager.
256
+ **/
207
257
  findCreditManager(creditManager) {
208
258
  const addr = creditManager.toLowerCase();
209
259
  for (const market of this.markets) {
@@ -215,6 +265,11 @@ class MarketRegister extends SDKConstruct {
215
265
  }
216
266
  throw new Error(`cannot find credit manager ${creditManager}`);
217
267
  }
268
+ /**
269
+ * Finds the market that contains the given credit manager.
270
+ * @param creditManager - Credit manager contract address.
271
+ * @throws If no loaded market contains the given credit manager.
272
+ **/
218
273
  findByCreditManager(creditManager) {
219
274
  const addr = creditManager.toLowerCase();
220
275
  const market = this.markets.find(
@@ -227,6 +282,11 @@ class MarketRegister extends SDKConstruct {
227
282
  }
228
283
  return market;
229
284
  }
285
+ /**
286
+ * Finds the market that uses the given price oracle.
287
+ * @param address - Price oracle contract address.
288
+ * @throws If no loaded market uses the given oracle.
289
+ **/
230
290
  findByPriceOracle(address) {
231
291
  const addr = address.toLowerCase();
232
292
  for (const market of this.markets) {
@@ -236,6 +296,11 @@ class MarketRegister extends SDKConstruct {
236
296
  }
237
297
  throw new Error(`cannot find market for price oracle ${address}`);
238
298
  }
299
+ /**
300
+ * Finds the market associated with the given pool.
301
+ * @param address - Pool contract address.
302
+ * @throws If no loaded market uses the given pool.
303
+ **/
239
304
  findByPool(address) {
240
305
  const addr = address.toLowerCase();
241
306
  for (const market of this.markets) {
@@ -245,9 +310,15 @@ class MarketRegister extends SDKConstruct {
245
310
  }
246
311
  throw new Error(`cannot find market for pool ${address}`);
247
312
  }
313
+ /**
314
+ * Underlying address map of pool address to market suite
315
+ **/
248
316
  get marketsMap() {
249
317
  return this.#markets;
250
318
  }
319
+ /**
320
+ * All loaded market suites.
321
+ **/
251
322
  get markets() {
252
323
  return this.#markets.values();
253
324
  }
@@ -13,26 +13,26 @@ const ZERO_PRICE_FEED = stringToHex("PRICE_FEED::ZERO", { size: 32 });
13
13
  class PriceOracleBaseContract extends BaseContract {
14
14
  sdk;
15
15
  /**
16
- * Mapping Token => [PriceFeed Address, stalenessPeriod]
17
- */
16
+ * {@inheritDoc IPriceOracleContract.mainPriceFeeds}
17
+ **/
18
18
  mainPriceFeeds = new AddressMap(
19
19
  void 0,
20
20
  "mainPriceFeeds"
21
21
  );
22
22
  /**
23
- * Mapping Token => [PriceFeed Address, stalenessPeriod]
24
- */
23
+ * {@inheritDoc IPriceOracleContract.reservePriceFeeds}
24
+ **/
25
25
  reservePriceFeeds = new AddressMap(
26
26
  void 0,
27
27
  "reservePriceFeeds"
28
28
  );
29
29
  /**
30
- * Mapping Token => Price in USD
31
- */
30
+ * {@inheritDoc IPriceOracleContract.mainPrices}
31
+ **/
32
32
  mainPrices = new PriceFeedAnswerMap(void 0, "mainPrices");
33
33
  /**
34
- * Mapping Token => Price in USD
35
- */
34
+ * {@inheritDoc IPriceOracleContract.reservePrices}
35
+ **/
36
36
  reservePrices = new PriceFeedAnswerMap(
37
37
  void 0,
38
38
  "reservePrices"
@@ -48,11 +48,8 @@ class PriceOracleBaseContract extends BaseContract {
48
48
  this.#loadState(priceFeedMap, priceFeedTree);
49
49
  }
50
50
  /**
51
- * Returns main and reserve price feeds for given tokens
52
- * @param tokens
53
- * @param opts Option to include main/reserve feeds only, defaults to both
54
- * @returns
55
- */
51
+ * {@inheritDoc IPriceOracleContract.priceFeedsForTokens}
52
+ **/
56
53
  priceFeedsForTokens(tokens, opts) {
57
54
  const main = opts?.main ?? true;
58
55
  const reserve = opts?.reserve ?? true;
@@ -62,39 +59,26 @@ class PriceOracleBaseContract extends BaseContract {
62
59
  ]).filter((f) => !!f);
63
60
  }
64
61
  /**
65
- * Gets main price for given token
66
- * Throws if token price feed is not found or answer is not successful
67
- * @param token
68
- * @returns
69
- */
62
+ * {@inheritDoc IPriceOracleContract.mainPrice}
63
+ **/
70
64
  mainPrice(token) {
71
65
  return this.mainPrices.price(token);
72
66
  }
73
67
  /**
74
- * Gets reserve price for given token
75
- * Throws if token price feed is not found or answer is not successful
76
- * @param token
77
- * @returns
78
- */
68
+ * {@inheritDoc IPriceOracleContract.reservePrice}
69
+ **/
79
70
  reservePrice(token) {
80
71
  return this.reservePrices.price(token);
81
72
  }
82
73
  /**
83
- * Returns true if oracle's price feed tree contains given price feed
84
- * This feed is not necessary connected to token, but can be a component of composite feed for some token
85
- * @param priceFeed
86
- * @returns
87
- */
74
+ * {@inheritDoc IPriceOracleContract.usesPriceFeed}
75
+ **/
88
76
  usesPriceFeed(priceFeed) {
89
77
  return this.#priceFeedTree.has(priceFeed);
90
78
  }
91
79
  /**
92
- * Tries to convert amount of from one token to another, using latest known prices
93
- * @param from
94
- * @param to
95
- * @param amount
96
- * @param reserve use reserve price feed instead of main
97
- */
80
+ * {@inheritDoc IPriceOracleContract.convert}
81
+ **/
98
82
  convert(from, to, amount, reserve = false) {
99
83
  if (from === to) {
100
84
  return amount;
@@ -106,11 +90,8 @@ class PriceOracleBaseContract extends BaseContract {
106
90
  return amount * fromPrice * toScale / (toPrice * fromScale);
107
91
  }
108
92
  /**
109
- * Tries to convert amount of token to USD, using latest known prices
110
- * @param from
111
- * @param amount
112
- * @param reserve use reserve price feed instead of main
113
- */
93
+ * {@inheritDoc IPriceOracleContract.convertToUSD}
94
+ **/
114
95
  convertToUSD(from, amount, reserve = false) {
115
96
  if (amount === 0n) {
116
97
  return 0n;
@@ -120,11 +101,8 @@ class PriceOracleBaseContract extends BaseContract {
120
101
  return amount * price / scale;
121
102
  }
122
103
  /**
123
- * Tries to convert amount of USD to token, using latest known prices
124
- * @param to
125
- * @param amount
126
- * @param reserve use reserve price feed instead of main
127
- */
104
+ * {@inheritDoc IPriceOracleContract.convertFromUSD}
105
+ **/
128
106
  convertFromUSD(to, amount, reserve = false) {
129
107
  if (amount === 0n) {
130
108
  return 0n;
@@ -134,14 +112,14 @@ class PriceOracleBaseContract extends BaseContract {
134
112
  return amount * scale / price;
135
113
  }
136
114
  /**
137
- * All price feed tree nodes known to this oracle
138
- */
115
+ * {@inheritDoc IPriceOracleContract.priceFeeds}
116
+ **/
139
117
  get priceFeeds() {
140
118
  return this.#priceFeedTree.values().map((node) => this.sdk.priceFeeds.mustGet(node.baseParams.addr));
141
119
  }
142
120
  /**
143
- * Paired method to updatePrices, helps to update prices on all oracles in one multicall
144
- */
121
+ * {@inheritDoc IPriceOracleContract.syncStateMulticall}
122
+ **/
145
123
  syncStateMulticall() {
146
124
  const args = [this.address];
147
125
  const [address] = this.sdk.addressProvider.mustGetLatest(
@@ -207,11 +185,14 @@ class PriceOracleBaseContract extends BaseContract {
207
185
  });
208
186
  }
209
187
  /**
210
- * Returns list of addresses that should be watched for events to sync state
211
- */
188
+ * {@inheritDoc IPriceOracleContract.watchAddresses}
189
+ **/
212
190
  get watchAddresses() {
213
191
  return /* @__PURE__ */ new Set([this.address]);
214
192
  }
193
+ /**
194
+ * {@inheritDoc IPriceOracleContract.stateHuman}
195
+ **/
215
196
  stateHuman(raw = true) {
216
197
  return {
217
198
  ...super.stateHuman(raw),
@@ -1,7 +1,14 @@
1
1
  import { Construct } from "../../base/index.js";
2
2
  import { formatDuration } from "../../utils/index.js";
3
3
  class PriceFeedRef extends Construct {
4
+ /**
5
+ * On-chain address of the referenced price feed contract.
6
+ **/
4
7
  address;
8
+ /**
9
+ * Maximum allowed age (in seconds) of the feed's answer before the
10
+ * oracle considers it stale.
11
+ **/
5
12
  stalenessPeriod;
6
13
  #priceFeed;
7
14
  constructor(options, address, stalenessPeriod) {
@@ -9,6 +16,10 @@ class PriceFeedRef extends Construct {
9
16
  this.address = address;
10
17
  this.stalenessPeriod = stalenessPeriod;
11
18
  }
19
+ /**
20
+ * Lazily resolved price feed contract instance.
21
+ * @throws If the feed is not registered in the contracts register.
22
+ **/
12
23
  get priceFeed() {
13
24
  if (!this.#priceFeed) {
14
25
  this.#priceFeed = this.register.mustGetContract(
@@ -17,6 +28,11 @@ class PriceFeedRef extends Construct {
17
28
  }
18
29
  return this.#priceFeed;
19
30
  }
31
+ /**
32
+ * Returns a human-readable snapshot of the feed state, including the
33
+ * staleness period formatted as a duration string.
34
+ * @param raw - When `true`, includes raw/unformatted values.
35
+ **/
20
36
  stateHuman(raw = true) {
21
37
  return {
22
38
  ...this.priceFeed.stateHuman(raw),
@@ -33,17 +33,29 @@ import { YearnPriceFeedContract } from "./YearnPriceFeed.js";
33
33
  import { ZeroPriceFeedContract } from "./ZeroPriceFeed.js";
34
34
  class PriceFeedRegister extends SDKConstruct {
35
35
  #hooks = new Hooks();
36
+ #updaters;
36
37
  #feeds = new AddressMap(void 0, "priceFeeds");
37
38
  #latestUpdate;
38
- updaters;
39
39
  constructor(sdk, opts = {}) {
40
40
  super(sdk);
41
- this.updaters = [
41
+ this.#updaters = [
42
42
  new PythUpdater(sdk, opts?.pyth),
43
43
  new RedstoneUpdater(sdk, opts?.redstone)
44
44
  ];
45
45
  }
46
+ /**
47
+ * @internal
48
+ * Registers a callback for price-feed register lifecycle events.
49
+ * @param event - Event name.
50
+ * @param handler - Callback to invoke.
51
+ **/
46
52
  addHook = this.#hooks.addHook.bind(this.#hooks);
53
+ /**
54
+ * @internal
55
+ * Removes a previously registered hook.
56
+ * @param event - Event name.
57
+ * @param handler - Callback to remove.
58
+ **/
47
59
  removeHook = this.#hooks.removeHook.bind(this.#hooks);
48
60
  /**
49
61
  * Returns all price feeds known to sdk
@@ -52,12 +64,13 @@ class PriceFeedRegister extends SDKConstruct {
52
64
  return this.#feeds.values();
53
65
  }
54
66
  /**
55
- * Returns RawTxs to update price feeds
56
- * @param priceFeeds Array oftop-level price feeds, actual updatable price feeds will be derived.
57
- * Or filter criteria, that will gather all main or reserve price feeds from all oracles
58
- * If not provided will use all price feeds that are attached
59
- * @returns
60
- */
67
+ * Generates transactions to push fresh off-chain prices to updatable feeds.
68
+ *
69
+ * @param priceFeeds - Top-level price feeds whose updatable dependencies
70
+ * will be resolved, or a filter (`{ main: true }` / `{ reserve: true }`)
71
+ * to gather feeds from all oracles. When omitted, all registered feeds
72
+ * are used.
73
+ **/
61
74
  async generatePriceFeedsUpdateTxs(priceFeeds) {
62
75
  let updateables = this.#feeds.values();
63
76
  let filterRemark = "";
@@ -78,7 +91,7 @@ class PriceFeedRegister extends SDKConstruct {
78
91
  timestamp: Math.floor(Date.now() / 1e3)
79
92
  };
80
93
  const updates = (await Promise.all(
81
- this.updaters.map((u) => u.getUpdateTxs(updateables).catch(() => []))
94
+ this.#updaters.map((u) => u.getUpdateTxs(updateables).catch(() => []))
82
95
  )).flat();
83
96
  let maxTimestamp = 0;
84
97
  for (const tx of updates) {
@@ -128,7 +141,7 @@ class PriceFeedRegister extends SDKConstruct {
128
141
  });
129
142
  }
130
143
  /**
131
- * Similar to {@link generatePriceFeedsUpdateTxs}, but will generate necessary price update transactions for external price feeds
144
+ * Similar to {@link generatePriceFeedsUpdateTxs}, but will generate necessary price update transactions for external price feeds (not known to sdk)
132
145
  * This does not add feeds to this register, so they won't be implicitly included in future generatePriceFeedsUpdateTxs calls
133
146
  * @param feeds
134
147
  * @param block
@@ -165,12 +178,32 @@ class PriceFeedRegister extends SDKConstruct {
165
178
  );
166
179
  return getRawPriceUpdates(updates);
167
180
  }
181
+ /**
182
+ * Checks whether a price feed is already registered at the given address.
183
+ * @param address - On-chain address to look up.
184
+ **/
168
185
  has(address) {
169
186
  return this.#feeds.has(address);
170
187
  }
188
+ /**
189
+ * Returns the cached price feed contract at the given address.
190
+ * @param address - On-chain address to look up.
191
+ * @throws If no feed is registered at that address.
192
+ **/
171
193
  mustGet(address) {
172
194
  return this.#feeds.mustGet(address);
173
195
  }
196
+ /**
197
+ * Inserts or updates a price feed from a full tree node.
198
+ *
199
+ * If a fully loaded feed already exists at the same address, only the
200
+ * answer is refreshed. Otherwise a new contract wrapper is created and
201
+ * cached.
202
+ *
203
+ * @param data - Full price feed tree node from the compressor.
204
+ * @returns The cached (or newly created) feed instance.
205
+ * @throws If the created feed is only partially initialized.
206
+ **/
174
207
  upsert(data) {
175
208
  const existing = this.#feeds.get(data.baseParams.addr);
176
209
  if (existing?.loaded) {
@@ -217,6 +250,14 @@ class PriceFeedRegister extends SDKConstruct {
217
250
  );
218
251
  return result.map((baseParams) => this.#createUpdatableProxy({ baseParams }));
219
252
  }
253
+ /**
254
+ * Instantiates the appropriate price feed contract wrapper based on
255
+ * the `contractType` discriminator in the node's base params.
256
+ *
257
+ * @param data - Partial or full price feed tree node.
258
+ * @returns A new (uncached) feed contract instance.
259
+ * @throws If the contract type is unsupported and strict mode is enabled.
260
+ **/
220
261
  create(data) {
221
262
  const contractType = bytes32ToString(
222
263
  data.baseParams.contractType
@@ -280,8 +321,10 @@ class PriceFeedRegister extends SDKConstruct {
280
321
  });
281
322
  }
282
323
  /**
283
- * Information update latest update of updatable price feeds, for diagnostic purposes
284
- */
324
+ * @internal
325
+ * Diagnostic snapshot of the most recent price-update round, or
326
+ * `undefined` if no updates have been generated yet.
327
+ **/
285
328
  get latestUpdate() {
286
329
  return this.#latestUpdate;
287
330
  }
@@ -6,50 +6,56 @@ import {
6
6
  import { ZodAddress } from "./utils/index.js";
7
7
  const SDKOptions = z.object({
8
8
  /**
9
- * If not set, address provider address is determinted automatically from networkType
10
- */
9
+ * Override address of the Gearbox AddressProvider contract.
10
+ * If not set, uses default universal address provider address {@link ADDRESS_PROVIDER_V310}
11
+ **/
11
12
  addressProvider: ZodAddress().optional(),
12
13
  /**
13
- * Market configurators
14
- */
14
+ * Addresses of market configurator contracts to load.
15
+ * If not set, all default market configurators for the chain are loaded
16
+ * (from {@link GearboxChain.defaultMarketConfigurators})
17
+ **/
15
18
  marketConfigurators: z.array(ZodAddress()).optional(),
16
19
  /**
17
- * Attach and load state at this specific block number
18
- */
20
+ * Pin SDK to a specific block number during attach.
21
+ * When set, all on-chain reads use this block instead of `latest`.
22
+ **/
19
23
  blockNumber: z.union([z.bigint().nonnegative(), z.number().int().nonnegative()]).optional(),
20
24
  /**
21
- * Will skip updateable prices on attach and sync
22
- * Makes things faster when your service is not intereseted in prices
23
- */
25
+ * Skip fetching updatable price feeds on attach and sync.
26
+ * Speeds up initialisation when prices are not needed.
27
+ **/
24
28
  ignoreUpdateablePrices: z.boolean().optional(),
25
29
  /**
26
- * Will skip loading markets for these pools on attach/hydrate/sync
27
- */
30
+ * Pool addresses whose markets should be skipped during attach/hydrate/sync.
31
+ **/
28
32
  ignoreMarkets: z.array(ZodAddress()).optional(),
29
33
  /**
30
- * Will throw an error if contract type is not supported, otherwise will try to use generic contract first, if possible
31
- */
34
+ * When `true`, throw on unrecognised contract types instead of falling
35
+ * back to a generic contract wrapper.
36
+ **/
32
37
  strictContractTypes: z.boolean().optional(),
33
38
  /**
34
- * Plugins to extends SDK functionality
35
- */
39
+ * Plugins that extend SDK functionality.
40
+ **/
36
41
  plugins: z.record(z.string(), z.any()).optional(),
37
42
  /**
38
- * Bring your own logger
39
- */
43
+ * Custom logger implementation.
44
+ **/
40
45
  logger: z.any(),
41
46
  /**
42
- * Options related to redstone price feeds
43
- */
47
+ * Options for Redstone price-feed updates.
48
+ **/
44
49
  redstone: RedstoneOptions.optional(),
45
50
  /**
46
- * Options related to pyth price feeds
47
- */
51
+ * Options for Pyth price-feed updates.
52
+ **/
48
53
  pyth: PythOptions.optional(),
49
54
  /**
50
- * Explicit gas limit for read eth_calls
51
- * Null to disable explicitly setting gas limit, undefined to use default sdk value
52
- */
55
+ * Explicit gas limit for read-only `eth_call` requests.
56
+ * `null` disables the gas limit entirely; `undefined` uses the SDK default.
57
+ * Default gas limit is 550_000_000 (550M).
58
+ **/
53
59
  gasLimit: z.bigint().nonnegative().nullable().optional()
54
60
  });
55
61
  export {