@zofai/zo-sdk 0.2.14 → 0.2.16
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/dist/abstract/BaseAPI.cjs +5 -0
- package/dist/abstract/BaseAPI.cjs.map +1 -1
- package/dist/abstract/BaseAPI.d.cts +2 -1
- package/dist/abstract/BaseAPI.d.cts.map +1 -1
- package/dist/abstract/BaseAPI.d.mts +2 -1
- package/dist/abstract/BaseAPI.d.mts.map +1 -1
- package/dist/abstract/BaseAPI.mjs +5 -0
- package/dist/abstract/BaseAPI.mjs.map +1 -1
- package/dist/abstract/BaseDataAPI.cjs +1 -1
- package/dist/abstract/BaseDataAPI.cjs.map +1 -1
- package/dist/abstract/BaseDataAPI.mjs +1 -1
- package/dist/abstract/BaseDataAPI.mjs.map +1 -1
- package/dist/consts/deployments-usdz-mainnet.json +1 -1
- package/dist/consts/deployments-zo-oracle-mainnet.json +329 -0
- package/dist/consts/index.cjs +35 -1
- package/dist/consts/index.cjs.map +1 -1
- package/dist/consts/index.d.cts +45 -0
- package/dist/consts/index.d.cts.map +1 -1
- package/dist/consts/index.d.mts +45 -0
- package/dist/consts/index.d.mts.map +1 -1
- package/dist/consts/index.mjs +31 -0
- package/dist/consts/index.mjs.map +1 -1
- package/dist/data.cjs +1 -1
- package/dist/data.cjs.map +1 -1
- package/dist/data.mjs +1 -1
- package/dist/data.mjs.map +1 -1
- package/dist/implementations/SLPAPI.cjs +3 -2
- package/dist/implementations/SLPAPI.cjs.map +1 -1
- package/dist/implementations/SLPAPI.d.cts.map +1 -1
- package/dist/implementations/SLPAPI.d.mts.map +1 -1
- package/dist/implementations/SLPAPI.mjs +3 -2
- package/dist/implementations/SLPAPI.mjs.map +1 -1
- package/dist/implementations/USDZAPI.cjs +531 -81
- package/dist/implementations/USDZAPI.cjs.map +1 -1
- package/dist/implementations/USDZAPI.d.cts +62 -0
- package/dist/implementations/USDZAPI.d.cts.map +1 -1
- package/dist/implementations/USDZAPI.d.mts +62 -0
- package/dist/implementations/USDZAPI.d.mts.map +1 -1
- package/dist/implementations/USDZAPI.mjs +532 -82
- package/dist/implementations/USDZAPI.mjs.map +1 -1
- package/dist/implementations/USDZDataAPI.cjs +38 -0
- package/dist/implementations/USDZDataAPI.cjs.map +1 -1
- package/dist/implementations/USDZDataAPI.d.cts +16 -0
- package/dist/implementations/USDZDataAPI.d.cts.map +1 -1
- package/dist/implementations/USDZDataAPI.d.mts +16 -0
- package/dist/implementations/USDZDataAPI.d.mts.map +1 -1
- package/dist/implementations/USDZDataAPI.mjs +38 -0
- package/dist/implementations/USDZDataAPI.mjs.map +1 -1
- package/dist/implementations/ZBTCVCAPI.cjs +3 -1
- package/dist/implementations/ZBTCVCAPI.cjs.map +1 -1
- package/dist/implementations/ZBTCVCAPI.d.cts.map +1 -1
- package/dist/implementations/ZBTCVCAPI.d.mts.map +1 -1
- package/dist/implementations/ZBTCVCAPI.mjs +3 -1
- package/dist/implementations/ZBTCVCAPI.mjs.map +1 -1
- package/dist/implementations/ZLPAPI.cjs +3 -2
- package/dist/implementations/ZLPAPI.cjs.map +1 -1
- package/dist/implementations/ZLPAPI.d.cts.map +1 -1
- package/dist/implementations/ZLPAPI.d.mts.map +1 -1
- package/dist/implementations/ZLPAPI.mjs +3 -2
- package/dist/implementations/ZLPAPI.mjs.map +1 -1
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces/base.d.cts +20 -2
- package/dist/interfaces/base.d.cts.map +1 -1
- package/dist/interfaces/base.d.mts +20 -2
- package/dist/interfaces/base.d.mts.map +1 -1
- package/dist/interfaces/usdz.d.cts +19 -0
- package/dist/interfaces/usdz.d.cts.map +1 -1
- package/dist/interfaces/usdz.d.mts +19 -0
- package/dist/interfaces/usdz.d.mts.map +1 -1
- package/dist/oracle.cjs +119 -1
- package/dist/oracle.cjs.map +1 -1
- package/dist/oracle.d.cts +57 -1
- package/dist/oracle.d.cts.map +1 -1
- package/dist/oracle.d.mts +57 -1
- package/dist/oracle.d.mts.map +1 -1
- package/dist/oracle.mjs +120 -2
- package/dist/oracle.mjs.map +1 -1
- package/dist/oraclePro.cjs +211 -0
- package/dist/oraclePro.cjs.map +1 -0
- package/dist/oraclePro.d.cts +90 -0
- package/dist/oraclePro.d.cts.map +1 -0
- package/dist/oraclePro.d.mts +90 -0
- package/dist/oraclePro.d.mts.map +1 -0
- package/dist/oraclePro.mjs +194 -0
- package/dist/oraclePro.mjs.map +1 -0
- package/dist/pythProClient.cjs +277 -0
- package/dist/pythProClient.cjs.map +1 -0
- package/dist/pythProClient.d.cts +143 -0
- package/dist/pythProClient.d.cts.map +1 -0
- package/dist/pythProClient.d.mts +143 -0
- package/dist/pythProClient.d.mts.map +1 -0
- package/dist/pythProClient.mjs +269 -0
- package/dist/pythProClient.mjs.map +1 -0
- package/dist/storkClient.cjs +217 -0
- package/dist/storkClient.cjs.map +1 -0
- package/dist/storkClient.d.cts +90 -0
- package/dist/storkClient.d.cts.map +1 -0
- package/dist/storkClient.d.mts +90 -0
- package/dist/storkClient.d.mts.map +1 -0
- package/dist/storkClient.mjs +208 -0
- package/dist/storkClient.mjs.map +1 -0
- package/dist/storkOracle.cjs +61 -0
- package/dist/storkOracle.cjs.map +1 -0
- package/dist/storkOracle.d.cts +21 -0
- package/dist/storkOracle.d.cts.map +1 -0
- package/dist/storkOracle.d.mts +21 -0
- package/dist/storkOracle.d.mts.map +1 -0
- package/dist/storkOracle.mjs +56 -0
- package/dist/storkOracle.mjs.map +1 -0
- package/package.json +1 -1
- package/src/abstract/BaseAPI.ts +11 -0
- package/src/abstract/BaseDataAPI.ts +1 -1
- package/src/consts/deployments-usdz-mainnet.json +1 -1
- package/src/consts/deployments-zo-oracle-mainnet.json +329 -0
- package/src/consts/index.ts +80 -0
- package/src/data.ts +1 -1
- package/src/implementations/SLPAPI.ts +5 -5
- package/src/implementations/USDZAPI.ts +906 -107
- package/src/implementations/USDZDataAPI.ts +42 -0
- package/src/implementations/ZBTCVCAPI.ts +6 -4
- package/src/implementations/ZLPAPI.ts +6 -5
- package/src/index.ts +3 -0
- package/src/interfaces/base.ts +55 -1
- package/src/interfaces/usdz.ts +170 -0
- package/src/oracle.ts +222 -1
- package/src/oraclePro.ts +309 -0
- package/src/pythProClient.ts +406 -0
- package/src/storkClient.ts +328 -0
- package/src/storkOracle.ts +82 -0
- package/tests/pythProClient.test.ts +155 -0
- package/tests/storkClient.test.ts +316 -0
|
@@ -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":"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"}
|
|
@@ -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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"}
|
|
@@ -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.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pythProClient.d.mts","sourceRoot":"","sources":["../src/pythProClient.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAE5D,MAAM,MAAM,cAAc,GACpB,WAAW,GACX,iBAAiB,GACjB,kBAAkB,GAClB,mBAAmB,CAAA;AAEzB,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,gBAAgB,EAAE,CAAA;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,sBAAsB,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,mGAAmG;IACnG,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,gBAAgB,EAAE,CAAA;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,MAAM,WAAW,0BAA0B;IACzC,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,MAAM,0BAA0B,GAChC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GAAG,mBAAmB,GAC/C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,qCAAqC,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAClG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtB,MAAM,MAAM,0BAA0B,GAChC;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG,0BAA0B,GAClD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtB,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOlD;AAED,+DAA+D;AAC/D,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOhE;AAaD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,sBAAsB,CAAC,CA4CjC;AAED;;GAEG;AACH,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,IAAI,CAAC,8BAA8B,EAAE,SAAS,GAAG,iBAAiB,CAAC,GAC5E,OAAO,CAAC,UAAU,CAAC,CAWrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gDAAgD;IAChD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,OAAO,SAAS,CAAA;CACjC;AAED,KAAK,mBAAmB,GAAG,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAA;AAChE,KAAK,oBAAoB,GAAG,CAAC,OAAO,EAAE,0BAA0B,KAAK,IAAI,CAAA;AAEzE;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEhD,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,YAAY,CAAQ;IAE5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgD;IAC9E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8C;IAC7E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkC;gBAEtD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,2BAA2B;IAQlE,uFAAuF;IACvF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CxB,UAAU,IAAI,IAAI;IAWlB;;;OAGG;IACH,SAAS,CACP,OAAO,EAAE,0BAA0B,EACnC,QAAQ,EAAE,mBAAmB,GAC5B,MAAM,IAAI;IAmBb,+EAA+E;IAC/E,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,mBAAmB,GAAG,IAAI;IAgBzE,SAAS,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAOpD,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,aAAa;CA0BtB"}
|