@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.
- package/{lib/aptos/aptos.js → dist/aptos/aptos.cjs} +80 -76
- package/{lib → dist}/aptos/aptos.d.ts +5 -5
- package/{lib/aptos/balance-tracker.js → dist/aptos/balance-tracker.cjs} +37 -25
- package/{lib → dist}/aptos/balance-tracker.d.ts +9 -9
- package/dist/aptos/command.cjs +161 -0
- package/{lib → dist}/aptos/command.d.ts +1 -2
- package/dist/common.cjs +4 -0
- package/{lib → dist}/common.d.ts +0 -1
- package/{lib/controller.js → dist/controller.cjs} +35 -33
- package/{lib → dist}/controller.d.ts +5 -6
- package/dist/evm/balance-tracker.cjs +58 -0
- package/{lib → dist}/evm/balance-tracker.d.ts +10 -10
- package/dist/evm/command.cjs +205 -0
- package/{lib → dist}/evm/command.d.ts +1 -2
- package/dist/evm/custom-gas-station.cjs +54 -0
- package/{lib → dist}/evm/custom-gas-station.d.ts +1 -2
- package/dist/evm/evm.cjs +287 -0
- package/{lib → dist}/evm/evm.d.ts +8 -7
- package/{lib/evm/pyth-abi.js → dist/evm/pyth-abi.cjs} +181 -160
- package/{lib → dist}/evm/pyth-abi.d.ts +0 -1
- package/dist/evm/pyth-contract.cjs +17 -0
- package/{lib → dist}/evm/pyth-contract.d.ts +3 -4
- package/dist/evm/super-wallet.cjs +90 -0
- package/{lib → dist}/evm/super-wallet.d.ts +1 -2
- package/dist/fuel/command.cjs +135 -0
- package/{lib → dist}/fuel/command.d.ts +1 -2
- package/dist/fuel/fuel.cjs +108 -0
- package/{lib → dist}/fuel/fuel.d.ts +5 -5
- package/dist/index.cjs +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/injective/command.cjs +150 -0
- package/{lib → dist}/injective/command.d.ts +1 -2
- package/{lib/injective/injective.js → dist/injective/injective.cjs} +100 -98
- package/{lib → dist}/injective/injective.d.ts +7 -6
- package/dist/interface.cjs +142 -0
- package/{lib → dist}/interface.d.ts +12 -13
- package/dist/metrics.cjs +218 -0
- package/{lib → dist}/metrics.d.ts +10 -11
- package/dist/near/command.cjs +129 -0
- package/{lib → dist}/near/command.d.ts +1 -2
- package/dist/near/near.cjs +183 -0
- package/{lib → dist}/near/near.d.ts +5 -5
- package/dist/options.cjs +132 -0
- package/{lib → dist}/options.d.ts +1 -2
- package/dist/package.json +1 -0
- package/dist/price-config.cjs +104 -0
- package/{lib → dist}/price-config.d.ts +5 -6
- package/{lib/pyth-price-listener.js → dist/pyth-price-listener.cjs} +30 -24
- package/{lib → dist}/pyth-price-listener.d.ts +4 -4
- package/dist/solana/balance-tracker.cjs +60 -0
- package/{lib → dist}/solana/balance-tracker.d.ts +9 -9
- package/dist/solana/command.cjs +259 -0
- package/{lib → dist}/solana/command.d.ts +2 -3
- package/{lib/solana/solana.js → dist/solana/solana.cjs} +90 -78
- package/{lib → dist}/solana/solana.d.ts +6 -6
- package/dist/sui/balance-tracker.cjs +58 -0
- package/{lib → dist}/sui/balance-tracker.d.ts +9 -9
- package/dist/sui/command.cjs +190 -0
- package/{lib → dist}/sui/command.d.ts +1 -2
- package/{lib/sui/sui.js → dist/sui/sui.cjs} +145 -133
- package/{lib → dist}/sui/sui.d.ts +7 -8
- package/dist/ton/command.cjs +137 -0
- package/{lib → dist}/ton/command.d.ts +1 -2
- package/dist/ton/ton.cjs +103 -0
- package/{lib → dist}/ton/ton.d.ts +7 -6
- package/dist/utils.cjs +102 -0
- package/{lib → dist}/utils.d.ts +4 -4
- package/package.json +161 -20
- package/lib/aptos/aptos.d.ts.map +0 -1
- package/lib/aptos/balance-tracker.d.ts.map +0 -1
- package/lib/aptos/command.d.ts.map +0 -1
- package/lib/aptos/command.js +0 -126
- package/lib/common.d.ts.map +0 -1
- package/lib/common.js +0 -2
- package/lib/controller.d.ts.map +0 -1
- package/lib/evm/balance-tracker.d.ts.map +0 -1
- package/lib/evm/balance-tracker.js +0 -49
- package/lib/evm/command.d.ts.map +0 -1
- package/lib/evm/command.js +0 -178
- package/lib/evm/custom-gas-station.d.ts.map +0 -1
- package/lib/evm/custom-gas-station.js +0 -40
- package/lib/evm/evm.d.ts.map +0 -1
- package/lib/evm/evm.js +0 -270
- package/lib/evm/pyth-abi.d.ts.map +0 -1
- package/lib/evm/pyth-contract.d.ts.map +0 -1
- package/lib/evm/pyth-contract.js +0 -11
- package/lib/evm/super-wallet.d.ts.map +0 -1
- package/lib/evm/super-wallet.js +0 -73
- package/lib/fuel/command.d.ts.map +0 -1
- package/lib/fuel/command.js +0 -98
- package/lib/fuel/fuel.d.ts.map +0 -1
- package/lib/fuel/fuel.js +0 -101
- package/lib/index.d.ts +0 -3
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -34
- package/lib/injective/command.d.ts.map +0 -1
- package/lib/injective/command.js +0 -119
- package/lib/injective/injective.d.ts.map +0 -1
- package/lib/interface.d.ts.map +0 -1
- package/lib/interface.js +0 -122
- package/lib/metrics.d.ts.map +0 -1
- package/lib/metrics.js +0 -152
- package/lib/near/command.d.ts.map +0 -1
- package/lib/near/command.js +0 -103
- package/lib/near/near.d.ts.map +0 -1
- package/lib/near/near.js +0 -168
- package/lib/options.d.ts.map +0 -1
- package/lib/options.js +0 -84
- package/lib/price-config.d.ts.map +0 -1
- package/lib/price-config.js +0 -114
- package/lib/pyth-price-listener.d.ts.map +0 -1
- package/lib/solana/balance-tracker.d.ts.map +0 -1
- package/lib/solana/balance-tracker.js +0 -51
- package/lib/solana/command.d.ts.map +0 -1
- package/lib/solana/command.js +0 -223
- package/lib/solana/solana.d.ts.map +0 -1
- package/lib/sui/balance-tracker.d.ts.map +0 -1
- package/lib/sui/balance-tracker.js +0 -49
- package/lib/sui/command.d.ts.map +0 -1
- package/lib/sui/command.js +0 -160
- package/lib/sui/sui.d.ts.map +0 -1
- package/lib/ton/command.d.ts.map +0 -1
- package/lib/ton/command.js +0 -99
- package/lib/ton/ton.d.ts.map +0 -1
- package/lib/ton/ton.js +0 -97
- package/lib/utils.d.ts.map +0 -1
- 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
|
-
}
|
package/lib/sui/command.d.ts.map
DELETED
|
@@ -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"}
|
package/lib/sui/command.js
DELETED
|
@@ -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
|
-
};
|
package/lib/sui/sui.d.ts.map
DELETED
|
@@ -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"}
|
package/lib/ton/command.d.ts.map
DELETED
|
@@ -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"}
|
package/lib/ton/command.js
DELETED
|
@@ -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
|
-
};
|
package/lib/ton/ton.d.ts.map
DELETED
|
@@ -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;
|
package/lib/utils.d.ts.map
DELETED
|
@@ -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
|
-
}
|