@pythnetwork/price-pusher 7.0.0-alpha → 7.0.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.
- 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/command.d.ts +1 -0
- package/lib/solana/command.d.ts.map +1 -1
- package/lib/solana/command.js +7 -2
- package/lib/solana/solana.d.ts +4 -1
- package/lib/solana/solana.d.ts.map +1 -1
- package/lib/solana/solana.js +19 -4
- 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 +3 -3
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/command.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/solana/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAgBhC,OAAO,EACL,cAAc,EAEf,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/solana/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAgBhC,OAAO,EACL,cAAc,EAEf,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;oBA6DH,GAAG;;AA3D9B,wBAkKE;AAEF,eAAO,MAAM,cAAc,MAAO,cAAc,UAAU,MAAM,SAO/D,CAAC"}
|
package/lib/solana/command.js
CHANGED
|
@@ -84,6 +84,11 @@ exports.default = {
|
|
|
84
84
|
type: "number",
|
|
85
85
|
default: 2,
|
|
86
86
|
},
|
|
87
|
+
"updates-per-jito-bundle": {
|
|
88
|
+
description: "Number of transactions in each bundle",
|
|
89
|
+
type: "number",
|
|
90
|
+
default: 6,
|
|
91
|
+
},
|
|
87
92
|
...options.priceConfigFile,
|
|
88
93
|
...options.priceServiceEndpoint,
|
|
89
94
|
...options.pythContractAddress,
|
|
@@ -94,7 +99,7 @@ exports.default = {
|
|
|
94
99
|
...options.controllerLogLevel,
|
|
95
100
|
},
|
|
96
101
|
handler: function (argv) {
|
|
97
|
-
const { endpoint, keypairFile, shardId, computeUnitPriceMicroLamports, priceConfigFile, priceServiceEndpoint, pythContractAddress, pushingFrequency, pollingFrequency, jitoEndpoint, jitoKeypairFile, jitoTipLamports, jitoBundleSize, logLevel, priceServiceConnectionLogLevel, controllerLogLevel, } = argv;
|
|
102
|
+
const { endpoint, keypairFile, shardId, computeUnitPriceMicroLamports, priceConfigFile, priceServiceEndpoint, pythContractAddress, pushingFrequency, pollingFrequency, jitoEndpoint, jitoKeypairFile, jitoTipLamports, jitoBundleSize, updatesPerJitoBundle, logLevel, priceServiceConnectionLogLevel, controllerLogLevel, } = argv;
|
|
98
103
|
const logger = (0, pino_1.default)({ level: logLevel });
|
|
99
104
|
const priceConfigs = (0, price_config_1.readPriceConfigFile)(priceConfigFile);
|
|
100
105
|
const priceServiceConnection = new price_service_client_1.PriceServiceConnection(priceServiceEndpoint, {
|
|
@@ -112,7 +117,7 @@ exports.default = {
|
|
|
112
117
|
if (jitoTipLamports) {
|
|
113
118
|
const jitoKeypair = web3_js_1.Keypair.fromSecretKey(Uint8Array.from(JSON.parse(fs_1.default.readFileSync(jitoKeypairFile, "ascii"))));
|
|
114
119
|
const jitoClient = (0, searcher_1.searcherClient)(jitoEndpoint, jitoKeypair);
|
|
115
|
-
solanaPricePusher = new solana_1.SolanaPricePusherJito(pythSolanaReceiver, priceServiceConnection, logger.child({ module: "SolanaPricePusherJito" }), shardId, jitoTipLamports, jitoClient, jitoBundleSize);
|
|
120
|
+
solanaPricePusher = new solana_1.SolanaPricePusherJito(pythSolanaReceiver, priceServiceConnection, logger.child({ module: "SolanaPricePusherJito" }), shardId, jitoTipLamports, jitoClient, jitoBundleSize, updatesPerJitoBundle);
|
|
116
121
|
(0, exports.onBundleResult)(jitoClient, logger.child({ module: "JitoClient" }));
|
|
117
122
|
}
|
|
118
123
|
else {
|
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 {
|
|
@@ -30,7 +32,8 @@ export declare class SolanaPricePusherJito implements IPricePusher {
|
|
|
30
32
|
private jitoTipLamports;
|
|
31
33
|
private searcherClient;
|
|
32
34
|
private jitoBundleSize;
|
|
33
|
-
|
|
35
|
+
private updatesPerJitoBundle;
|
|
36
|
+
constructor(pythSolanaReceiver: PythSolanaReceiver, priceServiceConnection: PriceServiceConnection, logger: Logger, shardId: number, jitoTipLamports: number, searcherClient: SearcherClient, jitoBundleSize: number, updatesPerJitoBundle: number);
|
|
34
37
|
updatePriceFeed(priceIds: string[], _pubTimesToPush: number[]): Promise<void>;
|
|
35
38
|
}
|
|
36
39
|
//# 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;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;AAED,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;IACtB,OAAO,CAAC,oBAAoB;gBAPpB,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,EACtB,oBAAoB,EAAE,MAAM;IAGhC,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"));
|
|
@@ -82,7 +96,6 @@ class SolanaPricePusher {
|
|
|
82
96
|
}
|
|
83
97
|
}
|
|
84
98
|
exports.SolanaPricePusher = SolanaPricePusher;
|
|
85
|
-
const UPDATES_PER_JITO_BUNDLE = 7;
|
|
86
99
|
class SolanaPricePusherJito {
|
|
87
100
|
pythSolanaReceiver;
|
|
88
101
|
priceServiceConnection;
|
|
@@ -91,7 +104,8 @@ class SolanaPricePusherJito {
|
|
|
91
104
|
jitoTipLamports;
|
|
92
105
|
searcherClient;
|
|
93
106
|
jitoBundleSize;
|
|
94
|
-
|
|
107
|
+
updatesPerJitoBundle;
|
|
108
|
+
constructor(pythSolanaReceiver, priceServiceConnection, logger, shardId, jitoTipLamports, searcherClient, jitoBundleSize, updatesPerJitoBundle) {
|
|
95
109
|
this.pythSolanaReceiver = pythSolanaReceiver;
|
|
96
110
|
this.priceServiceConnection = priceServiceConnection;
|
|
97
111
|
this.logger = logger;
|
|
@@ -99,6 +113,7 @@ class SolanaPricePusherJito {
|
|
|
99
113
|
this.jitoTipLamports = jitoTipLamports;
|
|
100
114
|
this.searcherClient = searcherClient;
|
|
101
115
|
this.jitoBundleSize = jitoBundleSize;
|
|
116
|
+
this.updatesPerJitoBundle = updatesPerJitoBundle;
|
|
102
117
|
}
|
|
103
118
|
async updatePriceFeed(priceIds,
|
|
104
119
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -111,12 +126,12 @@ class SolanaPricePusherJito {
|
|
|
111
126
|
this.logger.error(err, "getPriceFeedsUpdateData failed");
|
|
112
127
|
return;
|
|
113
128
|
}
|
|
114
|
-
for (let i = 0; i < priceIds.length; i +=
|
|
129
|
+
for (let i = 0; i < priceIds.length; i += this.updatesPerJitoBundle) {
|
|
115
130
|
const transactionBuilder = this.pythSolanaReceiver.newTransactionBuilder({
|
|
116
131
|
closeUpdateAccounts: true,
|
|
117
132
|
});
|
|
118
133
|
await transactionBuilder.addUpdatePriceFeed(priceFeedUpdateData.map((x) => {
|
|
119
|
-
return (0, price_service_sdk_1.sliceAccumulatorUpdateData)(Buffer.from(x, "base64"), i, i +
|
|
134
|
+
return (0, price_service_sdk_1.sliceAccumulatorUpdateData)(Buffer.from(x, "base64"), i, i + this.updatesPerJitoBundle).toString("base64");
|
|
120
135
|
}), this.shardId);
|
|
121
136
|
const transactions = await transactionBuilder.buildVersionedTransactions({
|
|
122
137
|
jitoTipLamports: this.jitoTipLamports,
|
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.
|
|
3
|
+
"version": "7.0.1",
|
|
4
4
|
"description": "Pyth Price Pusher",
|
|
5
5
|
"homepage": "https://pyth.network",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"@pythnetwork/pyth-sdk-solidity": "3.1.0",
|
|
63
63
|
"@pythnetwork/pyth-solana-receiver": "0.8.0",
|
|
64
64
|
"@pythnetwork/pyth-sui-js": "2.0.0",
|
|
65
|
-
"@pythnetwork/solana-utils": "0.4.
|
|
65
|
+
"@pythnetwork/solana-utils": "0.4.2",
|
|
66
66
|
"@solana/web3.js": "^1.93.0",
|
|
67
67
|
"@truffle/hdwallet-provider": "^2.1.3",
|
|
68
68
|
"@types/pino": "^7.0.5",
|
|
@@ -77,5 +77,5 @@
|
|
|
77
77
|
"yaml": "^2.1.1",
|
|
78
78
|
"yargs": "^17.5.1"
|
|
79
79
|
},
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "27656f9e609abaa5943489f1407c6595cfdbfc2e"
|
|
81
81
|
}
|