@pythnetwork/price-pusher 7.0.0-alpha → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/aptos/aptos.d.ts.map +1 -1
- package/lib/aptos/aptos.js +12 -12
- package/lib/injective/injective.d.ts.map +1 -1
- package/lib/injective/injective.js +2 -1
- package/lib/pyth-price-listener.d.ts +1 -0
- package/lib/pyth-price-listener.d.ts.map +1 -1
- package/lib/pyth-price-listener.js +10 -0
- package/lib/solana/solana.d.ts +2 -0
- package/lib/solana/solana.d.ts.map +1 -1
- package/lib/solana/solana.js +14 -0
- package/lib/sui/sui.d.ts +1 -5
- package/lib/sui/sui.d.ts.map +1 -1
- package/lib/sui/sui.js +13 -29
- package/package.json +2 -2
package/lib/aptos/aptos.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aptos.d.ts","sourceRoot":"","sources":["../../src/aptos/aptos.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,qBAAa,kBAAmB,SAAQ,kBAAkB;IAEtD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,MAAM;gBAHN,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EACxB,UAAU,EAAE,SAAS,EAAE,EACf,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;IAKG,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CA6C3E;AAGD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAE3D;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IAOjD,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,0BAA0B;IAVpC,OAAO,CAAC,kBAAkB,CAAqB;IAE/C,OAAO,CAAC,oBAAoB,CAAU;gBAG5B,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,0BAA0B,EAAE,MAAM;IAK5C;;;;;;OAMG;IACG,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAQhE,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"aptos.d.ts","sourceRoot":"","sources":["../../src/aptos/aptos.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,qBAAa,kBAAmB,SAAQ,kBAAkB;IAEtD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,MAAM;gBAHN,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EACxB,UAAU,EAAE,SAAS,EAAE,EACf,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;IAKG,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CA6C3E;AAGD,eAAO,MAAM,qBAAqB,wBAAwB,CAAC;AAE3D;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IAOjD,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,0BAA0B;IAVpC,OAAO,CAAC,kBAAkB,CAAqB;IAE/C,OAAO,CAAC,oBAAoB,CAAU;gBAG5B,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,0BAA0B,EAAE,MAAM;IAK5C;;;;;;OAMG;IACG,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAQhE,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;YA+DF,8BAA8B;YAwB9B,wBAAwB;CA+BvC"}
|
package/lib/aptos/aptos.js
CHANGED
|
@@ -14,9 +14,9 @@ class AptosPriceListener extends interface_1.ChainPriceListener {
|
|
|
14
14
|
this.logger = logger;
|
|
15
15
|
}
|
|
16
16
|
async getOnChainPriceInfo(priceId) {
|
|
17
|
+
const client = new aptos_1.AptosClient(this.endpoint);
|
|
18
|
+
const res = await client.getAccountResource(this.pythModule, `${this.pythModule}::state::LatestPriceInfo`);
|
|
17
19
|
try {
|
|
18
|
-
const client = new aptos_1.AptosClient(this.endpoint);
|
|
19
|
-
const res = await client.getAccountResource(this.pythModule, `${this.pythModule}::state::LatestPriceInfo`);
|
|
20
20
|
// This depends upon the pyth contract storage on Aptos and should not be undefined.
|
|
21
21
|
// If undefined, there has been some change and we would need to update accordingly.
|
|
22
22
|
const handle = res.data.info.handle;
|
|
@@ -102,17 +102,17 @@ class AptosPricePusher {
|
|
|
102
102
|
this.logger.error(err, "Error fetching the latest vaas to push.");
|
|
103
103
|
return;
|
|
104
104
|
}
|
|
105
|
+
const account = aptos_1.AptosAccount.fromDerivePath(exports.APTOS_ACCOUNT_HD_PATH, this.mnemonic);
|
|
106
|
+
const client = new aptos_1.AptosClient(this.endpoint);
|
|
107
|
+
const sequenceNumber = await this.tryGetNextSequenceNumber(client, account);
|
|
108
|
+
const rawTx = await client.generateTransaction(account.address(), {
|
|
109
|
+
function: `${this.pythContractAddress}::pyth::update_price_feeds_with_funder`,
|
|
110
|
+
type_arguments: [],
|
|
111
|
+
arguments: [priceFeedUpdateData],
|
|
112
|
+
}, {
|
|
113
|
+
sequence_number: sequenceNumber.toFixed(),
|
|
114
|
+
});
|
|
105
115
|
try {
|
|
106
|
-
const account = aptos_1.AptosAccount.fromDerivePath(exports.APTOS_ACCOUNT_HD_PATH, this.mnemonic);
|
|
107
|
-
const client = new aptos_1.AptosClient(this.endpoint);
|
|
108
|
-
const sequenceNumber = await this.tryGetNextSequenceNumber(client, account);
|
|
109
|
-
const rawTx = await client.generateTransaction(account.address(), {
|
|
110
|
-
function: `${this.pythContractAddress}::pyth::update_price_feeds_with_funder`,
|
|
111
|
-
type_arguments: [],
|
|
112
|
-
arguments: [priceFeedUpdateData],
|
|
113
|
-
}, {
|
|
114
|
-
sequence_number: sequenceNumber.toFixed(),
|
|
115
|
-
});
|
|
116
116
|
const signedTx = await client.signTransaction(account, rawTx);
|
|
117
117
|
const pendingTx = await client.submitTransaction(signedTx);
|
|
118
118
|
this.logger.debug({ hash: pendingTx.hash }, "Successfully broadcasted tx.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injective.d.ts","sourceRoot":"","sources":["../../src/injective/injective.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAW7C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAuB9B,qBAAa,sBAAuB,SAAQ,kBAAkB;IAE1D,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,MAAM;gBAHN,mBAAmB,EAAE,MAAM,EAC3B,YAAY,EAAE,MAAM,EAC5B,UAAU,EAAE,SAAS,EAAE,EACf,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;IAKG,mBAAmB,CACvB,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CA4BlC;AAED,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,qBAAa,oBAAqB,YAAW,YAAY;IAMrD,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,OAAO,CAAwB;gBAG7B,sBAAsB,EAAE,sBAAsB,EAC9C,mBAAmB,EAAE,MAAM,EAC3B,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAWxC,OAAO,CAAC,gBAAgB;YAIV,mBAAmB;IAkE3B,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAU1D,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"injective.d.ts","sourceRoot":"","sources":["../../src/injective/injective.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAW7C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAuB9B,qBAAa,sBAAuB,SAAQ,kBAAkB;IAE1D,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,MAAM;gBAHN,mBAAmB,EAAE,MAAM,EAC3B,YAAY,EAAE,MAAM,EAC5B,UAAU,EAAE,SAAS,EAAE,EACf,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;IAKG,mBAAmB,CACvB,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CA4BlC;AAED,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,qBAAa,oBAAqB,YAAW,YAAY;IAMrD,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,OAAO,CAAwB;gBAG7B,sBAAsB,EAAE,sBAAsB,EAC9C,mBAAmB,EAAE,MAAM,EAC3B,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAWxC,OAAO,CAAC,gBAAgB;YAIV,mBAAmB;IAkE3B,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAU1D,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;CAiEjB"}
|
|
@@ -149,7 +149,8 @@ class InjectivePricePusher {
|
|
|
149
149
|
}
|
|
150
150
|
catch (err) {
|
|
151
151
|
this.logger.error(err, "Error fetching update fee");
|
|
152
|
-
|
|
152
|
+
// Throwing an error because it is likely an RPC issue
|
|
153
|
+
throw err;
|
|
153
154
|
}
|
|
154
155
|
try {
|
|
155
156
|
const executeMsg = sdk_ts_1.MsgExecuteContract.fromJSON({
|
|
@@ -7,6 +7,7 @@ export declare class PythPriceListener implements IPriceListener {
|
|
|
7
7
|
private priceIdToAlias;
|
|
8
8
|
private latestPriceInfo;
|
|
9
9
|
private logger;
|
|
10
|
+
private lastUpdated;
|
|
10
11
|
constructor(connection: PriceServiceConnection, priceItems: PriceItem[], logger: Logger);
|
|
11
12
|
start(): Promise<void>;
|
|
12
13
|
private onNewPriceFeed;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pyth-price-listener.d.ts","sourceRoot":"","sources":["../src/pyth-price-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pyth-price-listener.d.ts","sourceRoot":"","sources":["../src/pyth-price-listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,sBAAsB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAI9B,qBAAa,iBAAkB,YAAW,cAAc;IACtD,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAA4B;gBAG7C,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,MAAM;IAaV,KAAK;IA8BX,OAAO,CAAC,cAAc;IAuBtB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;CAG3D"}
|
|
@@ -7,6 +7,7 @@ class PythPriceListener {
|
|
|
7
7
|
priceIdToAlias;
|
|
8
8
|
latestPriceInfo;
|
|
9
9
|
logger;
|
|
10
|
+
lastUpdated;
|
|
10
11
|
constructor(connection, priceItems, logger) {
|
|
11
12
|
this.connection = connection;
|
|
12
13
|
this.priceIds = priceItems.map((priceItem) => priceItem.id);
|
|
@@ -29,6 +30,14 @@ class PythPriceListener {
|
|
|
29
30
|
publishTime: latestAvailablePrice.publishTime,
|
|
30
31
|
});
|
|
31
32
|
});
|
|
33
|
+
// Check health of the price feeds 5 second. If the price feeds are not updating
|
|
34
|
+
// for more than 30s, throw an error.
|
|
35
|
+
setInterval(() => {
|
|
36
|
+
if (this.lastUpdated === undefined ||
|
|
37
|
+
this.lastUpdated < Date.now() - 30 * 1000) {
|
|
38
|
+
throw new Error("Hermes Price feeds are not updating.");
|
|
39
|
+
}
|
|
40
|
+
}, 5000);
|
|
32
41
|
}
|
|
33
42
|
onNewPriceFeed(priceFeed) {
|
|
34
43
|
this.logger.debug(`Received new price feed update from Pyth price service: ${this.priceIdToAlias.get(priceFeed.id)} ${priceFeed.id}`);
|
|
@@ -43,6 +52,7 @@ class PythPriceListener {
|
|
|
43
52
|
publishTime: currentPrice.publishTime,
|
|
44
53
|
};
|
|
45
54
|
this.latestPriceInfo.set(priceFeed.id, priceInfo);
|
|
55
|
+
this.lastUpdated = Date.now();
|
|
46
56
|
}
|
|
47
57
|
getLatestPriceInfo(priceId) {
|
|
48
58
|
return this.latestPriceInfo.get(priceId);
|
package/lib/solana/solana.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export declare class SolanaPriceListener extends ChainPriceListener {
|
|
|
11
11
|
constructor(pythSolanaReceiver: PythSolanaReceiver, shardId: number, priceItems: PriceItem[], logger: Logger, config: {
|
|
12
12
|
pollingFrequency: DurationInSeconds;
|
|
13
13
|
});
|
|
14
|
+
private checkHealth;
|
|
15
|
+
start(): Promise<void>;
|
|
14
16
|
getOnChainPriceInfo(priceId: string): Promise<PriceInfo | undefined>;
|
|
15
17
|
}
|
|
16
18
|
export declare class SolanaPricePusher implements IPricePusher {
|
|
@@ -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;AAE9B,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;
|
|
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;AAE9B,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;IAUnB,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;CAwCjB;AAID,qBAAa,qBAAsB,YAAW,YAAY;IAEtD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,cAAc;gBANd,kBAAkB,EAAE,kBAAkB,EACtC,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,MAAM;IAG1B,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAElB,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC;CAuCjB"}
|
package/lib/solana/solana.js
CHANGED
|
@@ -14,6 +14,20 @@ class SolanaPriceListener extends interface_1.ChainPriceListener {
|
|
|
14
14
|
this.shardId = shardId;
|
|
15
15
|
this.logger = logger;
|
|
16
16
|
}
|
|
17
|
+
// Checking the health of the Solana connection by checking the last block time
|
|
18
|
+
// and ensuring it is not older than 30 seconds.
|
|
19
|
+
async checkHealth() {
|
|
20
|
+
const slot = await this.pythSolanaReceiver.connection.getSlot();
|
|
21
|
+
const blockTime = await this.pythSolanaReceiver.connection.getBlockTime(slot);
|
|
22
|
+
if (blockTime === null || blockTime < Date.now() / 1000 - 30) {
|
|
23
|
+
throw new Error("Solana connection is unhealthy");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async start() {
|
|
27
|
+
// Frequently check the RPC connection to ensure it is healthy
|
|
28
|
+
setInterval(this.checkHealth.bind(this), 5000);
|
|
29
|
+
await super.start();
|
|
30
|
+
}
|
|
17
31
|
async getOnChainPriceInfo(priceId) {
|
|
18
32
|
try {
|
|
19
33
|
const priceFeedAccount = await this.pythSolanaReceiver.fetchPriceFeedAccount(this.shardId, Buffer.from(priceId, "hex"));
|
package/lib/sui/sui.d.ts
CHANGED
|
@@ -34,14 +34,10 @@ export declare class SuiPricePusher implements IPricePusher {
|
|
|
34
34
|
private readonly provider;
|
|
35
35
|
private logger;
|
|
36
36
|
private priceServiceConnection;
|
|
37
|
-
private pythPackageId;
|
|
38
|
-
private pythStateId;
|
|
39
|
-
private wormholePackageId;
|
|
40
|
-
private wormholeStateId;
|
|
41
37
|
private gasBudget;
|
|
42
38
|
private gasPool;
|
|
43
39
|
private pythClient;
|
|
44
|
-
constructor(signer: Ed25519Keypair, provider: SuiClient, logger: Logger, priceServiceConnection: PriceServiceConnection,
|
|
40
|
+
constructor(signer: Ed25519Keypair, provider: SuiClient, logger: Logger, priceServiceConnection: PriceServiceConnection, gasBudget: number, gasPool: SuiObjectRef[], pythClient: SuiPythClient);
|
|
45
41
|
/**
|
|
46
42
|
* getPackageId returns the latest package id that the object belongs to. Use this to
|
|
47
43
|
* fetch the latest package id for a given object id and handle package upgrades automatically.
|
package/lib/sui/sui.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sui.d.ts","sourceRoot":"","sources":["../../src/sui/sui.ts"],"names":[],"mappings":"AAAA,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;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAO9B,KAAK,QAAQ,GAAG,MAAM,CAAC;AAGvB,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAGrB,WAAW,EAAE,QAAQ,EACrB,eAAe,EAAE,QAAQ,EACzB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;IAYG,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CA6C3E;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAe,YAAW,YAAY;IAE/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"sui.d.ts","sourceRoot":"","sources":["../../src/sui/sui.ts"],"names":[],"mappings":"AAAA,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;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAO9B,KAAK,QAAQ,GAAG,MAAM,CAAC;AAGvB,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAGrB,WAAW,EAAE,QAAQ,EACrB,eAAe,EAAE,QAAQ,EACzB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;IAYG,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CA6C3E;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAe,YAAW,YAAY;IAE/C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;gBAND,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,SAAS,EAC5B,MAAM,EAAE,MAAM,EACd,sBAAsB,EAAE,sBAAsB,EAC9C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,YAAY,EAAE,EACvB,UAAU,EAAE,aAAa;IAGnC;;;;;;OAMG;WACU,YAAY,CACvB,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,QAAQ,CAAC;IAyBpB;;;OAGG;WACU,0BAA0B,CACrC,sBAAsB,EAAE,sBAAsB,EAC9C,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,EAAE,GACzB,OAAO,CAAC,cAAc,CAAC;IAkCpB,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;IA0ChB,iGAAiG;YACnF,qBAAqB;IAMnC,sEAAsE;YACxD,oBAAoB;mBAyDb,iBAAiB;mBAsDjB,yBAAyB;mBAgBzB,cAAc;mBAiCd,mBAAmB;mBAwCnB,oBAAoB;CAiE1C"}
|
package/lib/sui/sui.js
CHANGED
|
@@ -74,22 +74,14 @@ class SuiPricePusher {
|
|
|
74
74
|
provider;
|
|
75
75
|
logger;
|
|
76
76
|
priceServiceConnection;
|
|
77
|
-
pythPackageId;
|
|
78
|
-
pythStateId;
|
|
79
|
-
wormholePackageId;
|
|
80
|
-
wormholeStateId;
|
|
81
77
|
gasBudget;
|
|
82
78
|
gasPool;
|
|
83
79
|
pythClient;
|
|
84
|
-
constructor(signer, provider, logger, priceServiceConnection,
|
|
80
|
+
constructor(signer, provider, logger, priceServiceConnection, gasBudget, gasPool, pythClient) {
|
|
85
81
|
this.signer = signer;
|
|
86
82
|
this.provider = provider;
|
|
87
83
|
this.logger = logger;
|
|
88
84
|
this.priceServiceConnection = priceServiceConnection;
|
|
89
|
-
this.pythPackageId = pythPackageId;
|
|
90
|
-
this.pythStateId = pythStateId;
|
|
91
|
-
this.wormholePackageId = wormholePackageId;
|
|
92
|
-
this.wormholeStateId = wormholeStateId;
|
|
93
85
|
this.gasBudget = gasBudget;
|
|
94
86
|
this.gasPool = gasPool;
|
|
95
87
|
this.pythClient = pythClient;
|
|
@@ -131,11 +123,9 @@ class SuiPricePusher {
|
|
|
131
123
|
throw new Error(`numGasObjects cannot be greater than ${MAX_NUM_OBJECTS_IN_ARGUMENT} until we implement split chunking`);
|
|
132
124
|
}
|
|
133
125
|
const provider = new client_1.SuiClient({ url: endpoint });
|
|
134
|
-
const pythPackageId = await SuiPricePusher.getPackageId(provider, pythStateId);
|
|
135
|
-
const wormholePackageId = await SuiPricePusher.getPackageId(provider, wormholeStateId);
|
|
136
126
|
const gasPool = await SuiPricePusher.initializeGasPool(keypair, provider, numGasObjects, ignoreGasObjects, logger);
|
|
137
127
|
const pythClient = new pyth_sui_js_1.SuiPythClient(provider, pythStateId, wormholeStateId);
|
|
138
|
-
return new SuiPricePusher(keypair, provider, logger, priceServiceConnection,
|
|
128
|
+
return new SuiPricePusher(keypair, provider, logger, priceServiceConnection, gasBudget, gasPool, pythClient);
|
|
139
129
|
}
|
|
140
130
|
async updatePriceFeed(priceIds, pubTimesToPush) {
|
|
141
131
|
if (priceIds.length === 0) {
|
|
@@ -211,7 +201,7 @@ class SuiPricePusher {
|
|
|
211
201
|
// ignoreGasObjects is a list of gas objects that will be ignored during the
|
|
212
202
|
// merging -- use this to store any locked objects on initialization.
|
|
213
203
|
static async initializeGasPool(signer, provider, numGasObjects, ignoreGasObjects, logger) {
|
|
214
|
-
const signerAddress =
|
|
204
|
+
const signerAddress = signer.toSuiAddress();
|
|
215
205
|
if (ignoreGasObjects.length > 0) {
|
|
216
206
|
logger.info({ ignoreGasObjects }, "Ignoring some gas objects for coin merging");
|
|
217
207
|
}
|
|
@@ -236,24 +226,18 @@ class SuiPricePusher {
|
|
|
236
226
|
return gasPool;
|
|
237
227
|
}
|
|
238
228
|
// Attempt to refresh the version of the provided object reference to point to the current version
|
|
239
|
-
// of the object.
|
|
240
|
-
// be retrieved.
|
|
229
|
+
// of the object. Throws an error if the object cannot be refreshed.
|
|
241
230
|
static async tryRefreshObjectReference(provider, ref) {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
else {
|
|
252
|
-
return ref;
|
|
253
|
-
}
|
|
231
|
+
const objectResponse = await provider.getObject({ id: ref.objectId });
|
|
232
|
+
if (objectResponse.data !== undefined) {
|
|
233
|
+
return {
|
|
234
|
+
digest: objectResponse.data.digest,
|
|
235
|
+
objectId: objectResponse.data.objectId,
|
|
236
|
+
version: objectResponse.data.version,
|
|
237
|
+
};
|
|
254
238
|
}
|
|
255
|
-
|
|
256
|
-
|
|
239
|
+
else {
|
|
240
|
+
throw new Error("Failed to refresh object reference");
|
|
257
241
|
}
|
|
258
242
|
}
|
|
259
243
|
static async getAllGasCoins(provider, owner) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pythnetwork/price-pusher",
|
|
3
|
-
"version": "7.0.0
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"description": "Pyth Price Pusher",
|
|
5
5
|
"homepage": "https://pyth.network",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -77,5 +77,5 @@
|
|
|
77
77
|
"yaml": "^2.1.1",
|
|
78
78
|
"yargs": "^17.5.1"
|
|
79
79
|
},
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "05dc9c8e06b9643bb365db494e67cac843d7b90a"
|
|
81
81
|
}
|