@pythnetwork/price-pusher 6.7.0 → 7.0.0-alpha
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/README.md +26 -14
- package/lib/aptos/aptos.d.ts +5 -2
- package/lib/aptos/aptos.d.ts.map +1 -1
- package/lib/aptos/aptos.js +19 -19
- package/lib/aptos/command.d.ts +3 -0
- package/lib/aptos/command.d.ts.map +1 -1
- package/lib/aptos/command.js +12 -14
- package/lib/controller.d.ts +3 -1
- package/lib/controller.d.ts.map +1 -1
- package/lib/controller.js +11 -4
- package/lib/evm/command.d.ts +3 -0
- package/lib/evm/command.d.ts.map +1 -1
- package/lib/evm/command.js +14 -16
- package/lib/evm/custom-gas-station.d.ts +4 -2
- package/lib/evm/custom-gas-station.d.ts.map +1 -1
- package/lib/evm/custom-gas-station.js +7 -6
- package/lib/evm/evm.d.ts +7 -3
- package/lib/evm/evm.d.ts.map +1 -1
- package/lib/evm/evm.js +25 -24
- package/lib/index.js +3 -0
- package/lib/injective/command.d.ts +3 -0
- package/lib/injective/command.d.ts.map +1 -1
- package/lib/injective/command.js +11 -13
- package/lib/injective/injective.d.ts +5 -2
- package/lib/injective/injective.d.ts.map +1 -1
- package/lib/injective/injective.js +22 -22
- package/lib/interface.d.ts +1 -2
- package/lib/interface.d.ts.map +1 -1
- package/lib/interface.js +1 -4
- package/lib/near/command.d.ts +3 -0
- package/lib/near/command.d.ts.map +1 -1
- package/lib/near/command.js +14 -13
- package/lib/near/near.d.ts +5 -2
- package/lib/near/near.d.ts.map +1 -1
- package/lib/near/near.js +19 -17
- package/lib/options.d.ts +9 -0
- package/lib/options.d.ts.map +1 -1
- package/lib/options.js +28 -1
- package/lib/price-config.d.ts +2 -1
- package/lib/price-config.d.ts.map +1 -1
- package/lib/price-config.js +4 -6
- package/lib/pyth-price-listener.d.ts +3 -1
- package/lib/pyth-price-listener.d.ts.map +1 -1
- package/lib/pyth-price-listener.js +4 -2
- package/lib/solana/command.d.ts +5 -1
- package/lib/solana/command.d.ts.map +1 -1
- package/lib/solana/command.js +16 -18
- package/lib/solana/solana.d.ts +9 -5
- package/lib/solana/solana.d.ts.map +1 -1
- package/lib/solana/solana.js +42 -39
- package/lib/sui/command.d.ts +4 -0
- package/lib/sui/command.d.ts.map +1 -1
- package/lib/sui/command.js +18 -14
- package/lib/sui/sui.d.ts +6 -3
- package/lib/sui/sui.d.ts.map +1 -1
- package/lib/sui/sui.js +36 -30
- package/package.json +21 -11
package/lib/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,eAAO,MAAM,oBAAoB;;CAOhC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;CAQ/B,CAAC;AAEF,eAAO,MAAM,eAAe;;CAM3B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;CAQ5B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;CAU5B,CAAC;AAEF,eAAO,MAAM,YAAY;;CAMxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,eAAO,MAAM,oBAAoB;;CAOhC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;CAQ/B,CAAC;AAEF,eAAO,MAAM,eAAe;;CAM3B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;CAQ5B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;CAU5B,CAAC;AAEF,eAAO,MAAM,YAAY;;CAMxB,CAAC;AAEF,eAAO,MAAM,QAAQ;;CAQpB,CAAC;AAEF,eAAO,MAAM,8BAA8B;;CAQ1C,CAAC;AAEF,eAAO,MAAM,kBAAkB;;CAQ9B,CAAC"}
|
package/lib/options.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mnemonicFile = exports.pushingFrequency = exports.pollingFrequency = exports.priceConfigFile = exports.pythContractAddress = exports.priceServiceEndpoint = void 0;
|
|
3
|
+
exports.controllerLogLevel = exports.priceServiceConnectionLogLevel = exports.logLevel = exports.mnemonicFile = exports.pushingFrequency = exports.pollingFrequency = exports.priceConfigFile = exports.pythContractAddress = exports.priceServiceEndpoint = void 0;
|
|
4
4
|
exports.priceServiceEndpoint = {
|
|
5
5
|
"price-service-endpoint": {
|
|
6
6
|
description: "Endpoint URL for the price service. e.g: https://endpoint/example",
|
|
@@ -48,3 +48,30 @@ exports.mnemonicFile = {
|
|
|
48
48
|
required: true,
|
|
49
49
|
},
|
|
50
50
|
};
|
|
51
|
+
exports.logLevel = {
|
|
52
|
+
"log-level": {
|
|
53
|
+
description: "Log level",
|
|
54
|
+
type: "string",
|
|
55
|
+
required: false,
|
|
56
|
+
default: "info",
|
|
57
|
+
choices: ["trace", "debug", "info", "warn", "error"],
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
exports.priceServiceConnectionLogLevel = {
|
|
61
|
+
"price-service-connection-log-level": {
|
|
62
|
+
description: "Log level for the price service connection.",
|
|
63
|
+
type: "string",
|
|
64
|
+
required: false,
|
|
65
|
+
default: "warn",
|
|
66
|
+
choices: ["trace", "debug", "info", "warn", "error"],
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
exports.controllerLogLevel = {
|
|
70
|
+
"controller-log-level": {
|
|
71
|
+
description: "Log level for the controller.",
|
|
72
|
+
type: "string",
|
|
73
|
+
required: false,
|
|
74
|
+
default: "info",
|
|
75
|
+
choices: ["trace", "debug", "info", "warn", "error"],
|
|
76
|
+
},
|
|
77
|
+
};
|
package/lib/price-config.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { HexString } from "@pythnetwork/price-service-client";
|
|
2
|
+
import { Logger } from "pino";
|
|
2
3
|
import { DurationInSeconds, PctNumber } from "./utils";
|
|
3
4
|
import { PriceInfo } from "./interface";
|
|
4
5
|
export type PriceConfig = {
|
|
@@ -24,5 +25,5 @@ export declare enum UpdateCondition {
|
|
|
24
25
|
* @param priceConfig Config of the price feed to check
|
|
25
26
|
* @returns True if the on-chain price needs to be updated.
|
|
26
27
|
*/
|
|
27
|
-
export declare function shouldUpdate(priceConfig: PriceConfig, sourceLatestPrice: PriceInfo | undefined, targetLatestPrice: PriceInfo | undefined): UpdateCondition;
|
|
28
|
+
export declare function shouldUpdate(priceConfig: PriceConfig, sourceLatestPrice: PriceInfo | undefined, targetLatestPrice: PriceInfo | undefined, logger: Logger): UpdateCondition;
|
|
28
29
|
//# sourceMappingURL=price-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"price-config.d.ts","sourceRoot":"","sources":["../src/price-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAI9D,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAmB,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAuBxC,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,SAAS,CAAC;IACd,cAAc,EAAE,iBAAiB,CAAC;IAClC,cAAc,EAAE,SAAS,CAAC;IAC1B,eAAe,EAAE,SAAS,CAAC;IAU3B,iBAAiB,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,yBAAyB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACzD,yBAAyB,EAAE,SAAS,GAAG,SAAS,CAAC;IACjD,0BAA0B,EAAE,SAAS,GAAG,SAAS,CAAC;CACnD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAuB/D;AAED,oBAAY,eAAe;IAEzB,GAAG,IAAA;IAEH,KAAK,IAAA;IAEL,EAAE,IAAA;CACH;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,SAAS,GAAG,SAAS,EACxC,iBAAiB,EAAE,SAAS,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"price-config.d.ts","sourceRoot":"","sources":["../src/price-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAI9D,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAmB,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAuBxC,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,SAAS,CAAC;IACd,cAAc,EAAE,iBAAiB,CAAC;IAClC,cAAc,EAAE,SAAS,CAAC;IAC1B,eAAe,EAAE,SAAS,CAAC;IAU3B,iBAAiB,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,yBAAyB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACzD,yBAAyB,EAAE,SAAS,GAAG,SAAS,CAAC;IACjD,0BAA0B,EAAE,SAAS,GAAG,SAAS,CAAC;CACnD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAuB/D;AAED,oBAAY,eAAe;IAEzB,GAAG,IAAA;IAEH,KAAK,IAAA;IAEL,EAAE,IAAA;CACH;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,SAAS,GAAG,SAAS,EACxC,iBAAiB,EAAE,SAAS,GAAG,SAAS,EACxC,MAAM,EAAE,MAAM,GACb,eAAe,CAkEjB"}
|
package/lib/price-config.js
CHANGED
|
@@ -63,7 +63,7 @@ var UpdateCondition;
|
|
|
63
63
|
* @param priceConfig Config of the price feed to check
|
|
64
64
|
* @returns True if the on-chain price needs to be updated.
|
|
65
65
|
*/
|
|
66
|
-
function shouldUpdate(priceConfig, sourceLatestPrice, targetLatestPrice) {
|
|
66
|
+
function shouldUpdate(priceConfig, sourceLatestPrice, targetLatestPrice, logger) {
|
|
67
67
|
const priceId = priceConfig.id;
|
|
68
68
|
// There is no price to update the target with.
|
|
69
69
|
if (sourceLatestPrice === undefined) {
|
|
@@ -71,7 +71,7 @@ function shouldUpdate(priceConfig, sourceLatestPrice, targetLatestPrice) {
|
|
|
71
71
|
}
|
|
72
72
|
// It means that price never existed there. So we should push the latest price feed.
|
|
73
73
|
if (targetLatestPrice === undefined) {
|
|
74
|
-
|
|
74
|
+
logger.info(`${priceConfig.alias} (${priceId}) is not available on the target network. Pushing the price.`);
|
|
75
75
|
return UpdateCondition.YES;
|
|
76
76
|
}
|
|
77
77
|
// The current price is not newer than the price onchain
|
|
@@ -83,10 +83,8 @@ function shouldUpdate(priceConfig, sourceLatestPrice, targetLatestPrice) {
|
|
|
83
83
|
Number(targetLatestPrice.price)) *
|
|
84
84
|
100;
|
|
85
85
|
const confidenceRatioPct = Math.abs((Number(sourceLatestPrice.conf) / Number(sourceLatestPrice.price)) * 100);
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
console.log("Target latest price: ", targetLatestPrice);
|
|
89
|
-
console.log(`Time difference: ${timeDifference} (< ${priceConfig.timeDifference}? / early: < ${priceConfig.earlyUpdateTimeDifference}) OR ` +
|
|
86
|
+
logger.info({ sourcePrice: sourceLatestPrice, targetPrice: targetLatestPrice }, `Analyzing price ${priceConfig.alias} (${priceId}). ` +
|
|
87
|
+
`Time difference: ${timeDifference} (< ${priceConfig.timeDifference}? / early: < ${priceConfig.earlyUpdateTimeDifference}) OR ` +
|
|
90
88
|
`Price deviation: ${priceDeviationPct.toFixed(5)}% (< ${priceConfig.priceDeviation}%? / early: < ${priceConfig.earlyUpdatePriceDeviation}%?) OR ` +
|
|
91
89
|
`Confidence ratio: ${confidenceRatioPct.toFixed(5)}% (< ${priceConfig.confidenceRatio}%? / early: < ${priceConfig.earlyUpdatePriceDeviation}%?)`);
|
|
92
90
|
if (timeDifference >= priceConfig.timeDifference ||
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
2
2
|
import { PriceInfo, IPriceListener, PriceItem } from "./interface";
|
|
3
|
+
import { Logger } from "pino";
|
|
3
4
|
export declare class PythPriceListener implements IPriceListener {
|
|
4
5
|
private connection;
|
|
5
6
|
private priceIds;
|
|
6
7
|
private priceIdToAlias;
|
|
7
8
|
private latestPriceInfo;
|
|
8
|
-
|
|
9
|
+
private logger;
|
|
10
|
+
constructor(connection: PriceServiceConnection, priceItems: PriceItem[], logger: Logger);
|
|
9
11
|
start(): Promise<void>;
|
|
10
12
|
private onNewPriceFeed;
|
|
11
13
|
getLatestPriceInfo(priceId: string): PriceInfo | undefined;
|
|
@@ -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;
|
|
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;AAE9B,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;gBAGrB,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,EAAE,MAAM;IAaV,KAAK;IAmBX,OAAO,CAAC,cAAc;IAsBtB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;CAG3D"}
|
|
@@ -6,11 +6,13 @@ class PythPriceListener {
|
|
|
6
6
|
priceIds;
|
|
7
7
|
priceIdToAlias;
|
|
8
8
|
latestPriceInfo;
|
|
9
|
-
|
|
9
|
+
logger;
|
|
10
|
+
constructor(connection, priceItems, logger) {
|
|
10
11
|
this.connection = connection;
|
|
11
12
|
this.priceIds = priceItems.map((priceItem) => priceItem.id);
|
|
12
13
|
this.priceIdToAlias = new Map(priceItems.map((priceItem) => [priceItem.id, priceItem.alias]));
|
|
13
14
|
this.latestPriceInfo = new Map();
|
|
15
|
+
this.logger = logger;
|
|
14
16
|
}
|
|
15
17
|
// This method should be awaited on and once it finishes it has the latest value
|
|
16
18
|
// for the given price feeds (if they exist).
|
|
@@ -29,7 +31,7 @@ class PythPriceListener {
|
|
|
29
31
|
});
|
|
30
32
|
}
|
|
31
33
|
onNewPriceFeed(priceFeed) {
|
|
32
|
-
|
|
34
|
+
this.logger.debug(`Received new price feed update from Pyth price service: ${this.priceIdToAlias.get(priceFeed.id)} ${priceFeed.id}`);
|
|
33
35
|
// Consider price to be currently available if it is not older than 60s
|
|
34
36
|
const currentPrice = priceFeed.getPriceNoOlderThan(60);
|
|
35
37
|
if (currentPrice === undefined) {
|
package/lib/solana/command.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { Options } from "yargs";
|
|
2
2
|
import { SearcherClient } from "jito-ts/dist/sdk/block-engine/searcher";
|
|
3
|
+
import { Logger } from "pino";
|
|
3
4
|
declare const _default: {
|
|
4
5
|
command: string;
|
|
5
6
|
describe: string;
|
|
6
7
|
builder: {
|
|
8
|
+
"controller-log-level": Options;
|
|
9
|
+
"price-service-connection-log-level": Options;
|
|
10
|
+
"log-level": Options;
|
|
7
11
|
"pushing-frequency": Options;
|
|
8
12
|
"polling-frequency": Options;
|
|
9
13
|
"pyth-contract-address": Options;
|
|
@@ -21,5 +25,5 @@ declare const _default: {
|
|
|
21
25
|
handler: (argv: any) => void;
|
|
22
26
|
};
|
|
23
27
|
export default _default;
|
|
24
|
-
export declare const onBundleResult: (c: SearcherClient) => void;
|
|
28
|
+
export declare const onBundleResult: (c: SearcherClient, logger: Logger) => void;
|
|
25
29
|
//# sourceMappingURL=command.d.ts.map
|
|
@@ -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
|
|
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;;;;;;;;;;;;;;;;;;;;;;oBAwDH,GAAG;;AAtD9B,wBA2JE;AAEF,eAAO,MAAM,cAAc,MAAO,cAAc,UAAU,MAAM,SAO/D,CAAC"}
|
package/lib/solana/command.js
CHANGED
|
@@ -39,6 +39,7 @@ const web3_js_1 = require("@solana/web3.js");
|
|
|
39
39
|
const fs_1 = __importDefault(require("fs"));
|
|
40
40
|
const web3_js_2 = require("@solana/web3.js");
|
|
41
41
|
const searcher_1 = require("jito-ts/dist/sdk/block-engine/searcher");
|
|
42
|
+
const pino_1 = __importDefault(require("pino"));
|
|
42
43
|
exports.default = {
|
|
43
44
|
command: "solana",
|
|
44
45
|
describe: "run price pusher for solana",
|
|
@@ -88,22 +89,19 @@ exports.default = {
|
|
|
88
89
|
...options.pythContractAddress,
|
|
89
90
|
...options.pollingFrequency,
|
|
90
91
|
...options.pushingFrequency,
|
|
92
|
+
...options.logLevel,
|
|
93
|
+
...options.priceServiceConnectionLogLevel,
|
|
94
|
+
...options.controllerLogLevel,
|
|
91
95
|
},
|
|
92
96
|
handler: function (argv) {
|
|
93
|
-
const { endpoint, keypairFile, shardId, computeUnitPriceMicroLamports, priceConfigFile, priceServiceEndpoint, pythContractAddress, pushingFrequency, pollingFrequency, jitoEndpoint, jitoKeypairFile, jitoTipLamports, jitoBundleSize, } = argv;
|
|
97
|
+
const { endpoint, keypairFile, shardId, computeUnitPriceMicroLamports, priceConfigFile, priceServiceEndpoint, pythContractAddress, pushingFrequency, pollingFrequency, jitoEndpoint, jitoKeypairFile, jitoTipLamports, jitoBundleSize, logLevel, priceServiceConnectionLogLevel, controllerLogLevel, } = argv;
|
|
98
|
+
const logger = (0, pino_1.default)({ level: logLevel });
|
|
94
99
|
const priceConfigs = (0, price_config_1.readPriceConfigFile)(priceConfigFile);
|
|
95
100
|
const priceServiceConnection = new price_service_client_1.PriceServiceConnection(priceServiceEndpoint, {
|
|
96
|
-
logger: {
|
|
97
|
-
// Log only warnings and errors from the price service client
|
|
98
|
-
info: () => undefined,
|
|
99
|
-
warn: console.warn,
|
|
100
|
-
error: console.error,
|
|
101
|
-
debug: () => undefined,
|
|
102
|
-
trace: () => undefined,
|
|
103
|
-
},
|
|
101
|
+
logger: logger.child({ module: "PriceServiceConnection" }, { level: priceServiceConnectionLogLevel }),
|
|
104
102
|
});
|
|
105
103
|
const priceItems = priceConfigs.map(({ id, alias }) => ({ id, alias }));
|
|
106
|
-
const pythListener = new pyth_price_listener_1.PythPriceListener(priceServiceConnection, priceItems);
|
|
104
|
+
const pythListener = new pyth_price_listener_1.PythPriceListener(priceServiceConnection, priceItems, logger.child({ module: "PythPriceListener" }));
|
|
107
105
|
const wallet = new nodewallet_1.default(web3_js_1.Keypair.fromSecretKey(Uint8Array.from(JSON.parse(fs_1.default.readFileSync(keypairFile, "ascii")))));
|
|
108
106
|
const pythSolanaReceiver = new pyth_solana_receiver_1.PythSolanaReceiver({
|
|
109
107
|
connection: new web3_js_1.Connection(endpoint, "processed"),
|
|
@@ -114,20 +112,20 @@ exports.default = {
|
|
|
114
112
|
if (jitoTipLamports) {
|
|
115
113
|
const jitoKeypair = web3_js_1.Keypair.fromSecretKey(Uint8Array.from(JSON.parse(fs_1.default.readFileSync(jitoKeypairFile, "ascii"))));
|
|
116
114
|
const jitoClient = (0, searcher_1.searcherClient)(jitoEndpoint, jitoKeypair);
|
|
117
|
-
solanaPricePusher = new solana_1.SolanaPricePusherJito(pythSolanaReceiver, priceServiceConnection, shardId, jitoTipLamports, jitoClient, jitoBundleSize);
|
|
118
|
-
(0, exports.onBundleResult)(jitoClient);
|
|
115
|
+
solanaPricePusher = new solana_1.SolanaPricePusherJito(pythSolanaReceiver, priceServiceConnection, logger.child({ module: "SolanaPricePusherJito" }), shardId, jitoTipLamports, jitoClient, jitoBundleSize);
|
|
116
|
+
(0, exports.onBundleResult)(jitoClient, logger.child({ module: "JitoClient" }));
|
|
119
117
|
}
|
|
120
118
|
else {
|
|
121
|
-
solanaPricePusher = new solana_1.SolanaPricePusher(pythSolanaReceiver, priceServiceConnection, shardId, computeUnitPriceMicroLamports);
|
|
119
|
+
solanaPricePusher = new solana_1.SolanaPricePusher(pythSolanaReceiver, priceServiceConnection, logger.child({ module: "SolanaPricePusher" }), shardId, computeUnitPriceMicroLamports);
|
|
122
120
|
}
|
|
123
|
-
const solanaPriceListener = new solana_1.SolanaPriceListener(pythSolanaReceiver, shardId, priceItems, { pollingFrequency });
|
|
124
|
-
const controller = new controller_1.Controller(priceConfigs, pythListener, solanaPriceListener, solanaPricePusher, { pushingFrequency });
|
|
121
|
+
const solanaPriceListener = new solana_1.SolanaPriceListener(pythSolanaReceiver, shardId, priceItems, logger.child({ module: "SolanaPriceListener" }), { pollingFrequency });
|
|
122
|
+
const controller = new controller_1.Controller(priceConfigs, pythListener, solanaPriceListener, solanaPricePusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), { pushingFrequency });
|
|
125
123
|
controller.start();
|
|
126
124
|
},
|
|
127
125
|
};
|
|
128
|
-
const onBundleResult = (c) => {
|
|
129
|
-
c.onBundleResult(() => undefined, (
|
|
130
|
-
|
|
126
|
+
const onBundleResult = (c, logger) => {
|
|
127
|
+
c.onBundleResult(() => undefined, (err) => {
|
|
128
|
+
logger.error(err, "Error in bundle result");
|
|
131
129
|
});
|
|
132
130
|
};
|
|
133
131
|
exports.onBundleResult = onBundleResult;
|
package/lib/solana/solana.d.ts
CHANGED
|
@@ -3,10 +3,12 @@ import { ChainPriceListener, IPricePusher, PriceInfo, PriceItem } from "../inter
|
|
|
3
3
|
import { DurationInSeconds } from "../utils";
|
|
4
4
|
import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
5
5
|
import { SearcherClient } from "jito-ts/dist/sdk/block-engine/searcher";
|
|
6
|
+
import { Logger } from "pino";
|
|
6
7
|
export declare class SolanaPriceListener extends ChainPriceListener {
|
|
7
8
|
private pythSolanaReceiver;
|
|
8
9
|
private shardId;
|
|
9
|
-
|
|
10
|
+
private logger;
|
|
11
|
+
constructor(pythSolanaReceiver: PythSolanaReceiver, shardId: number, priceItems: PriceItem[], logger: Logger, config: {
|
|
10
12
|
pollingFrequency: DurationInSeconds;
|
|
11
13
|
});
|
|
12
14
|
getOnChainPriceInfo(priceId: string): Promise<PriceInfo | undefined>;
|
|
@@ -14,19 +16,21 @@ export declare class SolanaPriceListener extends ChainPriceListener {
|
|
|
14
16
|
export declare class SolanaPricePusher implements IPricePusher {
|
|
15
17
|
private pythSolanaReceiver;
|
|
16
18
|
private priceServiceConnection;
|
|
19
|
+
private logger;
|
|
17
20
|
private shardId;
|
|
18
21
|
private computeUnitPriceMicroLamports;
|
|
19
|
-
constructor(pythSolanaReceiver: PythSolanaReceiver, priceServiceConnection: PriceServiceConnection, shardId: number, computeUnitPriceMicroLamports: number);
|
|
20
|
-
updatePriceFeed(priceIds: string[],
|
|
22
|
+
constructor(pythSolanaReceiver: PythSolanaReceiver, priceServiceConnection: PriceServiceConnection, logger: Logger, shardId: number, computeUnitPriceMicroLamports: number);
|
|
23
|
+
updatePriceFeed(priceIds: string[], _pubTimesToPush: number[]): Promise<void>;
|
|
21
24
|
}
|
|
22
25
|
export declare class SolanaPricePusherJito implements IPricePusher {
|
|
23
26
|
private pythSolanaReceiver;
|
|
24
27
|
private priceServiceConnection;
|
|
28
|
+
private logger;
|
|
25
29
|
private shardId;
|
|
26
30
|
private jitoTipLamports;
|
|
27
31
|
private searcherClient;
|
|
28
32
|
private jitoBundleSize;
|
|
29
|
-
constructor(pythSolanaReceiver: PythSolanaReceiver, priceServiceConnection: PriceServiceConnection, shardId: number, jitoTipLamports: number, searcherClient: SearcherClient, jitoBundleSize: number);
|
|
30
|
-
updatePriceFeed(priceIds: string[],
|
|
33
|
+
constructor(pythSolanaReceiver: PythSolanaReceiver, priceServiceConnection: PriceServiceConnection, logger: Logger, shardId: number, jitoTipLamports: number, searcherClient: SearcherClient, jitoBundleSize: number);
|
|
34
|
+
updatePriceFeed(priceIds: string[], _pubTimesToPush: number[]): Promise<void>;
|
|
31
35
|
}
|
|
32
36
|
//# 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,qBAAa,mBAAoB,SAAQ,kBAAkB;IAEvD,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,OAAO;
|
|
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;IAKG,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
|
@@ -3,18 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SolanaPricePusherJito = exports.SolanaPricePusher = exports.SolanaPriceListener = void 0;
|
|
4
4
|
const interface_1 = require("../interface");
|
|
5
5
|
const solana_utils_1 = require("@pythnetwork/solana-utils");
|
|
6
|
+
const price_service_sdk_1 = require("@pythnetwork/price-service-sdk");
|
|
6
7
|
class SolanaPriceListener extends interface_1.ChainPriceListener {
|
|
7
8
|
pythSolanaReceiver;
|
|
8
9
|
shardId;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
logger;
|
|
11
|
+
constructor(pythSolanaReceiver, shardId, priceItems, logger, config) {
|
|
12
|
+
super(config.pollingFrequency, priceItems);
|
|
11
13
|
this.pythSolanaReceiver = pythSolanaReceiver;
|
|
12
14
|
this.shardId = shardId;
|
|
15
|
+
this.logger = logger;
|
|
13
16
|
}
|
|
14
17
|
async getOnChainPriceInfo(priceId) {
|
|
15
18
|
try {
|
|
16
19
|
const priceFeedAccount = await this.pythSolanaReceiver.fetchPriceFeedAccount(this.shardId, Buffer.from(priceId, "hex"));
|
|
17
|
-
|
|
20
|
+
this.logger.debug(`Polled a Solana on chain price for feed ${this.priceIdToAlias.get(priceId)} (${priceId}).`);
|
|
18
21
|
if (priceFeedAccount) {
|
|
19
22
|
return {
|
|
20
23
|
conf: priceFeedAccount.priceMessage.conf.toString(),
|
|
@@ -26,9 +29,8 @@ class SolanaPriceListener extends interface_1.ChainPriceListener {
|
|
|
26
29
|
return undefined;
|
|
27
30
|
}
|
|
28
31
|
}
|
|
29
|
-
catch (
|
|
30
|
-
|
|
31
|
-
console.error(e);
|
|
32
|
+
catch (err) {
|
|
33
|
+
this.logger.error({ err, priceId }, `Polling on-chain price failed.`);
|
|
32
34
|
return undefined;
|
|
33
35
|
}
|
|
34
36
|
}
|
|
@@ -37,15 +39,19 @@ exports.SolanaPriceListener = SolanaPriceListener;
|
|
|
37
39
|
class SolanaPricePusher {
|
|
38
40
|
pythSolanaReceiver;
|
|
39
41
|
priceServiceConnection;
|
|
42
|
+
logger;
|
|
40
43
|
shardId;
|
|
41
44
|
computeUnitPriceMicroLamports;
|
|
42
|
-
constructor(pythSolanaReceiver, priceServiceConnection, shardId, computeUnitPriceMicroLamports) {
|
|
45
|
+
constructor(pythSolanaReceiver, priceServiceConnection, logger, shardId, computeUnitPriceMicroLamports) {
|
|
43
46
|
this.pythSolanaReceiver = pythSolanaReceiver;
|
|
44
47
|
this.priceServiceConnection = priceServiceConnection;
|
|
48
|
+
this.logger = logger;
|
|
45
49
|
this.shardId = shardId;
|
|
46
50
|
this.computeUnitPriceMicroLamports = computeUnitPriceMicroLamports;
|
|
47
51
|
}
|
|
48
|
-
async updatePriceFeed(priceIds,
|
|
52
|
+
async updatePriceFeed(priceIds,
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
54
|
+
_pubTimesToPush) {
|
|
49
55
|
if (priceIds.length === 0) {
|
|
50
56
|
return;
|
|
51
57
|
}
|
|
@@ -53,8 +59,8 @@ class SolanaPricePusher {
|
|
|
53
59
|
try {
|
|
54
60
|
priceFeedUpdateData = await this.priceServiceConnection.getLatestVaas(priceIds);
|
|
55
61
|
}
|
|
56
|
-
catch (
|
|
57
|
-
|
|
62
|
+
catch (err) {
|
|
63
|
+
this.logger.error(err, "getPriceFeedsUpdateData failed:");
|
|
58
64
|
return;
|
|
59
65
|
}
|
|
60
66
|
const transactionBuilder = this.pythSolanaReceiver.newTransactionBuilder({
|
|
@@ -66,61 +72,58 @@ class SolanaPricePusher {
|
|
|
66
72
|
tightComputeBudget: true,
|
|
67
73
|
});
|
|
68
74
|
try {
|
|
69
|
-
await (0, solana_utils_1.sendTransactions)(transactions, this.pythSolanaReceiver.connection, this.pythSolanaReceiver.wallet);
|
|
70
|
-
|
|
75
|
+
const signatures = await (0, solana_utils_1.sendTransactions)(transactions, this.pythSolanaReceiver.connection, this.pythSolanaReceiver.wallet);
|
|
76
|
+
this.logger.info({ signatures }, "updatePriceFeed successful");
|
|
71
77
|
}
|
|
72
|
-
catch (
|
|
73
|
-
|
|
78
|
+
catch (err) {
|
|
79
|
+
this.logger.error(err, "updatePriceFeed failed");
|
|
74
80
|
return;
|
|
75
81
|
}
|
|
76
82
|
}
|
|
77
83
|
}
|
|
78
84
|
exports.SolanaPricePusher = SolanaPricePusher;
|
|
85
|
+
const UPDATES_PER_JITO_BUNDLE = 7;
|
|
79
86
|
class SolanaPricePusherJito {
|
|
80
87
|
pythSolanaReceiver;
|
|
81
88
|
priceServiceConnection;
|
|
89
|
+
logger;
|
|
82
90
|
shardId;
|
|
83
91
|
jitoTipLamports;
|
|
84
92
|
searcherClient;
|
|
85
93
|
jitoBundleSize;
|
|
86
|
-
constructor(pythSolanaReceiver, priceServiceConnection, shardId, jitoTipLamports, searcherClient, jitoBundleSize) {
|
|
94
|
+
constructor(pythSolanaReceiver, priceServiceConnection, logger, shardId, jitoTipLamports, searcherClient, jitoBundleSize) {
|
|
87
95
|
this.pythSolanaReceiver = pythSolanaReceiver;
|
|
88
96
|
this.priceServiceConnection = priceServiceConnection;
|
|
97
|
+
this.logger = logger;
|
|
89
98
|
this.shardId = shardId;
|
|
90
99
|
this.jitoTipLamports = jitoTipLamports;
|
|
91
100
|
this.searcherClient = searcherClient;
|
|
92
101
|
this.jitoBundleSize = jitoBundleSize;
|
|
93
102
|
}
|
|
94
|
-
async updatePriceFeed(priceIds,
|
|
103
|
+
async updatePriceFeed(priceIds,
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
105
|
+
_pubTimesToPush) {
|
|
95
106
|
let priceFeedUpdateData;
|
|
96
107
|
try {
|
|
97
108
|
priceFeedUpdateData = await this.priceServiceConnection.getLatestVaas(priceIds);
|
|
98
109
|
}
|
|
99
|
-
catch (
|
|
100
|
-
|
|
110
|
+
catch (err) {
|
|
111
|
+
this.logger.error(err, "getPriceFeedsUpdateData failed");
|
|
101
112
|
return;
|
|
102
113
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
});
|
|
117
|
-
await this.pythSolanaReceiver.connection.confirmTransaction({
|
|
118
|
-
signature: firstSignature,
|
|
119
|
-
blockhash: blockhashResult.value.blockhash,
|
|
120
|
-
lastValidBlockHeight: blockhashResult.value.lastValidBlockHeight,
|
|
121
|
-
}, "confirmed");
|
|
122
|
-
for (let i = this.jitoBundleSize; i < transactions.length; i += this.jitoBundleSize) {
|
|
123
|
-
await (0, solana_utils_1.sendTransactionsJito)(transactions.slice(i, i + this.jitoBundleSize), this.searcherClient, this.pythSolanaReceiver.wallet);
|
|
114
|
+
for (let i = 0; i < priceIds.length; i += UPDATES_PER_JITO_BUNDLE) {
|
|
115
|
+
const transactionBuilder = this.pythSolanaReceiver.newTransactionBuilder({
|
|
116
|
+
closeUpdateAccounts: true,
|
|
117
|
+
});
|
|
118
|
+
await transactionBuilder.addUpdatePriceFeed(priceFeedUpdateData.map((x) => {
|
|
119
|
+
return (0, price_service_sdk_1.sliceAccumulatorUpdateData)(Buffer.from(x, "base64"), i, i + UPDATES_PER_JITO_BUNDLE).toString("base64");
|
|
120
|
+
}), this.shardId);
|
|
121
|
+
const transactions = await transactionBuilder.buildVersionedTransactions({
|
|
122
|
+
jitoTipLamports: this.jitoTipLamports,
|
|
123
|
+
tightComputeBudget: true,
|
|
124
|
+
jitoBundleSize: this.jitoBundleSize,
|
|
125
|
+
});
|
|
126
|
+
await (0, solana_utils_1.sendTransactionsJito)(transactions, this.searcherClient, this.pythSolanaReceiver.wallet);
|
|
124
127
|
}
|
|
125
128
|
}
|
|
126
129
|
}
|
package/lib/sui/command.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ declare const _default: {
|
|
|
3
3
|
command: string;
|
|
4
4
|
describe: string;
|
|
5
5
|
builder: {
|
|
6
|
+
"controller-log-level": Options;
|
|
7
|
+
"price-service-connection-log-level": Options;
|
|
8
|
+
"log-level": Options;
|
|
6
9
|
"pushing-frequency": Options;
|
|
7
10
|
"polling-frequency": Options;
|
|
8
11
|
"mnemonic-file": Options;
|
|
@@ -12,6 +15,7 @@ declare const _default: {
|
|
|
12
15
|
"pyth-state-id": Options;
|
|
13
16
|
"wormhole-state-id": Options;
|
|
14
17
|
"num-gas-objects": Options;
|
|
18
|
+
"ignore-gas-objects": Options;
|
|
15
19
|
"gas-budget": Options;
|
|
16
20
|
"account-index": Options;
|
|
17
21
|
};
|
package/lib/sui/command.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/sui/command.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/sui/command.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;oBAqEC,GAAG;;AAhEpC,wBAoJE"}
|
package/lib/sui/command.js
CHANGED
|
@@ -34,6 +34,7 @@ const pyth_price_listener_1 = require("../pyth-price-listener");
|
|
|
34
34
|
const controller_1 = require("../controller");
|
|
35
35
|
const sui_1 = require("./sui");
|
|
36
36
|
const ed25519_1 = require("@mysten/sui.js/keypairs/ed25519");
|
|
37
|
+
const pino_1 = __importDefault(require("pino"));
|
|
37
38
|
exports.default = {
|
|
38
39
|
command: "sui",
|
|
39
40
|
describe: "Run price pusher for sui. Most of the arguments below are" +
|
|
@@ -66,6 +67,12 @@ exports.default = {
|
|
|
66
67
|
required: true,
|
|
67
68
|
default: 30,
|
|
68
69
|
},
|
|
70
|
+
"ignore-gas-objects": {
|
|
71
|
+
description: "Gas objects to ignore when merging gas objects on startup -- use this for locked objects.",
|
|
72
|
+
type: "array",
|
|
73
|
+
required: false,
|
|
74
|
+
default: [],
|
|
75
|
+
},
|
|
69
76
|
"gas-budget": {
|
|
70
77
|
description: "Gas budget for each price update",
|
|
71
78
|
type: "number",
|
|
@@ -83,33 +90,30 @@ exports.default = {
|
|
|
83
90
|
...options.mnemonicFile,
|
|
84
91
|
...options.pollingFrequency,
|
|
85
92
|
...options.pushingFrequency,
|
|
93
|
+
...options.logLevel,
|
|
94
|
+
...options.priceServiceConnectionLogLevel,
|
|
95
|
+
...options.controllerLogLevel,
|
|
86
96
|
},
|
|
87
97
|
handler: async function (argv) {
|
|
88
|
-
const { endpoint, priceConfigFile, priceServiceEndpoint, mnemonicFile, pushingFrequency, pollingFrequency, pythStateId, wormholeStateId, numGasObjects, gasBudget, accountIndex, } = argv;
|
|
98
|
+
const { endpoint, priceConfigFile, priceServiceEndpoint, mnemonicFile, pushingFrequency, pollingFrequency, pythStateId, wormholeStateId, numGasObjects, ignoreGasObjects, gasBudget, accountIndex, logLevel, priceServiceConnectionLogLevel, controllerLogLevel, } = argv;
|
|
99
|
+
const logger = (0, pino_1.default)({ level: logLevel });
|
|
89
100
|
const priceConfigs = (0, price_config_1.readPriceConfigFile)(priceConfigFile);
|
|
90
101
|
const priceServiceConnection = new price_service_client_1.PriceServiceConnection(priceServiceEndpoint, {
|
|
91
|
-
logger: {
|
|
92
|
-
// Log only warnings and errors from the price service client
|
|
93
|
-
info: () => undefined,
|
|
94
|
-
warn: console.warn,
|
|
95
|
-
error: console.error,
|
|
96
|
-
debug: () => undefined,
|
|
97
|
-
trace: () => undefined,
|
|
98
|
-
},
|
|
102
|
+
logger: logger.child({ module: "PriceServiceConnection" }, { level: priceServiceConnectionLogLevel }),
|
|
99
103
|
priceFeedRequestConfig: {
|
|
100
104
|
binary: true,
|
|
101
105
|
},
|
|
102
106
|
});
|
|
103
107
|
const mnemonic = fs_1.default.readFileSync(mnemonicFile, "utf-8").trim();
|
|
104
108
|
const keypair = ed25519_1.Ed25519Keypair.deriveKeypair(mnemonic, `m/44'/784'/${accountIndex}'/0'/0'`);
|
|
105
|
-
|
|
109
|
+
logger.info(`Pushing updates from wallet address: ${keypair
|
|
106
110
|
.getPublicKey()
|
|
107
111
|
.toSuiAddress()}`);
|
|
108
112
|
const priceItems = priceConfigs.map(({ id, alias }) => ({ id, alias }));
|
|
109
|
-
const pythListener = new pyth_price_listener_1.PythPriceListener(priceServiceConnection, priceItems);
|
|
110
|
-
const suiListener = new sui_1.SuiPriceListener(pythStateId, wormholeStateId, endpoint, priceItems, { pollingFrequency });
|
|
111
|
-
const suiPusher = await sui_1.SuiPricePusher.createWithAutomaticGasPool(priceServiceConnection, pythStateId, wormholeStateId, endpoint, keypair, gasBudget, numGasObjects);
|
|
112
|
-
const controller = new controller_1.Controller(priceConfigs, pythListener, suiListener, suiPusher, { pushingFrequency });
|
|
113
|
+
const pythListener = new pyth_price_listener_1.PythPriceListener(priceServiceConnection, priceItems, logger.child({ module: "PythPriceListener" }));
|
|
114
|
+
const suiListener = new sui_1.SuiPriceListener(pythStateId, wormholeStateId, endpoint, priceItems, logger.child({ module: "SuiPriceListener" }), { pollingFrequency });
|
|
115
|
+
const suiPusher = await sui_1.SuiPricePusher.createWithAutomaticGasPool(priceServiceConnection, logger.child({ module: "SuiPricePusher" }), pythStateId, wormholeStateId, endpoint, keypair, gasBudget, numGasObjects, ignoreGasObjects);
|
|
116
|
+
const controller = new controller_1.Controller(priceConfigs, pythListener, suiListener, suiPusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), { pushingFrequency });
|
|
113
117
|
controller.start();
|
|
114
118
|
},
|
|
115
119
|
};
|
package/lib/sui/sui.d.ts
CHANGED
|
@@ -4,11 +4,13 @@ import { PriceServiceConnection } from "@pythnetwork/price-service-client";
|
|
|
4
4
|
import { SuiPythClient } from "@pythnetwork/pyth-sui-js";
|
|
5
5
|
import { Ed25519Keypair } from "@mysten/sui.js/keypairs/ed25519";
|
|
6
6
|
import { SuiClient, SuiObjectRef } from "@mysten/sui.js/client";
|
|
7
|
+
import { Logger } from "pino";
|
|
7
8
|
type ObjectId = string;
|
|
8
9
|
export declare class SuiPriceListener extends ChainPriceListener {
|
|
9
10
|
private pythClient;
|
|
10
11
|
private provider;
|
|
11
|
-
|
|
12
|
+
private logger;
|
|
13
|
+
constructor(pythStateId: ObjectId, wormholeStateId: ObjectId, endpoint: string, priceItems: PriceItem[], logger: Logger, config: {
|
|
12
14
|
pollingFrequency: DurationInSeconds;
|
|
13
15
|
});
|
|
14
16
|
getOnChainPriceInfo(priceId: string): Promise<PriceInfo | undefined>;
|
|
@@ -30,6 +32,7 @@ export declare class SuiPriceListener extends ChainPriceListener {
|
|
|
30
32
|
export declare class SuiPricePusher implements IPricePusher {
|
|
31
33
|
private readonly signer;
|
|
32
34
|
private readonly provider;
|
|
35
|
+
private logger;
|
|
33
36
|
private priceServiceConnection;
|
|
34
37
|
private pythPackageId;
|
|
35
38
|
private pythStateId;
|
|
@@ -38,7 +41,7 @@ export declare class SuiPricePusher implements IPricePusher {
|
|
|
38
41
|
private gasBudget;
|
|
39
42
|
private gasPool;
|
|
40
43
|
private pythClient;
|
|
41
|
-
constructor(signer: Ed25519Keypair, provider: SuiClient, priceServiceConnection: PriceServiceConnection, pythPackageId: string, pythStateId: string, wormholePackageId: string, wormholeStateId: string, endpoint: string, keypair: Ed25519Keypair, gasBudget: number, gasPool: SuiObjectRef[], pythClient: SuiPythClient);
|
|
44
|
+
constructor(signer: Ed25519Keypair, provider: SuiClient, logger: Logger, priceServiceConnection: PriceServiceConnection, pythPackageId: string, pythStateId: string, wormholePackageId: string, wormholeStateId: string, endpoint: string, keypair: Ed25519Keypair, gasBudget: number, gasPool: SuiObjectRef[], pythClient: SuiPythClient);
|
|
42
45
|
/**
|
|
43
46
|
* getPackageId returns the latest package id that the object belongs to. Use this to
|
|
44
47
|
* fetch the latest package id for a given object id and handle package upgrades automatically.
|
|
@@ -51,7 +54,7 @@ export declare class SuiPricePusher implements IPricePusher {
|
|
|
51
54
|
* Create a price pusher with a pool of `numGasObjects` gas coins that will be used to send transactions.
|
|
52
55
|
* The gas coins of the wallet for the provided keypair will be merged and then evenly split into `numGasObjects`.
|
|
53
56
|
*/
|
|
54
|
-
static createWithAutomaticGasPool(priceServiceConnection: PriceServiceConnection, pythStateId: string, wormholeStateId: string, endpoint: string, keypair: Ed25519Keypair, gasBudget: number, numGasObjects: number): Promise<SuiPricePusher>;
|
|
57
|
+
static createWithAutomaticGasPool(priceServiceConnection: PriceServiceConnection, logger: Logger, pythStateId: string, wormholeStateId: string, endpoint: string, keypair: Ed25519Keypair, gasBudget: number, numGasObjects: number, ignoreGasObjects: string[]): Promise<SuiPricePusher>;
|
|
55
58
|
updatePriceFeed(priceIds: string[], pubTimesToPush: number[]): Promise<void>;
|
|
56
59
|
/** Send every transaction in txs in parallel, returning when all transactions have completed. */
|
|
57
60
|
private sendTransactionBlocks;
|
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;
|
|
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,aAAa;IACrB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,eAAe;IAGvB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;gBAZD,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,SAAS,EAC5B,MAAM,EAAE,MAAM,EACd,sBAAsB,EAAE,sBAAsB,EAC9C,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EACzB,eAAe,EAAE,MAAM,EAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACf,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;IAgDpB,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;mBAuDjB,yBAAyB;mBAoBzB,cAAc;mBAiCd,mBAAmB;mBAwCnB,oBAAoB;CAiE1C"}
|