@pythnetwork/price-pusher 10.2.0 → 10.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,119 +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 injective_1 = require("./injective");
44
- const pyth_price_listener_1 = require("../pyth-price-listener");
45
- const controller_1 = require("../controller");
46
- const networks_1 = require("@injectivelabs/networks");
47
- const pino_1 = __importDefault(require("pino"));
48
- const utils_1 = require("../utils");
49
- exports.default = {
50
- command: "injective",
51
- describe: "run price pusher for injective",
52
- builder: {
53
- "grpc-endpoint": {
54
- description: "gRPC endpoint URL for injective. The pusher will periodically" +
55
- "poll for updates. The polling interval is configurable via the " +
56
- "`polling-frequency` command-line argument.",
57
- type: "string",
58
- required: true,
59
- },
60
- network: {
61
- description: "testnet or mainnet",
62
- type: "string",
63
- required: true,
64
- },
65
- "gas-price": {
66
- description: "Gas price to be used for each transaction",
67
- type: "number",
68
- },
69
- "gas-multiplier": {
70
- description: "Gas multiplier to be used for each transaction",
71
- type: "number",
72
- },
73
- "price-ids-process-chunk-size": {
74
- description: "Set in case we wanna split price feeds updates into chunks to have smaller transactions. Set to -1 to disable chunking.",
75
- type: "number",
76
- required: false,
77
- },
78
- ...options.priceConfigFile,
79
- ...options.priceServiceEndpoint,
80
- ...options.mnemonicFile,
81
- ...options.pythContractAddress,
82
- ...options.pollingFrequency,
83
- ...options.pushingFrequency,
84
- ...options.logLevel,
85
- ...options.controllerLogLevel,
86
- },
87
- handler: async function (argv) {
88
- // FIXME: type checks for this
89
- const { network, logLevel, gasPrice, grpcEndpoint, mnemonicFile, gasMultiplier, priceConfigFile, pollingFrequency, pushingFrequency, controllerLogLevel, pythContractAddress, priceServiceEndpoint, priceIdsProcessChunkSize, } = argv;
90
- const logger = (0, pino_1.default)({ level: logLevel });
91
- if (network !== "testnet" && network !== "mainnet") {
92
- throw new Error("Please specify network. One of [testnet, mainnet]");
93
- }
94
- const priceConfigs = (0, price_config_1.readPriceConfigFile)(priceConfigFile);
95
- const hermesClient = new hermes_client_1.HermesClient(priceServiceEndpoint);
96
- const mnemonic = fs_1.default.readFileSync(mnemonicFile, "utf-8").trim();
97
- let priceItems = priceConfigs.map(({ id, alias }) => ({ id, alias }));
98
- // Better to filter out invalid price items before creating the pyth listener
99
- const { existingPriceItems, invalidPriceItems } = await (0, utils_1.filterInvalidPriceItems)(hermesClient, priceItems);
100
- if (invalidPriceItems.length > 0) {
101
- logger.error(`Invalid price id submitted for: ${invalidPriceItems
102
- .map(({ alias }) => alias)
103
- .join(", ")}`);
104
- }
105
- priceItems = existingPriceItems;
106
- const pythListener = new pyth_price_listener_1.PythPriceListener(hermesClient, priceItems, logger.child({ module: "PythPriceListener" }));
107
- const injectiveListener = new injective_1.InjectivePriceListener(pythContractAddress, grpcEndpoint, priceItems, logger.child({ module: "InjectivePriceListener" }), {
108
- pollingFrequency,
109
- });
110
- const injectivePusher = new injective_1.InjectivePricePusher(hermesClient, pythContractAddress, grpcEndpoint, logger.child({ module: "InjectivePricePusher" }), mnemonic, {
111
- chainId: (0, networks_1.getNetworkInfo)(network).chainId,
112
- gasPrice,
113
- gasMultiplier,
114
- priceIdsProcessChunkSize,
115
- });
116
- const controller = new controller_1.Controller(priceConfigs, pythListener, injectiveListener, injectivePusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), { pushingFrequency });
117
- controller.start();
118
- },
119
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"injective.d.ts","sourceRoot":"","sources":["../../src/injective/injective.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EACL,SAAS,EACT,SAAS,EACT,YAAY,EACZ,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAa7C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAmB9B,KAAK,eAAe,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB,EAAE,MAAM,CAAC;CAClC,CAAC;AAGF,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,qBAAa,oBAAqB,YAAW,YAAY;IAOrD,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;IAThB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,QAAQ,CACX,CAAC,2BAA2B;gBAGvB,YAAY,EAAE,YAAY,EAC1B,mBAAmB,EAAE,MAAM,EAC3B,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAaxC,OAAO,CAAC,SAAS;YAWH,mBAAmB;IA+C3B,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;YAuBF,oBAAoB;IA+ClC;;;;;OAKG;YACW,SAAS;IA0CvB;;OAEG;YACW,wBAAwB;IAuBtC;;OAEG;YACW,YAAY;CAwB3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../src/interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,cAAc;IAE7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CAC5D;AAED,8BAAsB,kBAAmB,YAAW,cAAc;IAK9D,OAAO,CAAC,gBAAgB;IACxB,SAAS,CAAC,UAAU,EAAE,SAAS,EAAE;IALnC,OAAO,CAAC,eAAe,CAA4B;IACnD,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAGvC,gBAAgB,EAAE,iBAAiB,EACjC,UAAU,EAAE,SAAS,EAAE;IAQ7B,KAAK;YAMG,UAAU;IASxB,SAAS,CAAC,qBAAqB,CAC7B,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,SAAS;IAkB1B,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI1D,QAAQ,CAAC,mBAAmB,CAC1B,OAAO,EAAE,SAAS,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,eAAe,CACb,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,aAAa,EAAE,GAC9B,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,cAAc,EAAE,iBAAiB,CAAC;IAClC,iDAAiD;IACjD,OAAO,EAAE,kBAAkB,CAAC;IAC5B,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;GAEG;AACH,8BAAsB,kBAAmB,YAAW,eAAe;IACjE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,cAAc,EAAE,iBAAiB,CAAC;IAC5C,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACtC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,SAAS,EAAE,OAAO,CAAS;gBAEzB,MAAM,EAAE,wBAAwB;IAQ/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAcrB,eAAe;IAkB7B;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAE1C,IAAI,IAAI,IAAI;CAGpB"}
package/lib/interface.js DELETED
@@ -1,122 +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
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.BaseBalanceTracker = exports.ChainPriceListener = void 0;
37
- class ChainPriceListener {
38
- pollingFrequency;
39
- priceItems;
40
- latestPriceInfo;
41
- priceIdToAlias;
42
- constructor(pollingFrequency, priceItems) {
43
- this.pollingFrequency = pollingFrequency;
44
- this.priceItems = priceItems;
45
- this.latestPriceInfo = new Map();
46
- this.priceIdToAlias = new Map(priceItems.map(({ id, alias }) => [id, alias]));
47
- }
48
- async start() {
49
- setInterval(this.pollPrices.bind(this), this.pollingFrequency * 1000);
50
- await this.pollPrices();
51
- }
52
- async pollPrices() {
53
- for (const { id: priceId } of this.priceItems) {
54
- const currentPriceInfo = await this.getOnChainPriceInfo(priceId);
55
- if (currentPriceInfo !== undefined) {
56
- this.updateLatestPriceInfo(priceId, currentPriceInfo);
57
- }
58
- }
59
- }
60
- updateLatestPriceInfo(priceId, observedPrice) {
61
- const cachedLatestPriceInfo = this.getLatestPriceInfo(priceId);
62
- // Ignore the observed price if the cache already has newer
63
- // price. This could happen because we are using polling and
64
- // subscription at the same time.
65
- if (cachedLatestPriceInfo !== undefined &&
66
- cachedLatestPriceInfo.publishTime > observedPrice.publishTime) {
67
- return;
68
- }
69
- this.latestPriceInfo.set(priceId, observedPrice);
70
- }
71
- // Should return undefined only when the price does not exist.
72
- getLatestPriceInfo(priceId) {
73
- return this.latestPriceInfo.get(priceId);
74
- }
75
- }
76
- exports.ChainPriceListener = ChainPriceListener;
77
- /**
78
- * Abstract base class that implements common functionality for all balance trackers
79
- */
80
- class BaseBalanceTracker {
81
- address;
82
- network;
83
- updateInterval;
84
- metrics;
85
- logger;
86
- isRunning = false;
87
- constructor(config) {
88
- this.address = config.address;
89
- this.network = config.network;
90
- this.updateInterval = config.updateInterval;
91
- this.metrics = config.metrics;
92
- this.logger = config.logger;
93
- }
94
- async start() {
95
- if (this.isRunning) {
96
- return;
97
- }
98
- this.isRunning = true;
99
- // Initial balance update
100
- await this.updateBalance();
101
- // Start the update loop
102
- this.startUpdateLoop();
103
- }
104
- async startUpdateLoop() {
105
- // We're using dynamic import to avoid circular dependencies
106
- const { sleep } = await Promise.resolve().then(() => __importStar(require("./utils")));
107
- // Run in a loop to regularly update the balance
108
- for (;;) {
109
- // Wait first, since we already did the initial update in start()
110
- await sleep(this.updateInterval * 1000);
111
- // Only continue if we're still running
112
- if (!this.isRunning) {
113
- break;
114
- }
115
- await this.updateBalance();
116
- }
117
- }
118
- stop() {
119
- this.isRunning = false;
120
- }
121
- }
122
- exports.BaseBalanceTracker = BaseBalanceTracker;
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAS;IAGhB,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACjC,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,wBAAwB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAChC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAEhC,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAExB,MAAM,EAAE,MAAM;IAyEnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOzB,iBAAiB,CACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAc,GACtB,IAAI;IAUA,qBAAqB,CAC1B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,eAAe,GACzB,IAAI;IAgBA,sBAAsB,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAc,GACtB,IAAI;IAUA,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvC,gBAAgB,CACrB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,4BAA4B,EAAE,MAAM,EACpC,4BAA4B,EAAE,MAAM,EACpC,yBAAyB,EAAE,MAAM,GAChC,IAAI;IAgBA,iBAAiB,CACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,IAAI;IAgBA,mBAAmB,CACxB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAAG,MAAM,GACvB,IAAI;CAYR"}
package/lib/metrics.js DELETED
@@ -1,152 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.PricePusherMetrics = void 0;
7
- const prom_client_1 = require("prom-client");
8
- const express_1 = __importDefault(require("express"));
9
- const price_config_1 = require("./price-config");
10
- // Define the metrics we want to track
11
- class PricePusherMetrics {
12
- registry;
13
- server;
14
- logger;
15
- // Metrics for price feed updates
16
- lastPublishedTime;
17
- priceUpdateAttempts;
18
- priceFeedsTotal;
19
- sourceTimestamp;
20
- configuredTimeDifference;
21
- sourcePriceValue;
22
- targetPriceValue;
23
- // Wallet metrics
24
- walletBalance;
25
- constructor(logger) {
26
- this.logger = logger;
27
- this.registry = new prom_client_1.Registry();
28
- this.server = (0, express_1.default)();
29
- // Register the default metrics (memory, CPU, etc.)
30
- this.registry.setDefaultLabels({ app: "price_pusher" });
31
- // Create metrics
32
- this.lastPublishedTime = new prom_client_1.Gauge({
33
- name: "pyth_price_last_published_time",
34
- help: "The last published time of a price feed in unix timestamp",
35
- labelNames: ["price_id", "alias"],
36
- registers: [this.registry],
37
- });
38
- this.priceUpdateAttempts = new prom_client_1.Counter({
39
- name: "pyth_price_update_attempts_total",
40
- help: "Total number of price update attempts with their trigger condition and status",
41
- labelNames: ["price_id", "alias", "trigger", "status"],
42
- registers: [this.registry],
43
- });
44
- this.priceFeedsTotal = new prom_client_1.Gauge({
45
- name: "pyth_price_feeds_total",
46
- help: "Total number of price feeds being monitored",
47
- registers: [this.registry],
48
- });
49
- this.sourceTimestamp = new prom_client_1.Gauge({
50
- name: "pyth_source_timestamp",
51
- help: "Latest source chain price publish timestamp",
52
- labelNames: ["price_id", "alias"],
53
- registers: [this.registry],
54
- });
55
- this.configuredTimeDifference = new prom_client_1.Gauge({
56
- name: "pyth_configured_time_difference",
57
- help: "Configured time difference threshold between source and target chains",
58
- labelNames: ["price_id", "alias"],
59
- registers: [this.registry],
60
- });
61
- this.sourcePriceValue = new prom_client_1.Gauge({
62
- name: "pyth_source_price",
63
- help: "Latest price value from Pyth source",
64
- labelNames: ["price_id", "alias"],
65
- registers: [this.registry],
66
- });
67
- this.targetPriceValue = new prom_client_1.Gauge({
68
- name: "pyth_target_price",
69
- help: "Latest price value from target chain",
70
- labelNames: ["price_id", "alias"],
71
- registers: [this.registry],
72
- });
73
- // Wallet balance metric
74
- this.walletBalance = new prom_client_1.Gauge({
75
- name: "pyth_wallet_balance",
76
- help: "Current wallet balance of the price pusher in native token units",
77
- labelNames: ["wallet_address", "network"],
78
- registers: [this.registry],
79
- });
80
- // Setup the metrics endpoint
81
- this.server.get("/metrics", async (req, res) => {
82
- res.set("Content-Type", this.registry.contentType);
83
- res.end(await this.registry.metrics());
84
- });
85
- }
86
- // Start the metrics server
87
- start(port) {
88
- this.server.listen(port, () => {
89
- this.logger.info(`Metrics server started on port ${port}`);
90
- });
91
- }
92
- // Record a successful price update
93
- recordPriceUpdate(priceId, alias, trigger = "yes") {
94
- this.priceUpdateAttempts.inc({
95
- price_id: priceId,
96
- alias,
97
- trigger: trigger.toLowerCase(),
98
- status: "success",
99
- });
100
- }
101
- // Record update condition status (YES/NO/EARLY)
102
- recordUpdateCondition(priceId, alias, condition) {
103
- const triggerLabel = price_config_1.UpdateCondition[condition].toLowerCase();
104
- // Only record as 'skipped' when the condition is NO
105
- if (condition === price_config_1.UpdateCondition.NO) {
106
- this.priceUpdateAttempts.inc({
107
- price_id: priceId,
108
- alias,
109
- trigger: triggerLabel,
110
- status: "skipped",
111
- });
112
- }
113
- // YES and EARLY don't increment the counter here - they'll be counted
114
- // when recordPriceUpdate or recordPriceUpdateError is called
115
- }
116
- // Record a price update error
117
- recordPriceUpdateError(priceId, alias, trigger = "yes") {
118
- this.priceUpdateAttempts.inc({
119
- price_id: priceId,
120
- alias,
121
- trigger: trigger.toLowerCase(),
122
- status: "error",
123
- });
124
- }
125
- // Set the number of price feeds
126
- setPriceFeedsTotal(count) {
127
- this.priceFeedsTotal.set(count);
128
- }
129
- // Update source, target and configured time difference timestamps
130
- updateTimestamps(priceId, alias, targetLatestPricePublishTime, sourceLatestPricePublishTime, priceConfigTimeDifference) {
131
- this.sourceTimestamp.set({ price_id: priceId, alias }, sourceLatestPricePublishTime);
132
- this.lastPublishedTime.set({ price_id: priceId, alias }, targetLatestPricePublishTime);
133
- this.configuredTimeDifference.set({ price_id: priceId, alias }, priceConfigTimeDifference);
134
- }
135
- // Update price values
136
- updatePriceValues(priceId, alias, sourcePrice, targetPrice) {
137
- if (sourcePrice !== undefined) {
138
- this.sourcePriceValue.set({ price_id: priceId, alias }, Number(sourcePrice));
139
- }
140
- if (targetPrice !== undefined) {
141
- this.targetPriceValue.set({ price_id: priceId, alias }, Number(targetPrice));
142
- }
143
- }
144
- // Update wallet balance
145
- updateWalletBalance(walletAddress, network, balance) {
146
- // Convert to number for compatibility with prometheus
147
- const balanceNum = typeof balance === "bigint" ? Number(balance) / 1e18 : balance;
148
- this.walletBalance.set({ wallet_address: walletAddress, network }, balanceNum);
149
- this.logger.debug(`Updated wallet balance metric: ${walletAddress} = ${balanceNum}`);
150
- }
151
- }
152
- exports.PricePusherMetrics = PricePusherMetrics;
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/near/command.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;;;;;;;;;;;;oBAcvB,OAAO;iBAKP,OAAO;sBAKP,OAAO;4BAKP,OAAO;;oBASiB,GAAG;;AAjCpC,wBA8GE"}
@@ -1,103 +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 pyth_price_listener_1 = require("../pyth-price-listener");
43
- const controller_1 = require("../controller");
44
- const near_1 = require("./near");
45
- const pino_1 = __importDefault(require("pino"));
46
- const utils_1 = require("../utils");
47
- exports.default = {
48
- command: "near",
49
- describe: "run price pusher for near",
50
- builder: {
51
- "node-url": {
52
- description: "NEAR RPC API url. used to make JSON RPC calls to interact with NEAR.",
53
- type: "string",
54
- required: true,
55
- },
56
- network: {
57
- description: "testnet or mainnet.",
58
- type: "string",
59
- required: true,
60
- },
61
- "account-id": {
62
- description: "payer account identifier.",
63
- type: "string",
64
- required: true,
65
- },
66
- "private-key-path": {
67
- description: "path to payer private key file.",
68
- type: "string",
69
- required: false,
70
- },
71
- ...options.priceConfigFile,
72
- ...options.priceServiceEndpoint,
73
- ...options.pythContractAddress,
74
- ...options.pollingFrequency,
75
- ...options.pushingFrequency,
76
- ...options.logLevel,
77
- ...options.controllerLogLevel,
78
- },
79
- handler: async function (argv) {
80
- // FIXME: type checks for this
81
- const { nodeUrl, network, accountId, privateKeyPath, priceConfigFile, priceServiceEndpoint, pythContractAddress, pushingFrequency, pollingFrequency, logLevel, controllerLogLevel, } = argv;
82
- const logger = (0, pino_1.default)({ level: logLevel });
83
- const priceConfigs = (0, price_config_1.readPriceConfigFile)(priceConfigFile);
84
- const hermesClient = new hermes_client_1.HermesClient(priceServiceEndpoint);
85
- let priceItems = priceConfigs.map(({ id, alias }) => ({ id, alias }));
86
- // Better to filter out invalid price items before creating the pyth listener
87
- const { existingPriceItems, invalidPriceItems } = await (0, utils_1.filterInvalidPriceItems)(hermesClient, priceItems);
88
- if (invalidPriceItems.length > 0) {
89
- logger.error(`Invalid price id submitted for: ${invalidPriceItems
90
- .map(({ alias }) => alias)
91
- .join(", ")}`);
92
- }
93
- priceItems = existingPriceItems;
94
- const pythListener = new pyth_price_listener_1.PythPriceListener(hermesClient, priceItems, logger);
95
- const nearAccount = new near_1.NearAccount(network, accountId, nodeUrl, privateKeyPath, pythContractAddress);
96
- const nearListener = new near_1.NearPriceListener(nearAccount, priceItems, logger.child({ module: "NearPriceListener" }), {
97
- pollingFrequency,
98
- });
99
- const nearPusher = new near_1.NearPricePusher(nearAccount, hermesClient, logger.child({ module: "NearPricePusher" }));
100
- const controller = new controller_1.Controller(priceConfigs, pythListener, nearListener, nearPusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), { pushingFrequency });
101
- controller.start();
102
- },
103
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"near.d.ts","sourceRoot":"","sources":["../../src/near/near.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,YAAY,EACZ,SAAS,EACT,kBAAkB,EAClB,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAa,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAGL,qBAAqB,EACtB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,qBAAa,iBAAkB,SAAQ,kBAAkB;IAErD,OAAO,CAAC,OAAO;IAEf,OAAO,CAAC,MAAM;gBAFN,OAAO,EAAE,WAAW,EAC5B,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;CAwB3E;AAED,qBAAa,eAAgB,YAAW,YAAY;IAEhD,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,MAAM;gBAFN,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,MAAM;IAGlB,eAAe,CACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC;YA0DF,uBAAuB;CAStC;AAED,qBAAa,WAAW;IAQpB,OAAO,CAAC,aAAa;IAPvB,OAAO,CAAC,OAAO,CAAU;gBAGvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,GAAG,SAAS,EAC1B,aAAa,EAAE,MAAM;IAWzB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU7C,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAUhD,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,GAAG,GACb,OAAO,CAAC,qBAAqB,CAAC;IAYjC,OAAO,CAAC,aAAa;CAkCtB"}