@zama-fhe/sdk 1.0.0-alpha.2

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.
@@ -0,0 +1,449 @@
1
+ import { assertObject, assertString } from './chunk-CTX3H4CB.js';
2
+ import { convertToBigIntRecord } from './chunk-UE6IBC3M.js';
3
+
4
+ // src/worker/relayer-sdk.worker.ts
5
+ var sdkInstance = null;
6
+ var sdkGlobal = null;
7
+ var relayerUrlBase = "";
8
+ var csrfTokenBase = "";
9
+ var CSRF_HEADER_NAME = "x-csrf-token";
10
+ var MUTATING_METHODS = /* @__PURE__ */ new Set(["POST", "PUT", "DELETE", "PATCH"]);
11
+ function sendSuccess(id, type, data, transfer) {
12
+ const response = {
13
+ id,
14
+ type,
15
+ success: true,
16
+ data
17
+ };
18
+ return transfer ? self.postMessage(response, transfer) : self.postMessage(response);
19
+ }
20
+ function sendError(id, type, error, statusCode) {
21
+ const response = {
22
+ id,
23
+ type,
24
+ success: false,
25
+ error
26
+ };
27
+ if (statusCode !== void 0) {
28
+ response.statusCode = statusCode;
29
+ }
30
+ self.postMessage(response);
31
+ }
32
+ var originalFetch = fetch;
33
+ var ALLOWED_CDN_HOSTS = /* @__PURE__ */ new Set(["cdn.zama.org"]);
34
+ function validateCdnUrl(rawUrl) {
35
+ let url;
36
+ try {
37
+ url = new URL(rawUrl);
38
+ } catch {
39
+ throw new Error("Invalid CDN URL");
40
+ }
41
+ if (url.protocol !== "https:") {
42
+ throw new Error("CDN URL must use https");
43
+ }
44
+ if (!ALLOWED_CDN_HOSTS.has(url.hostname)) {
45
+ throw new Error(`CDN URL host is not allowed: ${url.hostname}`);
46
+ }
47
+ return url.toString();
48
+ }
49
+ function setupFetchInterceptor() {
50
+ globalThis.fetch = async (input, init) => {
51
+ const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
52
+ const method = init?.method?.toUpperCase() ?? "GET";
53
+ if (relayerUrlBase && url.startsWith(relayerUrlBase)) {
54
+ const headers = new Headers(init?.headers);
55
+ if (MUTATING_METHODS.has(method) && csrfTokenBase) {
56
+ headers.set(CSRF_HEADER_NAME, csrfTokenBase);
57
+ }
58
+ return originalFetch(input, {
59
+ ...init,
60
+ headers,
61
+ credentials: "include"
62
+ });
63
+ }
64
+ return originalFetch(input, init);
65
+ };
66
+ }
67
+ function isBrowserExtension() {
68
+ try {
69
+ const g = globalThis;
70
+ for (const ns of [g.chrome, g.browser]) {
71
+ assertObject(ns, "ns");
72
+ assertObject(ns.runtime, "runtime");
73
+ assertString(ns.runtime.id, "id");
74
+ return true;
75
+ }
76
+ } catch {
77
+ return false;
78
+ }
79
+ return false;
80
+ }
81
+ async function verifyIntegrity(content, expectedHash) {
82
+ const encoder = new TextEncoder();
83
+ const hashBuffer = await crypto.subtle.digest("SHA-384", encoder.encode(content));
84
+ const hashHex = Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
85
+ if (hashHex !== expectedHash) {
86
+ throw new Error(`CDN integrity check failed: expected SHA-384 ${expectedHash}, got ${hashHex}`);
87
+ }
88
+ }
89
+ async function fetchScript(cdnUrl) {
90
+ const response = await originalFetch(cdnUrl);
91
+ if (!response.ok) {
92
+ throw new Error(`Failed to fetch SDK: ${response.status} ${response.statusText}`);
93
+ }
94
+ return response.text();
95
+ }
96
+ async function loadSdkScript(cdnUrl, integrity) {
97
+ if (isBrowserExtension()) {
98
+ if (integrity) {
99
+ await verifyIntegrity(await fetchScript(cdnUrl), integrity);
100
+ }
101
+ return self.importScripts(cdnUrl);
102
+ }
103
+ const scriptContent = await fetchScript(cdnUrl);
104
+ if (integrity) {
105
+ await verifyIntegrity(scriptContent, integrity);
106
+ }
107
+ const blob = new Blob([scriptContent], { type: "application/javascript" });
108
+ const blobUrl = URL.createObjectURL(blob);
109
+ try {
110
+ self.importScripts(blobUrl);
111
+ } finally {
112
+ URL.revokeObjectURL(blobUrl);
113
+ }
114
+ }
115
+ async function handleInit(request) {
116
+ const { id, type, payload } = request;
117
+ const { cdnUrl, fhevmConfig, csrfToken, integrity } = payload;
118
+ try {
119
+ validateCdnUrl(cdnUrl);
120
+ relayerUrlBase = fhevmConfig.relayerUrl ?? "";
121
+ csrfTokenBase = csrfToken;
122
+ setupFetchInterceptor();
123
+ await loadSdkScript(cdnUrl, integrity);
124
+ if (!self.relayerSDK) {
125
+ throw new Error("Failed to load relayerSDK from CDN");
126
+ }
127
+ sdkGlobal = self.relayerSDK;
128
+ await sdkGlobal.initSDK();
129
+ const config = {
130
+ ...fhevmConfig,
131
+ batchRpcCalls: false
132
+ };
133
+ sdkInstance = await sdkGlobal.createInstance(config);
134
+ sendSuccess(id, type, { initialized: true });
135
+ } catch (error) {
136
+ const message = error instanceof Error ? error.message : String(error);
137
+ console.error("[Worker] Init error:", message);
138
+ sendError(id, type, message);
139
+ }
140
+ }
141
+ async function handleEncrypt(request) {
142
+ const { id, type, payload } = request;
143
+ const { values, contractAddress, userAddress } = payload;
144
+ try {
145
+ if (!sdkInstance) {
146
+ throw new Error("SDK not initialized. Call INIT first.");
147
+ }
148
+ const input = sdkInstance.createEncryptedInput(contractAddress, userAddress);
149
+ for (const value of values) {
150
+ input.add64(value);
151
+ }
152
+ const encrypted = await input.encrypt();
153
+ const response = {
154
+ handles: encrypted.handles,
155
+ inputProof: encrypted.inputProof
156
+ };
157
+ const transferList = [
158
+ encrypted.inputProof.buffer,
159
+ ...encrypted.handles.map((h) => h.buffer)
160
+ ];
161
+ sendSuccess(id, type, response, transferList);
162
+ } catch (error) {
163
+ const message = error instanceof Error ? error.message : String(error);
164
+ console.error("[Worker] Encrypt error:", message);
165
+ sendError(id, type, message);
166
+ }
167
+ }
168
+ async function handleUserDecrypt(request) {
169
+ const { id, type, payload } = request;
170
+ try {
171
+ if (!sdkInstance) {
172
+ throw new Error("SDK not initialized. Call INIT first.");
173
+ }
174
+ const handleContractPairs = payload.handles.map((handle) => ({
175
+ handle,
176
+ contractAddress: payload.contractAddress
177
+ }));
178
+ const result = await sdkInstance.userDecrypt(
179
+ handleContractPairs,
180
+ payload.privateKey,
181
+ payload.publicKey,
182
+ payload.signature,
183
+ payload.signedContractAddresses,
184
+ payload.signerAddress,
185
+ payload.startTimestamp,
186
+ payload.durationDays
187
+ );
188
+ const response = {
189
+ clearValues: convertToBigIntRecord(result)
190
+ };
191
+ sendSuccess(id, type, response);
192
+ } catch (error) {
193
+ const message = error instanceof Error ? error.message : String(error);
194
+ const statusCode = extractHttpStatus(error);
195
+ console.error("[Worker] UserDecrypt error:", message);
196
+ sendError(id, type, message, statusCode);
197
+ }
198
+ }
199
+ function extractHttpStatus(error) {
200
+ if (error == null || typeof error !== "object") return void 0;
201
+ const e = error;
202
+ if (typeof e.statusCode === "number") return e.statusCode;
203
+ if (typeof e.status === "number") return e.status;
204
+ if (e.cause != null && typeof e.cause === "object") {
205
+ const cause = e.cause;
206
+ if (typeof cause.statusCode === "number") return cause.statusCode;
207
+ if (typeof cause.status === "number") return cause.status;
208
+ }
209
+ return void 0;
210
+ }
211
+ async function handlePublicDecrypt(request) {
212
+ const { id, type, payload } = request;
213
+ try {
214
+ if (!sdkInstance) {
215
+ throw new Error("SDK not initialized. Call INIT first.");
216
+ }
217
+ const result = await sdkInstance.publicDecrypt(payload.handles);
218
+ const response = {
219
+ clearValues: convertToBigIntRecord(result.clearValues),
220
+ abiEncodedClearValues: result.abiEncodedClearValues,
221
+ decryptionProof: result.decryptionProof
222
+ };
223
+ sendSuccess(id, type, response);
224
+ } catch (error) {
225
+ const message = error instanceof Error ? error.message : String(error);
226
+ console.error("[Worker] PublicDecrypt error:", message);
227
+ sendError(id, type, message);
228
+ }
229
+ }
230
+ function handleGenerateKeypair(request) {
231
+ const { id, type } = request;
232
+ try {
233
+ if (!sdkInstance) {
234
+ throw new Error("SDK not initialized. Call INIT first.");
235
+ }
236
+ const keypair = sdkInstance.generateKeypair();
237
+ const response = {
238
+ publicKey: keypair.publicKey,
239
+ privateKey: keypair.privateKey
240
+ };
241
+ sendSuccess(id, type, response);
242
+ } catch (error) {
243
+ const message = error instanceof Error ? error.message : String(error);
244
+ console.error("[Worker] GenerateKeypair error:", message);
245
+ sendError(id, type, message);
246
+ }
247
+ }
248
+ function handleCreateEIP712(request) {
249
+ const { id, type, payload } = request;
250
+ try {
251
+ if (!sdkInstance) {
252
+ throw new Error("SDK not initialized. Call INIT first.");
253
+ }
254
+ const eip712 = sdkInstance.createEIP712(
255
+ payload.publicKey,
256
+ payload.contractAddresses,
257
+ payload.startTimestamp,
258
+ payload.durationDays
259
+ );
260
+ const response = {
261
+ domain: {
262
+ name: eip712.domain.name,
263
+ version: eip712.domain.version,
264
+ chainId: Number(eip712.domain.chainId),
265
+ verifyingContract: eip712.domain.verifyingContract
266
+ },
267
+ types: {
268
+ UserDecryptRequestVerification: eip712.types.UserDecryptRequestVerification.map(
269
+ (field) => ({
270
+ name: field.name,
271
+ type: field.type
272
+ })
273
+ )
274
+ },
275
+ message: {
276
+ publicKey: eip712.message.publicKey,
277
+ contractAddresses: [...eip712.message.contractAddresses],
278
+ startTimestamp: BigInt(eip712.message.startTimestamp),
279
+ durationDays: BigInt(eip712.message.durationDays),
280
+ extraData: eip712.message.extraData
281
+ }
282
+ };
283
+ sendSuccess(id, type, response);
284
+ } catch (error) {
285
+ const message = error instanceof Error ? error.message : String(error);
286
+ console.error("[Worker] CreateEIP712 error:", message);
287
+ sendError(id, type, message);
288
+ }
289
+ }
290
+ function handleCreateDelegatedEIP712(request) {
291
+ const { id, type, payload } = request;
292
+ try {
293
+ if (!sdkInstance) {
294
+ throw new Error("SDK not initialized. Call INIT first.");
295
+ }
296
+ const result = sdkInstance.createDelegatedUserDecryptEIP712(
297
+ payload.publicKey,
298
+ payload.contractAddresses,
299
+ payload.delegatorAddress,
300
+ payload.startTimestamp,
301
+ payload.durationDays
302
+ );
303
+ sendSuccess(id, type, result);
304
+ } catch (error) {
305
+ const message = error instanceof Error ? error.message : String(error);
306
+ console.error("[Worker] CreateDelegatedEIP712 error:", message);
307
+ sendError(id, type, message);
308
+ }
309
+ }
310
+ async function handleDelegatedUserDecrypt(request) {
311
+ const { id, type, payload } = request;
312
+ try {
313
+ if (!sdkInstance) {
314
+ throw new Error("SDK not initialized. Call INIT first.");
315
+ }
316
+ const handleContractPairs = payload.handles.map((handle) => ({
317
+ handle,
318
+ contractAddress: payload.contractAddress
319
+ }));
320
+ const result = await sdkInstance.delegatedUserDecrypt(
321
+ handleContractPairs,
322
+ payload.privateKey,
323
+ payload.publicKey,
324
+ payload.signature,
325
+ payload.signedContractAddresses,
326
+ payload.delegatorAddress,
327
+ payload.delegateAddress,
328
+ payload.startTimestamp,
329
+ payload.durationDays
330
+ );
331
+ const response = {
332
+ clearValues: convertToBigIntRecord(result)
333
+ };
334
+ sendSuccess(id, type, response);
335
+ } catch (error) {
336
+ const message = error instanceof Error ? error.message : String(error);
337
+ console.error("[Worker] DelegatedUserDecrypt error:", message);
338
+ sendError(id, type, message);
339
+ }
340
+ }
341
+ async function handleRequestZKProofVerification(request) {
342
+ const { id, type, payload } = request;
343
+ try {
344
+ if (!sdkInstance) {
345
+ throw new Error("SDK not initialized. Call INIT first.");
346
+ }
347
+ const result = await sdkInstance.requestZKProofVerification(payload.zkProof);
348
+ const transferList = [
349
+ result.inputProof.buffer,
350
+ ...result.handles.map((h) => h.buffer)
351
+ ];
352
+ sendSuccess(id, type, result, transferList);
353
+ } catch (error) {
354
+ const message = error instanceof Error ? error.message : String(error);
355
+ console.error("[Worker] RequestZKProofVerification error:", message);
356
+ sendError(id, type, message);
357
+ }
358
+ }
359
+ function handleGetPublicKey(request) {
360
+ const { id, type } = request;
361
+ try {
362
+ if (!sdkInstance) {
363
+ throw new Error("SDK not initialized. Call INIT first.");
364
+ }
365
+ const result = sdkInstance.getPublicKey();
366
+ const response = { result };
367
+ sendSuccess(id, type, response);
368
+ } catch (error) {
369
+ const message = error instanceof Error ? error.message : String(error);
370
+ console.error("[Worker] GetPublicKey error:", message);
371
+ sendError(id, type, message);
372
+ }
373
+ }
374
+ function handleGetPublicParams(request) {
375
+ const { id, type, payload } = request;
376
+ try {
377
+ if (!sdkInstance) {
378
+ throw new Error("SDK not initialized. Call INIT first.");
379
+ }
380
+ const result = sdkInstance.getPublicParams(
381
+ payload.bits
382
+ );
383
+ const response = { result };
384
+ sendSuccess(id, type, response);
385
+ } catch (error) {
386
+ const message = error instanceof Error ? error.message : String(error);
387
+ console.error("[Worker] GetPublicParams error:", message);
388
+ sendError(id, type, message);
389
+ }
390
+ }
391
+ function handleUpdateCsrf(request) {
392
+ const { id, type, payload } = request;
393
+ csrfTokenBase = payload.csrfToken;
394
+ sendSuccess(id, type, { updated: true });
395
+ }
396
+ self.onmessage = async (event) => {
397
+ const request = event.data;
398
+ try {
399
+ switch (request.type) {
400
+ case "INIT":
401
+ await handleInit(request);
402
+ break;
403
+ case "UPDATE_CSRF":
404
+ handleUpdateCsrf(request);
405
+ break;
406
+ case "ENCRYPT":
407
+ await handleEncrypt(request);
408
+ break;
409
+ case "USER_DECRYPT":
410
+ await handleUserDecrypt(request);
411
+ break;
412
+ case "PUBLIC_DECRYPT":
413
+ await handlePublicDecrypt(request);
414
+ break;
415
+ case "GENERATE_KEYPAIR":
416
+ handleGenerateKeypair(request);
417
+ break;
418
+ case "CREATE_EIP712":
419
+ handleCreateEIP712(request);
420
+ break;
421
+ case "CREATE_DELEGATED_EIP712":
422
+ handleCreateDelegatedEIP712(request);
423
+ break;
424
+ case "DELEGATED_USER_DECRYPT":
425
+ await handleDelegatedUserDecrypt(request);
426
+ break;
427
+ case "REQUEST_ZK_PROOF_VERIFICATION":
428
+ await handleRequestZKProofVerification(request);
429
+ break;
430
+ case "GET_PUBLIC_KEY":
431
+ handleGetPublicKey(request);
432
+ break;
433
+ case "GET_PUBLIC_PARAMS":
434
+ handleGetPublicParams(request);
435
+ break;
436
+ default:
437
+ console.error("[Worker] Unknown request type:", request.type);
438
+ }
439
+ } catch (err) {
440
+ const message = err instanceof Error ? err.message : String(err);
441
+ sendError(
442
+ request?.id ?? "unknown",
443
+ request?.type ?? "UNKNOWN",
444
+ message
445
+ );
446
+ }
447
+ };
448
+ //# sourceMappingURL=relayer-sdk.worker.js.map
449
+ //# sourceMappingURL=relayer-sdk.worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/worker/relayer-sdk.worker.ts"],"names":[],"mappings":"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","file":"relayer-sdk.worker.js","sourcesContent":["/**\n * Web Worker for RelayerSDK FHE operations.\n * Handles CPU-intensive WASM operations off the main thread.\n */\n\nimport type {\n FhevmInstance,\n FhevmInstanceConfig,\n RelayerSDKGlobal,\n} from \"../relayer/relayer-sdk.types\";\nimport { convertToBigIntRecord } from \"../relayer/relayer-utils\";\nimport { assertObject, assertString } from \"../utils\";\nimport type {\n CreateDelegatedEIP712Request,\n CreateDelegatedEIP712ResponseData,\n CreateEIP712Request,\n CreateEIP712ResponseData,\n DelegatedUserDecryptRequest,\n DelegatedUserDecryptResponseData,\n EncryptRequest,\n EncryptResponseData,\n ErrorResponse,\n GenerateKeypairRequest,\n GenerateKeypairResponseData,\n GetPublicKeyRequest,\n GetPublicKeyResponseData,\n GetPublicParamsRequest,\n GetPublicParamsResponseData,\n InitRequest,\n InitResponseData,\n PublicDecryptRequest,\n PublicDecryptResponseData,\n RequestZKProofVerificationRequest,\n SuccessResponse,\n UpdateCsrfRequest,\n UpdateCsrfResponseData,\n UserDecryptRequest,\n UserDecryptResponseData,\n WorkerRequest,\n} from \"./worker.types\";\n\n// Global SDK instance and config\nlet sdkInstance: FhevmInstance | null = null;\nlet sdkGlobal: RelayerSDKGlobal | null = null;\n\n// Store relayer URL and CSRF token for fetch interception.\n// These globals are per-worker-instance. Do NOT convert to SharedWorker\n// without rearchitecting CSRF token management to be per-connection.\nlet relayerUrlBase: string = \"\";\nlet csrfTokenBase: string = \"\";\n\n// CSRF header name (must match server expectation)\nconst CSRF_HEADER_NAME = \"x-csrf-token\";\n\n// Mutating HTTP methods that require CSRF token (js-set-map-lookups)\nconst MUTATING_METHODS = new Set([\"POST\", \"PUT\", \"DELETE\", \"PATCH\"]);\n\n// Web Worker global scope with SDK\ninterface WorkerGlobalScopeWithSDK extends Worker {\n relayerSDK?: RelayerSDKGlobal;\n importScripts: (...urls: string[]) => void;\n}\n\ndeclare const self: WorkerGlobalScopeWithSDK;\n\n/**\n * Send a success response back to the main thread.\n * Optionally transfers ArrayBuffers for zero-copy performance.\n */\nfunction sendSuccess<T>(\n id: string,\n type: WorkerRequest[\"type\"],\n data: T,\n transfer?: Transferable[],\n): void {\n const response: SuccessResponse<T> = {\n id,\n type,\n success: true,\n data,\n };\n return transfer ? self.postMessage(response, transfer) : self.postMessage(response);\n}\n\n/**\n * Send an error response back to the main thread.\n */\nfunction sendError(\n id: string,\n type: WorkerRequest[\"type\"],\n error: string,\n statusCode?: number,\n): void {\n const response: ErrorResponse = {\n id,\n type,\n success: false,\n error,\n };\n if (statusCode !== undefined) {\n response.statusCode = statusCode;\n }\n self.postMessage(response);\n}\n\n// Store original fetch for use in SDK loading\nconst originalFetch = fetch;\n\n// ── CDN URL validation ───────────────────────────────────────\n\n/** Allowed CDN hostnames for loading the relayer SDK script. */\nconst ALLOWED_CDN_HOSTS = new Set<string>([\"cdn.zama.org\"]);\n\n/**\n * Validate the CDN URL supplied by the caller.\n * Ensures only HTTPS URLs from approved hosts are used when loading\n * SDK code into the worker.\n */\nfunction validateCdnUrl(rawUrl: string): string {\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n throw new Error(\"Invalid CDN URL\");\n }\n\n if (url.protocol !== \"https:\") {\n throw new Error(\"CDN URL must use https\");\n }\n\n if (!ALLOWED_CDN_HOSTS.has(url.hostname)) {\n throw new Error(`CDN URL host is not allowed: ${url.hostname}`);\n }\n\n return url.toString();\n}\n\n/**\n * Set up fetch interceptor to add credentials and CSRF token for relayer requests.\n * Workers don't automatically include cookies, so we intercept fetch calls\n * targeting our relayer proxy to inject credentials and CSRF headers.\n */\nfunction setupFetchInterceptor(): void {\n globalThis.fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\n const method = init?.method?.toUpperCase() ?? \"GET\";\n\n // Only intercept requests to our relayer proxy\n if (relayerUrlBase && url.startsWith(relayerUrlBase)) {\n const headers = new Headers(init?.headers);\n\n // Add CSRF token for mutating requests\n if (MUTATING_METHODS.has(method) && csrfTokenBase) {\n headers.set(CSRF_HEADER_NAME, csrfTokenBase);\n }\n\n return originalFetch(input, {\n ...init,\n headers,\n credentials: \"include\",\n });\n }\n\n // Pass through other requests unchanged\n return originalFetch(input, init);\n };\n}\n\n/**\n * Detect browser extension environment (Chrome, Firefox, Safari).\n * Extensions have restricted CSP that blocks blob: URLs, so we must\n * fall back to importScripts with the CDN URL directly.\n * - Chrome/Edge: `chrome.runtime.id`\n * - Firefox/Safari: `browser.runtime.id`\n */\nfunction isBrowserExtension(): boolean {\n try {\n // Chrome/Edge expose chrome.runtime.id, Firefox/Safari expose browser.runtime.id\n const g = globalThis as unknown as Record<string, unknown>;\n for (const ns of [g.chrome, g.browser]) {\n assertObject(ns, \"ns\");\n assertObject(ns.runtime, \"runtime\");\n assertString(ns.runtime.id, \"id\");\n return true;\n }\n } catch {\n return false;\n }\n return false;\n}\n\n/**\n * Verify a fetched script's SHA-384 hash matches the expected integrity value.\n */\nasync function verifyIntegrity(content: string, expectedHash: string): Promise<void> {\n const encoder = new TextEncoder();\n const hashBuffer = await crypto.subtle.digest(\"SHA-384\", encoder.encode(content));\n const hashHex = Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n if (hashHex !== expectedHash) {\n throw new Error(`CDN integrity check failed: expected SHA-384 ${expectedHash}, got ${hashHex}`);\n }\n}\n\n/**\n * Load SDK script from CDN.\n * Uses two strategies depending on the environment:\n * - **Web apps (default):** fetch + blob URL + importScripts. Avoids MIME-type\n * rejections (some CDNs serve .cjs as `application/node`) and CSP\n * `unsafe-eval` violations.\n * - **Browser extensions (Chrome/Firefox/Safari):** importScripts directly.\n * Blob URLs are blocked by extension CSP, but the CDN must be allowed\n * in the extension's manifest CSP.\n *\n * Integrity is always verified when a hash is provided, regardless of strategy.\n */\nasync function fetchScript(cdnUrl: string): Promise<string> {\n const response = await originalFetch(cdnUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch SDK: ${response.status} ${response.statusText}`);\n }\n return response.text();\n}\n\nasync function loadSdkScript(cdnUrl: string, integrity?: string): Promise<void> {\n if (isBrowserExtension()) {\n // Extensions: blob: URLs are forbidden. Use importScripts directly —\n // the CDN origin must be allowed in the extension's CSP manifest.\n if (integrity) {\n await verifyIntegrity(await fetchScript(cdnUrl), integrity);\n }\n return self.importScripts(cdnUrl);\n }\n\n // Web apps: fetch + blob URL avoids MIME-type and eval CSP issues.\n const scriptContent = await fetchScript(cdnUrl);\n\n if (integrity) {\n await verifyIntegrity(scriptContent, integrity);\n }\n\n const blob = new Blob([scriptContent], { type: \"application/javascript\" });\n const blobUrl = URL.createObjectURL(blob);\n try {\n self.importScripts(blobUrl);\n } finally {\n URL.revokeObjectURL(blobUrl);\n }\n}\n\n/**\n * Handle INIT request - load SDK and initialize WASM.\n */\nasync function handleInit(request: InitRequest): Promise<void> {\n const { id, type, payload } = request;\n const { cdnUrl, fhevmConfig, csrfToken, integrity } = payload;\n\n try {\n // Validate CDN URL before any script loading\n validateCdnUrl(cdnUrl);\n\n // Extract relayerUrl from config for fetch interception\n relayerUrlBase = fhevmConfig.relayerUrl ?? \"\";\n csrfTokenBase = csrfToken;\n\n // Set up fetch interceptor before loading SDK\n setupFetchInterceptor();\n\n // Load SDK via fetch + blob URL (avoids CORS issues with importScripts)\n await loadSdkScript(cdnUrl, integrity);\n\n if (!self.relayerSDK) {\n throw new Error(\"Failed to load relayerSDK from CDN\");\n }\n\n sdkGlobal = self.relayerSDK;\n\n // Initialize WASM\n await sdkGlobal.initSDK();\n\n // Create SDK instance with caller-provided config\n const config: FhevmInstanceConfig = {\n ...fhevmConfig,\n batchRpcCalls: false,\n };\n\n sdkInstance = await sdkGlobal.createInstance(config);\n\n sendSuccess<InitResponseData>(id, type, { initialized: true });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] Init error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle ENCRYPT request.\n */\nasync function handleEncrypt(request: EncryptRequest): Promise<void> {\n const { id, type, payload } = request;\n const { values, contractAddress, userAddress } = payload;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const input = sdkInstance.createEncryptedInput(contractAddress, userAddress);\n\n for (const value of values) {\n input.add64(value);\n }\n\n const encrypted = await input.encrypt();\n\n const response: EncryptResponseData = {\n handles: encrypted.handles,\n inputProof: encrypted.inputProof,\n };\n\n // Transfer ArrayBuffers for zero-copy performance\n const transferList: Transferable[] = [\n encrypted.inputProof.buffer,\n ...encrypted.handles.map((h) => h.buffer),\n ];\n\n sendSuccess(id, type, response, transferList);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] Encrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle USER_DECRYPT request.\n */\nasync function handleUserDecrypt(request: UserDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const handleContractPairs = payload.handles.map((handle) => ({\n handle,\n contractAddress: payload.contractAddress,\n }));\n\n const result = await sdkInstance.userDecrypt(\n handleContractPairs,\n payload.privateKey,\n payload.publicKey,\n payload.signature,\n payload.signedContractAddresses,\n payload.signerAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n const response: UserDecryptResponseData = {\n clearValues: convertToBigIntRecord(result),\n };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const statusCode = extractHttpStatus(error);\n console.error(\"[Worker] UserDecrypt error:\", message);\n sendError(id, type, message, statusCode);\n }\n}\n\n/**\n * Extract an HTTP status code from an error, if present.\n * Relayer SDK errors may carry a `status` or `statusCode` property.\n */\nfunction extractHttpStatus(error: unknown): number | undefined {\n if (error == null || typeof error !== \"object\") return undefined;\n const e = error as Record<string, unknown>;\n if (typeof e.statusCode === \"number\") return e.statusCode;\n if (typeof e.status === \"number\") return e.status;\n // Check nested cause\n if (e.cause != null && typeof e.cause === \"object\") {\n const cause = e.cause as Record<string, unknown>;\n if (typeof cause.statusCode === \"number\") return cause.statusCode;\n if (typeof cause.status === \"number\") return cause.status;\n }\n return undefined;\n}\n\n/**\n * Handle PUBLIC_DECRYPT request.\n */\nasync function handlePublicDecrypt(request: PublicDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const result = await sdkInstance.publicDecrypt(payload.handles);\n\n const response: PublicDecryptResponseData = {\n clearValues: convertToBigIntRecord(result.clearValues),\n abiEncodedClearValues: result.abiEncodedClearValues,\n decryptionProof: result.decryptionProof,\n };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] PublicDecrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle GENERATE_KEYPAIR request.\n */\nfunction handleGenerateKeypair(request: GenerateKeypairRequest): void {\n const { id, type } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const keypair = sdkInstance.generateKeypair();\n\n const response: GenerateKeypairResponseData = {\n publicKey: keypair.publicKey,\n privateKey: keypair.privateKey,\n };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] GenerateKeypair error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle CREATE_EIP712 request.\n */\nfunction handleCreateEIP712(request: CreateEIP712Request): void {\n const { id, type, payload } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const eip712 = sdkInstance.createEIP712(\n payload.publicKey,\n payload.contractAddresses,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n const response: CreateEIP712ResponseData = {\n domain: {\n name: eip712.domain.name,\n version: eip712.domain.version,\n chainId: Number(eip712.domain.chainId),\n verifyingContract: eip712.domain.verifyingContract as `0x${string}`,\n },\n types: {\n UserDecryptRequestVerification: eip712.types.UserDecryptRequestVerification.map(\n (field) => ({\n name: field.name,\n type: field.type,\n }),\n ),\n },\n message: {\n publicKey: eip712.message.publicKey,\n contractAddresses: [...eip712.message.contractAddresses],\n startTimestamp: BigInt(eip712.message.startTimestamp),\n durationDays: BigInt(eip712.message.durationDays),\n extraData: eip712.message.extraData,\n },\n };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] CreateEIP712 error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle CREATE_DELEGATED_EIP712 request.\n */\nfunction handleCreateDelegatedEIP712(request: CreateDelegatedEIP712Request): void {\n const { id, type, payload } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const result = sdkInstance.createDelegatedUserDecryptEIP712(\n payload.publicKey,\n payload.contractAddresses,\n payload.delegatorAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n sendSuccess<CreateDelegatedEIP712ResponseData>(id, type, result);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] CreateDelegatedEIP712 error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle DELEGATED_USER_DECRYPT request.\n */\nasync function handleDelegatedUserDecrypt(request: DelegatedUserDecryptRequest): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const handleContractPairs = payload.handles.map((handle) => ({\n handle,\n contractAddress: payload.contractAddress,\n }));\n\n const result = await sdkInstance.delegatedUserDecrypt(\n handleContractPairs,\n payload.privateKey,\n payload.publicKey,\n payload.signature,\n payload.signedContractAddresses,\n payload.delegatorAddress,\n payload.delegateAddress,\n payload.startTimestamp,\n payload.durationDays,\n );\n\n const response: DelegatedUserDecryptResponseData = {\n clearValues: convertToBigIntRecord(result),\n };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] DelegatedUserDecrypt error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle REQUEST_ZK_PROOF_VERIFICATION request.\n */\nasync function handleRequestZKProofVerification(\n request: RequestZKProofVerificationRequest,\n): Promise<void> {\n const { id, type, payload } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const result = await sdkInstance.requestZKProofVerification(payload.zkProof);\n\n // Transfer ArrayBuffers for zero-copy performance\n const transferList: Transferable[] = [\n result.inputProof.buffer,\n ...result.handles.map((h) => h.buffer),\n ];\n\n sendSuccess(id, type, result, transferList);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] RequestZKProofVerification error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle GET_PUBLIC_KEY request.\n */\nfunction handleGetPublicKey(request: GetPublicKeyRequest): void {\n const { id, type } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const result = sdkInstance.getPublicKey();\n\n const response: GetPublicKeyResponseData = { result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] GetPublicKey error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle GET_PUBLIC_PARAMS request.\n */\nfunction handleGetPublicParams(request: GetPublicParamsRequest): void {\n const { id, type, payload } = request;\n\n try {\n if (!sdkInstance) {\n throw new Error(\"SDK not initialized. Call INIT first.\");\n }\n\n const result = sdkInstance.getPublicParams(\n payload.bits as keyof import(\"@zama-fhe/relayer-sdk/bundle\").PublicParams<Uint8Array>,\n );\n\n const response: GetPublicParamsResponseData = { result };\n\n sendSuccess(id, type, response);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"[Worker] GetPublicParams error:\", message);\n sendError(id, type, message);\n }\n}\n\n/**\n * Handle UPDATE_CSRF request - update the stored CSRF token.\n */\nfunction handleUpdateCsrf(request: UpdateCsrfRequest): void {\n const { id, type, payload } = request;\n csrfTokenBase = payload.csrfToken;\n sendSuccess<UpdateCsrfResponseData>(id, type, { updated: true });\n}\n\n/**\n * Main message handler.\n */\nself.onmessage = async (event: MessageEvent<WorkerRequest>) => {\n const request = event.data;\n\n try {\n switch (request.type) {\n case \"INIT\":\n await handleInit(request);\n break;\n case \"UPDATE_CSRF\":\n handleUpdateCsrf(request);\n break;\n case \"ENCRYPT\":\n await handleEncrypt(request);\n break;\n case \"USER_DECRYPT\":\n await handleUserDecrypt(request);\n break;\n case \"PUBLIC_DECRYPT\":\n await handlePublicDecrypt(request);\n break;\n case \"GENERATE_KEYPAIR\":\n handleGenerateKeypair(request);\n break;\n case \"CREATE_EIP712\":\n handleCreateEIP712(request);\n break;\n case \"CREATE_DELEGATED_EIP712\":\n handleCreateDelegatedEIP712(request);\n break;\n case \"DELEGATED_USER_DECRYPT\":\n await handleDelegatedUserDecrypt(request);\n break;\n case \"REQUEST_ZK_PROOF_VERIFICATION\":\n await handleRequestZKProofVerification(request);\n break;\n case \"GET_PUBLIC_KEY\":\n handleGetPublicKey(request);\n break;\n case \"GET_PUBLIC_PARAMS\":\n handleGetPublicParams(request);\n break;\n default:\n console.error(\"[Worker] Unknown request type:\", (request as WorkerRequest).type);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n sendError(\n request?.id ?? \"unknown\",\n request?.type ?? (\"UNKNOWN\" as WorkerRequest[\"type\"]),\n message,\n );\n }\n};\n"]}
@@ -0,0 +1,46 @@
1
+ import { F as FHEKeypair, E as EIP712TypedData, a as EncryptParams, b as EncryptResult, U as UserDecryptParams, P as PublicDecryptResult, D as DelegatedUserDecryptParams } from './token.types-D1ELXBX9.js';
2
+ import { Address, KmsDelegatedUserDecryptEIP712Type, ZKProofLike, InputProofBytesType, FhevmInstanceConfig } from '@zama-fhe/relayer-sdk/bundle';
3
+
4
+ /**
5
+ * Interface for FHE relayer operations.
6
+ * Implemented by `RelayerWeb` (browser, via Web Worker + WASM) and `RelayerNode` (Node.js, direct).
7
+ */
8
+ interface RelayerSDK {
9
+ /** Generate an FHE keypair (public + private key). */
10
+ generateKeypair(): Promise<FHEKeypair>;
11
+ /** Create EIP-712 typed data for signing an FHE decrypt credential. */
12
+ createEIP712(publicKey: string, contractAddresses: Address[], startTimestamp: number, durationDays?: number): Promise<EIP712TypedData>;
13
+ /** Encrypt plaintext values into FHE ciphertexts. */
14
+ encrypt(params: EncryptParams): Promise<EncryptResult>;
15
+ /** Decrypt FHE ciphertext handles using the user's own credentials. */
16
+ userDecrypt(params: UserDecryptParams): Promise<Record<string, bigint>>;
17
+ /** Decrypt FHE handles using the network public key (no credential needed). */
18
+ publicDecrypt(handles: string[]): Promise<PublicDecryptResult>;
19
+ /** Create EIP-712 typed data for a delegated user decrypt credential. */
20
+ createDelegatedUserDecryptEIP712(publicKey: string, contractAddresses: Address[], delegatorAddress: string, startTimestamp: number, durationDays?: number): Promise<KmsDelegatedUserDecryptEIP712Type>;
21
+ /** Decrypt FHE handles using delegated user credentials. */
22
+ delegatedUserDecrypt(params: DelegatedUserDecryptParams): Promise<Record<string, bigint>>;
23
+ /** Submit a ZK proof for on-chain verification. */
24
+ requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType>;
25
+ /** Fetch the FHE network public key. Returns `null` if not available. */
26
+ getPublicKey(): Promise<{
27
+ publicKeyId: string;
28
+ publicKey: Uint8Array;
29
+ } | null>;
30
+ /** Fetch FHE public parameters for a given bit size. Returns `null` if not available. */
31
+ getPublicParams(bits: number): Promise<{
32
+ publicParams: Uint8Array;
33
+ publicParamsId: string;
34
+ } | null>;
35
+ /** Terminate the relayer backend and release resources. */
36
+ terminate(): void;
37
+ }
38
+
39
+ /** Mainnet network configuration (chainId 1). */
40
+ declare const MainnetConfig: FhevmInstanceConfig;
41
+ /** Sepolia testnet network configuration (chainId 11155111). */
42
+ declare const SepoliaConfig: FhevmInstanceConfig;
43
+ /** Hardhat local network configuration (chainId 31337). */
44
+ declare const HardhatConfig: FhevmInstanceConfig;
45
+
46
+ export { HardhatConfig as H, MainnetConfig as M, type RelayerSDK as R, SepoliaConfig as S };