@veridex/sdk 1.0.0-beta.9 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/LICENSE +170 -21
  2. package/README.md +574 -117
  3. package/dist/EVMClient-DtqvdfUP.d.mts +376 -0
  4. package/dist/auth/prepareAuth.d.mts +25 -0
  5. package/dist/auth/prepareAuth.js +2406 -0
  6. package/dist/auth/prepareAuth.js.map +1 -0
  7. package/dist/auth/prepareAuth.mjs +151 -0
  8. package/dist/auth/prepareAuth.mjs.map +1 -0
  9. package/dist/chains/aptos/index.d.mts +6 -5
  10. package/dist/chains/aptos/index.js +66 -39
  11. package/dist/chains/aptos/index.js.map +1 -1
  12. package/dist/chains/aptos/index.mjs +5 -547
  13. package/dist/chains/aptos/index.mjs.map +1 -1
  14. package/dist/chains/avalanche/index.d.mts +137 -0
  15. package/dist/chains/avalanche/index.js +1555 -0
  16. package/dist/chains/avalanche/index.js.map +1 -0
  17. package/dist/chains/avalanche/index.mjs +10 -0
  18. package/dist/chains/avalanche/index.mjs.map +1 -0
  19. package/dist/chains/evm/index.d.mts +5 -3
  20. package/dist/chains/evm/index.js +165 -3
  21. package/dist/chains/evm/index.js.map +1 -1
  22. package/dist/chains/evm/index.mjs +8 -1200
  23. package/dist/chains/evm/index.mjs.map +1 -1
  24. package/dist/chains/solana/index.d.mts +1 -1
  25. package/dist/chains/solana/index.js.map +1 -1
  26. package/dist/chains/solana/index.mjs +4 -486
  27. package/dist/chains/solana/index.mjs.map +1 -1
  28. package/dist/chains/stacks/index.d.mts +559 -0
  29. package/dist/chains/stacks/index.js +1207 -0
  30. package/dist/chains/stacks/index.js.map +1 -0
  31. package/dist/chains/stacks/index.mjs +71 -0
  32. package/dist/chains/stacks/index.mjs.map +1 -0
  33. package/dist/chains/starknet/index.d.mts +3 -3
  34. package/dist/chains/starknet/index.js.map +1 -1
  35. package/dist/chains/starknet/index.mjs +5 -503
  36. package/dist/chains/starknet/index.mjs.map +1 -1
  37. package/dist/chains/sui/index.d.mts +2 -2
  38. package/dist/chains/sui/index.js.map +1 -1
  39. package/dist/chains/sui/index.mjs +5 -529
  40. package/dist/chains/sui/index.mjs.map +1 -1
  41. package/dist/chunk-5T6KPH7A.mjs +1082 -0
  42. package/dist/chunk-5T6KPH7A.mjs.map +1 -0
  43. package/dist/chunk-72ZA3OYQ.mjs +20 -0
  44. package/dist/chunk-72ZA3OYQ.mjs.map +1 -0
  45. package/dist/chunk-EFIURACP.mjs +438 -0
  46. package/dist/chunk-EFIURACP.mjs.map +1 -0
  47. package/dist/chunk-F3YAGZSW.mjs +269 -0
  48. package/dist/chunk-F3YAGZSW.mjs.map +1 -0
  49. package/dist/chunk-GWJRKDSA.mjs +549 -0
  50. package/dist/chunk-GWJRKDSA.mjs.map +1 -0
  51. package/dist/chunk-M3MM4YMF.mjs +417 -0
  52. package/dist/chunk-M3MM4YMF.mjs.map +1 -0
  53. package/dist/chunk-N4A2RMUN.mjs +216 -0
  54. package/dist/chunk-N4A2RMUN.mjs.map +1 -0
  55. package/dist/chunk-NUWSMJFJ.mjs +179 -0
  56. package/dist/chunk-NUWSMJFJ.mjs.map +1 -0
  57. package/dist/chunk-OVMMTL6H.mjs +330 -0
  58. package/dist/chunk-OVMMTL6H.mjs.map +1 -0
  59. package/dist/chunk-PDHZ5X5O.mjs +565 -0
  60. package/dist/chunk-PDHZ5X5O.mjs.map +1 -0
  61. package/dist/chunk-PRHNGA4G.mjs +464 -0
  62. package/dist/chunk-PRHNGA4G.mjs.map +1 -0
  63. package/dist/chunk-Q5O3M5LP.mjs +422 -0
  64. package/dist/chunk-Q5O3M5LP.mjs.map +1 -0
  65. package/dist/chunk-QDO6NQ7P.mjs +840 -0
  66. package/dist/chunk-QDO6NQ7P.mjs.map +1 -0
  67. package/dist/chunk-QT4ZZ4GM.mjs +509 -0
  68. package/dist/chunk-QT4ZZ4GM.mjs.map +1 -0
  69. package/dist/chunk-USDA5JTN.mjs +1249 -0
  70. package/dist/chunk-USDA5JTN.mjs.map +1 -0
  71. package/dist/chunk-V636MIV3.mjs +52 -0
  72. package/dist/chunk-V636MIV3.mjs.map +1 -0
  73. package/dist/chunk-X7BZMSPQ.mjs +407 -0
  74. package/dist/chunk-X7BZMSPQ.mjs.map +1 -0
  75. package/dist/chunk-YCUJZ6Z7.mjs +829 -0
  76. package/dist/chunk-YCUJZ6Z7.mjs.map +1 -0
  77. package/dist/constants.d.mts +1 -1
  78. package/dist/constants.js +26 -12
  79. package/dist/constants.js.map +1 -1
  80. package/dist/constants.mjs +16 -375
  81. package/dist/constants.mjs.map +1 -1
  82. package/dist/index-DDalBhAm.d.mts +243 -0
  83. package/dist/index.d.mts +2508 -556
  84. package/dist/index.js +14576 -9628
  85. package/dist/index.js.map +1 -1
  86. package/dist/index.mjs +4108 -7840
  87. package/dist/index.mjs.map +1 -1
  88. package/dist/passkey.d.mts +182 -0
  89. package/dist/passkey.js +914 -0
  90. package/dist/passkey.js.map +1 -0
  91. package/dist/passkey.mjs +15 -0
  92. package/dist/passkey.mjs.map +1 -0
  93. package/dist/payload.js.map +1 -1
  94. package/dist/payload.mjs +25 -244
  95. package/dist/payload.mjs.map +1 -1
  96. package/dist/portfolio-V347KZOL.mjs +13 -0
  97. package/dist/portfolio-V347KZOL.mjs.map +1 -0
  98. package/dist/queries/index.js +145 -12
  99. package/dist/queries/index.js.map +1 -1
  100. package/dist/queries/index.mjs +14 -1496
  101. package/dist/queries/index.mjs.map +1 -1
  102. package/dist/{types-FJL7j6gQ.d.ts → types-B7V5VNbO.d.mts} +6 -2
  103. package/dist/{types-ChIsqCiw.d.mts → types-DP2CQT8p.d.mts} +12 -1
  104. package/dist/types.d.mts +16 -0
  105. package/dist/types.js.map +1 -1
  106. package/dist/utils.js +25 -11
  107. package/dist/utils.js.map +1 -1
  108. package/dist/utils.mjs +19 -371
  109. package/dist/utils.mjs.map +1 -1
  110. package/dist/wormhole.js.map +1 -1
  111. package/dist/wormhole.mjs +25 -397
  112. package/dist/wormhole.mjs.map +1 -1
  113. package/package.json +28 -3
  114. package/scripts/patch-noble-curves.js +78 -0
  115. package/dist/chains/aptos/index.d.ts +0 -145
  116. package/dist/chains/evm/index.d.ts +0 -5
  117. package/dist/chains/solana/index.d.ts +0 -116
  118. package/dist/chains/starknet/index.d.ts +0 -172
  119. package/dist/chains/sui/index.d.ts +0 -182
  120. package/dist/constants.d.ts +0 -150
  121. package/dist/index-0NXfbk0z.d.ts +0 -637
  122. package/dist/index-D0dLVjTA.d.mts +0 -637
  123. package/dist/index.d.ts +0 -3123
  124. package/dist/payload.d.ts +0 -125
  125. package/dist/queries/index.d.ts +0 -148
  126. package/dist/types-ChIsqCiw.d.ts +0 -565
  127. package/dist/types-FJL7j6gQ.d.mts +0 -172
  128. package/dist/types.d.ts +0 -407
  129. package/dist/utils.d.ts +0 -81
  130. package/dist/wormhole.d.ts +0 -167
@@ -0,0 +1,417 @@
1
+ import {
2
+ WORMHOLE_API
3
+ } from "./chunk-X7BZMSPQ.mjs";
4
+
5
+ // src/wormhole.ts
6
+ import { ethers } from "ethers";
7
+ var CONSISTENCY_LEVELS = {
8
+ /** Finalized - Wait for block finality (most secure) */
9
+ FINALIZED: 200,
10
+ /** Instant - No wait for finality (fastest, less secure) */
11
+ INSTANT: 201,
12
+ /** Safe - Standard finality (deprecated, use FINALIZED) */
13
+ SAFE: 200
14
+ };
15
+ var GUARDIAN_CONFIG = {
16
+ /** Total number of guardians in mainnet */
17
+ MAINNET_GUARDIAN_COUNT: 19,
18
+ /** Required signatures for mainnet quorum (13/19) */
19
+ MAINNET_QUORUM: 13,
20
+ /** Total number of guardians in testnet */
21
+ TESTNET_GUARDIAN_COUNT: 1,
22
+ /** Required signatures for testnet quorum */
23
+ TESTNET_QUORUM: 1
24
+ };
25
+ async function fetchVAA(emitterChain, emitterAddress, sequence, options = {}) {
26
+ const {
27
+ testnet = true,
28
+ maxRetries = 30,
29
+ retryDelayMs = 2e3,
30
+ onRetry
31
+ } = options;
32
+ const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;
33
+ const normalizedEmitter = normalizeEmitterAddress(emitterAddress);
34
+ const url = `${apiBase}/api/v1/vaas/${emitterChain}/${normalizedEmitter}/${sequence.toString()}`;
35
+ for (let i = 0; i < maxRetries; i++) {
36
+ try {
37
+ const response = await fetch(url);
38
+ if (response.ok) {
39
+ const data = await response.json();
40
+ if (data.data?.vaa) {
41
+ return data.data.vaa;
42
+ }
43
+ }
44
+ if (i < maxRetries - 1) {
45
+ onRetry?.(i + 1, maxRetries);
46
+ await sleep(retryDelayMs);
47
+ }
48
+ } catch {
49
+ if (i < maxRetries - 1) {
50
+ onRetry?.(i + 1, maxRetries);
51
+ await sleep(retryDelayMs);
52
+ }
53
+ }
54
+ }
55
+ throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);
56
+ }
57
+ async function fetchVAAByTxHash(txHash, options = {}) {
58
+ const {
59
+ testnet = true,
60
+ maxRetries = 60,
61
+ retryDelayMs = 3e3,
62
+ onRetry
63
+ } = options;
64
+ const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;
65
+ const cleanTxHash = txHash.replace(/^0x/, "");
66
+ const url = `${apiBase}/api/v1/operations?txHash=${cleanTxHash}`;
67
+ for (let i = 0; i < maxRetries; i++) {
68
+ try {
69
+ const response = await fetch(url);
70
+ if (response.ok) {
71
+ const data = await response.json();
72
+ if (data.operations && data.operations.length > 0) {
73
+ const operation = data.operations[0];
74
+ if (operation.vaa?.raw) {
75
+ return operation.vaa.raw;
76
+ }
77
+ }
78
+ }
79
+ if (i < maxRetries - 1) {
80
+ onRetry?.(i + 1, maxRetries);
81
+ await sleep(retryDelayMs);
82
+ }
83
+ } catch {
84
+ if (i < maxRetries - 1) {
85
+ onRetry?.(i + 1, maxRetries);
86
+ await sleep(retryDelayMs);
87
+ }
88
+ }
89
+ }
90
+ throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);
91
+ }
92
+ async function fetchVAAByTxHashFallback(txHash, options = {}) {
93
+ const {
94
+ testnet = true,
95
+ maxRetries = 30,
96
+ retryDelayMs = 2e3,
97
+ onRetry
98
+ } = options;
99
+ const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;
100
+ const url = `${apiBase}/api/v1/transactions/${txHash}`;
101
+ for (let i = 0; i < maxRetries; i++) {
102
+ try {
103
+ const response = await fetch(url);
104
+ if (response.ok) {
105
+ const data = await response.json();
106
+ if (data.data?.globalTx?.originTx?.vaaId) {
107
+ const vaaId = data.data.globalTx.originTx.vaaId;
108
+ const vaaUrl = `${apiBase}/api/v1/vaas/${vaaId}`;
109
+ const vaaResponse = await fetch(vaaUrl);
110
+ if (vaaResponse.ok) {
111
+ const vaaData = await vaaResponse.json();
112
+ if (vaaData.data?.vaa) {
113
+ return vaaData.data.vaa;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ if (i < maxRetries - 1) {
119
+ onRetry?.(i + 1, maxRetries);
120
+ await sleep(retryDelayMs);
121
+ }
122
+ } catch {
123
+ if (i < maxRetries - 1) {
124
+ onRetry?.(i + 1, maxRetries);
125
+ await sleep(retryDelayMs);
126
+ }
127
+ }
128
+ }
129
+ throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);
130
+ }
131
+ function parseVAA(vaaBase64) {
132
+ const vaaBytes = Buffer.from(vaaBase64, "base64");
133
+ return parseVAABytes(vaaBytes);
134
+ }
135
+ function parseVAABytes(vaaBytes) {
136
+ let offset = 0;
137
+ const version = vaaBytes.readUInt8(offset);
138
+ offset += 1;
139
+ const guardianSetIndex = vaaBytes.readUInt32BE(offset);
140
+ offset += 4;
141
+ const numSignatures = vaaBytes.readUInt8(offset);
142
+ offset += 1;
143
+ const signatures = [];
144
+ for (let i = 0; i < numSignatures; i++) {
145
+ const guardianIndex = vaaBytes.readUInt8(offset);
146
+ offset += 1;
147
+ const signature = "0x" + vaaBytes.subarray(offset, offset + 65).toString("hex");
148
+ offset += 65;
149
+ signatures.push({ guardianIndex, signature });
150
+ }
151
+ const bodyOffset = offset;
152
+ const timestamp = vaaBytes.readUInt32BE(offset);
153
+ offset += 4;
154
+ const nonce = vaaBytes.readUInt32BE(offset);
155
+ offset += 4;
156
+ const emitterChain = vaaBytes.readUInt16BE(offset);
157
+ offset += 2;
158
+ const emitterAddress = "0x" + vaaBytes.subarray(offset, offset + 32).toString("hex");
159
+ offset += 32;
160
+ const sequence = vaaBytes.readBigUInt64BE(offset);
161
+ offset += 8;
162
+ const consistencyLevel = vaaBytes.readUInt8(offset);
163
+ offset += 1;
164
+ const payload = "0x" + vaaBytes.subarray(offset).toString("hex");
165
+ const body = vaaBytes.subarray(bodyOffset);
166
+ const hash = ethers.keccak256(ethers.keccak256(body));
167
+ return {
168
+ version,
169
+ guardianSetIndex,
170
+ signatures,
171
+ timestamp,
172
+ nonce,
173
+ emitterChain,
174
+ emitterAddress,
175
+ sequence,
176
+ consistencyLevel,
177
+ payload,
178
+ hash
179
+ };
180
+ }
181
+ function parseVeridexPayload(payloadHex) {
182
+ const payload = Buffer.from(payloadHex.replace("0x", ""), "hex");
183
+ let offset = 0;
184
+ const version = payload.readUInt8(offset);
185
+ offset += 1;
186
+ const userKeyHash = "0x" + payload.subarray(offset, offset + 32).toString("hex");
187
+ offset += 32;
188
+ const targetChain = payload.readUInt16BE(offset);
189
+ offset += 2;
190
+ const nonce = BigInt("0x" + payload.subarray(offset, offset + 32).toString("hex"));
191
+ offset += 32;
192
+ const publicKeyX = BigInt("0x" + payload.subarray(offset, offset + 32).toString("hex"));
193
+ offset += 32;
194
+ const publicKeyY = BigInt("0x" + payload.subarray(offset, offset + 32).toString("hex"));
195
+ offset += 32;
196
+ const actionPayload = "0x" + payload.subarray(offset).toString("hex");
197
+ return {
198
+ version,
199
+ userKeyHash,
200
+ targetChain,
201
+ nonce,
202
+ publicKeyX,
203
+ publicKeyY,
204
+ actionPayload
205
+ };
206
+ }
207
+ function encodeVAAToBytes(vaaBase64) {
208
+ const vaaBytes = Buffer.from(vaaBase64, "base64");
209
+ return "0x" + vaaBytes.toString("hex");
210
+ }
211
+ function encodeVAAForSolana(vaaBase64) {
212
+ return new Uint8Array(Buffer.from(vaaBase64, "base64"));
213
+ }
214
+ function normalizeEmitterAddress(address) {
215
+ let hex = address.replace("0x", "");
216
+ while (hex.length < 64) {
217
+ hex = "0" + hex;
218
+ }
219
+ return hex;
220
+ }
221
+ function emitterToEvmAddress(emitterHex) {
222
+ const hex = emitterHex.replace("0x", "");
223
+ return "0x" + hex.slice(-40);
224
+ }
225
+ async function getSequenceFromTxReceipt(provider, txHash, wormholeCoreBridge) {
226
+ const receipt = await provider.getTransactionReceipt(txHash);
227
+ if (!receipt) {
228
+ throw new Error(`Transaction receipt not found: ${txHash}`);
229
+ }
230
+ const LOG_MESSAGE_PUBLISHED_TOPIC = ethers.id(
231
+ "LogMessagePublished(address,uint64,uint32,bytes,uint8)"
232
+ );
233
+ for (const log of receipt.logs) {
234
+ if (log.address.toLowerCase() === wormholeCoreBridge.toLowerCase()) {
235
+ if (log.topics[0] === LOG_MESSAGE_PUBLISHED_TOPIC && log.topics[1]) {
236
+ const sequence = BigInt(log.topics[1]);
237
+ return sequence;
238
+ }
239
+ }
240
+ }
241
+ throw new Error("LogMessagePublished event not found in transaction");
242
+ }
243
+ async function waitForGuardianSignatures(emitterChain, emitterAddress, sequence, options = {}) {
244
+ const {
245
+ testnet = true,
246
+ requiredSignatures = testnet ? GUARDIAN_CONFIG.TESTNET_QUORUM : GUARDIAN_CONFIG.MAINNET_QUORUM,
247
+ maxWaitMs = 12e4,
248
+ checkIntervalMs = 5e3,
249
+ onProgress
250
+ } = options;
251
+ const startTime = Date.now();
252
+ while (Date.now() - startTime < maxWaitMs) {
253
+ try {
254
+ const vaaBase64 = await fetchVAA(emitterChain, emitterAddress, sequence, {
255
+ testnet,
256
+ maxRetries: 1,
257
+ retryDelayMs: 0
258
+ });
259
+ const vaa = parseVAA(vaaBase64);
260
+ onProgress?.(vaa.signatures.length, requiredSignatures);
261
+ if (vaa.signatures.length >= requiredSignatures) {
262
+ return vaa;
263
+ }
264
+ } catch {
265
+ }
266
+ await sleep(checkIntervalMs);
267
+ }
268
+ throw new Error(`Timeout waiting for guardian signatures after ${maxWaitMs / 1e3}s`);
269
+ }
270
+ function getWormholeCoreBridge(wormholeChainId, testnet = true) {
271
+ const testnetBridges = {
272
+ 10004: "0x79A1027a6A159502049F10906D333EC57E95F083",
273
+ // Base Sepolia
274
+ 10005: "0x31377888146f3253211EFEf5c676D41ECe7D58Fe",
275
+ // Optimism Sepolia
276
+ 10003: "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35",
277
+ // Arbitrum Sepolia
278
+ 1: "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5",
279
+ // Solana Devnet
280
+ 22: "0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625",
281
+ // Aptos Testnet
282
+ 21: "0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790"
283
+ // Sui Testnet
284
+ };
285
+ const mainnetBridges = {
286
+ 2: "0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B",
287
+ // Ethereum
288
+ 30: "0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6",
289
+ // Base
290
+ 24: "0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722",
291
+ // Optimism
292
+ 23: "0xa5f208e072434bC67592E4C49C1B991BA79BCA46",
293
+ // Arbitrum
294
+ 5: "0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7",
295
+ // Polygon
296
+ 1: "worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth",
297
+ // Solana
298
+ 22: "0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625",
299
+ // Aptos
300
+ 21: "0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c"
301
+ // Sui
302
+ };
303
+ const bridges = testnet ? testnetBridges : mainnetBridges;
304
+ return bridges[wormholeChainId] ?? "";
305
+ }
306
+ function getWormholeTokenBridge(wormholeChainId, testnet = true) {
307
+ const testnetBridges = {
308
+ 10004: "0x86F55A04690fd7815A3D802bD587e83eA888B239",
309
+ // Base Sepolia
310
+ 10005: "0x99737Ec4B815d816c49A385943baf0380e75c0Ac",
311
+ // Optimism Sepolia
312
+ 10003: "0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e"
313
+ // Arbitrum Sepolia
314
+ };
315
+ const mainnetBridges = {
316
+ 2: "0x3ee18B2214AFF97000D974cf647E7C347E8fa585",
317
+ // Ethereum
318
+ 30: "0x8d2de8d2f73F1F4cAB472AC9A881C9b123C79627",
319
+ // Base
320
+ 24: "0x1D68124e65faFC907325e3EDbF8c4d84499DAa8b",
321
+ // Optimism
322
+ 23: "0x0b2402144Bb366A632D14B83F244D2e0e21bD39c",
323
+ // Arbitrum
324
+ 5: "0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE"
325
+ // Polygon
326
+ };
327
+ const bridges = testnet ? testnetBridges : mainnetBridges;
328
+ return bridges[wormholeChainId] ?? "";
329
+ }
330
+ function getWormholeRelayer(wormholeChainId, testnet = true) {
331
+ const testnetRelayers = {
332
+ 10004: "0x93BAD53DDfB6132b0aC8E37f6029163E63372cEE",
333
+ // Base Sepolia
334
+ 10005: "0x93BAD53DDfB6132b0aC8E37f6029163E63372cEE",
335
+ // Optimism Sepolia
336
+ 10003: "0x7B1bD7a6b4E61c2a123AC6BC2cbfC614437D0470"
337
+ // Arbitrum Sepolia
338
+ };
339
+ const mainnetRelayers = {
340
+ 2: "0x27428DD2d3DD32A4D7f7C497eAaa23130d894911",
341
+ // Ethereum
342
+ 30: "0x706F82e9bb5b0813501714Ab5974216704980e31",
343
+ // Base
344
+ 24: "0x27428DD2d3DD32A4D7f7C497eAaa23130d894911",
345
+ // Optimism
346
+ 23: "0x27428DD2d3DD32A4D7f7C497eAaa23130d894911",
347
+ // Arbitrum
348
+ 5: "0x27428DD2d3DD32A4D7f7C497eAaa23130d894911"
349
+ // Polygon
350
+ };
351
+ const relayers = testnet ? testnetRelayers : mainnetRelayers;
352
+ return relayers[wormholeChainId] ?? "";
353
+ }
354
+ function supportsRelayer(wormholeChainId, testnet = true) {
355
+ return getWormholeRelayer(wormholeChainId, testnet) !== "";
356
+ }
357
+ function getChainName(wormholeChainId) {
358
+ const names = {
359
+ 1: "Solana",
360
+ 2: "Ethereum",
361
+ 4: "BSC",
362
+ 5: "Polygon",
363
+ 6: "Avalanche",
364
+ 10: "Fantom",
365
+ 21: "Sui",
366
+ 22: "Aptos",
367
+ 23: "Arbitrum",
368
+ 24: "Optimism",
369
+ 30: "Base",
370
+ 10002: "Sepolia",
371
+ 10003: "Arbitrum Sepolia",
372
+ 10004: "Base Sepolia",
373
+ 10005: "Optimism Sepolia"
374
+ };
375
+ return names[wormholeChainId] ?? `Chain ${wormholeChainId}`;
376
+ }
377
+ function hasQuorum(vaa, testnet = true) {
378
+ const required = testnet ? GUARDIAN_CONFIG.TESTNET_QUORUM : GUARDIAN_CONFIG.MAINNET_QUORUM;
379
+ return vaa.signatures.length >= required;
380
+ }
381
+ function validateEmitter(vaa, expectedChain, expectedAddress) {
382
+ const normalizedExpected = "0x" + normalizeEmitterAddress(expectedAddress);
383
+ return vaa.emitterChain === expectedChain && vaa.emitterAddress.toLowerCase() === normalizedExpected.toLowerCase();
384
+ }
385
+ function evmAddressToBytes32(address) {
386
+ const hex = address.replace("0x", "").toLowerCase();
387
+ return "0x" + hex.padStart(64, "0");
388
+ }
389
+ function sleep(ms) {
390
+ return new Promise((resolve) => setTimeout(resolve, ms));
391
+ }
392
+
393
+ export {
394
+ CONSISTENCY_LEVELS,
395
+ GUARDIAN_CONFIG,
396
+ fetchVAA,
397
+ fetchVAAByTxHash,
398
+ fetchVAAByTxHashFallback,
399
+ parseVAA,
400
+ parseVAABytes,
401
+ parseVeridexPayload,
402
+ encodeVAAToBytes,
403
+ encodeVAAForSolana,
404
+ normalizeEmitterAddress,
405
+ emitterToEvmAddress,
406
+ getSequenceFromTxReceipt,
407
+ waitForGuardianSignatures,
408
+ getWormholeCoreBridge,
409
+ getWormholeTokenBridge,
410
+ getWormholeRelayer,
411
+ supportsRelayer,
412
+ getChainName,
413
+ hasQuorum,
414
+ validateEmitter,
415
+ evmAddressToBytes32
416
+ };
417
+ //# sourceMappingURL=chunk-M3MM4YMF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/wormhole.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Wormhole Utilities\n * \n * Functions for fetching VAAs, parsing messages, and interacting with Wormhole\n * \n * This module integrates with the official @wormhole-foundation/sdk patterns for\n * better chain abstraction and reliability, while providing Veridex-specific\n * utilities for payload handling and VAA management.\n */\n\nimport { ethers } from 'ethers';\nimport type { VAA, VAASignature, VeridexPayload } from './types.js';\nimport { WORMHOLE_API } from './constants.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Wormhole Consistency Levels\n * @see https://docs.wormhole.com/wormhole/reference/glossary#consistency-level\n */\nexport const CONSISTENCY_LEVELS = {\n /** Finalized - Wait for block finality (most secure) */\n FINALIZED: 200,\n /** Instant - No wait for finality (fastest, less secure) */\n INSTANT: 201,\n /** Safe - Standard finality (deprecated, use FINALIZED) */\n SAFE: 200,\n} as const;\n\n/**\n * Guardian network configuration\n */\nexport const GUARDIAN_CONFIG = {\n /** Total number of guardians in mainnet */\n MAINNET_GUARDIAN_COUNT: 19,\n /** Required signatures for mainnet quorum (13/19) */\n MAINNET_QUORUM: 13,\n /** Total number of guardians in testnet */\n TESTNET_GUARDIAN_COUNT: 1,\n /** Required signatures for testnet quorum */\n TESTNET_QUORUM: 1,\n} as const;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface FetchVAAOptions {\n testnet?: boolean;\n maxRetries?: number;\n retryDelayMs?: number;\n onRetry?: (attempt: number, maxRetries: number) => void;\n}\n\nexport interface WaitForSignaturesOptions {\n testnet?: boolean;\n requiredSignatures?: number;\n maxWaitMs?: number;\n checkIntervalMs?: number;\n onProgress?: (currentSignatures: number, required: number) => void;\n}\n\n// ============================================================================\n// VAA Fetching\n// ============================================================================\n\n/**\n * Fetch a VAA from Wormhole guardians by sequence number\n * \n * @example\n * ```ts\n * const vaa = await fetchVAA(\n * WORMHOLE_CHAIN_IDS.TESTNET.BASE_SEPOLIA,\n * '0x000...hubAddress',\n * 97n,\n * { testnet: true }\n * );\n * ```\n */\nexport async function fetchVAA(\n emitterChain: number,\n emitterAddress: string,\n sequence: bigint,\n options: FetchVAAOptions = {}\n): Promise<string> {\n const {\n testnet = true,\n maxRetries = 30,\n retryDelayMs = 2000,\n onRetry,\n } = options;\n\n const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;\n const normalizedEmitter = normalizeEmitterAddress(emitterAddress);\n const url = `${apiBase}/api/v1/vaas/${emitterChain}/${normalizedEmitter}/${sequence.toString()}`;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n const response = await fetch(url);\n\n if (response.ok) {\n const data = await response.json() as { data?: { vaa?: string } };\n if (data.data?.vaa) {\n return data.data.vaa;\n }\n }\n\n if (i < maxRetries - 1) {\n onRetry?.(i + 1, maxRetries);\n await sleep(retryDelayMs);\n }\n } catch {\n if (i < maxRetries - 1) {\n onRetry?.(i + 1, maxRetries);\n await sleep(retryDelayMs);\n }\n }\n }\n\n throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);\n}\n\n/**\n * Fetch VAA by transaction hash using operations API\n * This is more reliable than the transactions API when sequence numbers don't match\n */\nexport async function fetchVAAByTxHash(\n txHash: string,\n options: {\n testnet?: boolean;\n maxRetries?: number;\n retryDelayMs?: number;\n onRetry?: (attempt: number, maxRetries: number) => void;\n } = {}\n): Promise<string> {\n const {\n testnet = true,\n maxRetries = 60,\n retryDelayMs = 3000,\n onRetry,\n } = options;\n\n const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;\n // Remove 0x prefix if present for the API\n const cleanTxHash = txHash.replace(/^0x/, '');\n const url = `${apiBase}/api/v1/operations?txHash=${cleanTxHash}`;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n const response = await fetch(url);\n\n if (response.ok) {\n const data = await response.json() as { \n operations?: Array<{ \n vaa?: { raw?: string }; \n sequence?: string;\n }>;\n };\n if (data.operations && data.operations.length > 0) {\n const operation = data.operations[0];\n if (operation.vaa?.raw) {\n return operation.vaa.raw;\n }\n }\n }\n\n if (i < maxRetries - 1) {\n onRetry?.(i + 1, maxRetries);\n await sleep(retryDelayMs);\n }\n } catch {\n if (i < maxRetries - 1) {\n onRetry?.(i + 1, maxRetries);\n await sleep(retryDelayMs);\n }\n }\n }\n\n throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);\n}\n\n/**\n * Fetch VAA by transaction hash using transactions API (fallback)\n */\nexport async function fetchVAAByTxHashFallback(\n txHash: string,\n options: {\n testnet?: boolean;\n maxRetries?: number;\n retryDelayMs?: number;\n onRetry?: (attempt: number, maxRetries: number) => void;\n } = {}\n): Promise<string> {\n const {\n testnet = true,\n maxRetries = 30,\n retryDelayMs = 2000,\n onRetry,\n } = options;\n\n const apiBase = testnet ? WORMHOLE_API.TESTNET : WORMHOLE_API.MAINNET;\n const url = `${apiBase}/api/v1/transactions/${txHash}`;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n const response = await fetch(url);\n\n if (response.ok) {\n const data = await response.json() as { data?: { globalTx?: { originTx?: { vaaId?: string } } } };\n if (data.data?.globalTx?.originTx?.vaaId) {\n const vaaId = data.data.globalTx.originTx.vaaId;\n const vaaUrl = `${apiBase}/api/v1/vaas/${vaaId}`;\n const vaaResponse = await fetch(vaaUrl);\n\n if (vaaResponse.ok) {\n const vaaData = await vaaResponse.json() as { data?: { vaa?: string } };\n if (vaaData.data?.vaa) {\n return vaaData.data.vaa;\n }\n }\n }\n }\n\n if (i < maxRetries - 1) {\n onRetry?.(i + 1, maxRetries);\n await sleep(retryDelayMs);\n }\n } catch {\n if (i < maxRetries - 1) {\n onRetry?.(i + 1, maxRetries);\n await sleep(retryDelayMs);\n }\n }\n }\n\n throw new Error(`Failed to fetch VAA after ${maxRetries} attempts`);\n}\n\n// ============================================================================\n// VAA Parsing\n// ============================================================================\n\n/**\n * Parse a base64-encoded VAA into its components\n */\nexport function parseVAA(vaaBase64: string): VAA {\n const vaaBytes = Buffer.from(vaaBase64, 'base64');\n return parseVAABytes(vaaBytes);\n}\n\n/**\n * Parse raw VAA bytes into its components\n */\nexport function parseVAABytes(vaaBytes: Buffer): VAA {\n let offset = 0;\n\n // Version (1 byte)\n const version = vaaBytes.readUInt8(offset);\n offset += 1;\n\n // Guardian set index (4 bytes)\n const guardianSetIndex = vaaBytes.readUInt32BE(offset);\n offset += 4;\n\n // Number of signatures (1 byte)\n const numSignatures = vaaBytes.readUInt8(offset);\n offset += 1;\n\n // Parse signatures (66 bytes each: 1 guardian index + 65 signature)\n const signatures: VAASignature[] = [];\n for (let i = 0; i < numSignatures; i++) {\n const guardianIndex = vaaBytes.readUInt8(offset);\n offset += 1;\n const signature = '0x' + vaaBytes.subarray(offset, offset + 65).toString('hex');\n offset += 65;\n signatures.push({ guardianIndex, signature });\n }\n\n // Mark the start of the body (for hash calculation)\n const bodyOffset = offset;\n\n // Timestamp (4 bytes)\n const timestamp = vaaBytes.readUInt32BE(offset);\n offset += 4;\n\n // Nonce (4 bytes)\n const nonce = vaaBytes.readUInt32BE(offset);\n offset += 4;\n\n // Emitter chain (2 bytes)\n const emitterChain = vaaBytes.readUInt16BE(offset);\n offset += 2;\n\n // Emitter address (32 bytes)\n const emitterAddress = '0x' + vaaBytes.subarray(offset, offset + 32).toString('hex');\n offset += 32;\n\n // Sequence (8 bytes)\n const sequence = vaaBytes.readBigUInt64BE(offset);\n offset += 8;\n\n // Consistency level (1 byte)\n const consistencyLevel = vaaBytes.readUInt8(offset);\n offset += 1;\n\n // Payload (remaining bytes)\n const payload = '0x' + vaaBytes.subarray(offset).toString('hex');\n\n // Calculate VAA body hash (used for verification on destination chains)\n const body = vaaBytes.subarray(bodyOffset);\n const hash = ethers.keccak256(ethers.keccak256(body));\n\n return {\n version,\n guardianSetIndex,\n signatures,\n timestamp,\n nonce,\n emitterChain,\n emitterAddress,\n sequence,\n consistencyLevel,\n payload,\n hash,\n };\n}\n\n/**\n * Parse a Veridex-specific payload from a VAA\n */\nexport function parseVeridexPayload(payloadHex: string): VeridexPayload {\n const payload = Buffer.from(payloadHex.replace('0x', ''), 'hex');\n let offset = 0;\n\n // Version (1 byte)\n const version = payload.readUInt8(offset);\n offset += 1;\n\n // User key hash (32 bytes)\n const userKeyHash = '0x' + payload.subarray(offset, offset + 32).toString('hex');\n offset += 32;\n\n // Target chain (2 bytes)\n const targetChain = payload.readUInt16BE(offset);\n offset += 2;\n\n // Nonce (32 bytes)\n const nonce = BigInt('0x' + payload.subarray(offset, offset + 32).toString('hex'));\n offset += 32;\n\n // Public key X (32 bytes)\n const publicKeyX = BigInt('0x' + payload.subarray(offset, offset + 32).toString('hex'));\n offset += 32;\n\n // Public key Y (32 bytes)\n const publicKeyY = BigInt('0x' + payload.subarray(offset, offset + 32).toString('hex'));\n offset += 32;\n\n // Action payload (remaining bytes)\n const actionPayload = '0x' + payload.subarray(offset).toString('hex');\n\n return {\n version,\n userKeyHash,\n targetChain,\n nonce,\n publicKeyX,\n publicKeyY,\n actionPayload,\n };\n}\n\n// ============================================================================\n// VAA Encoding\n// ============================================================================\n\n/**\n * Encode a VAA back to bytes for on-chain submission\n */\nexport function encodeVAAToBytes(vaaBase64: string): string {\n const vaaBytes = Buffer.from(vaaBase64, 'base64');\n return '0x' + vaaBytes.toString('hex');\n}\n\n/**\n * Encode VAA to bytes for Solana (returns Uint8Array)\n */\nexport function encodeVAAForSolana(vaaBase64: string): Uint8Array {\n return new Uint8Array(Buffer.from(vaaBase64, 'base64'));\n}\n\n// ============================================================================\n// Address Utilities\n// ============================================================================\n\n/**\n * Normalize an address to a 32-byte Wormhole emitter address format\n */\nexport function normalizeEmitterAddress(address: string): string {\n let hex = address.replace('0x', '');\n while (hex.length < 64) {\n hex = '0' + hex;\n }\n return hex;\n}\n\n/**\n * Convert a 32-byte emitter address back to a 20-byte EVM address\n */\nexport function emitterToEvmAddress(emitterHex: string): string {\n const hex = emitterHex.replace('0x', '');\n return '0x' + hex.slice(-40);\n}\n\n// ============================================================================\n// Transaction Utilities\n// ============================================================================\n\n/**\n * Extract the VAA sequence from a transaction receipt\n */\nexport async function getSequenceFromTxReceipt(\n provider: ethers.Provider,\n txHash: string,\n wormholeCoreBridge: string\n): Promise<bigint> {\n const receipt = await provider.getTransactionReceipt(txHash);\n if (!receipt) {\n throw new Error(`Transaction receipt not found: ${txHash}`);\n }\n\n const LOG_MESSAGE_PUBLISHED_TOPIC = ethers.id(\n 'LogMessagePublished(address,uint64,uint32,bytes,uint8)'\n );\n\n for (const log of receipt.logs) {\n if (log.address.toLowerCase() === wormholeCoreBridge.toLowerCase()) {\n if (log.topics[0] === LOG_MESSAGE_PUBLISHED_TOPIC && log.topics[1]) {\n const sequence = BigInt(log.topics[1]);\n return sequence;\n }\n }\n }\n\n throw new Error('LogMessagePublished event not found in transaction');\n}\n\n/**\n * Wait for a Wormhole message to be signed by guardians\n * \n * @example\n * ```ts\n * const vaa = await waitForGuardianSignatures(\n * WORMHOLE_CHAIN_IDS.TESTNET.BASE_SEPOLIA,\n * hubEmitter,\n * 97n,\n * {\n * testnet: true,\n * onProgress: (current, required) => console.log(`${current}/${required} signatures`)\n * }\n * );\n * ```\n */\nexport async function waitForGuardianSignatures(\n emitterChain: number,\n emitterAddress: string,\n sequence: bigint,\n options: WaitForSignaturesOptions = {}\n): Promise<VAA> {\n const {\n testnet = true,\n requiredSignatures = testnet ? GUARDIAN_CONFIG.TESTNET_QUORUM : GUARDIAN_CONFIG.MAINNET_QUORUM,\n maxWaitMs = 120000,\n checkIntervalMs = 5000,\n onProgress,\n } = options;\n\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitMs) {\n try {\n const vaaBase64 = await fetchVAA(emitterChain, emitterAddress, sequence, {\n testnet,\n maxRetries: 1,\n retryDelayMs: 0,\n });\n const vaa = parseVAA(vaaBase64);\n\n onProgress?.(vaa.signatures.length, requiredSignatures);\n\n if (vaa.signatures.length >= requiredSignatures) {\n return vaa;\n }\n } catch {\n // VAA not available yet, continue waiting\n }\n\n await sleep(checkIntervalMs);\n }\n\n throw new Error(`Timeout waiting for guardian signatures after ${maxWaitMs / 1000}s`);\n}\n\n// ============================================================================\n// Wormhole Core Bridge Addresses\n// ============================================================================\n\n/**\n * Get the Wormhole Core Bridge contract address for a chain\n */\nexport function getWormholeCoreBridge(wormholeChainId: number, testnet = true): string {\n const testnetBridges: Record<number, string> = {\n 10004: '0x79A1027a6A159502049F10906D333EC57E95F083', // Base Sepolia\n 10005: '0x31377888146f3253211EFEf5c676D41ECe7D58Fe', // Optimism Sepolia\n 10003: '0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35', // Arbitrum Sepolia\n 1: '3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5', // Solana Devnet\n 22: '0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625', // Aptos Testnet\n 21: '0x31358d198147da50db32eda2562951d53973a0c0ad5ed738e9b17d88b213d790', // Sui Testnet\n };\n\n const mainnetBridges: Record<number, string> = {\n 2: '0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B', // Ethereum\n 30: '0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6', // Base\n 24: '0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722', // Optimism\n 23: '0xa5f208e072434bC67592E4C49C1B991BA79BCA46', // Arbitrum\n 5: '0x7A4B5a56256163F07b2C80A7cA55aBE66c4ec4d7', // Polygon\n 1: 'worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth', // Solana\n 22: '0x5bc11445584a763c1fa7ed39081f1b920954da14e04b32440cba863d03e19625', // Aptos\n 21: '0xaeab97f96cf9877fee2883315d459552b2b921edc16d7ceac6eab944dd88919c', // Sui\n };\n\n const bridges = testnet ? testnetBridges : mainnetBridges;\n return bridges[wormholeChainId] ?? '';\n}\n\n/**\n * Get the Wormhole Token Bridge contract address for a chain\n */\nexport function getWormholeTokenBridge(wormholeChainId: number, testnet = true): string {\n const testnetBridges: Record<number, string> = {\n 10004: '0x86F55A04690fd7815A3D802bD587e83eA888B239', // Base Sepolia\n 10005: '0x99737Ec4B815d816c49A385943baf0380e75c0Ac', // Optimism Sepolia\n 10003: '0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e', // Arbitrum Sepolia\n };\n\n const mainnetBridges: Record<number, string> = {\n 2: '0x3ee18B2214AFF97000D974cf647E7C347E8fa585', // Ethereum\n 30: '0x8d2de8d2f73F1F4cAB472AC9A881C9b123C79627', // Base\n 24: '0x1D68124e65faFC907325e3EDbF8c4d84499DAa8b', // Optimism\n 23: '0x0b2402144Bb366A632D14B83F244D2e0e21bD39c', // Arbitrum\n 5: '0x5a58505a96D1dbf8dF91cB21B54419FC36e93fdE', // Polygon\n };\n\n const bridges = testnet ? testnetBridges : mainnetBridges;\n return bridges[wormholeChainId] ?? '';\n}\n\n/**\n * Get the Wormhole Relayer contract address for a chain\n */\nexport function getWormholeRelayer(wormholeChainId: number, testnet = true): string {\n const testnetRelayers: Record<number, string> = {\n 10004: '0x93BAD53DDfB6132b0aC8E37f6029163E63372cEE', // Base Sepolia\n 10005: '0x93BAD53DDfB6132b0aC8E37f6029163E63372cEE', // Optimism Sepolia\n 10003: '0x7B1bD7a6b4E61c2a123AC6BC2cbfC614437D0470', // Arbitrum Sepolia\n };\n\n const mainnetRelayers: Record<number, string> = {\n 2: '0x27428DD2d3DD32A4D7f7C497eAaa23130d894911', // Ethereum\n 30: '0x706F82e9bb5b0813501714Ab5974216704980e31', // Base\n 24: '0x27428DD2d3DD32A4D7f7C497eAaa23130d894911', // Optimism\n 23: '0x27428DD2d3DD32A4D7f7C497eAaa23130d894911', // Arbitrum\n 5: '0x27428DD2d3DD32A4D7f7C497eAaa23130d894911', // Polygon\n };\n\n const relayers = testnet ? testnetRelayers : mainnetRelayers;\n return relayers[wormholeChainId] ?? '';\n}\n\n/**\n * Check if a chain supports Wormhole Relayer\n */\nexport function supportsRelayer(wormholeChainId: number, testnet = true): boolean {\n return getWormholeRelayer(wormholeChainId, testnet) !== '';\n}\n\n/**\n * Get chain name from Wormhole chain ID\n */\nexport function getChainName(wormholeChainId: number): string {\n const names: Record<number, string> = {\n 1: 'Solana',\n 2: 'Ethereum',\n 4: 'BSC',\n 5: 'Polygon',\n 6: 'Avalanche',\n 10: 'Fantom',\n 21: 'Sui',\n 22: 'Aptos',\n 23: 'Arbitrum',\n 24: 'Optimism',\n 30: 'Base',\n 10002: 'Sepolia',\n 10003: 'Arbitrum Sepolia',\n 10004: 'Base Sepolia',\n 10005: 'Optimism Sepolia',\n };\n return names[wormholeChainId] ?? `Chain ${wormholeChainId}`;\n}\n\n// ============================================================================\n// VAA Validation\n// ============================================================================\n\n/**\n * Validate that a VAA has sufficient signatures for the given network\n */\nexport function hasQuorum(vaa: VAA, testnet = true): boolean {\n const required = testnet ? GUARDIAN_CONFIG.TESTNET_QUORUM : GUARDIAN_CONFIG.MAINNET_QUORUM;\n return vaa.signatures.length >= required;\n}\n\n/**\n * Validate VAA emitter matches expected source\n */\nexport function validateEmitter(\n vaa: VAA,\n expectedChain: number,\n expectedAddress: string\n): boolean {\n const normalizedExpected = '0x' + normalizeEmitterAddress(expectedAddress);\n return (\n vaa.emitterChain === expectedChain &&\n vaa.emitterAddress.toLowerCase() === normalizedExpected.toLowerCase()\n );\n}\n\n/**\n * Convert an EVM address to bytes32 format (for Wormhole)\n */\nexport function evmAddressToBytes32(address: string): string {\n const hex = address.replace('0x', '').toLowerCase();\n return '0x' + hex.padStart(64, '0');\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n"],"mappings":";;;;;AAUA,SAAS,cAAc;AAYhB,IAAM,qBAAqB;AAAA;AAAA,EAEhC,WAAW;AAAA;AAAA,EAEX,SAAS;AAAA;AAAA,EAET,MAAM;AACR;AAKO,IAAM,kBAAkB;AAAA;AAAA,EAE7B,wBAAwB;AAAA;AAAA,EAExB,gBAAgB;AAAA;AAAA,EAEhB,wBAAwB;AAAA;AAAA,EAExB,gBAAgB;AAClB;AAsCA,eAAsB,SACpB,cACA,gBACA,UACA,UAA2B,CAAC,GACX;AACjB,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,IACf;AAAA,EACF,IAAI;AAEJ,QAAM,UAAU,UAAU,aAAa,UAAU,aAAa;AAC9D,QAAM,oBAAoB,wBAAwB,cAAc;AAChE,QAAM,MAAM,GAAG,OAAO,gBAAgB,YAAY,IAAI,iBAAiB,IAAI,SAAS,SAAS,CAAC;AAE9F,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG;AAEhC,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAI,KAAK,MAAM,KAAK;AAClB,iBAAO,KAAK,KAAK;AAAA,QACnB;AAAA,MACF;AAEA,UAAI,IAAI,aAAa,GAAG;AACtB,kBAAU,IAAI,GAAG,UAAU;AAC3B,cAAM,MAAM,YAAY;AAAA,MAC1B;AAAA,IACF,QAAQ;AACN,UAAI,IAAI,aAAa,GAAG;AACtB,kBAAU,IAAI,GAAG,UAAU;AAC3B,cAAM,MAAM,YAAY;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,6BAA6B,UAAU,WAAW;AACpE;AAMA,eAAsB,iBACpB,QACA,UAKI,CAAC,GACY;AACjB,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,IACf;AAAA,EACF,IAAI;AAEJ,QAAM,UAAU,UAAU,aAAa,UAAU,aAAa;AAE9D,QAAM,cAAc,OAAO,QAAQ,OAAO,EAAE;AAC5C,QAAM,MAAM,GAAG,OAAO,6BAA6B,WAAW;AAE9D,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG;AAEhC,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,MAAM,SAAS,KAAK;AAMjC,YAAI,KAAK,cAAc,KAAK,WAAW,SAAS,GAAG;AACjD,gBAAM,YAAY,KAAK,WAAW,CAAC;AACnC,cAAI,UAAU,KAAK,KAAK;AACtB,mBAAO,UAAU,IAAI;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,IAAI,aAAa,GAAG;AACtB,kBAAU,IAAI,GAAG,UAAU;AAC3B,cAAM,MAAM,YAAY;AAAA,MAC1B;AAAA,IACF,QAAQ;AACN,UAAI,IAAI,aAAa,GAAG;AACtB,kBAAU,IAAI,GAAG,UAAU;AAC3B,cAAM,MAAM,YAAY;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,6BAA6B,UAAU,WAAW;AACpE;AAKA,eAAsB,yBACpB,QACA,UAKI,CAAC,GACY;AACjB,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,eAAe;AAAA,IACf;AAAA,EACF,IAAI;AAEJ,QAAM,UAAU,UAAU,aAAa,UAAU,aAAa;AAC9D,QAAM,MAAM,GAAG,OAAO,wBAAwB,MAAM;AAEpD,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,GAAG;AAEhC,UAAI,SAAS,IAAI;AACf,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAI,KAAK,MAAM,UAAU,UAAU,OAAO;AACxC,gBAAM,QAAQ,KAAK,KAAK,SAAS,SAAS;AAC1C,gBAAM,SAAS,GAAG,OAAO,gBAAgB,KAAK;AAC9C,gBAAM,cAAc,MAAM,MAAM,MAAM;AAEtC,cAAI,YAAY,IAAI;AAClB,kBAAM,UAAU,MAAM,YAAY,KAAK;AACvC,gBAAI,QAAQ,MAAM,KAAK;AACrB,qBAAO,QAAQ,KAAK;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,IAAI,aAAa,GAAG;AACtB,kBAAU,IAAI,GAAG,UAAU;AAC3B,cAAM,MAAM,YAAY;AAAA,MAC1B;AAAA,IACF,QAAQ;AACN,UAAI,IAAI,aAAa,GAAG;AACtB,kBAAU,IAAI,GAAG,UAAU;AAC3B,cAAM,MAAM,YAAY;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,6BAA6B,UAAU,WAAW;AACpE;AASO,SAAS,SAAS,WAAwB;AAC/C,QAAM,WAAW,OAAO,KAAK,WAAW,QAAQ;AAChD,SAAO,cAAc,QAAQ;AAC/B;AAKO,SAAS,cAAc,UAAuB;AACnD,MAAI,SAAS;AAGb,QAAM,UAAU,SAAS,UAAU,MAAM;AACzC,YAAU;AAGV,QAAM,mBAAmB,SAAS,aAAa,MAAM;AACrD,YAAU;AAGV,QAAM,gBAAgB,SAAS,UAAU,MAAM;AAC/C,YAAU;AAGV,QAAM,aAA6B,CAAC;AACpC,WAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,UAAM,gBAAgB,SAAS,UAAU,MAAM;AAC/C,cAAU;AACV,UAAM,YAAY,OAAO,SAAS,SAAS,QAAQ,SAAS,EAAE,EAAE,SAAS,KAAK;AAC9E,cAAU;AACV,eAAW,KAAK,EAAE,eAAe,UAAU,CAAC;AAAA,EAC9C;AAGA,QAAM,aAAa;AAGnB,QAAM,YAAY,SAAS,aAAa,MAAM;AAC9C,YAAU;AAGV,QAAM,QAAQ,SAAS,aAAa,MAAM;AAC1C,YAAU;AAGV,QAAM,eAAe,SAAS,aAAa,MAAM;AACjD,YAAU;AAGV,QAAM,iBAAiB,OAAO,SAAS,SAAS,QAAQ,SAAS,EAAE,EAAE,SAAS,KAAK;AACnF,YAAU;AAGV,QAAM,WAAW,SAAS,gBAAgB,MAAM;AAChD,YAAU;AAGV,QAAM,mBAAmB,SAAS,UAAU,MAAM;AAClD,YAAU;AAGV,QAAM,UAAU,OAAO,SAAS,SAAS,MAAM,EAAE,SAAS,KAAK;AAG/D,QAAM,OAAO,SAAS,SAAS,UAAU;AACzC,QAAM,OAAO,OAAO,UAAU,OAAO,UAAU,IAAI,CAAC;AAEpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,oBAAoB,YAAoC;AACtE,QAAM,UAAU,OAAO,KAAK,WAAW,QAAQ,MAAM,EAAE,GAAG,KAAK;AAC/D,MAAI,SAAS;AAGb,QAAM,UAAU,QAAQ,UAAU,MAAM;AACxC,YAAU;AAGV,QAAM,cAAc,OAAO,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,SAAS,KAAK;AAC/E,YAAU;AAGV,QAAM,cAAc,QAAQ,aAAa,MAAM;AAC/C,YAAU;AAGV,QAAM,QAAQ,OAAO,OAAO,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,SAAS,KAAK,CAAC;AACjF,YAAU;AAGV,QAAM,aAAa,OAAO,OAAO,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,SAAS,KAAK,CAAC;AACtF,YAAU;AAGV,QAAM,aAAa,OAAO,OAAO,QAAQ,SAAS,QAAQ,SAAS,EAAE,EAAE,SAAS,KAAK,CAAC;AACtF,YAAU;AAGV,QAAM,gBAAgB,OAAO,QAAQ,SAAS,MAAM,EAAE,SAAS,KAAK;AAEpE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AASO,SAAS,iBAAiB,WAA2B;AAC1D,QAAM,WAAW,OAAO,KAAK,WAAW,QAAQ;AAChD,SAAO,OAAO,SAAS,SAAS,KAAK;AACvC;AAKO,SAAS,mBAAmB,WAA+B;AAChE,SAAO,IAAI,WAAW,OAAO,KAAK,WAAW,QAAQ,CAAC;AACxD;AASO,SAAS,wBAAwB,SAAyB;AAC/D,MAAI,MAAM,QAAQ,QAAQ,MAAM,EAAE;AAClC,SAAO,IAAI,SAAS,IAAI;AACtB,UAAM,MAAM;AAAA,EACd;AACA,SAAO;AACT;AAKO,SAAS,oBAAoB,YAA4B;AAC9D,QAAM,MAAM,WAAW,QAAQ,MAAM,EAAE;AACvC,SAAO,OAAO,IAAI,MAAM,GAAG;AAC7B;AASA,eAAsB,yBACpB,UACA,QACA,oBACiB;AACjB,QAAM,UAAU,MAAM,SAAS,sBAAsB,MAAM;AAC3D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kCAAkC,MAAM,EAAE;AAAA,EAC5D;AAEA,QAAM,8BAA8B,OAAO;AAAA,IACzC;AAAA,EACF;AAEA,aAAW,OAAO,QAAQ,MAAM;AAC9B,QAAI,IAAI,QAAQ,YAAY,MAAM,mBAAmB,YAAY,GAAG;AAClE,UAAI,IAAI,OAAO,CAAC,MAAM,+BAA+B,IAAI,OAAO,CAAC,GAAG;AAClE,cAAM,WAAW,OAAO,IAAI,OAAO,CAAC,CAAC;AACrC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,oDAAoD;AACtE;AAkBA,eAAsB,0BACpB,cACA,gBACA,UACA,UAAoC,CAAC,GACvB;AACd,QAAM;AAAA,IACJ,UAAU;AAAA,IACV,qBAAqB,UAAU,gBAAgB,iBAAiB,gBAAgB;AAAA,IAChF,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB;AAAA,EACF,IAAI;AAEJ,QAAM,YAAY,KAAK,IAAI;AAE3B,SAAO,KAAK,IAAI,IAAI,YAAY,WAAW;AACzC,QAAI;AACF,YAAM,YAAY,MAAM,SAAS,cAAc,gBAAgB,UAAU;AAAA,QACvE;AAAA,QACA,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AACD,YAAM,MAAM,SAAS,SAAS;AAE9B,mBAAa,IAAI,WAAW,QAAQ,kBAAkB;AAEtD,UAAI,IAAI,WAAW,UAAU,oBAAoB;AAC/C,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,MAAM,eAAe;AAAA,EAC7B;AAEA,QAAM,IAAI,MAAM,iDAAiD,YAAY,GAAI,GAAG;AACtF;AASO,SAAS,sBAAsB,iBAAyB,UAAU,MAAc;AACrF,QAAM,iBAAyC;AAAA,IAC7C,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,GAAG;AAAA;AAAA,IACH,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,EACN;AAEA,QAAM,iBAAyC;AAAA,IAC7C,GAAG;AAAA;AAAA,IACH,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,GAAG;AAAA;AAAA,IACH,GAAG;AAAA;AAAA,IACH,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,EACN;AAEA,QAAM,UAAU,UAAU,iBAAiB;AAC3C,SAAO,QAAQ,eAAe,KAAK;AACrC;AAKO,SAAS,uBAAuB,iBAAyB,UAAU,MAAc;AACtF,QAAM,iBAAyC;AAAA,IAC7C,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,EACT;AAEA,QAAM,iBAAyC;AAAA,IAC7C,GAAG;AAAA;AAAA,IACH,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,GAAG;AAAA;AAAA,EACL;AAEA,QAAM,UAAU,UAAU,iBAAiB;AAC3C,SAAO,QAAQ,eAAe,KAAK;AACrC;AAKO,SAAS,mBAAmB,iBAAyB,UAAU,MAAc;AAClF,QAAM,kBAA0C;AAAA,IAC9C,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,IACP,OAAO;AAAA;AAAA,EACT;AAEA,QAAM,kBAA0C;AAAA,IAC9C,GAAG;AAAA;AAAA,IACH,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,IAAI;AAAA;AAAA,IACJ,GAAG;AAAA;AAAA,EACL;AAEA,QAAM,WAAW,UAAU,kBAAkB;AAC7C,SAAO,SAAS,eAAe,KAAK;AACtC;AAKO,SAAS,gBAAgB,iBAAyB,UAAU,MAAe;AAChF,SAAO,mBAAmB,iBAAiB,OAAO,MAAM;AAC1D;AAKO,SAAS,aAAa,iBAAiC;AAC5D,QAAM,QAAgC;AAAA,IACpC,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AACA,SAAO,MAAM,eAAe,KAAK,SAAS,eAAe;AAC3D;AASO,SAAS,UAAU,KAAU,UAAU,MAAe;AAC3D,QAAM,WAAW,UAAU,gBAAgB,iBAAiB,gBAAgB;AAC5E,SAAO,IAAI,WAAW,UAAU;AAClC;AAKO,SAAS,gBACd,KACA,eACA,iBACS;AACT,QAAM,qBAAqB,OAAO,wBAAwB,eAAe;AACzE,SACE,IAAI,iBAAiB,iBACrB,IAAI,eAAe,YAAY,MAAM,mBAAmB,YAAY;AAExE;AAKO,SAAS,oBAAoB,SAAyB;AAC3D,QAAM,MAAM,QAAQ,QAAQ,MAAM,EAAE,EAAE,YAAY;AAClD,SAAO,OAAO,IAAI,SAAS,IAAI,GAAG;AACpC;AAMA,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,aAAW,WAAW,SAAS,EAAE,CAAC;AACvD;","names":[]}