@pythnetwork/price-pusher 10.2.0 → 10.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/{lib/aptos/aptos.js → dist/aptos/aptos.cjs} +80 -76
  2. package/{lib → dist}/aptos/aptos.d.ts +5 -5
  3. package/{lib/aptos/balance-tracker.js → dist/aptos/balance-tracker.cjs} +37 -25
  4. package/{lib → dist}/aptos/balance-tracker.d.ts +9 -9
  5. package/dist/aptos/command.cjs +161 -0
  6. package/{lib → dist}/aptos/command.d.ts +1 -2
  7. package/dist/common.cjs +4 -0
  8. package/{lib → dist}/common.d.ts +0 -1
  9. package/{lib/controller.js → dist/controller.cjs} +35 -33
  10. package/{lib → dist}/controller.d.ts +5 -6
  11. package/dist/evm/balance-tracker.cjs +58 -0
  12. package/{lib → dist}/evm/balance-tracker.d.ts +10 -10
  13. package/dist/evm/command.cjs +205 -0
  14. package/{lib → dist}/evm/command.d.ts +1 -2
  15. package/dist/evm/custom-gas-station.cjs +54 -0
  16. package/{lib → dist}/evm/custom-gas-station.d.ts +1 -2
  17. package/dist/evm/evm.cjs +287 -0
  18. package/{lib → dist}/evm/evm.d.ts +8 -7
  19. package/{lib/evm/pyth-abi.js → dist/evm/pyth-abi.cjs} +181 -160
  20. package/{lib → dist}/evm/pyth-abi.d.ts +0 -1
  21. package/dist/evm/pyth-contract.cjs +17 -0
  22. package/{lib → dist}/evm/pyth-contract.d.ts +3 -4
  23. package/dist/evm/super-wallet.cjs +90 -0
  24. package/{lib → dist}/evm/super-wallet.d.ts +1 -2
  25. package/dist/fuel/command.cjs +135 -0
  26. package/{lib → dist}/fuel/command.d.ts +1 -2
  27. package/dist/fuel/fuel.cjs +108 -0
  28. package/{lib → dist}/fuel/fuel.d.ts +5 -5
  29. package/dist/index.cjs +25 -0
  30. package/dist/index.d.ts +1 -0
  31. package/dist/injective/command.cjs +150 -0
  32. package/{lib → dist}/injective/command.d.ts +1 -2
  33. package/{lib/injective/injective.js → dist/injective/injective.cjs} +100 -98
  34. package/{lib → dist}/injective/injective.d.ts +7 -6
  35. package/dist/interface.cjs +142 -0
  36. package/{lib → dist}/interface.d.ts +12 -13
  37. package/dist/metrics.cjs +218 -0
  38. package/{lib → dist}/metrics.d.ts +10 -11
  39. package/dist/near/command.cjs +129 -0
  40. package/{lib → dist}/near/command.d.ts +1 -2
  41. package/dist/near/near.cjs +183 -0
  42. package/{lib → dist}/near/near.d.ts +5 -5
  43. package/dist/options.cjs +132 -0
  44. package/{lib → dist}/options.d.ts +1 -2
  45. package/dist/package.json +1 -0
  46. package/dist/price-config.cjs +104 -0
  47. package/{lib → dist}/price-config.d.ts +5 -6
  48. package/{lib/pyth-price-listener.js → dist/pyth-price-listener.cjs} +30 -24
  49. package/{lib → dist}/pyth-price-listener.d.ts +4 -4
  50. package/dist/solana/balance-tracker.cjs +60 -0
  51. package/{lib → dist}/solana/balance-tracker.d.ts +9 -9
  52. package/dist/solana/command.cjs +259 -0
  53. package/{lib → dist}/solana/command.d.ts +2 -3
  54. package/{lib/solana/solana.js → dist/solana/solana.cjs} +90 -78
  55. package/{lib → dist}/solana/solana.d.ts +6 -6
  56. package/dist/sui/balance-tracker.cjs +58 -0
  57. package/{lib → dist}/sui/balance-tracker.d.ts +9 -9
  58. package/dist/sui/command.cjs +190 -0
  59. package/{lib → dist}/sui/command.d.ts +1 -2
  60. package/{lib/sui/sui.js → dist/sui/sui.cjs} +145 -133
  61. package/{lib → dist}/sui/sui.d.ts +7 -8
  62. package/dist/ton/command.cjs +137 -0
  63. package/{lib → dist}/ton/command.d.ts +1 -2
  64. package/dist/ton/ton.cjs +103 -0
  65. package/{lib → dist}/ton/ton.d.ts +7 -6
  66. package/dist/utils.cjs +102 -0
  67. package/{lib → dist}/utils.d.ts +4 -4
  68. package/package.json +161 -20
  69. package/lib/aptos/aptos.d.ts.map +0 -1
  70. package/lib/aptos/balance-tracker.d.ts.map +0 -1
  71. package/lib/aptos/command.d.ts.map +0 -1
  72. package/lib/aptos/command.js +0 -126
  73. package/lib/common.d.ts.map +0 -1
  74. package/lib/common.js +0 -2
  75. package/lib/controller.d.ts.map +0 -1
  76. package/lib/evm/balance-tracker.d.ts.map +0 -1
  77. package/lib/evm/balance-tracker.js +0 -49
  78. package/lib/evm/command.d.ts.map +0 -1
  79. package/lib/evm/command.js +0 -178
  80. package/lib/evm/custom-gas-station.d.ts.map +0 -1
  81. package/lib/evm/custom-gas-station.js +0 -40
  82. package/lib/evm/evm.d.ts.map +0 -1
  83. package/lib/evm/evm.js +0 -270
  84. package/lib/evm/pyth-abi.d.ts.map +0 -1
  85. package/lib/evm/pyth-contract.d.ts.map +0 -1
  86. package/lib/evm/pyth-contract.js +0 -11
  87. package/lib/evm/super-wallet.d.ts.map +0 -1
  88. package/lib/evm/super-wallet.js +0 -73
  89. package/lib/fuel/command.d.ts.map +0 -1
  90. package/lib/fuel/command.js +0 -98
  91. package/lib/fuel/fuel.d.ts.map +0 -1
  92. package/lib/fuel/fuel.js +0 -101
  93. package/lib/index.d.ts +0 -3
  94. package/lib/index.d.ts.map +0 -1
  95. package/lib/index.js +0 -34
  96. package/lib/injective/command.d.ts.map +0 -1
  97. package/lib/injective/command.js +0 -119
  98. package/lib/injective/injective.d.ts.map +0 -1
  99. package/lib/interface.d.ts.map +0 -1
  100. package/lib/interface.js +0 -122
  101. package/lib/metrics.d.ts.map +0 -1
  102. package/lib/metrics.js +0 -152
  103. package/lib/near/command.d.ts.map +0 -1
  104. package/lib/near/command.js +0 -103
  105. package/lib/near/near.d.ts.map +0 -1
  106. package/lib/near/near.js +0 -168
  107. package/lib/options.d.ts.map +0 -1
  108. package/lib/options.js +0 -84
  109. package/lib/price-config.d.ts.map +0 -1
  110. package/lib/price-config.js +0 -114
  111. package/lib/pyth-price-listener.d.ts.map +0 -1
  112. package/lib/solana/balance-tracker.d.ts.map +0 -1
  113. package/lib/solana/balance-tracker.js +0 -51
  114. package/lib/solana/command.d.ts.map +0 -1
  115. package/lib/solana/command.js +0 -223
  116. package/lib/solana/solana.d.ts.map +0 -1
  117. package/lib/sui/balance-tracker.d.ts.map +0 -1
  118. package/lib/sui/balance-tracker.js +0 -49
  119. package/lib/sui/command.d.ts.map +0 -1
  120. package/lib/sui/command.js +0 -160
  121. package/lib/sui/sui.d.ts.map +0 -1
  122. package/lib/ton/command.d.ts.map +0 -1
  123. package/lib/ton/command.js +0 -99
  124. package/lib/ton/ton.d.ts.map +0 -1
  125. package/lib/ton/ton.js +0 -97
  126. package/lib/utils.d.ts.map +0 -1
  127. package/lib/utils.js +0 -61
@@ -1,49 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SuiBalanceTracker = void 0;
4
- exports.createSuiBalanceTracker = createSuiBalanceTracker;
5
- const interface_1 = require("../interface");
6
- /**
7
- * Sui-specific implementation of the balance tracker
8
- */
9
- class SuiBalanceTracker extends interface_1.BaseBalanceTracker {
10
- client;
11
- constructor(config) {
12
- super({
13
- ...config,
14
- logger: config.logger.child({ module: "SuiBalanceTracker" }),
15
- });
16
- this.client = config.client;
17
- }
18
- /**
19
- * Sui-specific implementation of balance update
20
- */
21
- async updateBalance() {
22
- try {
23
- const balance = await this.client.getBalance({
24
- owner: this.address,
25
- });
26
- // Convert to a normalized number for reporting (SUI has 9 decimals)
27
- const normalizedBalance = Number(balance.totalBalance) / 1e9;
28
- this.metrics.updateWalletBalance(this.address, this.network, normalizedBalance);
29
- this.logger.debug(`Updated Sui wallet balance: ${this.address} = ${normalizedBalance} SUI`);
30
- }
31
- catch (error) {
32
- this.logger.error({ error }, "Error fetching Sui wallet balance for metrics");
33
- }
34
- }
35
- }
36
- exports.SuiBalanceTracker = SuiBalanceTracker;
37
- /**
38
- * Factory function to create a balance tracker for Sui chain
39
- */
40
- function createSuiBalanceTracker(params) {
41
- return new SuiBalanceTracker({
42
- client: params.client,
43
- address: params.address,
44
- network: params.network,
45
- updateInterval: params.updateInterval,
46
- metrics: params.metrics,
47
- logger: params.logger,
48
- });
49
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/sui/command.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;;;;;;;;;;;;;;kBAwBvB,OAAO;yBAOP,OAAO;6BAOP,OAAO;2BAMP,OAAO;8BAOP,OAAO;sBAMP,OAAO;yBAMP,OAAO;;oBAWiB,GAAG;;AAjEpC,wBAoLE"}
@@ -1,160 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const hermes_client_1 = require("@pythnetwork/hermes-client");
40
- const options = __importStar(require("../options"));
41
- const price_config_1 = require("../price-config");
42
- const fs_1 = __importDefault(require("fs"));
43
- const pyth_price_listener_1 = require("../pyth-price-listener");
44
- const controller_1 = require("../controller");
45
- const sui_1 = require("./sui");
46
- const ed25519_1 = require("@mysten/sui/keypairs/ed25519");
47
- const pino_1 = __importDefault(require("pino"));
48
- const utils_1 = require("../utils");
49
- const metrics_1 = require("../metrics");
50
- const balance_tracker_1 = require("./balance-tracker");
51
- const client_1 = require("@mysten/sui/client");
52
- exports.default = {
53
- command: "sui",
54
- describe: "Run price pusher for sui. Most of the arguments below are" +
55
- "network specific, so there's one set of values for mainnet and" +
56
- " another for testnet. See config.sui.mainnet.sample.json for the " +
57
- "appropriate values for your network. ",
58
- builder: {
59
- endpoint: {
60
- description: "RPC endpoint URL for sui. The pusher will periodically" +
61
- "poll for updates. The polling interval is configurable via the " +
62
- "`polling-frequency` command-line argument.",
63
- type: "string",
64
- required: true,
65
- },
66
- "pyth-state-id": {
67
- description: "Pyth State Id. Can be found here" +
68
- "https://docs.pyth.network/documentation/pythnet-price-feeds/sui",
69
- type: "string",
70
- required: true,
71
- },
72
- "wormhole-state-id": {
73
- description: "Wormhole State Id. Can be found here" +
74
- "https://docs.pyth.network/documentation/pythnet-price-feeds/sui",
75
- type: "string",
76
- required: true,
77
- },
78
- "num-gas-objects": {
79
- description: "Number of gas objects in the pool.",
80
- type: "number",
81
- required: true,
82
- default: 30,
83
- },
84
- "ignore-gas-objects": {
85
- description: "Gas objects to ignore when merging gas objects on startup -- use this for locked objects.",
86
- type: "array",
87
- required: false,
88
- default: [],
89
- },
90
- "gas-budget": {
91
- description: "Gas budget for each price update",
92
- type: "number",
93
- required: true,
94
- default: 500_000_000,
95
- },
96
- "account-index": {
97
- description: "Index of the account to use derived by the mnemonic",
98
- type: "number",
99
- required: true,
100
- default: 0,
101
- },
102
- ...options.priceConfigFile,
103
- ...options.priceServiceEndpoint,
104
- ...options.mnemonicFile,
105
- ...options.pollingFrequency,
106
- ...options.pushingFrequency,
107
- ...options.logLevel,
108
- ...options.controllerLogLevel,
109
- ...options.enableMetrics,
110
- ...options.metricsPort,
111
- },
112
- handler: async function (argv) {
113
- const { endpoint, priceConfigFile, priceServiceEndpoint, mnemonicFile, pushingFrequency, pollingFrequency, pythStateId, wormholeStateId, numGasObjects, ignoreGasObjects, gasBudget, accountIndex, logLevel, controllerLogLevel, enableMetrics, metricsPort, } = argv;
114
- const logger = (0, pino_1.default)({ level: logLevel });
115
- const priceConfigs = (0, price_config_1.readPriceConfigFile)(priceConfigFile);
116
- const hermesClient = new hermes_client_1.HermesClient(priceServiceEndpoint);
117
- const mnemonic = fs_1.default.readFileSync(mnemonicFile, "utf-8").trim();
118
- const keypair = ed25519_1.Ed25519Keypair.deriveKeypair(mnemonic, `m/44'/784'/${accountIndex}'/0'/0'`);
119
- const suiAddress = keypair.getPublicKey().toSuiAddress();
120
- logger.info(`Pushing updates from wallet address: ${suiAddress}`);
121
- let priceItems = priceConfigs.map(({ id, alias }) => ({ id, alias }));
122
- // Better to filter out invalid price items before creating the pyth listener
123
- const { existingPriceItems, invalidPriceItems } = await (0, utils_1.filterInvalidPriceItems)(hermesClient, priceItems);
124
- if (invalidPriceItems.length > 0) {
125
- logger.error(`Invalid price id submitted for: ${invalidPriceItems
126
- .map(({ alias }) => alias)
127
- .join(", ")}`);
128
- }
129
- priceItems = existingPriceItems;
130
- // Initialize metrics if enabled
131
- let metrics;
132
- if (enableMetrics) {
133
- metrics = new metrics_1.PricePusherMetrics(logger.child({ module: "Metrics" }));
134
- metrics.start(metricsPort);
135
- logger.info(`Metrics server started on port ${metricsPort}`);
136
- }
137
- const pythListener = new pyth_price_listener_1.PythPriceListener(hermesClient, priceItems, logger.child({ module: "PythPriceListener" }));
138
- const suiClient = new client_1.SuiClient({ url: endpoint });
139
- const suiListener = new sui_1.SuiPriceListener(pythStateId, wormholeStateId, endpoint, priceItems, logger.child({ module: "SuiPriceListener" }), { pollingFrequency });
140
- const suiPusher = await sui_1.SuiPricePusher.createWithAutomaticGasPool(hermesClient, logger.child({ module: "SuiPricePusher" }), pythStateId, wormholeStateId, endpoint, keypair, gasBudget, numGasObjects, ignoreGasObjects);
141
- const controller = new controller_1.Controller(priceConfigs, pythListener, suiListener, suiPusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), {
142
- pushingFrequency,
143
- metrics,
144
- });
145
- // Create and start the balance tracker if metrics are enabled
146
- if (metrics) {
147
- const balanceTracker = (0, balance_tracker_1.createSuiBalanceTracker)({
148
- client: suiClient,
149
- address: suiAddress,
150
- network: "sui",
151
- updateInterval: pushingFrequency,
152
- metrics,
153
- logger,
154
- });
155
- // Start the balance tracker
156
- await balanceTracker.start();
157
- }
158
- controller.start();
159
- },
160
- };
@@ -1 +0,0 @@
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,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAkB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAM1D,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;CA4C3E;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,YAAY;IACpB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;gBAND,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,SAAS,EAC5B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,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,YAAY,EAAE,YAAY,EAC1B,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;IA8ChB,iGAAiG;YACnF,qBAAqB;IAInC,sEAAsE;YACxD,oBAAoB;mBAyDb,iBAAiB;mBAsDjB,yBAAyB;mBAgBzB,cAAc;mBAiCd,mBAAmB;mBAwCnB,oBAAoB;CAiE1C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/ton/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;;;;;;;;;;;kBAoBvB,OAAO;4BAKP,OAAO;iCAKP,OAAO;;oBAQiB,GAAG;;AA1BpC,wBAmGE"}
@@ -1,99 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const options = __importStar(require("../options"));
40
- const price_config_1 = require("../price-config");
41
- const pyth_price_listener_1 = require("../pyth-price-listener");
42
- const ton_1 = require("./ton");
43
- const controller_1 = require("../controller");
44
- const ton_2 = require("@ton/ton");
45
- const fs_1 = __importDefault(require("fs"));
46
- const pino_1 = __importDefault(require("pino"));
47
- const hermes_client_1 = require("@pythnetwork/hermes-client");
48
- const utils_1 = require("../utils");
49
- exports.default = {
50
- command: "ton",
51
- describe: "run price pusher for TON",
52
- builder: {
53
- endpoint: {
54
- description: "TON RPC API endpoint",
55
- type: "string",
56
- required: true,
57
- },
58
- "private-key-file": {
59
- description: "Path to the private key file",
60
- type: "string",
61
- required: true,
62
- },
63
- "pyth-contract-address": {
64
- description: "Pyth contract address on TON",
65
- type: "string",
66
- required: true,
67
- },
68
- ...options.priceConfigFile,
69
- ...options.priceServiceEndpoint,
70
- ...options.pushingFrequency,
71
- ...options.pollingFrequency,
72
- ...options.logLevel,
73
- ...options.controllerLogLevel,
74
- },
75
- handler: async function (argv) {
76
- const { endpoint, privateKeyFile, pythContractAddress, priceConfigFile, priceServiceEndpoint, pushingFrequency, pollingFrequency, logLevel, controllerLogLevel, } = argv;
77
- const logger = (0, pino_1.default)({ level: logLevel });
78
- const priceConfigs = (0, price_config_1.readPriceConfigFile)(priceConfigFile);
79
- const hermesClient = new hermes_client_1.HermesClient(priceServiceEndpoint);
80
- let priceItems = priceConfigs.map(({ id, alias }) => ({ id, alias }));
81
- // Better to filter out invalid price items before creating the pyth listener
82
- const { existingPriceItems, invalidPriceItems } = await (0, utils_1.filterInvalidPriceItems)(hermesClient, priceItems);
83
- if (invalidPriceItems.length > 0) {
84
- logger.error(`Invalid price id submitted for: ${invalidPriceItems
85
- .map(({ alias }) => alias)
86
- .join(", ")}`);
87
- }
88
- priceItems = existingPriceItems;
89
- const pythListener = new pyth_price_listener_1.PythPriceListener(hermesClient, priceItems, logger.child({ module: "PythPriceListener" }));
90
- const client = new ton_2.TonClient({ endpoint });
91
- const privateKey = fs_1.default.readFileSync(privateKeyFile, "utf8").trim();
92
- const contractAddress = ton_2.Address.parse(pythContractAddress);
93
- const provider = client.provider(contractAddress);
94
- const tonPriceListener = new ton_1.TonPriceListener(provider, contractAddress, priceItems, logger.child({ module: "TonPriceListener" }), { pollingFrequency });
95
- const tonPricePusher = new ton_1.TonPricePusher(client, privateKey, contractAddress, hermesClient, logger.child({ module: "TonPricePusher" }));
96
- const controller = new controller_1.Controller(priceConfigs, pythListener, tonPriceListener, tonPricePusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), { pushingFrequency });
97
- await controller.start();
98
- },
99
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"ton.d.ts","sourceRoot":"","sources":["../../src/ton/ton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,SAAS,EACT,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAgB,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EACL,OAAO,EACP,gBAAgB,EAGhB,SAAS,EAEV,MAAM,UAAU,CAAC;AAOlB,qBAAa,gBAAiB,SAAQ,kBAAkB;IAIpD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,eAAe;IAEvB,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,QAAQ,CAA+B;gBAGrC,QAAQ,EAAE,gBAAgB,EAC1B,eAAe,EAAE,OAAO,EAChC,UAAU,EAAE,SAAS,EAAE,EACf,MAAM,EAAE,MAAM,EACtB,MAAM,EAAE;QACN,gBAAgB,EAAE,iBAAiB,CAAC;KACrC;IAQG,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CAqB3E;AAED,qBAAa,cAAe,YAAW,YAAY;IAK/C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;IARhB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAAS;gBAGb,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,OAAO,EACxB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM;IAclB,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAElB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;CAqCjB"}
package/lib/ton/ton.js DELETED
@@ -1,97 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TonPricePusher = exports.TonPriceListener = void 0;
4
- const interface_1 = require("../interface");
5
- const utils_1 = require("../utils");
6
- const ton_1 = require("@ton/ton");
7
- const crypto_1 = require("@ton/crypto");
8
- const pyth_ton_js_1 = require("@pythnetwork/pyth-ton-js");
9
- class TonPriceListener extends interface_1.ChainPriceListener {
10
- provider;
11
- contractAddress;
12
- logger;
13
- contract;
14
- constructor(provider, contractAddress, priceItems, logger, config) {
15
- super(config.pollingFrequency, priceItems);
16
- this.provider = provider;
17
- this.contractAddress = contractAddress;
18
- this.logger = logger;
19
- this.contract = this.provider.open(pyth_ton_js_1.PythContract.createFromAddress(this.contractAddress));
20
- }
21
- async getOnChainPriceInfo(priceId) {
22
- try {
23
- const formattedPriceId = (0, utils_1.addLeading0x)(priceId);
24
- const priceInfo = await this.contract.getPriceUnsafe(formattedPriceId);
25
- this.logger.debug(`Polled a TON on chain price for feed ${this.priceIdToAlias.get(priceId)} (${priceId}).`);
26
- return {
27
- conf: priceInfo.conf.toString(),
28
- price: priceInfo.price.toString(),
29
- publishTime: priceInfo.publishTime,
30
- };
31
- }
32
- catch (err) {
33
- this.logger.error({ err, priceId }, `Polling on-chain price failed.`);
34
- return undefined;
35
- }
36
- }
37
- }
38
- exports.TonPriceListener = TonPriceListener;
39
- class TonPricePusher {
40
- client;
41
- privateKey;
42
- contractAddress;
43
- hermesClient;
44
- logger;
45
- contract;
46
- sender;
47
- constructor(client, privateKey, contractAddress, hermesClient, logger) {
48
- this.client = client;
49
- this.privateKey = privateKey;
50
- this.contractAddress = contractAddress;
51
- this.hermesClient = hermesClient;
52
- this.logger = logger;
53
- this.contract = this.client
54
- .provider(this.contractAddress)
55
- .open(pyth_ton_js_1.PythContract.createFromAddress(this.contractAddress));
56
- const keyPair = (0, crypto_1.keyPairFromSeed)(Buffer.from(this.privateKey, "hex"));
57
- const wallet = ton_1.WalletContractV4.create({
58
- publicKey: keyPair.publicKey,
59
- workchain: 0, // workchain 0 is the masterchain
60
- });
61
- const provider = this.client.open(wallet);
62
- this.sender = provider.sender(keyPair.secretKey);
63
- }
64
- async updatePriceFeed(priceIds,
65
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
66
- pubTimesToPush) {
67
- if (priceIds.length === 0) {
68
- return;
69
- }
70
- let priceFeedUpdateData;
71
- try {
72
- const response = await this.hermesClient.getLatestPriceUpdates(priceIds, {
73
- encoding: "base64",
74
- ignoreInvalidPriceIds: true,
75
- });
76
- priceFeedUpdateData = response.binary.data;
77
- }
78
- catch (err) {
79
- this.logger.error(err, "getPriceFeedsUpdateData failed");
80
- return;
81
- }
82
- try {
83
- for (const updateData of priceFeedUpdateData) {
84
- const updateDataBuffer = Buffer.from(updateData, "base64");
85
- const updateFee = await this.contract.getUpdateFee(updateDataBuffer);
86
- const totalFee = (0, pyth_ton_js_1.calculateUpdatePriceFeedsFee)(BigInt(priceIds.length)) +
87
- BigInt(updateFee);
88
- await this.contract.sendUpdatePriceFeeds(this.sender, updateDataBuffer, totalFee);
89
- }
90
- this.logger.info("updatePriceFeed successful");
91
- }
92
- catch (err) {
93
- this.logger.error(err, "updatePriceFeed failed");
94
- }
95
- }
96
- }
97
- exports.TonPricePusher = TonPricePusher;
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAC/B,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACvC,eAAO,MAAM,QAAQ,uCAAwC,CAAC;AAC9D,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAChD,eAAO,MAAM,iBAAiB,gBAAiB,CAAC;AAChD,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,SAAS,GAAG,SAAS,CAKxD;AAED,eAAO,MAAM,YAAY,GAAI,IAAI,SAAS,KAAG,KAAK,MAAM,EACrB,CAAC;AAKpC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAStD;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,SAAS,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EACpC,WAAW,SAAS,OAAO,CAAC,MAAM,CAAC,EACnC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,eAOnC;AAED,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,KAAG,CAMvD,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,YAAY,EAC1B,UAAU,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC;IACT,kBAAkB,EAAE,SAAS,EAAE,CAAC;IAChC,iBAAiB,EAAE,SAAS,EAAE,CAAC;CAChC,CAAC,CAqBD"}
package/lib/utils.js DELETED
@@ -1,61 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assertDefined = exports.addLeading0x = exports.customGasChainIds = exports.txSpeeds = void 0;
4
- exports.sleep = sleep;
5
- exports.removeLeading0x = removeLeading0x;
6
- exports.isWsEndpoint = isWsEndpoint;
7
- exports.verifyValidOption = verifyValidOption;
8
- exports.filterInvalidPriceItems = filterInvalidPriceItems;
9
- exports.txSpeeds = ["slow", "standard", "fast"];
10
- exports.customGasChainIds = [137];
11
- async function sleep(ms) {
12
- return new Promise((resolve) => setTimeout(resolve, ms));
13
- }
14
- function removeLeading0x(id) {
15
- if (id.startsWith("0x")) {
16
- return id.substring(2);
17
- }
18
- return id;
19
- }
20
- const addLeading0x = (id) => hasLeading0x(id) ? id : `0x${id}`;
21
- exports.addLeading0x = addLeading0x;
22
- const hasLeading0x = (input) => input.startsWith("0x");
23
- function isWsEndpoint(endpoint) {
24
- const url = new URL(endpoint);
25
- const protocol = url.protocol;
26
- if (protocol === "ws:" || protocol == "wss:") {
27
- return true;
28
- }
29
- return false;
30
- }
31
- function verifyValidOption(option, validOptions) {
32
- if (validOptions.includes(option)) {
33
- return option;
34
- }
35
- const errorString = option + " is not a valid option. Please choose between " + validOptions;
36
- throw new Error(errorString);
37
- }
38
- const assertDefined = (value) => {
39
- if (value === undefined) {
40
- throw new Error("Assertion failed: value was undefined");
41
- }
42
- else {
43
- return value;
44
- }
45
- };
46
- exports.assertDefined = assertDefined;
47
- async function filterInvalidPriceItems(hermesClient, priceItems) {
48
- const priceMetadata = await hermesClient.getPriceFeeds();
49
- const allPriceIds = priceMetadata.map((priceMetadata) => priceMetadata.id);
50
- // Filter out invalid price ids
51
- const { existingPriceItems, invalidPriceItems } = priceItems.reduce((acc, item) => {
52
- if (allPriceIds.includes(item.id)) {
53
- acc.existingPriceItems.push(item);
54
- }
55
- else {
56
- acc.invalidPriceItems.push(item);
57
- }
58
- return acc;
59
- }, { existingPriceItems: [], invalidPriceItems: [] });
60
- return { existingPriceItems, invalidPriceItems };
61
- }