@pythnetwork/price-pusher 8.3.1 → 8.3.2

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.
package/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2024 Pyth Data Association.
1
+ Copyright 2025 Pyth Data Association.
2
2
 
3
3
  Licensed under the Apache License, Version 2.0 (the "License");
4
4
  you may not use this file except in compliance with the License.
package/README.md CHANGED
@@ -75,7 +75,11 @@ You can get the list of available price feeds from
75
75
 
76
76
  Price pusher communicates with [Hermes][] price service to get the most recent price updates. Hermes listens to the
77
77
  Pythnet and Wormhole network to get latest price updates, and serves REST and websocket APIs for consumers to fetch the
78
- updates. Pyth hosts public endpoints for Hermes; however, it is recommended to get a private endpoint from one of the
78
+ updates.
79
+
80
+ NOTE: It is recommended to use stable hermes endpoints. If you are running the price pusher for **Aptos Testnet**, **Sui Testnet**, or **Near Testnet**, we recommend you use beta hermes endpoints.
81
+
82
+ Pyth hosts [public endpoints](https://docs.pyth.network/price-feeds/api-instances-and-providers/hermes) for Hermes; however, it is recommended to get a private endpoint from one of the
79
83
  Hermes RPC providers for more reliability. Please refer to [this
80
84
  document](https://docs.pyth.network/documentation/pythnet-price-feeds/hermes) for more information.
81
85
 
@@ -22,7 +22,7 @@ export declare class SolanaPricePusher implements IPricePusher {
22
22
  private shardId;
23
23
  private computeUnitPriceMicroLamports;
24
24
  constructor(pythSolanaReceiver: PythSolanaReceiver, priceServiceConnection: PriceServiceConnection, logger: Logger, shardId: number, computeUnitPriceMicroLamports: number);
25
- updatePriceFeed(priceIds: string[], _pubTimesToPush: number[]): Promise<void>;
25
+ updatePriceFeed(priceIds: string[]): Promise<void>;
26
26
  }
27
27
  export declare class SolanaPricePusherJito implements IPricePusher {
28
28
  private pythSolanaReceiver;
@@ -37,6 +37,7 @@ export declare class SolanaPricePusherJito implements IPricePusher {
37
37
  private updatesPerJitoBundle;
38
38
  constructor(pythSolanaReceiver: PythSolanaReceiver, priceServiceConnection: PriceServiceConnection, logger: Logger, shardId: number, defaultJitoTipLamports: number, dynamicJitoTips: boolean, maxJitoTipLamports: number, searcherClient: SearcherClient, jitoBundleSize: number, updatesPerJitoBundle: number);
39
39
  getRecentJitoTipLamports(): Promise<number | undefined>;
40
- updatePriceFeed(priceIds: string[], _pubTimesToPush: number[]): Promise<void>;
40
+ private sleep;
41
+ updatePriceFeed(priceIds: string[]): Promise<void>;
41
42
  }
42
43
  //# sourceMappingURL=solana.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/solana/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAK9B,qBAAa,mBAAoB,SAAQ,kBAAkB;IAEvD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,OAAO;IAEf,OAAO,CAAC,MAAM;gBAHN,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,MAAM,EACvB,UAAU,EAAE,SAAS,EAAE,EACf,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;YAOW,WAAW;IAuBnB,KAAK;IAOL,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CA0B3E;AAED,qBAAa,iBAAkB,YAAW,YAAY;IAElD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,6BAA6B;gBAJ7B,kBAAkB,EAAE,kBAAkB,EACtC,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,6BAA6B,EAAE,MAAM;IAGzC,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAElB,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;CA+CjB;AAED,qBAAa,qBAAsB,YAAW,YAAY;IAEtD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,oBAAoB;gBATpB,kBAAkB,EAAE,kBAAkB,EACtC,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,eAAe,EAAE,OAAO,EACxB,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,MAAM,EACtB,oBAAoB,EAAE,MAAM;IAGhC,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAsBvD,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAElB,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;CAgDjB"}
1
+ {"version":3,"file":"solana.d.ts","sourceRoot":"","sources":["../../src/solana/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAK3E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAK9B,qBAAa,mBAAoB,SAAQ,kBAAkB;IAEvD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,OAAO;IAEf,OAAO,CAAC,MAAM;gBAHN,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,EAAE,MAAM,EACvB,UAAU,EAAE,SAAS,EAAE,EACf,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;YAOW,WAAW;IAuBnB,KAAK;IAOL,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CA0B3E;AAED,qBAAa,iBAAkB,YAAW,YAAY;IAElD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,6BAA6B;gBAJ7B,kBAAkB,EAAE,kBAAkB,EACtC,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,6BAA6B,EAAE,MAAM;IAGzC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CA+CzD;AAED,qBAAa,qBAAsB,YAAW,YAAY;IAEtD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,oBAAoB;gBATpB,kBAAkB,EAAE,kBAAkB,EACtC,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,sBAAsB,EAAE,MAAM,EAC9B,eAAe,EAAE,OAAO,EACxB,kBAAkB,EAAE,MAAM,EAC1B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,MAAM,EACtB,oBAAoB,EAAE,MAAM;IAGhC,wBAAwB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAsB/C,KAAK;IAIb,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAqEzD"}
@@ -73,9 +73,7 @@ class SolanaPricePusher {
73
73
  this.shardId = shardId;
74
74
  this.computeUnitPriceMicroLamports = computeUnitPriceMicroLamports;
75
75
  }
76
- async updatePriceFeed(priceIds,
77
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
78
- _pubTimesToPush) {
76
+ async updatePriceFeed(priceIds) {
79
77
  if (priceIds.length === 0) {
80
78
  return;
81
79
  }
@@ -150,9 +148,10 @@ class SolanaPricePusherJito {
150
148
  return undefined;
151
149
  }
152
150
  }
153
- async updatePriceFeed(priceIds,
154
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
155
- _pubTimesToPush) {
151
+ async sleep(ms) {
152
+ return new Promise((resolve) => setTimeout(resolve, ms));
153
+ }
154
+ async updatePriceFeed(priceIds) {
156
155
  const recentJitoTip = await this.getRecentJitoTipLamports();
157
156
  const jitoTip = this.dynamicJitoTips && recentJitoTip !== undefined
158
157
  ? Math.max(this.defaultJitoTipLamports, recentJitoTip)
@@ -179,7 +178,29 @@ class SolanaPricePusherJito {
179
178
  tightComputeBudget: true,
180
179
  jitoBundleSize: this.jitoBundleSize,
181
180
  });
182
- await (0, solana_utils_1.sendTransactionsJito)(transactions, this.searcherClient, this.pythSolanaReceiver.wallet);
181
+ let retries = 60;
182
+ while (retries > 0) {
183
+ try {
184
+ await (0, solana_utils_1.sendTransactionsJito)(transactions, this.searcherClient, this.pythSolanaReceiver.wallet);
185
+ break;
186
+ }
187
+ catch (err) {
188
+ if (err.code === 8 && err.details?.includes("Rate limit exceeded")) {
189
+ this.logger.warn("Rate limit hit, waiting before retry...");
190
+ await this.sleep(1100); // Wait slightly more than 1 second
191
+ retries--;
192
+ if (retries === 0) {
193
+ this.logger.error("Max retries reached for rate limit");
194
+ throw err;
195
+ }
196
+ }
197
+ else {
198
+ throw err;
199
+ }
200
+ }
201
+ }
202
+ // Add a delay between bundles to avoid rate limiting
203
+ await this.sleep(1100);
183
204
  }
184
205
  }
185
206
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pythnetwork/price-pusher",
3
- "version": "8.3.1",
3
+ "version": "8.3.2",
4
4
  "description": "Pyth Price Pusher",
5
5
  "homepage": "https://pyth.network",
6
6
  "main": "lib/index.js",
@@ -61,13 +61,13 @@
61
61
  "@injectivelabs/sdk-ts": "1.10.72",
62
62
  "@mysten/sui": "^1.3.0",
63
63
  "@pythnetwork/price-service-client": "1.9.0",
64
- "@pythnetwork/price-service-sdk": "^1.7.1",
64
+ "@pythnetwork/price-service-sdk": "^1.8.0",
65
65
  "@pythnetwork/pyth-fuel-js": "1.0.7",
66
66
  "@pythnetwork/pyth-sdk-solidity": "4.0.0",
67
- "@pythnetwork/pyth-solana-receiver": "0.8.2",
67
+ "@pythnetwork/pyth-solana-receiver": "0.9.1",
68
68
  "@pythnetwork/pyth-sui-js": "2.1.0",
69
- "@pythnetwork/pyth-ton-js": "0.1.1",
70
- "@pythnetwork/solana-utils": "0.4.2",
69
+ "@pythnetwork/pyth-ton-js": "0.1.2",
70
+ "@pythnetwork/solana-utils": "0.4.3",
71
71
  "@solana/web3.js": "^1.93.0",
72
72
  "@ton/crypto": "^3.3.0",
73
73
  "@ton/ton": "^15.1.0",
@@ -82,5 +82,5 @@
82
82
  "yaml": "^2.1.1",
83
83
  "yargs": "^17.5.1"
84
84
  },
85
- "gitHead": "83f4174d8235fb6095c347366fd432fb95307162"
85
+ "gitHead": "cdaf99e8629cd6af655a5f1c2c5750de9bc485dd"
86
86
  }