@gearbox-protocol/sdk 12.4.0 → 12.6.0-next.1

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 (26) hide show
  1. package/dist/cjs/sdk/core/address-provider/AbstractAddressProviderContract.js +20 -3
  2. package/dist/cjs/sdk/core/address-provider/AddressProviderV300Contract.js +1 -1
  3. package/dist/cjs/sdk/core/address-provider/AddressProviderV310Contract.js +1 -1
  4. package/dist/cjs/sdk/core/address-provider/createAddressProvider.js +18 -2
  5. package/dist/cjs/sdk/market/pricefeeds/updates/PythUpdater.js +16 -74
  6. package/dist/cjs/sdk/market/pricefeeds/updates/RedstoneUpdater.js +9 -96
  7. package/dist/cjs/sdk/market/pricefeeds/updates/fetchPythPayloads.js +111 -0
  8. package/dist/cjs/sdk/market/pricefeeds/updates/fetchRedstonePayloads.js +144 -0
  9. package/dist/cjs/sdk/market/pricefeeds/updates/index.js +6 -1
  10. package/dist/esm/sdk/core/address-provider/AbstractAddressProviderContract.js +20 -3
  11. package/dist/esm/sdk/core/address-provider/AddressProviderV300Contract.js +1 -1
  12. package/dist/esm/sdk/core/address-provider/AddressProviderV310Contract.js +1 -1
  13. package/dist/esm/sdk/core/address-provider/createAddressProvider.js +20 -2
  14. package/dist/esm/sdk/market/pricefeeds/updates/PythUpdater.js +16 -78
  15. package/dist/esm/sdk/market/pricefeeds/updates/RedstoneUpdater.js +10 -99
  16. package/dist/esm/sdk/market/pricefeeds/updates/fetchPythPayloads.js +91 -0
  17. package/dist/esm/sdk/market/pricefeeds/updates/fetchRedstonePayloads.js +124 -0
  18. package/dist/esm/sdk/market/pricefeeds/updates/index.js +2 -0
  19. package/dist/types/sdk/core/address-provider/AbstractAddressProviderContract.d.ts +2 -2
  20. package/dist/types/sdk/core/address-provider/AddressProviderV300Contract.d.ts +2 -2
  21. package/dist/types/sdk/core/address-provider/AddressProviderV310Contract.d.ts +2 -2
  22. package/dist/types/sdk/core/address-provider/types.d.ts +15 -0
  23. package/dist/types/sdk/market/pricefeeds/updates/fetchPythPayloads.d.ts +30 -0
  24. package/dist/types/sdk/market/pricefeeds/updates/fetchRedstonePayloads.d.ts +44 -0
  25. package/dist/types/sdk/market/pricefeeds/updates/index.d.ts +2 -0
  26. package/package.json +1 -1
@@ -26,10 +26,20 @@ var import_base = require("../../base/index.js");
26
26
  var import_constants = require("../../constants/index.js");
27
27
  var import_mappers = require("../../utils/mappers.js");
28
28
  class AbstractAddressProviderContract extends import_base.BaseContract {
29
- #addresses = {};
30
- constructor(options, args, addresses = {}) {
29
+ #addresses;
30
+ #overrides;
31
+ constructor(options, args, addresses) {
31
32
  super(options, args);
32
- this.#addresses = addresses;
33
+ this.#addresses = addresses?.addresses ?? {};
34
+ this.#overrides = addresses?.overrides ?? {};
35
+ for (const [contract, vs] of import_mappers.TypedObjectUtils.entries(this.#overrides)) {
36
+ for (const [version, address] of import_mappers.TypedObjectUtils.entries(vs)) {
37
+ this.#addresses[contract] = {
38
+ ...this.#addresses[contract],
39
+ [version]: address
40
+ };
41
+ }
42
+ }
33
43
  }
34
44
  setInternalAddress(key, address, version) {
35
45
  const k = (0, import_viem.isHex)(key) ? (0, import_viem.hexToString)(key, { size: 32 }) : key;
@@ -38,6 +48,13 @@ class AbstractAddressProviderContract extends import_base.BaseContract {
38
48
  }
39
49
  this.#addresses[k][version] = address;
40
50
  this.logger?.debug(`Set address for ${k}@${version} to ${address}`);
51
+ const overriden = this.#overrides[k]?.[version];
52
+ if (overriden) {
53
+ this.logger?.warn(
54
+ `address for ${k}@${version} was overriden, hardcode ${overriden} instead of ${address}`
55
+ );
56
+ this.#addresses[k][version] = overriden;
57
+ }
41
58
  }
42
59
  getAddress(contract, version = import_constants.NO_VERSION) {
43
60
  if (!this.#addresses[contract]) {
@@ -37,7 +37,7 @@ var import_viem2 = require("../../utils/viem/index.js");
37
37
  var import_AbstractAddressProviderContract = __toESM(require("./AbstractAddressProviderContract.js"));
38
38
  const abi = import_v300.iAddressProviderV300Abi;
39
39
  class AddressProviderV300Contract extends import_AbstractAddressProviderContract.default {
40
- constructor(options, address, version, addresses = {}) {
40
+ constructor(options, address, version, addresses) {
41
41
  super(
42
42
  options,
43
43
  {
@@ -36,7 +36,7 @@ var import_generated = require("../../../abi/310/generated.js");
36
36
  var import_AbstractAddressProviderContract = __toESM(require("./AbstractAddressProviderContract.js"));
37
37
  const abi = import_generated.iAddressProviderV310Abi;
38
38
  class AddressProviderV310Contract extends import_AbstractAddressProviderContract.default {
39
- constructor(options, address, version = 310, addresses = {}) {
39
+ constructor(options, address, version = 310, addresses) {
40
40
  super(
41
41
  options,
42
42
  {
@@ -27,6 +27,18 @@ var import_constants = require("../../constants/index.js");
27
27
  var import_hex = require("../../utils/hex.js");
28
28
  var import_AddressProviderV300Contract = require("./AddressProviderV300Contract.js");
29
29
  var import_AddressProviderV310Contract = require("./AddressProviderV310Contract.js");
30
+ const OVERRIDE_ADDRESSES = {
31
+ // Override price feed compressor and market feed compressor
32
+ // we urgently deployed fix and it has not been added to the address provider yet
33
+ Mainnet: {
34
+ [import_constants.AP_PRICE_FEED_COMPRESSOR]: {
35
+ 311: "0x1fA2637B9fab0CD14290A7EE908DDc9688a15120"
36
+ },
37
+ [import_constants.AP_MARKET_COMPRESSOR]: {
38
+ 311: "0x0C27F242f6e9F2A9AD3261bE6e439De3B948bcA2"
39
+ }
40
+ }
41
+ };
30
42
  async function createAddressProvider(sdk, address) {
31
43
  let v;
32
44
  if ((0, import_hex.hexEq)(address, import_constants.ADDRESS_PROVIDER_V310)) {
@@ -45,11 +57,15 @@ function hydrateAddressProvider(sdk, state) {
45
57
  return newAddressProvider(sdk, addr, Number(version), state.addresses);
46
58
  }
47
59
  function newAddressProvider(sdk, address, version, addresses) {
60
+ const addrOptions = {
61
+ addresses,
62
+ overrides: OVERRIDE_ADDRESSES[sdk.networkType]
63
+ };
48
64
  if ((0, import_constants.isV300)(version)) {
49
- return new import_AddressProviderV300Contract.AddressProviderV300Contract(sdk, address, version, addresses);
65
+ return new import_AddressProviderV300Contract.AddressProviderV300Contract(sdk, address, version, addrOptions);
50
66
  }
51
67
  if ((0, import_constants.isV310)(version)) {
52
- return new import_AddressProviderV310Contract.AddressProviderV310Contract(sdk, address, version, addresses);
68
+ return new import_AddressProviderV310Contract.AddressProviderV310Contract(sdk, address, version, addrOptions);
53
69
  }
54
70
  throw new Error(`unsupported address provider version: ${version}`);
55
71
  }
@@ -22,14 +22,11 @@ __export(PythUpdater_exports, {
22
22
  PythUpdater: () => PythUpdater
23
23
  });
24
24
  module.exports = __toCommonJS(PythUpdater_exports);
25
- var import_buffer = require("buffer");
26
- var import_viem = require("viem");
27
25
  var import_v4 = require("zod/v4");
28
26
  var import_base = require("../../../base/index.js");
29
- var import_utils = require("../../../utils/index.js");
27
+ var import_fetchPythPayloads = require("./fetchPythPayloads.js");
30
28
  var import_PriceUpdatesCache = require("./PriceUpdatesCache.js");
31
29
  var import_PriceUpdateTx = require("./PriceUpdateTx.js");
32
- var import_PythAccumulatorUpdateData = require("./PythAccumulatorUpdateData.js");
33
30
  class PythUpdateTx extends import_PriceUpdateTx.PriceUpdateTx {
34
31
  name = "pyth";
35
32
  }
@@ -58,16 +55,15 @@ const PythOptions = import_v4.z.object({
58
55
  class PythUpdater extends import_base.SDKConstruct {
59
56
  #cache;
60
57
  #historicalTimestamp;
61
- #api;
58
+ #apiProxy;
62
59
  #ignoreMissingFeeds;
63
60
  constructor(sdk, opts = {}) {
64
61
  super(sdk);
65
- this.#ignoreMissingFeeds = opts.ignoreMissingFeeds;
66
- this.#api = opts.apiProxy ?? "https://hermes.pyth.network/v2/updates/price/";
67
- this.#api = this.#api.endsWith("/") ? this.#api : `${this.#api}/`;
68
- const ts = opts.historicTimestamp;
69
- if (ts) {
70
- this.#historicalTimestamp = ts === true ? Number(this.sdk.timestamp) : ts;
62
+ const { apiProxy, cacheTTL, ignoreMissingFeeds, historicTimestamp } = opts;
63
+ this.#ignoreMissingFeeds = ignoreMissingFeeds;
64
+ this.#apiProxy = apiProxy;
65
+ if (historicTimestamp) {
66
+ this.#historicalTimestamp = historicTimestamp === true ? Number(this.sdk.timestamp) : historicTimestamp;
71
67
  this.logger?.debug(
72
68
  `using historical timestamp ${this.#historicalTimestamp}`
73
69
  );
@@ -76,8 +72,8 @@ class PythUpdater extends import_base.SDKConstruct {
76
72
  // currently staleness period is 240 seconds on all networks, add some buffer
77
73
  // this period of 4 minutes is selected based on time that is required for user to sign transaction with wallet
78
74
  // so it's unlikely to decrease
79
- ttl: opts.cacheTTL ?? 225 * 1e3,
80
- historical: !!ts
75
+ ttl: cacheTTL ?? 225 * 1e3,
76
+ historical: !!historicTimestamp
81
77
  });
82
78
  }
83
79
  async getUpdateTxs(feeds) {
@@ -168,72 +164,18 @@ class PythUpdater extends import_base.SDKConstruct {
168
164
  this.logger?.debug(
169
165
  `fetching pyth payloads for ${dataFeedsIds.size} price feeds: ${ids.join(", ")}${tsStr}`
170
166
  );
171
- const url = new URL(this.#api + (this.#historicalTimestamp ?? "latest"));
172
- url.searchParams.append("parsed", "false");
173
- if (this.#ignoreMissingFeeds) {
174
- url.searchParams.append("ignore_invalid_price_ids", "true");
175
- }
176
- for (const id of dataFeedsIds) {
177
- url.searchParams.append("ids[]", id);
178
- }
179
- const resp = await (0, import_utils.retry)(
180
- async () => {
181
- const resp2 = await fetch(url.toString());
182
- if (!resp2.ok) {
183
- const body = await resp2.text();
184
- throw new Error(
185
- `failed to fetch pyth payloads: ${resp2.statusText}: ${body}`
186
- );
187
- }
188
- const data = await resp2.json();
189
- return data;
190
- },
191
- { attempts: 3, exponent: 2, interval: 200 }
192
- );
193
- const result = respToCalldata(resp);
194
- if (!this.#ignoreMissingFeeds && result.length !== dataFeedsIds.size) {
195
- throw new Error(
196
- `expected ${dataFeedsIds.size} price feeds, got ${result.length}`
197
- );
198
- }
199
- return result;
167
+ return (0, import_fetchPythPayloads.fetchPythPayloads)({
168
+ dataFeedsIds,
169
+ historicalTimestampSeconds: this.#historicalTimestamp,
170
+ apiProxy: this.#apiProxy,
171
+ ignoreMissingFeeds: this.#ignoreMissingFeeds,
172
+ logger: this.logger
173
+ });
200
174
  }
201
175
  }
202
176
  function isPyth(pf) {
203
177
  return pf.contractType === "PRICE_FEED::PYTH";
204
178
  }
205
- function respToCalldata(resp) {
206
- if (resp.binary.data.length === 0) {
207
- return [];
208
- }
209
- const updates = splitAccumulatorUpdates(resp.binary.data[0]);
210
- return updates.map(({ data, dataFeedId, timestamp }) => {
211
- return {
212
- dataFeedId,
213
- data: (0, import_viem.encodeAbiParameters)(
214
- [{ type: "uint256" }, { type: "bytes[]" }],
215
- [BigInt(timestamp), [data]]
216
- ),
217
- timestamp,
218
- cached: false
219
- };
220
- });
221
- }
222
- function splitAccumulatorUpdates(binary) {
223
- const data = import_buffer.Buffer.from(binary, "hex");
224
- const parsed = (0, import_PythAccumulatorUpdateData.parseAccumulatorUpdateData)(data);
225
- const results = [];
226
- for (let i = 0; i < parsed.updates.length; i++) {
227
- const upd = parsed.updates[i].message;
228
- const msg = (0, import_PythAccumulatorUpdateData.parsePriceFeedMessage)(upd);
229
- results.push({
230
- dataFeedId: (0, import_viem.toHex)(msg.feedId),
231
- timestamp: msg.publishTime.toNumber(),
232
- data: (0, import_viem.toHex)((0, import_PythAccumulatorUpdateData.sliceAccumulatorUpdateData)(data, i, i + 1))
233
- });
234
- }
235
- return results;
236
- }
237
179
  // Annotate the CommonJS export names for ESM import in node:
238
180
  0 && (module.exports = {
239
181
  PythOptions,
@@ -22,13 +22,10 @@ __export(RedstoneUpdater_exports, {
22
22
  RedstoneUpdater: () => RedstoneUpdater
23
23
  });
24
24
  module.exports = __toCommonJS(RedstoneUpdater_exports);
25
- var import_evm_connector = require("@redstone-finance/evm-connector");
26
- var import_protocol = require("@redstone-finance/protocol");
27
- var import_sdk = require("@redstone-finance/sdk");
28
- var import_viem = require("viem");
29
25
  var import_v4 = require("zod/v4");
30
26
  var import_base = require("../../../base/index.js");
31
27
  var import_utils = require("../../../utils/index.js");
28
+ var import_fetchRedstonePayloads = require("./fetchRedstonePayloads.js");
32
29
  var import_PriceUpdatesCache = require("./PriceUpdatesCache.js");
33
30
  var import_PriceUpdateTx = require("./PriceUpdateTx.js");
34
31
  class RedstoneUpdateTx extends import_PriceUpdateTx.PriceUpdateTx {
@@ -244,102 +241,18 @@ class RedstoneUpdater extends import_base.SDKConstruct {
244
241
  this.logger?.debug(
245
242
  `fetching redstone payloads for ${dataFeedsIds.size} data feeds in ${dataServiceId} with ${uniqueSignersCount} signers: ${dataPackagesIds.join(", ")}${tsStr}`
246
243
  );
247
- const wrapper = new import_evm_connector.DataServiceWrapper({
244
+ return (0, import_fetchRedstonePayloads.fetchRedstonePayloads)({
248
245
  dataServiceId,
249
- dataPackagesIds,
246
+ dataFeedsIds,
250
247
  uniqueSignersCount,
251
- authorizedSigners: (0, import_sdk.getSignersForDataServiceId)(
252
- dataServiceId
253
- ),
254
- historicalTimestamp: this.#historicalTimestampMs,
255
- urls: this.#gateways,
256
- ignoreMissingFeed: this.#ignoreMissingFeeds,
257
- enableEnhancedLogs: this.#enableLogging
248
+ historicalTimestampMs: this.#historicalTimestampMs,
249
+ gateways: this.#gateways,
250
+ ignoreMissingFeeds: this.#ignoreMissingFeeds,
251
+ enableLogging: this.#enableLogging,
252
+ logger: this.logger,
253
+ metadataTimestampMs: Number(this.sdk.timestamp) * 1e3
258
254
  });
259
- wrapper.setMetadataTimestamp(
260
- this.#historicalTimestampMs ?? Number(this.sdk.timestamp) * 1e3
261
- );
262
- const dataPayload = await (0, import_utils.retry)(
263
- () => wrapper.prepareRedstonePayload(true),
264
- { attempts: 5, interval: this.#historicalTimestampMs ? 30500 : 250 }
265
- );
266
- const parsed = import_protocol.RedstonePayload.parse((0, import_viem.toBytes)(`0x${dataPayload}`));
267
- const packagesByDataFeedId = groupDataPackages(parsed.signedDataPackages);
268
- const result = [];
269
- for (const dataFeedId of dataFeedsIds) {
270
- const signedDataPackages = packagesByDataFeedId[dataFeedId];
271
- if (!signedDataPackages) {
272
- if (this.#ignoreMissingFeeds) {
273
- this.logger?.warn(`cannot find data packages for ${dataFeedId}`);
274
- continue;
275
- }
276
- throw new Error(`cannot find data packages for ${dataFeedId}`);
277
- }
278
- if (signedDataPackages.length !== uniqueSignersCount) {
279
- if (this.#ignoreMissingFeeds) {
280
- this.logger?.warn(
281
- `got ${signedDataPackages.length} data packages for ${dataFeedId}, but expected ${uniqueSignersCount}`
282
- );
283
- continue;
284
- }
285
- throw new Error(
286
- `got ${signedDataPackages.length} data packages for ${dataFeedId}, but expected ${uniqueSignersCount}`
287
- );
288
- }
289
- result.push(
290
- getCalldataWithTimestamp(
291
- dataFeedId,
292
- signedDataPackages,
293
- wrapper.getUnsignedMetadata()
294
- )
295
- );
296
- }
297
- return result;
298
- }
299
- }
300
- function groupDataPackages(signedDataPackages) {
301
- const packagesByDataFeedId = {};
302
- for (const p of signedDataPackages) {
303
- const { dataPoints } = p.dataPackage;
304
- const dataFeedId0 = dataPoints[0].dataFeedId;
305
- for (const dp of dataPoints) {
306
- if (dp.dataFeedId !== dataFeedId0) {
307
- throw new Error(
308
- `data package contains data points with different dataFeedIds: ${dp.dataFeedId} and ${dataFeedId0}`
309
- );
310
- }
311
- }
312
- if (!packagesByDataFeedId[dataFeedId0]) {
313
- packagesByDataFeedId[dataFeedId0] = [];
314
- }
315
- packagesByDataFeedId[dataFeedId0].push(p);
316
- }
317
- return packagesByDataFeedId;
318
- }
319
- function getCalldataWithTimestamp(dataFeedId, packages, unsignedMetadata) {
320
- const originalPayload = import_protocol.RedstonePayload.prepare(packages, unsignedMetadata);
321
- const originalPayloadLength = originalPayload.length / 2;
322
- const bytesToAdd = 32 - originalPayloadLength % 32;
323
- const newUnsignedMetadata = unsignedMetadata + "_".repeat(bytesToAdd);
324
- const payload = import_protocol.RedstonePayload.prepare(packages, newUnsignedMetadata);
325
- let timestamp = 0;
326
- for (const p of packages) {
327
- const newTimestamp = p.dataPackage.timestampMilliseconds / 1e3;
328
- if (timestamp === 0) {
329
- timestamp = newTimestamp;
330
- } else if (timestamp !== newTimestamp) {
331
- throw new Error("Timestamps are not equal");
332
- }
333
255
  }
334
- return {
335
- dataFeedId,
336
- data: (0, import_viem.encodeAbiParameters)(
337
- [{ type: "uint256" }, { type: "bytes" }],
338
- [BigInt(timestamp), `0x${payload}`]
339
- ),
340
- timestamp,
341
- cached: false
342
- };
343
256
  }
344
257
  function isRedstone(pf) {
345
258
  return pf.contractType === "PRICE_FEED::REDSTONE";
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var fetchPythPayloads_exports = {};
20
+ __export(fetchPythPayloads_exports, {
21
+ fetchPythPayloads: () => fetchPythPayloads
22
+ });
23
+ module.exports = __toCommonJS(fetchPythPayloads_exports);
24
+ var import_buffer = require("buffer");
25
+ var import_viem = require("viem");
26
+ var import_utils = require("../../../utils/index.js");
27
+ var import_PythAccumulatorUpdateData = require("./PythAccumulatorUpdateData.js");
28
+ async function fetchPythPayloads(options) {
29
+ const {
30
+ dataFeedsIds,
31
+ ignoreMissingFeeds,
32
+ historicalTimestampSeconds,
33
+ logger,
34
+ apiProxy
35
+ } = options;
36
+ const ids = Array.from(new Set(dataFeedsIds));
37
+ if (ids.length === 0) {
38
+ return [];
39
+ }
40
+ let api = apiProxy ?? "https://hermes.pyth.network/v2/updates/price/";
41
+ api = api.endsWith("/") ? api : `${api}/`;
42
+ const url = new URL(api + (historicalTimestampSeconds ?? "latest"));
43
+ url.searchParams.append("parsed", "false");
44
+ if (ignoreMissingFeeds) {
45
+ url.searchParams.append("ignore_invalid_price_ids", "true");
46
+ }
47
+ for (const id of dataFeedsIds) {
48
+ url.searchParams.append("ids[]", id);
49
+ }
50
+ const resp = await (0, import_utils.retry)(
51
+ async () => {
52
+ const resp2 = await fetch(url.toString());
53
+ if (!resp2.ok) {
54
+ const body = await resp2.text();
55
+ throw new Error(
56
+ `failed to fetch pyth payloads: ${resp2.statusText}: ${body}`
57
+ );
58
+ }
59
+ const data = await resp2.json();
60
+ return data;
61
+ },
62
+ { attempts: 3, exponent: 2, interval: 200 }
63
+ );
64
+ const result = respToCalldata(resp);
65
+ if (result.length !== ids.length) {
66
+ if (ignoreMissingFeeds) {
67
+ logger?.warn(`expected ${ids.length} price feeds, got ${result.length}`);
68
+ } else {
69
+ throw new Error(
70
+ `expected ${ids.length} price feeds, got ${result.length}`
71
+ );
72
+ }
73
+ }
74
+ return result;
75
+ }
76
+ function respToCalldata(resp) {
77
+ if (resp.binary.data.length === 0) {
78
+ return [];
79
+ }
80
+ const updates = splitAccumulatorUpdates(resp.binary.data[0]);
81
+ return updates.map(({ data, dataFeedId, timestamp }) => {
82
+ return {
83
+ dataFeedId,
84
+ data: (0, import_viem.encodeAbiParameters)(
85
+ [{ type: "uint256" }, { type: "bytes[]" }],
86
+ [BigInt(timestamp), [data]]
87
+ ),
88
+ timestamp,
89
+ cached: false
90
+ };
91
+ });
92
+ }
93
+ function splitAccumulatorUpdates(binary) {
94
+ const data = import_buffer.Buffer.from(binary, "hex");
95
+ const parsed = (0, import_PythAccumulatorUpdateData.parseAccumulatorUpdateData)(data);
96
+ const results = [];
97
+ for (let i = 0; i < parsed.updates.length; i++) {
98
+ const upd = parsed.updates[i].message;
99
+ const msg = (0, import_PythAccumulatorUpdateData.parsePriceFeedMessage)(upd);
100
+ results.push({
101
+ dataFeedId: (0, import_viem.toHex)(msg.feedId),
102
+ timestamp: msg.publishTime.toNumber(),
103
+ data: (0, import_viem.toHex)((0, import_PythAccumulatorUpdateData.sliceAccumulatorUpdateData)(data, i, i + 1))
104
+ });
105
+ }
106
+ return results;
107
+ }
108
+ // Annotate the CommonJS export names for ESM import in node:
109
+ 0 && (module.exports = {
110
+ fetchPythPayloads
111
+ });
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var fetchRedstonePayloads_exports = {};
20
+ __export(fetchRedstonePayloads_exports, {
21
+ fetchRedstonePayloads: () => fetchRedstonePayloads
22
+ });
23
+ module.exports = __toCommonJS(fetchRedstonePayloads_exports);
24
+ var import_evm_connector = require("@redstone-finance/evm-connector");
25
+ var import_protocol = require("@redstone-finance/protocol");
26
+ var import_sdk = require("@redstone-finance/sdk");
27
+ var import_viem = require("viem");
28
+ var import_utils = require("../../../utils/index.js");
29
+ async function fetchRedstonePayloads(options) {
30
+ const {
31
+ dataServiceId,
32
+ dataFeedsIds,
33
+ uniqueSignersCount,
34
+ historicalTimestampMs,
35
+ gateways,
36
+ ignoreMissingFeeds,
37
+ enableLogging,
38
+ logger
39
+ } = options;
40
+ const metadataTimestampMs = historicalTimestampMs ?? options.metadataTimestampMs;
41
+ const dataPackagesIds = Array.from(new Set(dataFeedsIds));
42
+ if (dataPackagesIds.length === 0) {
43
+ return [];
44
+ }
45
+ const wrapper = new import_evm_connector.DataServiceWrapper({
46
+ dataServiceId,
47
+ dataPackagesIds,
48
+ uniqueSignersCount,
49
+ authorizedSigners: (0, import_sdk.getSignersForDataServiceId)(
50
+ dataServiceId
51
+ ),
52
+ historicalTimestamp: historicalTimestampMs,
53
+ urls: gateways,
54
+ ignoreMissingFeed: ignoreMissingFeeds,
55
+ enableEnhancedLogs: enableLogging
56
+ });
57
+ if (metadataTimestampMs) {
58
+ wrapper.setMetadataTimestamp(metadataTimestampMs);
59
+ }
60
+ const dataPayload = await (0, import_utils.retry)(() => wrapper.prepareRedstonePayload(true), {
61
+ attempts: 5,
62
+ interval: historicalTimestampMs ? 30500 : 250
63
+ });
64
+ const parsed = import_protocol.RedstonePayload.parse((0, import_viem.toBytes)(`0x${dataPayload}`));
65
+ const packagesByDataFeedId = groupDataPackages(parsed.signedDataPackages);
66
+ const result = [];
67
+ for (const dataFeedId of dataFeedsIds) {
68
+ const signedDataPackages = packagesByDataFeedId[dataFeedId];
69
+ if (!signedDataPackages) {
70
+ if (ignoreMissingFeeds) {
71
+ logger?.warn(`cannot find data packages for ${dataFeedId}`);
72
+ continue;
73
+ }
74
+ throw new Error(`cannot find data packages for ${dataFeedId}`);
75
+ }
76
+ if (signedDataPackages.length !== uniqueSignersCount) {
77
+ if (ignoreMissingFeeds) {
78
+ logger?.warn(
79
+ `got ${signedDataPackages.length} data packages for ${dataFeedId}, but expected ${uniqueSignersCount}`
80
+ );
81
+ continue;
82
+ }
83
+ throw new Error(
84
+ `got ${signedDataPackages.length} data packages for ${dataFeedId}, but expected ${uniqueSignersCount}`
85
+ );
86
+ }
87
+ result.push(
88
+ getCalldataWithTimestamp(
89
+ dataFeedId,
90
+ signedDataPackages,
91
+ wrapper.getUnsignedMetadata()
92
+ )
93
+ );
94
+ }
95
+ return result;
96
+ }
97
+ function groupDataPackages(signedDataPackages) {
98
+ const packagesByDataFeedId = {};
99
+ for (const p of signedDataPackages) {
100
+ const { dataPoints } = p.dataPackage;
101
+ const dataFeedId0 = dataPoints[0].dataFeedId;
102
+ for (const dp of dataPoints) {
103
+ if (dp.dataFeedId !== dataFeedId0) {
104
+ throw new Error(
105
+ `data package contains data points with different dataFeedIds: ${dp.dataFeedId} and ${dataFeedId0}`
106
+ );
107
+ }
108
+ }
109
+ if (!packagesByDataFeedId[dataFeedId0]) {
110
+ packagesByDataFeedId[dataFeedId0] = [];
111
+ }
112
+ packagesByDataFeedId[dataFeedId0].push(p);
113
+ }
114
+ return packagesByDataFeedId;
115
+ }
116
+ function getCalldataWithTimestamp(dataFeedId, packages, unsignedMetadata) {
117
+ const originalPayload = import_protocol.RedstonePayload.prepare(packages, unsignedMetadata);
118
+ const originalPayloadLength = originalPayload.length / 2;
119
+ const bytesToAdd = 32 - originalPayloadLength % 32;
120
+ const newUnsignedMetadata = unsignedMetadata + "_".repeat(bytesToAdd);
121
+ const payload = import_protocol.RedstonePayload.prepare(packages, newUnsignedMetadata);
122
+ let timestamp = 0;
123
+ for (const p of packages) {
124
+ const newTimestamp = p.dataPackage.timestampMilliseconds / 1e3;
125
+ if (timestamp === 0) {
126
+ timestamp = newTimestamp;
127
+ } else if (timestamp !== newTimestamp) {
128
+ throw new Error("Timestamps are not equal");
129
+ }
130
+ }
131
+ return {
132
+ dataFeedId,
133
+ data: (0, import_viem.encodeAbiParameters)(
134
+ [{ type: "uint256" }, { type: "bytes" }],
135
+ [BigInt(timestamp), `0x${payload}`]
136
+ ),
137
+ timestamp,
138
+ cached: false
139
+ };
140
+ }
141
+ // Annotate the CommonJS export names for ESM import in node:
142
+ 0 && (module.exports = {
143
+ fetchRedstonePayloads
144
+ });
@@ -15,6 +15,7 @@ var __copyProps = (to, from, except, desc) => {
15
15
  }
16
16
  return to;
17
17
  };
18
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
18
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
20
  var updates_exports = {};
20
21
  __export(updates_exports, {
@@ -24,6 +25,8 @@ __export(updates_exports, {
24
25
  RedstoneUpdater: () => import_RedstoneUpdater.RedstoneUpdater
25
26
  });
26
27
  module.exports = __toCommonJS(updates_exports);
28
+ __reExport(updates_exports, require("./fetchPythPayloads.js"), module.exports);
29
+ __reExport(updates_exports, require("./fetchRedstonePayloads.js"), module.exports);
27
30
  var import_PythUpdater = require("./PythUpdater.js");
28
31
  var import_RedstoneUpdater = require("./RedstoneUpdater.js");
29
32
  // Annotate the CommonJS export names for ESM import in node:
@@ -31,5 +34,7 @@ var import_RedstoneUpdater = require("./RedstoneUpdater.js");
31
34
  PythOptions,
32
35
  PythUpdater,
33
36
  RedstoneOptions,
34
- RedstoneUpdater
37
+ RedstoneUpdater,
38
+ ...require("./fetchPythPayloads.js"),
39
+ ...require("./fetchRedstonePayloads.js")
35
40
  });
@@ -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
  {