@zofai/zo-sdk 0.2.13 → 0.2.15

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 (109) hide show
  1. package/.claude/settings.local.json +11 -1
  2. package/dist/abstract/BaseDataAPI.cjs +1 -1
  3. package/dist/abstract/BaseDataAPI.cjs.map +1 -1
  4. package/dist/abstract/BaseDataAPI.mjs +1 -1
  5. package/dist/abstract/BaseDataAPI.mjs.map +1 -1
  6. package/dist/consts/deployments-usdz-mainnet.json +1 -31
  7. package/dist/consts/deployments-zo-oracle-mainnet.json +329 -0
  8. package/dist/consts/index.cjs +35 -1
  9. package/dist/consts/index.cjs.map +1 -1
  10. package/dist/consts/index.d.cts +45 -0
  11. package/dist/consts/index.d.cts.map +1 -1
  12. package/dist/consts/index.d.mts +45 -0
  13. package/dist/consts/index.d.mts.map +1 -1
  14. package/dist/consts/index.mjs +31 -0
  15. package/dist/consts/index.mjs.map +1 -1
  16. package/dist/data.cjs +1 -1
  17. package/dist/data.cjs.map +1 -1
  18. package/dist/data.mjs +1 -1
  19. package/dist/data.mjs.map +1 -1
  20. package/dist/implementations/USDZAPI.cjs +426 -78
  21. package/dist/implementations/USDZAPI.cjs.map +1 -1
  22. package/dist/implementations/USDZAPI.d.cts +54 -0
  23. package/dist/implementations/USDZAPI.d.cts.map +1 -1
  24. package/dist/implementations/USDZAPI.d.mts +54 -0
  25. package/dist/implementations/USDZAPI.d.mts.map +1 -1
  26. package/dist/implementations/USDZAPI.mjs +427 -79
  27. package/dist/implementations/USDZAPI.mjs.map +1 -1
  28. package/dist/implementations/USDZDataAPI.cjs +38 -0
  29. package/dist/implementations/USDZDataAPI.cjs.map +1 -1
  30. package/dist/implementations/USDZDataAPI.d.cts +16 -0
  31. package/dist/implementations/USDZDataAPI.d.cts.map +1 -1
  32. package/dist/implementations/USDZDataAPI.d.mts +16 -0
  33. package/dist/implementations/USDZDataAPI.d.mts.map +1 -1
  34. package/dist/implementations/USDZDataAPI.mjs +38 -0
  35. package/dist/implementations/USDZDataAPI.mjs.map +1 -1
  36. package/dist/index.cjs +3 -0
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +3 -0
  39. package/dist/index.d.cts.map +1 -1
  40. package/dist/index.d.mts +3 -0
  41. package/dist/index.d.mts.map +1 -1
  42. package/dist/index.mjs +3 -0
  43. package/dist/index.mjs.map +1 -1
  44. package/dist/interfaces/base.d.cts +19 -1
  45. package/dist/interfaces/base.d.cts.map +1 -1
  46. package/dist/interfaces/base.d.mts +19 -1
  47. package/dist/interfaces/base.d.mts.map +1 -1
  48. package/dist/interfaces/usdz.d.cts +17 -0
  49. package/dist/interfaces/usdz.d.cts.map +1 -1
  50. package/dist/interfaces/usdz.d.mts +17 -0
  51. package/dist/interfaces/usdz.d.mts.map +1 -1
  52. package/dist/oracle.cjs +119 -1
  53. package/dist/oracle.cjs.map +1 -1
  54. package/dist/oracle.d.cts +57 -1
  55. package/dist/oracle.d.cts.map +1 -1
  56. package/dist/oracle.d.mts +57 -1
  57. package/dist/oracle.d.mts.map +1 -1
  58. package/dist/oracle.mjs +120 -2
  59. package/dist/oracle.mjs.map +1 -1
  60. package/dist/oraclePro.cjs +214 -0
  61. package/dist/oraclePro.cjs.map +1 -0
  62. package/dist/oraclePro.d.cts +92 -0
  63. package/dist/oraclePro.d.cts.map +1 -0
  64. package/dist/oraclePro.d.mts +92 -0
  65. package/dist/oraclePro.d.mts.map +1 -0
  66. package/dist/oraclePro.mjs +196 -0
  67. package/dist/oraclePro.mjs.map +1 -0
  68. package/dist/pythProClient.cjs +277 -0
  69. package/dist/pythProClient.cjs.map +1 -0
  70. package/dist/pythProClient.d.cts +143 -0
  71. package/dist/pythProClient.d.cts.map +1 -0
  72. package/dist/pythProClient.d.mts +143 -0
  73. package/dist/pythProClient.d.mts.map +1 -0
  74. package/dist/pythProClient.mjs +269 -0
  75. package/dist/pythProClient.mjs.map +1 -0
  76. package/dist/storkClient.cjs +217 -0
  77. package/dist/storkClient.cjs.map +1 -0
  78. package/dist/storkClient.d.cts +90 -0
  79. package/dist/storkClient.d.cts.map +1 -0
  80. package/dist/storkClient.d.mts +90 -0
  81. package/dist/storkClient.d.mts.map +1 -0
  82. package/dist/storkClient.mjs +208 -0
  83. package/dist/storkClient.mjs.map +1 -0
  84. package/dist/storkOracle.cjs +61 -0
  85. package/dist/storkOracle.cjs.map +1 -0
  86. package/dist/storkOracle.d.cts +21 -0
  87. package/dist/storkOracle.d.cts.map +1 -0
  88. package/dist/storkOracle.d.mts +21 -0
  89. package/dist/storkOracle.d.mts.map +1 -0
  90. package/dist/storkOracle.mjs +56 -0
  91. package/dist/storkOracle.mjs.map +1 -0
  92. package/package.json +1 -1
  93. package/src/abstract/BaseDataAPI.ts +1 -1
  94. package/src/consts/deployments-usdz-mainnet.json +1 -31
  95. package/src/consts/deployments-zo-oracle-mainnet.json +329 -0
  96. package/src/consts/index.ts +80 -0
  97. package/src/data.ts +1 -1
  98. package/src/implementations/USDZAPI.ts +731 -101
  99. package/src/implementations/USDZDataAPI.ts +42 -0
  100. package/src/index.ts +3 -0
  101. package/src/interfaces/base.ts +54 -1
  102. package/src/interfaces/usdz.ts +125 -0
  103. package/src/oracle.ts +222 -1
  104. package/src/oraclePro.ts +312 -0
  105. package/src/pythProClient.ts +406 -0
  106. package/src/storkClient.ts +328 -0
  107. package/src/storkOracle.ts +82 -0
  108. package/tests/pythProClient.test.ts +155 -0
  109. package/tests/storkClient.test.ts +316 -0
@@ -0,0 +1,196 @@
1
+ import { SUI_CLOCK_OBJECT_ID } from "@mysten/sui/utils";
2
+ import { buildOracleProConfig, getPythFeederToPriceId, getZoOracleConfig } from "./consts/index.mjs";
3
+ import { fetchPythProUpdateBytesFromKronos } from "./pythProClient.mjs";
4
+ import { hexToBytes } from "./storkClient.mjs";
5
+ import { parseSymbolKey } from "./utils.mjs";
6
+ /** Normalize coin type strings for zo_oracle ↔ LP deployment matching. */
7
+ export function normalizeCoinType(coinType) {
8
+ const parts = coinType.split('::');
9
+ if (parts.length < 2 || !parts[0].startsWith('0x')) {
10
+ return coinType.toLowerCase();
11
+ }
12
+ const hex = parts[0].slice(2).replace(/^0+/, '') || '0';
13
+ return `0x${hex}::${parts.slice(1).join('::')}`.toLowerCase();
14
+ }
15
+ export function requireOracleProConfig(network) {
16
+ return buildOracleProConfig(getZoOracleConfig(network));
17
+ }
18
+ /**
19
+ * Build coin module -> Lazer feed id using zo_oracle symbol configs + Hermes price id map.
20
+ */
21
+ export function buildCoinModuleToLazerFeedId(pythLazer, zoOracle, network) {
22
+ const pythFeederToPriceId = getPythFeederToPriceId(network);
23
+ const map = new Map();
24
+ for (const config of Object.values(zoOracle.symbolConfigs)) {
25
+ const priceId = pythFeederToPriceId[config.pythFeederId];
26
+ if (!priceId) {
27
+ continue;
28
+ }
29
+ const lazerId = pythLazer.feedIds[priceId];
30
+ if (lazerId === undefined) {
31
+ continue;
32
+ }
33
+ map.set(normalizeCoinType(config.coinType), lazerId);
34
+ }
35
+ return map;
36
+ }
37
+ export function resolveLazerFeedIds(zoOracle, coins, tokens, network, legacyFeeders) {
38
+ const { pythLazer } = zoOracle;
39
+ const coinModuleMap = buildCoinModuleToLazerFeedId(pythLazer, zoOracle, network);
40
+ const feederToPriceId = getPythFeederToPriceId(network);
41
+ const ids = new Set();
42
+ for (const token of tokens) {
43
+ const module = coins[token]?.module;
44
+ if (!module) {
45
+ throw new Error(`Unknown token: ${token}`);
46
+ }
47
+ let lazerId = coinModuleMap.get(normalizeCoinType(module));
48
+ if (lazerId === undefined && legacyFeeders?.[token]) {
49
+ const priceId = feederToPriceId[legacyFeeders[token]];
50
+ if (priceId) {
51
+ lazerId = pythLazer.feedIds[priceId];
52
+ }
53
+ }
54
+ if (lazerId === undefined) {
55
+ throw new Error(`No Pyth Lazer feed id for token "${token}" (${module})`);
56
+ }
57
+ ids.add(lazerId);
58
+ }
59
+ return [...ids];
60
+ }
61
+ /** Map Stork asset symbol (e.g. `BTCUSD`) → 32-byte on-chain feeder id bytes. */
62
+ export function buildStorkAssetIdMap(zoOracle) {
63
+ const map = new Map();
64
+ for (const [symbolKey, config] of Object.entries(zoOracle.symbolConfigs)) {
65
+ if (!config.storkFeederId) {
66
+ continue;
67
+ }
68
+ const asset = symbolKey.replace('/', '');
69
+ map.set(asset, hexToBytes(config.storkFeederId));
70
+ }
71
+ return map;
72
+ }
73
+ /** Map SDK token id → kronos Stork asset id (e.g. `btc` → `BTCUSD`). */
74
+ export function resolveStorkAssetsForTokens(zoOracle, coins, tokens) {
75
+ const moduleToAsset = new Map();
76
+ for (const [symbolKey, config] of Object.entries(zoOracle.symbolConfigs)) {
77
+ if (!config.storkFeederId) {
78
+ continue;
79
+ }
80
+ moduleToAsset.set(normalizeCoinType(config.coinType), symbolKey.replace('/', ''));
81
+ }
82
+ const assets = new Set();
83
+ for (const token of tokens) {
84
+ const module = coins[token]?.module;
85
+ if (!module) {
86
+ continue;
87
+ }
88
+ const asset = moduleToAsset.get(normalizeCoinType(module));
89
+ if (asset) {
90
+ assets.add(asset);
91
+ }
92
+ }
93
+ return [...assets];
94
+ }
95
+ export function toUpdateBytes(raw) {
96
+ return raw instanceof Uint8Array ? Array.from(raw) : raw;
97
+ }
98
+ /**
99
+ * PTB step 0: verify a Pyth Pro leEcdsa update on-chain.
100
+ * Returns the verified `pyth_lazer::update_v2::Update` object.
101
+ */
102
+ export function parseAndVerifyPythProUpdate(tx, config, rawUpdateBytes) {
103
+ const [pythProUpdate] = tx.moveCall({
104
+ target: `${config.pythLazer.package}::pyth_lazer::parse_and_verify_le_ecdsa_update_v2`,
105
+ arguments: [
106
+ tx.object(config.pythLazer.state),
107
+ tx.object(SUI_CLOCK_OBJECT_ID),
108
+ tx.pure.vector('u8', toUpdateBytes(rawUpdateBytes)),
109
+ ],
110
+ });
111
+ return pythProUpdate;
112
+ }
113
+ export function buildOracleInputs(tx, config, pythProUpdate) {
114
+ return {
115
+ pythProUpdate,
116
+ storkState: tx.object(config.storkState),
117
+ oracleRegistry: tx.object(config.oracleRegistry),
118
+ clock: tx.object(SUI_CLOCK_OBJECT_ID),
119
+ };
120
+ }
121
+ /** Pyth Pro + Stork objects: `[pythProUpdate, storkState, oracleRegistry]`. */
122
+ export function oracleArgsStandard(oracle) {
123
+ return [oracle.pythProUpdate, oracle.storkState, oracle.oracleRegistry];
124
+ }
125
+ /** `[pythProUpdate, storkState, oracleRegistry, clock]` — for public fns that take clock after oracle args. */
126
+ export function oracleArgsWithClock(oracle) {
127
+ return [...oracleArgsStandard(oracle), oracle.clock];
128
+ }
129
+ export function oracleArgsAlt(oracle) {
130
+ return [oracle.oracleRegistry, oracle.storkState, oracle.pythProUpdate];
131
+ }
132
+ export function buildOracleInputsAlt(oracle) {
133
+ return {
134
+ oracleRegistry: oracle.oracleRegistry,
135
+ storkState: oracle.storkState,
136
+ pythProUpdate: oracle.pythProUpdate,
137
+ };
138
+ }
139
+ /**
140
+ * Fetch leEcdsa update bytes via kronos REST (`/pyth-pro/latest-price?includeUpdateBytes=true`).
141
+ */
142
+ export function fetchPythProUpdateBytes(kronosUrl, feedIds, options) {
143
+ return fetchPythProUpdateBytesFromKronos(kronosUrl, feedIds, options);
144
+ }
145
+ /** create_vaults_valuation + valuate_vault_v2 for each vault. */
146
+ export function valuateVaultsV2(params) {
147
+ const { tx, upgradedPackage, lpType, market, vaults, coinModules, oracle } = params;
148
+ const vaultsValuation = tx.moveCall({
149
+ target: `${upgradedPackage}::market::create_vaults_valuation`,
150
+ typeArguments: [lpType],
151
+ arguments: [oracle.clock, tx.object(market)],
152
+ });
153
+ for (const key of Object.keys(vaults)) {
154
+ const vault = vaults[key];
155
+ tx.moveCall({
156
+ target: `${upgradedPackage}::market::valuate_vault_v2`,
157
+ typeArguments: [lpType, coinModules[key].module],
158
+ arguments: [
159
+ tx.object(market),
160
+ tx.object(vault.reservingFeeModel),
161
+ ...oracleArgsWithClock(oracle),
162
+ vaultsValuation,
163
+ ],
164
+ });
165
+ }
166
+ return vaultsValuation;
167
+ }
168
+ /** create_symbols_valuation + valuate_symbol_v2 for each symbol. */
169
+ export function valuateSymbolsV2(params) {
170
+ const { tx, upgradedPackage, marketPackage, lpType, market, symbols, coinModules, oracle } = params;
171
+ const symbolsValuation = tx.moveCall({
172
+ target: `${upgradedPackage}::market::create_symbols_valuation`,
173
+ typeArguments: [lpType],
174
+ arguments: [oracle.clock, tx.object(market)],
175
+ });
176
+ for (const key of Object.keys(symbols)) {
177
+ const [direction, token] = parseSymbolKey(key);
178
+ const symbol = symbols[key];
179
+ tx.moveCall({
180
+ target: `${upgradedPackage}::market::valuate_symbol_v2`,
181
+ typeArguments: [
182
+ lpType,
183
+ coinModules[token].module,
184
+ `${marketPackage}::market::${direction.toUpperCase()}`,
185
+ ],
186
+ arguments: [
187
+ tx.object(market),
188
+ tx.object(symbol.fundingFeeModel),
189
+ ...oracleArgsWithClock(oracle),
190
+ symbolsValuation,
191
+ ],
192
+ });
193
+ }
194
+ return symbolsValuation;
195
+ }
196
+ //# sourceMappingURL=oraclePro.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oraclePro.mjs","sourceRoot":"","sources":["../src/oraclePro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ /** Kronos Pyth Pro (Pyth Lazer) REST + WebSocket client. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PythProStreamClient = void 0;
5
+ exports.hexToBytes = hexToBytes;
6
+ exports.apiBaseUrlToPythProWsUrl = apiBaseUrlToPythProWsUrl;
7
+ exports.getLatestPythProPrices = getLatestPythProPrices;
8
+ exports.fetchPythProUpdateBytesFromKronos = fetchPythProUpdateBytesFromKronos;
9
+ function hexToBytes(hex) {
10
+ const normalized = hex.startsWith('0x') ? hex.slice(2) : hex;
11
+ const bytes = new Uint8Array(normalized.length / 2);
12
+ for (let i = 0; i < normalized.length; i += 2) {
13
+ bytes[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16);
14
+ }
15
+ return bytes;
16
+ }
17
+ /** Derive ws(s):// stream URL from kronos http(s) base URL. */
18
+ function apiBaseUrlToPythProWsUrl(baseUrl) {
19
+ const url = new URL(baseUrl);
20
+ url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
21
+ url.pathname = '/pyth-pro/stream';
22
+ url.search = '';
23
+ url.hash = '';
24
+ return url.toString();
25
+ }
26
+ function normalizeBaseUrl(baseUrl) {
27
+ return baseUrl.replace(/\/+$/, '');
28
+ }
29
+ function parseLatestPriceResponse(json) {
30
+ if (!json.success || !json.data) {
31
+ throw new Error(json.message ?? 'Pyth Pro latest-price request failed');
32
+ }
33
+ return json.data;
34
+ }
35
+ /**
36
+ * Fetch latest Pyth Pro prices from kronos REST (`GET` or `POST /pyth-pro/latest-price`).
37
+ */
38
+ async function getLatestPythProPrices(baseUrl, options) {
39
+ const { priceFeedIds, channel, includeEmaPrice, includeUpdateBytes } = options;
40
+ if (priceFeedIds.length === 0) {
41
+ throw new Error('priceFeedIds is required');
42
+ }
43
+ const root = normalizeBaseUrl(baseUrl);
44
+ if (priceFeedIds.length <= 20) {
45
+ const params = new URLSearchParams();
46
+ params.set('priceFeedIds', priceFeedIds.join(','));
47
+ if (channel) {
48
+ params.set('channel', channel);
49
+ }
50
+ if (includeEmaPrice) {
51
+ params.set('includeEmaPrice', 'true');
52
+ }
53
+ if (includeUpdateBytes) {
54
+ params.set('includeUpdateBytes', 'true');
55
+ }
56
+ const res = await fetch(`${root}/pyth-pro/latest-price?${params}`);
57
+ const json = await res.json();
58
+ if (!res.ok && json.message) {
59
+ throw new Error(json.message);
60
+ }
61
+ return parseLatestPriceResponse(json);
62
+ }
63
+ const res = await fetch(`${root}/pyth-pro/latest-price`, {
64
+ method: 'POST',
65
+ headers: { 'Content-Type': 'application/json' },
66
+ body: JSON.stringify({
67
+ priceFeedIds,
68
+ channel,
69
+ includeEmaPrice: includeEmaPrice ?? false,
70
+ includeUpdateBytes: includeUpdateBytes ?? false,
71
+ }),
72
+ });
73
+ const json = await res.json();
74
+ if (!res.ok && json.message) {
75
+ throw new Error(json.message);
76
+ }
77
+ return parseLatestPriceResponse(json);
78
+ }
79
+ /**
80
+ * Fetch leEcdsa update bytes via kronos (for on-chain `parse_and_verify_le_ecdsa_update_v2`).
81
+ */
82
+ async function fetchPythProUpdateBytesFromKronos(baseUrl, feedIds, options) {
83
+ const data = await getLatestPythProPrices(baseUrl, {
84
+ priceFeedIds: feedIds,
85
+ channel: options?.channel,
86
+ includeEmaPrice: options?.includeEmaPrice,
87
+ includeUpdateBytes: true,
88
+ });
89
+ if (!data.leEcdsaHex) {
90
+ throw new Error('No leEcdsaHex in kronos Pyth Pro response (set includeUpdateBytes: true)');
91
+ }
92
+ return hexToBytes(data.leEcdsaHex);
93
+ }
94
+ /**
95
+ * WebSocket client for kronos `/pyth-pro/stream`.
96
+ * Multiplexes subscriptions and re-subscribes after reconnect.
97
+ */
98
+ class PythProStreamClient {
99
+ constructor(baseUrl, options) {
100
+ this.ws = null;
101
+ this.connectPromise = null;
102
+ this.reconnectTimer = null;
103
+ this.pingTimer = null;
104
+ this.closedByUser = false;
105
+ this.subscriptions = new Map();
106
+ this.updateHandlers = new Map();
107
+ this.messageHandlers = new Set();
108
+ this.wsUrl = options?.wsUrl ?? apiBaseUrlToPythProWsUrl(baseUrl);
109
+ this.autoReconnect = options?.autoReconnect ?? true;
110
+ this.reconnectDelayMs = options?.reconnectDelayMs ?? 1000;
111
+ this.pingIntervalMs = options?.pingIntervalMs ?? 30000;
112
+ this.WebSocketImpl = options?.WebSocketImpl ?? WebSocket;
113
+ }
114
+ /** Open the WebSocket and wait for the server `connected` message (or socket open). */
115
+ connect() {
116
+ if (this.ws?.readyState === WebSocket.OPEN) {
117
+ return Promise.resolve();
118
+ }
119
+ if (this.connectPromise) {
120
+ return this.connectPromise;
121
+ }
122
+ this.closedByUser = false;
123
+ this.connectPromise = new Promise((resolve, reject) => {
124
+ const ws = new this.WebSocketImpl(this.wsUrl);
125
+ this.ws = ws;
126
+ const onOpen = () => {
127
+ this.startPing();
128
+ this.resubscribeAll();
129
+ resolve();
130
+ };
131
+ const onError = (event) => {
132
+ if (ws.readyState !== WebSocket.OPEN) {
133
+ reject(new Error(`Pyth Pro WebSocket connection failed: ${this.wsUrl}`));
134
+ }
135
+ this.emitMessage({ type: 'error', message: String(event) });
136
+ };
137
+ ws.addEventListener('open', onOpen, { once: true });
138
+ ws.addEventListener('error', onError, { once: true });
139
+ ws.addEventListener('message', (event) => {
140
+ this.handleMessage(String(event.data));
141
+ });
142
+ ws.addEventListener('close', () => {
143
+ this.stopPing();
144
+ this.ws = null;
145
+ this.connectPromise = null;
146
+ if (!this.closedByUser && this.autoReconnect) {
147
+ this.scheduleReconnect();
148
+ }
149
+ });
150
+ });
151
+ return this.connectPromise;
152
+ }
153
+ disconnect() {
154
+ this.closedByUser = true;
155
+ this.clearReconnect();
156
+ this.stopPing();
157
+ if (this.ws) {
158
+ this.ws.close();
159
+ this.ws = null;
160
+ }
161
+ this.connectPromise = null;
162
+ }
163
+ /**
164
+ * Subscribe to live price updates. Returns an unsubscribe function.
165
+ * `onUpdate` is called for each `streamUpdated` matching `subscriptionId`.
166
+ */
167
+ subscribe(options, onUpdate) {
168
+ this.subscriptions.set(options.subscriptionId, options);
169
+ let handlers = this.updateHandlers.get(options.subscriptionId);
170
+ if (!handlers) {
171
+ handlers = new Set();
172
+ this.updateHandlers.set(options.subscriptionId, handlers);
173
+ }
174
+ handlers.add(onUpdate);
175
+ void this.connect().then(() => {
176
+ this.send({ type: 'subscribe', ...options });
177
+ });
178
+ return () => {
179
+ this.unsubscribe(options.subscriptionId, onUpdate);
180
+ };
181
+ }
182
+ /** Remove one handler or the whole subscription when `onUpdate` is omitted. */
183
+ unsubscribe(subscriptionId, onUpdate) {
184
+ const handlers = this.updateHandlers.get(subscriptionId);
185
+ if (onUpdate && handlers) {
186
+ handlers.delete(onUpdate);
187
+ if (handlers.size > 0) {
188
+ return;
189
+ }
190
+ }
191
+ this.updateHandlers.delete(subscriptionId);
192
+ this.subscriptions.delete(subscriptionId);
193
+ if (this.ws?.readyState === WebSocket.OPEN) {
194
+ this.send({ type: 'unsubscribe', subscriptionId });
195
+ }
196
+ }
197
+ onMessage(handler) {
198
+ this.messageHandlers.add(handler);
199
+ return () => {
200
+ this.messageHandlers.delete(handler);
201
+ };
202
+ }
203
+ send(message) {
204
+ if (this.ws?.readyState !== WebSocket.OPEN) {
205
+ return;
206
+ }
207
+ this.ws.send(JSON.stringify(message));
208
+ }
209
+ resubscribeAll() {
210
+ for (const sub of this.subscriptions.values()) {
211
+ this.send({ type: 'subscribe', ...sub });
212
+ }
213
+ }
214
+ scheduleReconnect() {
215
+ if (this.reconnectTimer) {
216
+ return;
217
+ }
218
+ this.reconnectTimer = setTimeout(() => {
219
+ this.reconnectTimer = null;
220
+ void this.connect().catch(() => {
221
+ this.scheduleReconnect();
222
+ });
223
+ }, this.reconnectDelayMs);
224
+ }
225
+ clearReconnect() {
226
+ if (this.reconnectTimer) {
227
+ clearTimeout(this.reconnectTimer);
228
+ this.reconnectTimer = null;
229
+ }
230
+ }
231
+ startPing() {
232
+ if (this.pingIntervalMs <= 0) {
233
+ return;
234
+ }
235
+ this.stopPing();
236
+ this.pingTimer = setInterval(() => {
237
+ this.send({ type: 'ping' });
238
+ }, this.pingIntervalMs);
239
+ }
240
+ stopPing() {
241
+ if (this.pingTimer) {
242
+ clearInterval(this.pingTimer);
243
+ this.pingTimer = null;
244
+ }
245
+ }
246
+ emitMessage(message) {
247
+ for (const handler of this.messageHandlers) {
248
+ handler(message);
249
+ }
250
+ }
251
+ handleMessage(raw) {
252
+ let message;
253
+ try {
254
+ message = JSON.parse(raw);
255
+ }
256
+ catch {
257
+ this.emitMessage({ type: 'error', message: `Invalid JSON: ${raw}` });
258
+ return;
259
+ }
260
+ this.emitMessage(message);
261
+ if (message.type === 'streamUpdated') {
262
+ const handlers = this.updateHandlers.get(message.subscriptionId);
263
+ if (handlers) {
264
+ for (const handler of handlers) {
265
+ handler({
266
+ subscriptionId: message.subscriptionId,
267
+ timestampUs: message.timestampUs,
268
+ priceFeeds: message.priceFeeds,
269
+ leEcdsaHex: message.leEcdsaHex,
270
+ });
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ exports.PythProStreamClient = PythProStreamClient;
277
+ //# sourceMappingURL=pythProClient.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pythProClient.cjs","sourceRoot":"","sources":["../src/pythProClient.ts"],"names":[],"mappings":";AAAA,4DAA4D;;;AAuE5D,gCAOC;AAGD,4DAOC;AAgBD,wDA+CC;AAKD,8EAeC;AApGD,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IAC5D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,+DAA+D;AAC/D,SAAgB,wBAAwB,CAAC,OAAe;IACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;IACzD,GAAG,CAAC,QAAQ,GAAG,kBAAkB,CAAA;IACjC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAA;IACf,GAAG,CAAC,IAAI,GAAG,EAAE,CAAA;IACb,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAA;AACvB,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAgC;IAChE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,sCAAsC,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAA;AAClB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,sBAAsB,CAC1C,OAAe,EACf,OAAuC;IAEvC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAA;IAC9E,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAEtC,IAAI,YAAY,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;QACpC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAChC,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;QACvC,CAAC;QACD,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,0BAA0B,MAAM,EAAE,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAgC,CAAA;QAC3D,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC;QACD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,wBAAwB,EAAE;QACvD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,YAAY;YACZ,OAAO;YACP,eAAe,EAAE,eAAe,IAAI,KAAK;YACzC,kBAAkB,EAAE,kBAAkB,IAAI,KAAK;SAChD,CAAC;KACH,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAgC,CAAA;IAC3D,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAA;AACvC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iCAAiC,CACrD,OAAe,EACf,OAAiB,EACjB,OAA6E;IAE7E,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE;QACjD,YAAY,EAAE,OAAO;QACrB,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,eAAe,EAAE,OAAO,EAAE,eAAe;QACzC,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAA;IACF,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAA;IAC7F,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AACpC,CAAC;AAkBD;;;GAGG;AACH,MAAa,mBAAmB;IAiB9B,YAAY,OAAe,EAAE,OAAqC;QAV1D,OAAE,GAAqB,IAAI,CAAA;QAC3B,mBAAc,GAAyB,IAAI,CAAA;QAC3C,mBAAc,GAAyC,IAAI,CAAA;QAC3D,cAAS,GAA0C,IAAI,CAAA;QACvD,iBAAY,GAAG,KAAK,CAAA;QAEX,kBAAa,GAAG,IAAI,GAAG,EAAsC,CAAA;QAC7D,mBAAc,GAAG,IAAI,GAAG,EAAoC,CAAA;QAC5D,oBAAe,GAAG,IAAI,GAAG,EAAwB,CAAA;QAGhE,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,wBAAwB,CAAC,OAAO,CAAC,CAAA;QAChE,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,IAAI,CAAA;QACnD,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAA;QACzD,IAAI,CAAC,cAAc,GAAG,OAAO,EAAE,cAAc,IAAI,KAAM,CAAA;QACvD,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,SAAS,CAAA;IAC1D,CAAC;IAED,uFAAuF;IACvF,OAAO;QACL,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAA;QAC5B,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpD,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC7C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;YAEZ,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,IAAI,CAAC,SAAS,EAAE,CAAA;gBAChB,IAAI,CAAC,cAAc,EAAE,CAAA;gBACrB,OAAO,EAAE,CAAA;YACX,CAAC,CAAA;YAED,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;gBAC/B,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;gBAC1E,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAC7D,CAAC,CAAA;YAED,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACnD,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACrD,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YACxC,CAAC,CAAC,CAAA;YACF,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAChC,IAAI,CAAC,QAAQ,EAAE,CAAA;gBACf,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;gBACd,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;gBAC1B,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAA;gBAC1B,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,UAAU;QACR,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,IAAI,CAAC,cAAc,EAAE,CAAA;QACrB,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;YACf,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;QAChB,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;IAC5B,CAAC;IAED;;;OAGG;IACH,SAAS,CACP,OAAmC,EACnC,QAA6B;QAE7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;QAEvD,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;QAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;YACpB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;QAC3D,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAEtB,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;QACpD,CAAC,CAAA;IACH,CAAC;IAED,+EAA+E;IAC/E,WAAW,CAAC,cAAsB,EAAE,QAA8B;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACxD,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACzB,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YACzB,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QAC1C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAA;QACzC,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,OAA6B;QACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACjC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACtC,CAAC,CAAA;IACH,CAAC;IAEO,IAAI,CAAC,OAAmC;QAC9C,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAM;QACR,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;IACvC,CAAC;IAEO,cAAc;QACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;YAC1B,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAA;YAC1B,CAAC,CAAC,CAAA;QACJ,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC3B,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC5B,CAAC;IACH,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAM;QACR,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAA;QACf,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;QAC7B,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IACzB,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACvB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,OAAmC;QACrD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,OAAO,CAAC,OAAO,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,GAAW;QAC/B,IAAI,OAAmC,CAAA;QACvC,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+B,CAAA;QACzD,CAAC;QACD,MAAM,CAAC;YACL,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,EAAE,EAAE,CAAC,CAAA;YACpE,OAAM;QACR,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAEzB,IAAI,OAAO,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;YAChE,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,OAAO,CAAC;wBACN,cAAc,EAAE,OAAO,CAAC,cAAc;wBACtC,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;qBAC/B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AApND,kDAoNC"}
@@ -0,0 +1,143 @@
1
+ /** Kronos Pyth Pro (Pyth Lazer) REST + WebSocket client. */
2
+ export type PythProChannel = 'real_time' | 'fixed_rate@50ms' | 'fixed_rate@200ms' | 'fixed_rate@1000ms';
3
+ export interface PythProPriceFeed {
4
+ priceFeedId: number;
5
+ price: string;
6
+ exponent: number;
7
+ confidence: string;
8
+ feedUpdateTimestamp: string;
9
+ priceUsd: number;
10
+ emaPrice?: string | null;
11
+ emaPriceUsd?: number | null;
12
+ }
13
+ export interface PythProLatestPriceData {
14
+ timestampUs: string;
15
+ priceFeeds: PythProPriceFeed[];
16
+ leEcdsaHex: string | null;
17
+ }
18
+ export interface PythProLatestPriceResponse {
19
+ success: boolean;
20
+ timestamp?: string;
21
+ data?: PythProLatestPriceData;
22
+ message?: string;
23
+ }
24
+ export interface IGetLatestPythProPricesOptions {
25
+ priceFeedIds: number[];
26
+ channel?: PythProChannel;
27
+ includeEmaPrice?: boolean;
28
+ includeUpdateBytes?: boolean;
29
+ /** Override kronos REST base URL (default: `DEFAULT_API_ENDPOINT` or SDK instance apiEndpoint). */
30
+ kronosUrl?: string;
31
+ }
32
+ export interface PythProStreamUpdate {
33
+ subscriptionId: number;
34
+ timestampUs: string;
35
+ priceFeeds: PythProPriceFeed[];
36
+ leEcdsaHex?: string | null;
37
+ }
38
+ export interface IPythProStreamSubscription {
39
+ subscriptionId: number;
40
+ priceFeedIds: number[];
41
+ channel?: PythProChannel;
42
+ includeEmaPrice?: boolean;
43
+ includeUpdateBytes?: boolean;
44
+ }
45
+ export type PythProStreamServerMessage = {
46
+ type: 'connected';
47
+ message?: string;
48
+ } | {
49
+ type: 'subscribed';
50
+ subscriptionId: number;
51
+ } | {
52
+ type: 'unsubscribed';
53
+ subscriptionId: number;
54
+ } | {
55
+ type: 'streamUpdated';
56
+ } & PythProStreamUpdate | {
57
+ type: 'subscriptionError';
58
+ subscriptionId: number;
59
+ message?: string;
60
+ } | {
61
+ type: 'subscribedWithInvalidFeedIdsIgnored';
62
+ subscriptionId: number;
63
+ ignoredFeedIds?: number[];
64
+ } | {
65
+ type: 'error';
66
+ message?: string;
67
+ } | {
68
+ type: 'pong';
69
+ };
70
+ export type PythProStreamClientMessage = {
71
+ type: 'subscribe';
72
+ } & IPythProStreamSubscription | {
73
+ type: 'unsubscribe';
74
+ subscriptionId: number;
75
+ } | {
76
+ type: 'ping';
77
+ };
78
+ export declare function hexToBytes(hex: string): Uint8Array;
79
+ /** Derive ws(s):// stream URL from kronos http(s) base URL. */
80
+ export declare function apiBaseUrlToPythProWsUrl(baseUrl: string): string;
81
+ /**
82
+ * Fetch latest Pyth Pro prices from kronos REST (`GET` or `POST /pyth-pro/latest-price`).
83
+ */
84
+ export declare function getLatestPythProPrices(baseUrl: string, options: IGetLatestPythProPricesOptions): Promise<PythProLatestPriceData>;
85
+ /**
86
+ * Fetch leEcdsa update bytes via kronos (for on-chain `parse_and_verify_le_ecdsa_update_v2`).
87
+ */
88
+ export declare function fetchPythProUpdateBytesFromKronos(baseUrl: string, feedIds: number[], options?: Pick<IGetLatestPythProPricesOptions, 'channel' | 'includeEmaPrice'>): Promise<Uint8Array>;
89
+ export interface IPythProStreamClientOptions {
90
+ /** Defaults to apiBaseUrlToPythProWsUrl(baseUrl). */
91
+ wsUrl?: string;
92
+ /** Reconnect after disconnect. Default true. */
93
+ autoReconnect?: boolean;
94
+ /** Initial reconnect delay in ms. Default 1000. */
95
+ reconnectDelayMs?: number;
96
+ /** Ping interval in ms. Default 30000. Set 0 to disable. */
97
+ pingIntervalMs?: number;
98
+ /** Custom WebSocket constructor (Node test mocks, etc.). */
99
+ WebSocketImpl?: typeof WebSocket;
100
+ }
101
+ type StreamUpdateHandler = (update: PythProStreamUpdate) => void;
102
+ type StreamMessageHandler = (message: PythProStreamServerMessage) => void;
103
+ /**
104
+ * WebSocket client for kronos `/pyth-pro/stream`.
105
+ * Multiplexes subscriptions and re-subscribes after reconnect.
106
+ */
107
+ export declare class PythProStreamClient {
108
+ private readonly wsUrl;
109
+ private readonly autoReconnect;
110
+ private readonly reconnectDelayMs;
111
+ private readonly pingIntervalMs;
112
+ private readonly WebSocketImpl;
113
+ private ws;
114
+ private connectPromise;
115
+ private reconnectTimer;
116
+ private pingTimer;
117
+ private closedByUser;
118
+ private readonly subscriptions;
119
+ private readonly updateHandlers;
120
+ private readonly messageHandlers;
121
+ constructor(baseUrl: string, options?: IPythProStreamClientOptions);
122
+ /** Open the WebSocket and wait for the server `connected` message (or socket open). */
123
+ connect(): Promise<void>;
124
+ disconnect(): void;
125
+ /**
126
+ * Subscribe to live price updates. Returns an unsubscribe function.
127
+ * `onUpdate` is called for each `streamUpdated` matching `subscriptionId`.
128
+ */
129
+ subscribe(options: IPythProStreamSubscription, onUpdate: StreamUpdateHandler): () => void;
130
+ /** Remove one handler or the whole subscription when `onUpdate` is omitted. */
131
+ unsubscribe(subscriptionId: number, onUpdate?: StreamUpdateHandler): void;
132
+ onMessage(handler: StreamMessageHandler): () => void;
133
+ private send;
134
+ private resubscribeAll;
135
+ private scheduleReconnect;
136
+ private clearReconnect;
137
+ private startPing;
138
+ private stopPing;
139
+ private emitMessage;
140
+ private handleMessage;
141
+ }
142
+ export {};
143
+ //# sourceMappingURL=pythProClient.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pythProClient.d.cts","sourceRoot":"","sources":["../src/pythProClient.ts"],"names":[],"mappings":"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"}