@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,285 @@
1
+ // src/token/errors.ts
2
+ var ZamaErrorCode = {
3
+ /** User rejected the wallet signature prompt. */
4
+ SigningRejected: "SIGNING_REJECTED",
5
+ /** Wallet signature failed for a reason other than rejection. */
6
+ SigningFailed: "SIGNING_FAILED",
7
+ /** FHE encryption failed. */
8
+ EncryptionFailed: "ENCRYPTION_FAILED",
9
+ /** FHE decryption failed. */
10
+ DecryptionFailed: "DECRYPTION_FAILED",
11
+ /** ERC-20 approval transaction failed. */
12
+ ApprovalFailed: "APPROVAL_FAILED",
13
+ /** On-chain transaction reverted. */
14
+ TransactionReverted: "TRANSACTION_REVERTED",
15
+ /** FHE credentials have expired and need regeneration. */
16
+ CredentialExpired: "CREDENTIAL_EXPIRED",
17
+ /** Relayer rejected credentials (stale, expired, or malformed). */
18
+ InvalidCredentials: "INVALID_CREDENTIALS",
19
+ /** No FHE ciphertext exists for this account (never shielded). */
20
+ NoCiphertext: "NO_CIPHERTEXT",
21
+ /** Relayer HTTP request failed. */
22
+ RelayerRequestFailed: "RELAYER_REQUEST_FAILED"
23
+ };
24
+ var ZamaError = class extends Error {
25
+ /** Machine-readable error code. */
26
+ code;
27
+ constructor(code, message, options) {
28
+ super(message, options);
29
+ this.name = "ZamaError";
30
+ this.code = code;
31
+ }
32
+ };
33
+ var SigningRejectedError = class extends ZamaError {
34
+ constructor(message, options) {
35
+ super(ZamaErrorCode.SigningRejected, message, options);
36
+ this.name = "SigningRejectedError";
37
+ }
38
+ };
39
+ var SigningFailedError = class extends ZamaError {
40
+ constructor(message, options) {
41
+ super(ZamaErrorCode.SigningFailed, message, options);
42
+ this.name = "SigningFailedError";
43
+ }
44
+ };
45
+ var EncryptionFailedError = class extends ZamaError {
46
+ constructor(message, options) {
47
+ super(ZamaErrorCode.EncryptionFailed, message, options);
48
+ this.name = "EncryptionFailedError";
49
+ }
50
+ };
51
+ var DecryptionFailedError = class extends ZamaError {
52
+ constructor(message, options) {
53
+ super(ZamaErrorCode.DecryptionFailed, message, options);
54
+ this.name = "DecryptionFailedError";
55
+ }
56
+ };
57
+ var ApprovalFailedError = class extends ZamaError {
58
+ constructor(message, options) {
59
+ super(ZamaErrorCode.ApprovalFailed, message, options);
60
+ this.name = "ApprovalFailedError";
61
+ }
62
+ };
63
+ var TransactionRevertedError = class extends ZamaError {
64
+ constructor(message, options) {
65
+ super(ZamaErrorCode.TransactionReverted, message, options);
66
+ this.name = "TransactionRevertedError";
67
+ }
68
+ };
69
+ var CredentialExpiredError = class extends ZamaError {
70
+ constructor(message, options) {
71
+ super(ZamaErrorCode.CredentialExpired, message, options);
72
+ this.name = "CredentialExpiredError";
73
+ }
74
+ };
75
+ var InvalidCredentialsError = class extends ZamaError {
76
+ constructor(message, options) {
77
+ super(ZamaErrorCode.InvalidCredentials, message, options);
78
+ this.name = "InvalidCredentialsError";
79
+ }
80
+ };
81
+ var NoCiphertextError = class extends ZamaError {
82
+ constructor(message, options) {
83
+ super(ZamaErrorCode.NoCiphertext, message, options);
84
+ this.name = "NoCiphertextError";
85
+ }
86
+ };
87
+ var RelayerRequestFailedError = class extends ZamaError {
88
+ /** HTTP status code from the relayer, if available. */
89
+ statusCode;
90
+ constructor(message, statusCode, options) {
91
+ super(ZamaErrorCode.RelayerRequestFailed, message, options);
92
+ this.name = "RelayerRequestFailedError";
93
+ this.statusCode = statusCode;
94
+ }
95
+ };
96
+ function matchZamaError(error, handlers) {
97
+ if (error instanceof ZamaError) {
98
+ const handler = handlers[error.code];
99
+ if (handler) return handler(error);
100
+ }
101
+ return handlers._?.(error);
102
+ }
103
+
104
+ // src/worker/worker.base-client.ts
105
+ var DEFAULT_TIMEOUT_MS = 3e4;
106
+ var INIT_TIMEOUT_MS = 6e4;
107
+ var BaseWorkerClient = class {
108
+ #worker = null;
109
+ #pendingRequests = /* @__PURE__ */ new Map();
110
+ #initPromise = null;
111
+ config;
112
+ logger;
113
+ constructor(config, logger) {
114
+ this.config = config;
115
+ this.logger = logger;
116
+ }
117
+ // ===========================================================================
118
+ // Shared init / terminate
119
+ // ===========================================================================
120
+ async initWorker() {
121
+ if (this.#worker) return this.#worker;
122
+ if (!this.#initPromise) {
123
+ this.#initPromise = this.#doInitWorker().catch((err) => {
124
+ this.#initPromise = null;
125
+ throw err;
126
+ });
127
+ }
128
+ return this.#initPromise;
129
+ }
130
+ async #doInitWorker() {
131
+ const worker = this.createWorker();
132
+ this.wireEvents(worker);
133
+ try {
134
+ const { type, payload } = this.getInitPayload();
135
+ await this.sendRequestTo(worker, type, payload, INIT_TIMEOUT_MS);
136
+ this.onWorkerReady?.(worker);
137
+ this.#worker = worker;
138
+ } catch (err) {
139
+ this.terminateWorker(worker);
140
+ throw err;
141
+ }
142
+ return this.#worker;
143
+ }
144
+ terminate() {
145
+ if (this.#worker) {
146
+ for (const [id, pending] of this.#pendingRequests) {
147
+ clearTimeout(pending.timeoutId);
148
+ pending.reject(new Error("Worker terminated"));
149
+ this.#pendingRequests.delete(id);
150
+ }
151
+ this.terminateWorker(this.#worker);
152
+ this.#worker = null;
153
+ }
154
+ this.#initPromise = null;
155
+ }
156
+ // ===========================================================================
157
+ // Message handling (called by subclass event wiring)
158
+ // ===========================================================================
159
+ handleResponse(response) {
160
+ const pending = this.#pendingRequests.get(response.id);
161
+ if (!pending) {
162
+ this.logger?.warn("[WorkerClient] Received response for unknown request", {
163
+ id: response.id
164
+ });
165
+ return;
166
+ }
167
+ const elapsed = Math.round(performance.now() - pending.startTime);
168
+ clearTimeout(pending.timeoutId);
169
+ this.#pendingRequests.delete(response.id);
170
+ if (response.success) {
171
+ this.logger?.debug(`[WorkerClient] \u2190 ${pending.type} OK`, {
172
+ id: response.id,
173
+ elapsed
174
+ });
175
+ pending.resolve(response.data);
176
+ } else {
177
+ this.logger?.error(`[WorkerClient] \u2190 ${pending.type} FAILED`, {
178
+ id: response.id,
179
+ elapsed,
180
+ error: response.error
181
+ });
182
+ const err = new Error(response.error);
183
+ if ("statusCode" in response && typeof response.statusCode === "number") {
184
+ err.statusCode = response.statusCode;
185
+ }
186
+ pending.reject(err);
187
+ }
188
+ }
189
+ handleWorkerError(message) {
190
+ this.logger?.error("[WorkerClient] Worker error", { error: message });
191
+ const worker = this.#worker;
192
+ this.#worker = null;
193
+ this.#rejectAllPending(`Worker error: ${message}`);
194
+ if (worker) this.terminateWorker(worker);
195
+ }
196
+ handleWorkerMessageError() {
197
+ this.logger?.error("[WorkerClient] Message deserialization failed");
198
+ const worker = this.#worker;
199
+ this.#worker = null;
200
+ this.#rejectAllPending("Worker message deserialization failed");
201
+ if (worker) this.terminateWorker(worker);
202
+ }
203
+ // ===========================================================================
204
+ // Request sending
205
+ // ===========================================================================
206
+ sendRequestTo(worker, type, payload, timeoutMs = DEFAULT_TIMEOUT_MS) {
207
+ return new Promise((resolve, reject) => {
208
+ const id = this.generateRequestId();
209
+ const startTime = performance.now();
210
+ this.logger?.debug(`[WorkerClient] \u2192 ${type}`, { id });
211
+ const timeoutId = setTimeout(() => {
212
+ this.#pendingRequests.delete(id);
213
+ const elapsed = Math.round(performance.now() - startTime);
214
+ this.logger?.error(`[WorkerClient] ${type} timed out after ${timeoutMs}ms`, {
215
+ id,
216
+ elapsed
217
+ });
218
+ reject(new Error(`Request ${type} timed out after ${timeoutMs}ms`));
219
+ }, timeoutMs);
220
+ this.#pendingRequests.set(id, {
221
+ resolve,
222
+ reject,
223
+ timeoutId,
224
+ startTime,
225
+ type
226
+ });
227
+ const request = { id, type, payload };
228
+ this.postMessage(worker, request);
229
+ });
230
+ }
231
+ async sendRequest(type, payload, timeoutMs = DEFAULT_TIMEOUT_MS) {
232
+ const worker = await this.initWorker();
233
+ return this.sendRequestTo(worker, type, payload, timeoutMs);
234
+ }
235
+ // ===========================================================================
236
+ // Domain methods
237
+ // ===========================================================================
238
+ async generateKeypair() {
239
+ return this.sendRequest("GENERATE_KEYPAIR", {});
240
+ }
241
+ async createEIP712(params) {
242
+ return this.sendRequest("CREATE_EIP712", params);
243
+ }
244
+ async encrypt(params) {
245
+ return this.sendRequest("ENCRYPT", params);
246
+ }
247
+ async userDecrypt(params) {
248
+ return this.sendRequest("USER_DECRYPT", params);
249
+ }
250
+ async publicDecrypt(handles) {
251
+ return this.sendRequest("PUBLIC_DECRYPT", { handles });
252
+ }
253
+ async createDelegatedUserDecryptEIP712(params) {
254
+ return this.sendRequest("CREATE_DELEGATED_EIP712", params);
255
+ }
256
+ async delegatedUserDecrypt(params) {
257
+ return this.sendRequest("DELEGATED_USER_DECRYPT", params);
258
+ }
259
+ async requestZKProofVerification(zkProof) {
260
+ return this.sendRequest(
261
+ "REQUEST_ZK_PROOF_VERIFICATION",
262
+ { zkProof }
263
+ );
264
+ }
265
+ async getPublicKey() {
266
+ return this.sendRequest("GET_PUBLIC_KEY", {});
267
+ }
268
+ async getPublicParams(bits) {
269
+ return this.sendRequest("GET_PUBLIC_PARAMS", { bits });
270
+ }
271
+ // ===========================================================================
272
+ // Internal helpers
273
+ // ===========================================================================
274
+ #rejectAllPending(message) {
275
+ for (const [id, pending] of this.#pendingRequests) {
276
+ clearTimeout(pending.timeoutId);
277
+ pending.reject(new Error(message));
278
+ this.#pendingRequests.delete(id);
279
+ }
280
+ }
281
+ };
282
+
283
+ export { ApprovalFailedError, BaseWorkerClient, CredentialExpiredError, DecryptionFailedError, EncryptionFailedError, InvalidCredentialsError, NoCiphertextError, RelayerRequestFailedError, SigningFailedError, SigningRejectedError, TransactionRevertedError, ZamaError, ZamaErrorCode, matchZamaError };
284
+ //# sourceMappingURL=chunk-5D5ZJ3U7.js.map
285
+ //# sourceMappingURL=chunk-5D5ZJ3U7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/token/errors.ts","../src/worker/worker.base-client.ts"],"names":[],"mappings":"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","file":"chunk-5D5ZJ3U7.js","sourcesContent":["/**\n * Typed error codes thrown by the SDK.\n * Use `error.code` or `instanceof` to programmatically handle specific failure modes.\n *\n * @example\n * ```ts\n * try {\n * await token.confidentialTransfer(\"0xTo\", 100n);\n * } catch (e) {\n * if (e instanceof SigningRejectedError) {\n * // User rejected the wallet signature\n * }\n * }\n * ```\n */\nexport const ZamaErrorCode = {\n /** User rejected the wallet signature prompt. */\n SigningRejected: \"SIGNING_REJECTED\",\n /** Wallet signature failed for a reason other than rejection. */\n SigningFailed: \"SIGNING_FAILED\",\n /** FHE encryption failed. */\n EncryptionFailed: \"ENCRYPTION_FAILED\",\n /** FHE decryption failed. */\n DecryptionFailed: \"DECRYPTION_FAILED\",\n /** ERC-20 approval transaction failed. */\n ApprovalFailed: \"APPROVAL_FAILED\",\n /** On-chain transaction reverted. */\n TransactionReverted: \"TRANSACTION_REVERTED\",\n /** FHE credentials have expired and need regeneration. */\n CredentialExpired: \"CREDENTIAL_EXPIRED\",\n /** Relayer rejected credentials (stale, expired, or malformed). */\n InvalidCredentials: \"INVALID_CREDENTIALS\",\n /** No FHE ciphertext exists for this account (never shielded). */\n NoCiphertext: \"NO_CIPHERTEXT\",\n /** Relayer HTTP request failed. */\n RelayerRequestFailed: \"RELAYER_REQUEST_FAILED\",\n} as const;\n\n/** Union of all {@link ZamaErrorCode} string values. */\nexport type ZamaErrorCode = (typeof ZamaErrorCode)[keyof typeof ZamaErrorCode];\n\n/**\n * Base error thrown by all SDK operations.\n * Carries a {@link ZamaErrorCode} for programmatic error handling.\n * Prefer catching specific subclasses (e.g. {@link EncryptionFailedError}).\n */\nexport class ZamaError extends Error {\n /** Machine-readable error code. */\n readonly code: ZamaErrorCode;\n\n constructor(code: ZamaErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"ZamaError\";\n this.code = code;\n }\n}\n\n/** User rejected the wallet signature prompt. */\nexport class SigningRejectedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.SigningRejected, message, options);\n this.name = \"SigningRejectedError\";\n }\n}\n\n/** Wallet signature failed for a reason other than rejection. */\nexport class SigningFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.SigningFailed, message, options);\n this.name = \"SigningFailedError\";\n }\n}\n\n/** FHE encryption failed. */\nexport class EncryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.EncryptionFailed, message, options);\n this.name = \"EncryptionFailedError\";\n }\n}\n\n/** FHE decryption failed. */\nexport class DecryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.DecryptionFailed, message, options);\n this.name = \"DecryptionFailedError\";\n }\n}\n\n/** ERC-20 approval transaction failed. */\nexport class ApprovalFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.ApprovalFailed, message, options);\n this.name = \"ApprovalFailedError\";\n }\n}\n\n/** On-chain transaction reverted. */\nexport class TransactionRevertedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.TransactionReverted, message, options);\n this.name = \"TransactionRevertedError\";\n }\n}\n\n/** FHE credentials have expired and need regeneration. */\nexport class CredentialExpiredError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.CredentialExpired, message, options);\n this.name = \"CredentialExpiredError\";\n }\n}\n\n/** Relayer rejected credentials (stale, expired, or malformed). */\nexport class InvalidCredentialsError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.InvalidCredentials, message, options);\n this.name = \"InvalidCredentialsError\";\n }\n}\n\n/** No FHE ciphertext exists for this account (never shielded). */\nexport class NoCiphertextError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.NoCiphertext, message, options);\n this.name = \"NoCiphertextError\";\n }\n}\n\n/** Relayer HTTP request failed. */\nexport class RelayerRequestFailedError extends ZamaError {\n /** HTTP status code from the relayer, if available. */\n readonly statusCode: number | undefined;\n\n constructor(message: string, statusCode?: number, options?: ErrorOptions) {\n super(ZamaErrorCode.RelayerRequestFailed, message, options);\n this.name = \"RelayerRequestFailedError\";\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Pattern-match on a {@link ZamaError} by its error code.\n * Falls through to the `_` wildcard handler if no specific handler matches.\n * Returns `undefined` if the error is not a `ZamaError` and no `_` handler is provided.\n *\n * @example\n * ```ts\n * matchZamaError(error, {\n * SIGNING_REJECTED: () => toast(\"Please approve in wallet\"),\n * TRANSACTION_REVERTED: (e) => toast(`Tx failed: ${e.message}`),\n * _: () => toast(\"Unknown error\"),\n * });\n * ```\n */\nexport function matchZamaError<R>(\n error: unknown,\n handlers: Partial<Record<ZamaErrorCode, (error: ZamaError) => R>> & {\n _?: (error: unknown) => R;\n },\n): R | undefined {\n if (error instanceof ZamaError) {\n const handler = handlers[error.code];\n if (handler) return handler(error);\n }\n return handlers._?.(error);\n}\n","import type { ZKProofLike } from \"../relayer/relayer-sdk.types\";\nimport type {\n CreateDelegatedEIP712Payload,\n CreateDelegatedEIP712ResponseData,\n CreateEIP712Payload,\n CreateEIP712ResponseData,\n DelegatedUserDecryptPayload,\n DelegatedUserDecryptResponseData,\n EncryptPayload,\n EncryptResponseData,\n GenerateKeypairResponseData,\n GetPublicKeyResponseData,\n GetPublicParamsResponseData,\n InitResponseData,\n PublicDecryptResponseData,\n RequestZKProofVerificationResponseData,\n UserDecryptPayload,\n UserDecryptResponseData,\n GenericLogger,\n WorkerRequest,\n WorkerRequestType,\n WorkerResponse,\n} from \"./worker.types\";\n\n/** Pending request tracker */\ninterface PendingRequest<T> {\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n startTime: number;\n type: WorkerRequestType;\n}\n\n/** Default timeout for operations (30 seconds) */\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\n/** Extended timeout for WASM initialization (60 seconds) */\nexport const INIT_TIMEOUT_MS = 60_000;\n\n/**\n * Abstract base class for worker clients (browser Web Worker and Node.js worker_threads).\n * Encapsulates all shared logic: pending request tracking, timeouts, init dedup, domain methods.\n * Subclasses implement the abstract hooks for platform-specific worker creation and messaging.\n */\nexport abstract class BaseWorkerClient<TWorker, TConfig> {\n #worker: TWorker | null = null;\n #pendingRequests = new Map<string, PendingRequest<unknown>>();\n #initPromise: Promise<TWorker> | null = null;\n protected readonly config: TConfig;\n protected readonly logger: GenericLogger | undefined;\n\n constructor(config: TConfig, logger: GenericLogger | undefined) {\n this.config = config;\n this.logger = logger;\n }\n\n // ===========================================================================\n // Abstract hooks — subclasses must implement\n // ===========================================================================\n\n /** Create the platform-specific worker instance. */\n protected abstract createWorker(): TWorker;\n\n /** Wire message/error/messageerror events on the worker. */\n protected abstract wireEvents(worker: TWorker): void;\n\n /** Post a message to the worker. */\n protected abstract postMessage(worker: TWorker, request: WorkerRequest): void;\n\n /** Terminate the platform-specific worker. */\n protected abstract terminateWorker(worker: TWorker): void;\n\n /** Generate a unique request ID. */\n protected abstract generateRequestId(): string;\n\n /** Return the init request type and payload. */\n protected abstract getInitPayload(): {\n type: WorkerRequestType;\n payload: WorkerRequest[\"payload\"];\n };\n\n /** Optional hook called after worker init succeeds (e.g. for node worker.unref()). */\n protected onWorkerReady?(_worker: TWorker): void;\n\n // ===========================================================================\n // Shared init / terminate\n // ===========================================================================\n\n async initWorker(): Promise<TWorker> {\n if (this.#worker) return this.#worker;\n\n if (!this.#initPromise) {\n this.#initPromise = this.#doInitWorker().catch((err) => {\n this.#initPromise = null;\n throw err;\n });\n }\n return this.#initPromise;\n }\n\n async #doInitWorker(): Promise<TWorker> {\n const worker = this.createWorker();\n this.wireEvents(worker);\n\n try {\n const { type, payload } = this.getInitPayload();\n await this.sendRequestTo<InitResponseData>(worker, type, payload, INIT_TIMEOUT_MS);\n this.onWorkerReady?.(worker);\n this.#worker = worker;\n } catch (err) {\n this.terminateWorker(worker);\n throw err;\n }\n\n return this.#worker;\n }\n\n terminate(): void {\n if (this.#worker) {\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(\"Worker terminated\"));\n this.#pendingRequests.delete(id);\n }\n\n this.terminateWorker(this.#worker);\n this.#worker = null;\n }\n this.#initPromise = null;\n }\n\n // ===========================================================================\n // Message handling (called by subclass event wiring)\n // ===========================================================================\n\n protected handleResponse(response: WorkerResponse<unknown>): void {\n const pending = this.#pendingRequests.get(response.id);\n\n if (!pending) {\n this.logger?.warn(\"[WorkerClient] Received response for unknown request\", {\n id: response.id,\n });\n return;\n }\n\n const elapsed = Math.round(performance.now() - pending.startTime);\n\n clearTimeout(pending.timeoutId);\n this.#pendingRequests.delete(response.id);\n\n if (response.success) {\n this.logger?.debug(`[WorkerClient] ← ${pending.type} OK`, {\n id: response.id,\n elapsed,\n });\n pending.resolve(response.data);\n } else {\n this.logger?.error(`[WorkerClient] ← ${pending.type} FAILED`, {\n id: response.id,\n elapsed,\n error: response.error,\n });\n const err = new Error(response.error);\n if (\"statusCode\" in response && typeof response.statusCode === \"number\") {\n (err as Error & { statusCode?: number }).statusCode = response.statusCode;\n }\n pending.reject(err);\n }\n }\n\n protected handleWorkerError(message: string): void {\n this.logger?.error(\"[WorkerClient] Worker error\", { error: message });\n const worker = this.#worker;\n this.#worker = null;\n this.#rejectAllPending(`Worker error: ${message}`);\n if (worker) this.terminateWorker(worker);\n }\n\n protected handleWorkerMessageError(): void {\n this.logger?.error(\"[WorkerClient] Message deserialization failed\");\n const worker = this.#worker;\n this.#worker = null;\n this.#rejectAllPending(\"Worker message deserialization failed\");\n if (worker) this.terminateWorker(worker);\n }\n\n // ===========================================================================\n // Request sending\n // ===========================================================================\n\n protected sendRequestTo<T>(\n worker: TWorker,\n type: WorkerRequestType,\n payload: WorkerRequest[\"payload\"],\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const id = this.generateRequestId();\n const startTime = performance.now();\n this.logger?.debug(`[WorkerClient] → ${type}`, { id });\n\n const timeoutId = setTimeout(() => {\n this.#pendingRequests.delete(id);\n const elapsed = Math.round(performance.now() - startTime);\n this.logger?.error(`[WorkerClient] ${type} timed out after ${timeoutMs}ms`, {\n id,\n elapsed,\n });\n reject(new Error(`Request ${type} timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n this.#pendingRequests.set(id, {\n resolve: resolve as (value: unknown) => void,\n reject,\n timeoutId,\n startTime,\n type,\n });\n\n const request = { id, type, payload } as WorkerRequest;\n this.postMessage(worker, request);\n });\n }\n\n protected async sendRequest<T>(\n type: WorkerRequestType,\n payload: WorkerRequest[\"payload\"],\n timeoutMs: number = DEFAULT_TIMEOUT_MS,\n ): Promise<T> {\n const worker = await this.initWorker();\n return this.sendRequestTo<T>(worker, type, payload, timeoutMs);\n }\n\n // ===========================================================================\n // Domain methods\n // ===========================================================================\n\n async generateKeypair(): Promise<GenerateKeypairResponseData> {\n return this.sendRequest<GenerateKeypairResponseData>(\"GENERATE_KEYPAIR\", {});\n }\n\n async createEIP712(params: CreateEIP712Payload): Promise<CreateEIP712ResponseData> {\n return this.sendRequest<CreateEIP712ResponseData>(\"CREATE_EIP712\", params);\n }\n\n async encrypt(params: EncryptPayload): Promise<EncryptResponseData> {\n return this.sendRequest<EncryptResponseData>(\"ENCRYPT\", params);\n }\n\n async userDecrypt(params: UserDecryptPayload): Promise<UserDecryptResponseData> {\n return this.sendRequest<UserDecryptResponseData>(\"USER_DECRYPT\", params);\n }\n\n async publicDecrypt(handles: string[]): Promise<PublicDecryptResponseData> {\n return this.sendRequest<PublicDecryptResponseData>(\"PUBLIC_DECRYPT\", { handles });\n }\n\n async createDelegatedUserDecryptEIP712(\n params: CreateDelegatedEIP712Payload,\n ): Promise<CreateDelegatedEIP712ResponseData> {\n return this.sendRequest<CreateDelegatedEIP712ResponseData>(\"CREATE_DELEGATED_EIP712\", params);\n }\n\n async delegatedUserDecrypt(\n params: DelegatedUserDecryptPayload,\n ): Promise<DelegatedUserDecryptResponseData> {\n return this.sendRequest<DelegatedUserDecryptResponseData>(\"DELEGATED_USER_DECRYPT\", params);\n }\n\n async requestZKProofVerification(\n zkProof: ZKProofLike,\n ): Promise<RequestZKProofVerificationResponseData> {\n return this.sendRequest<RequestZKProofVerificationResponseData>(\n \"REQUEST_ZK_PROOF_VERIFICATION\",\n { zkProof },\n );\n }\n\n async getPublicKey(): Promise<GetPublicKeyResponseData> {\n return this.sendRequest<GetPublicKeyResponseData>(\"GET_PUBLIC_KEY\", {});\n }\n\n async getPublicParams(bits: number): Promise<GetPublicParamsResponseData> {\n return this.sendRequest<GetPublicParamsResponseData>(\"GET_PUBLIC_PARAMS\", { bits });\n }\n\n // ===========================================================================\n // Internal helpers\n // ===========================================================================\n\n #rejectAllPending(message: string): void {\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(message));\n this.#pendingRequests.delete(id);\n }\n }\n}\n"]}
@@ -0,0 +1,49 @@
1
+ // src/utils.ts
2
+ function toHex(bytes) {
3
+ const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
4
+ return `0x${hex}`;
5
+ }
6
+ var ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/;
7
+ function assertAddress(value, name) {
8
+ if (!ADDRESS_REGEX.test(value)) {
9
+ throw new TypeError(`${name} must be a valid address (0x + 40 hex chars), got: ${value}`);
10
+ }
11
+ }
12
+ function normalizeAddress(addr, name) {
13
+ assertAddress(addr, name);
14
+ return addr;
15
+ }
16
+ function assertObject(value, context) {
17
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
18
+ throw new TypeError(`${context} must be an object, got ${typeof value}`);
19
+ }
20
+ }
21
+ function assertString(value, context) {
22
+ if (typeof value !== "string") {
23
+ throw new TypeError(`${context} must be a string, got ${typeof value}`);
24
+ }
25
+ }
26
+ function assertArray(value, context) {
27
+ if (!Array.isArray(value)) {
28
+ throw new TypeError(`${context} must be an array, got ${typeof value}`);
29
+ }
30
+ }
31
+ async function pLimit(fns, maxConcurrency = Infinity) {
32
+ if (!isFinite(maxConcurrency) || maxConcurrency >= fns.length) {
33
+ return Promise.all(fns.map((f) => f()));
34
+ }
35
+ const results = new Array(fns.length);
36
+ let index = 0;
37
+ async function worker() {
38
+ while (index < fns.length) {
39
+ const i = index++;
40
+ results[i] = await fns[i]();
41
+ }
42
+ }
43
+ await Promise.all(Array.from({ length: maxConcurrency }, worker));
44
+ return results;
45
+ }
46
+
47
+ export { assertAddress, assertArray, assertObject, assertString, normalizeAddress, pLimit, toHex };
48
+ //# sourceMappingURL=chunk-CTX3H4CB.js.map
49
+ //# sourceMappingURL=chunk-CTX3H4CB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"names":[],"mappings":";AAGO,SAAS,MAAM,KAAA,EAA4B;AAChD,EAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC7E,EAAA,OAAO,KAAK,GAAG,CAAA,CAAA;AACjB;AAIA,IAAM,aAAA,GAAgB,qBAAA;AAEf,SAAS,aAAA,CAAc,OAAe,IAAA,EAAwC;AACnF,EAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,KAAK,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA,mDAAA,EAAsD,KAAK,CAAA,CAAE,CAAA;AAAA,EAC1F;AACF;AAUO,SAAS,gBAAA,CAAiB,MAAc,IAAA,EAAuB;AACpE,EAAA,aAAA,CAAc,MAAM,IAAI,CAAA;AACxB,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,YAAA,CACd,OACA,OAAA,EAC0C;AAC1C,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,OAAO,CAAA,wBAAA,EAA2B,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EACzE;AACF;AAEO,SAAS,YAAA,CAAa,OAAgB,OAAA,EAA0C;AACrF,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,OAAO,CAAA,uBAAA,EAA0B,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EACxE;AACF;AAEO,SAAS,WAAA,CAAY,OAAgB,OAAA,EAA6C;AACvF,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,EAAG,OAAO,CAAA,uBAAA,EAA0B,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EACxE;AACF;AAQA,eAAsB,MAAA,CACpB,GAAA,EACA,cAAA,GAAiB,QAAA,EACH;AACd,EAAA,IAAI,CAAC,QAAA,CAAS,cAAc,CAAA,IAAK,cAAA,IAAkB,IAAI,MAAA,EAAQ;AAC7D,IAAA,OAAO,OAAA,CAAQ,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,MAAM,OAAA,GAAe,IAAI,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AACzC,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,eAAe,MAAA,GAAS;AACtB,IAAA,OAAO,KAAA,GAAQ,IAAI,MAAA,EAAQ;AACzB,MAAA,MAAM,CAAA,GAAI,KAAA,EAAA;AACV,MAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAM,GAAA,CAAI,CAAC,CAAA,EAAG;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,cAAA,EAAe,EAAG,MAAM,CAAC,CAAA;AAChE,EAAA,OAAO,OAAA;AACT","file":"chunk-CTX3H4CB.js","sourcesContent":["import type { Address } from \"./relayer/relayer-sdk.types\";\n\n/** Convert a Uint8Array to a hex string prefixed with `0x`. */\nexport function toHex(bytes: Uint8Array): Address {\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `0x${hex}`;\n}\n\n// ── Runtime type assertion helpers ───────────────────────────\n\nconst ADDRESS_REGEX = /^0x[0-9a-fA-F]{40}$/;\n\nexport function assertAddress(value: string, name: string): asserts value is Address {\n if (!ADDRESS_REGEX.test(value)) {\n throw new TypeError(`${name} must be a valid address (0x + 40 hex chars), got: ${value}`);\n }\n}\n\n/**\n * Validate an address and return it unchanged.\n * Call at public API entry points so invalid addresses are caught early.\n *\n * Addresses are **not** lowercased — the relayer SDK requires EIP-55\n * checksummed addresses for encrypt / decrypt calls.\n * Use case-insensitive comparison (`.toLowerCase()`) when comparing addresses.\n */\nexport function normalizeAddress(addr: string, name: string): Address {\n assertAddress(addr, name);\n return addr as Address;\n}\n\nexport function assertObject(\n value: unknown,\n context: string,\n): asserts value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${context} must be an object, got ${typeof value}`);\n }\n}\n\nexport function assertString(value: unknown, context: string): asserts value is string {\n if (typeof value !== \"string\") {\n throw new TypeError(`${context} must be a string, got ${typeof value}`);\n }\n}\n\nexport function assertArray(value: unknown, context: string): asserts value is unknown[] {\n if (!Array.isArray(value)) {\n throw new TypeError(`${context} must be an array, got ${typeof value}`);\n }\n}\n\n// ── Concurrency helper ──────────────────────────────────────\n\n/**\n * Execute an array of async thunks with bounded concurrency.\n * Defaults to `Infinity` (equivalent to `Promise.all`).\n */\nexport async function pLimit<T>(\n fns: Array<() => Promise<T>>,\n maxConcurrency = Infinity,\n): Promise<T[]> {\n if (!isFinite(maxConcurrency) || maxConcurrency >= fns.length) {\n return Promise.all(fns.map((f) => f()));\n }\n\n const results: T[] = new Array(fns.length);\n let index = 0;\n\n async function worker() {\n while (index < fns.length) {\n const i = index++;\n results[i] = await fns[i]!();\n }\n }\n\n await Promise.all(Array.from({ length: maxConcurrency }, worker));\n return results;\n}\n"]}
@@ -0,0 +1,101 @@
1
+ // src/relayer/relayer-utils.ts
2
+ var MAX_RETRIES = 2;
3
+ var RETRY_BASE_MS = 500;
4
+ async function withRetry(fn, retries = MAX_RETRIES) {
5
+ let lastError;
6
+ for (let attempt = 0; attempt <= retries; attempt++) {
7
+ try {
8
+ return await fn();
9
+ } catch (error) {
10
+ lastError = error;
11
+ if (attempt < retries && isTransientError(error)) {
12
+ await sleep(RETRY_BASE_MS * 2 ** attempt);
13
+ continue;
14
+ }
15
+ throw error;
16
+ }
17
+ }
18
+ throw lastError;
19
+ }
20
+ function isTransientError(error) {
21
+ if (!(error instanceof Error)) return false;
22
+ const msg = error.message.toLowerCase();
23
+ return msg.includes("timed out") || msg.includes("timeout") || msg.includes("econnreset") || msg.includes("econnrefused") || msg.includes("network") || msg.includes("fetch failed") || msg.includes("socket hang up") || msg.includes("502") || msg.includes("503") || msg.includes("504");
24
+ }
25
+ function sleep(ms) {
26
+ return new Promise((resolve) => setTimeout(resolve, ms));
27
+ }
28
+ function convertToBigIntRecord(result) {
29
+ const clearValues = {};
30
+ for (const [handle, value] of Object.entries(result)) {
31
+ if (typeof value === "bigint") {
32
+ clearValues[handle] = value;
33
+ } else if (typeof value === "boolean") {
34
+ clearValues[handle] = value ? BigInt(1) : BigInt(0);
35
+ } else if (typeof value === "string" || typeof value === "number") {
36
+ clearValues[handle] = BigInt(value);
37
+ } else {
38
+ throw new TypeError(`Unexpected decrypted value type for handle ${handle}: ${typeof value}`);
39
+ }
40
+ }
41
+ return clearValues;
42
+ }
43
+ var MainnetConfig = {
44
+ chainId: 1,
45
+ gatewayChainId: 261131,
46
+ relayerUrl: "https://relayer.mainnet.zama.org",
47
+ network: "https://ethereum-rpc.publicnode.com",
48
+ aclContractAddress: "0xcA2E8f1F656CD25C01F05d0b243Ab1ecd4a8ffb6",
49
+ kmsContractAddress: "0x77627828a55156b04Ac0DC0eb30467f1a552BB03",
50
+ inputVerifierContractAddress: "0xCe0FC2e05CFff1B719EFF7169f7D80Af770c8EA2",
51
+ verifyingContractAddressDecryption: "0x0f6024a97684f7d90ddb0fAAD79cB15F2C888D24",
52
+ verifyingContractAddressInputVerification: "0xcB1bB072f38bdAF0F328CdEf1Fc6eDa1DF029287"
53
+ };
54
+ var SepoliaConfig = {
55
+ chainId: 11155111,
56
+ gatewayChainId: 10901,
57
+ relayerUrl: "https://relayer.testnet.zama.org",
58
+ network: "https://ethereum-sepolia-rpc.publicnode.com",
59
+ aclContractAddress: "0xf0Ffdc93b7E186bC2f8CB3dAA75D86d1930A433D",
60
+ kmsContractAddress: "0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A",
61
+ inputVerifierContractAddress: "0xBBC1fFCdc7C316aAAd72E807D9b0272BE8F84DA0",
62
+ verifyingContractAddressDecryption: "0x5D8BD78e2ea6bbE41f26dFe9fdaEAa349e077478",
63
+ verifyingContractAddressInputVerification: "0x483b9dE06E4E4C7D35CCf5837A1668487406D955"
64
+ };
65
+ var HardhatConfig = {
66
+ chainId: 31337,
67
+ gatewayChainId: 10901,
68
+ relayerUrl: "",
69
+ network: "http://127.0.0.1:8545",
70
+ aclContractAddress: "0x50157CFfD6bBFA2DECe204a89ec419c23ef5755D",
71
+ inputVerifierContractAddress: "0x36772142b74871f255CbD7A3e89B401d3e45825f",
72
+ kmsContractAddress: "0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A",
73
+ verifyingContractAddressDecryption: "0x5ffdaAB0373E62E2ea2944776209aEf29E631A64",
74
+ verifyingContractAddressInputVerification: "0x812b06e1CDCE800494b79fFE4f925A504a9A9810"
75
+ };
76
+ var DefaultConfigs = {
77
+ [1]: MainnetConfig,
78
+ [11155111]: SepoliaConfig,
79
+ [31337]: HardhatConfig
80
+ };
81
+ var DOMAIN_FIELD_TYPES = {
82
+ name: "string",
83
+ version: "string",
84
+ chainId: "uint256",
85
+ verifyingContract: "address",
86
+ salt: "bytes32"
87
+ };
88
+ function buildEIP712DomainType(domain) {
89
+ return Object.keys(DOMAIN_FIELD_TYPES).filter((k) => k in domain).map((k) => ({ name: k, type: DOMAIN_FIELD_TYPES[k] }));
90
+ }
91
+ function mergeFhevmConfig(chainId, overrides) {
92
+ const base = DefaultConfigs[chainId];
93
+ if (!base && (!overrides || Object.keys(overrides).length === 0)) {
94
+ throw new Error(`No config for chainId: ${chainId}`);
95
+ }
96
+ return { ...base, ...overrides };
97
+ }
98
+
99
+ export { HardhatConfig, MainnetConfig, SepoliaConfig, buildEIP712DomainType, convertToBigIntRecord, mergeFhevmConfig, withRetry };
100
+ //# sourceMappingURL=chunk-UE6IBC3M.js.map
101
+ //# sourceMappingURL=chunk-UE6IBC3M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/relayer/relayer-utils.ts"],"names":[],"mappings":"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","file":"chunk-UE6IBC3M.js","sourcesContent":["import type { EIP712TypedData, FhevmInstanceConfig } from \"./relayer-sdk.types\";\n\nconst MAX_RETRIES = 2;\nconst RETRY_BASE_MS = 500;\n\n/**\n * Retry an async operation with exponential backoff.\n * Only retries on transient errors (timeout, network). Does not retry user-facing errors.\n */\nexport async function withRetry<T>(fn: () => Promise<T>, retries = MAX_RETRIES): Promise<T> {\n let lastError: unknown;\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (attempt < retries && isTransientError(error)) {\n await sleep(RETRY_BASE_MS * 2 ** attempt);\n continue;\n }\n throw error;\n }\n }\n throw lastError;\n}\n\nfunction isTransientError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const msg = error.message.toLowerCase();\n return (\n msg.includes(\"timed out\") ||\n msg.includes(\"timeout\") ||\n msg.includes(\"econnreset\") ||\n msg.includes(\"econnrefused\") ||\n msg.includes(\"network\") ||\n msg.includes(\"fetch failed\") ||\n msg.includes(\"socket hang up\") ||\n msg.includes(\"502\") ||\n msg.includes(\"503\") ||\n msg.includes(\"504\")\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Convert SDK result values to bigint record.\n * Handles bigint, boolean, string, and number values.\n */\nexport function convertToBigIntRecord(result: Record<string, unknown>): Record<string, bigint> {\n const clearValues: Record<string, bigint> = {};\n for (const [handle, value] of Object.entries(result)) {\n if (typeof value === \"bigint\") {\n clearValues[handle] = value;\n } else if (typeof value === \"boolean\") {\n clearValues[handle] = value ? BigInt(1) : BigInt(0);\n } else if (typeof value === \"string\" || typeof value === \"number\") {\n clearValues[handle] = BigInt(value);\n } else {\n throw new TypeError(`Unexpected decrypted value type for handle ${handle}: ${typeof value}`);\n }\n }\n return clearValues;\n}\n\n/** Mainnet network configuration (chainId 1). */\nexport const MainnetConfig: FhevmInstanceConfig = {\n chainId: 1,\n gatewayChainId: 261131,\n relayerUrl: \"https://relayer.mainnet.zama.org\",\n network: \"https://ethereum-rpc.publicnode.com\",\n aclContractAddress: \"0xcA2E8f1F656CD25C01F05d0b243Ab1ecd4a8ffb6\",\n kmsContractAddress: \"0x77627828a55156b04Ac0DC0eb30467f1a552BB03\",\n inputVerifierContractAddress: \"0xCe0FC2e05CFff1B719EFF7169f7D80Af770c8EA2\",\n verifyingContractAddressDecryption: \"0x0f6024a97684f7d90ddb0fAAD79cB15F2C888D24\",\n verifyingContractAddressInputVerification: \"0xcB1bB072f38bdAF0F328CdEf1Fc6eDa1DF029287\",\n} as const;\n\n/** Sepolia testnet network configuration (chainId 11155111). */\nexport const SepoliaConfig: FhevmInstanceConfig = {\n chainId: 11155111,\n gatewayChainId: 10901,\n relayerUrl: \"https://relayer.testnet.zama.org\",\n network: \"https://ethereum-sepolia-rpc.publicnode.com\",\n aclContractAddress: \"0xf0Ffdc93b7E186bC2f8CB3dAA75D86d1930A433D\",\n kmsContractAddress: \"0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A\",\n inputVerifierContractAddress: \"0xBBC1fFCdc7C316aAAd72E807D9b0272BE8F84DA0\",\n verifyingContractAddressDecryption: \"0x5D8BD78e2ea6bbE41f26dFe9fdaEAa349e077478\",\n verifyingContractAddressInputVerification: \"0x483b9dE06E4E4C7D35CCf5837A1668487406D955\",\n} as const;\n\n/** Hardhat local network configuration (chainId 31337). */\nexport const HardhatConfig: FhevmInstanceConfig = {\n chainId: 31337,\n gatewayChainId: 10901,\n relayerUrl: \"\",\n network: \"http://127.0.0.1:8545\",\n aclContractAddress: \"0x50157CFfD6bBFA2DECe204a89ec419c23ef5755D\",\n inputVerifierContractAddress: \"0x36772142b74871f255CbD7A3e89B401d3e45825f\",\n kmsContractAddress: \"0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A\",\n verifyingContractAddressDecryption: \"0x5ffdaAB0373E62E2ea2944776209aEf29E631A64\",\n verifyingContractAddressInputVerification: \"0x812b06e1CDCE800494b79fFE4f925A504a9A9810\",\n} as const;\n\nexport const DefaultConfigs: Record<number, FhevmInstanceConfig> = {\n [1]: MainnetConfig,\n [11155111]: SepoliaConfig,\n [31337]: HardhatConfig,\n} as const;\n\n/** EIP-712 domain field → Solidity type. Order follows the EIP-712 spec. */\nconst DOMAIN_FIELD_TYPES: Record<string, string> = {\n name: \"string\",\n version: \"string\",\n chainId: \"uint256\",\n verifyingContract: \"address\",\n salt: \"bytes32\",\n};\n\n/**\n * Build `EIP712Domain` type entries from the keys present in a domain object.\n * Order matches the EIP-712 spec (name → version → chainId → verifyingContract → salt).\n */\nexport function buildEIP712DomainType(\n domain: EIP712TypedData[\"domain\"],\n): Array<{ name: string; type: string }> {\n return Object.keys(DOMAIN_FIELD_TYPES)\n .filter((k) => k in domain)\n .map((k) => ({ name: k, type: DOMAIN_FIELD_TYPES[k]! }));\n}\n\n/**\n * Merge user overrides on top of SDK defaults for a given chain.\n */\nexport function mergeFhevmConfig(\n chainId: number,\n overrides?: Partial<FhevmInstanceConfig>,\n): FhevmInstanceConfig {\n const base = DefaultConfigs[chainId];\n if (!base && (!overrides || Object.keys(overrides).length === 0)) {\n throw new Error(`No config for chainId: ${chainId}`);\n }\n return { ...base, ...overrides } as FhevmInstanceConfig;\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import { G as GenericSigner, E as EIP712TypedData, H as Hex, C as ContractCallConfig, T as TransactionReceipt } from '../token.types-D1ELXBX9.js';
2
+ import { BrowserProvider, Signer, Provider } from 'ethers';
3
+ import { Address } from '@zama-fhe/relayer-sdk/bundle';
4
+ import { B as BatchTransferData } from '../transfer-batcher-BdbgGcJG.js';
5
+
6
+ /** Configuration for {@link EthersSigner}. */
7
+ interface EthersSignerConfig {
8
+ signer: BrowserProvider | Signer;
9
+ }
10
+ /**
11
+ * GenericSigner backed by ethers.
12
+ *
13
+ * Accepts either a `BrowserProvider` (signer resolved lazily via `getSigner()`)
14
+ * or a `Signer` directly (e.g. `Wallet` for Node.js scripts).
15
+ *
16
+ * @param config - {@link EthersSignerConfig} with signer or provider
17
+ */
18
+ declare class EthersSigner implements GenericSigner {
19
+ private signerPromise;
20
+ constructor(config: EthersSignerConfig);
21
+ getChainId(): Promise<number>;
22
+ getAddress(): Promise<Address>;
23
+ signTypedData(typedData: EIP712TypedData): Promise<Hex>;
24
+ writeContract<C extends ContractCallConfig>(config: C): Promise<Hex>;
25
+ readContract<T, C extends ContractCallConfig>(config: C): Promise<T>;
26
+ waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt>;
27
+ }
28
+
29
+ declare function readConfidentialBalanceOfContract(provider: Provider | Signer, tokenAddress: Address, userAddress: Address): Promise<any>;
30
+ declare function readWrapperForTokenContract(provider: Provider | Signer, coordinator: Address, tokenAddress: Address): Promise<any>;
31
+ declare function readUnderlyingTokenContract(provider: Provider | Signer, wrapperAddress: Address): Promise<any>;
32
+ declare function readWrapperExistsContract(provider: Provider | Signer, coordinator: Address, tokenAddress: Address): Promise<any>;
33
+ declare function readSupportsInterfaceContract(provider: Provider | Signer, tokenAddress: Address, interfaceId: Address): Promise<any>;
34
+ declare function writeConfidentialTransferContract(signer: Signer, tokenAddress: Address, to: Address, handle: Uint8Array, inputProof: Uint8Array): Promise<`0x${string}`>;
35
+ declare function writeConfidentialBatchTransferContract(signer: Signer, batcherAddress: Address, tokenAddress: Address, fromAddress: Address, batchTransferData: BatchTransferData[], fees: bigint): Promise<`0x${string}`>;
36
+ declare function writeUnwrapContract(signer: Signer, encryptedErc20: Address, from: Address, to: Address, encryptedAmount: Uint8Array, inputProof: Uint8Array): Promise<`0x${string}`>;
37
+ declare function writeUnwrapFromBalanceContract(signer: Signer, encryptedErc20: Address, from: Address, to: Address, encryptedBalance: Address): Promise<`0x${string}`>;
38
+ declare function writeFinalizeUnwrapContract(signer: Signer, wrapper: Address, burntAmount: Address, burntAmountCleartext: bigint, decryptionProof: Address): Promise<`0x${string}`>;
39
+ declare function writeSetOperatorContract(signer: Signer, tokenAddress: Address, spender: Address, timestamp?: number): Promise<`0x${string}`>;
40
+ declare function writeWrapContract(signer: Signer, wrapperAddress: Address, to: Address, amount: bigint): Promise<`0x${string}`>;
41
+ declare function writeWrapETHContract(signer: Signer, wrapperAddress: Address, to: Address, amount: bigint, value: bigint): Promise<`0x${string}`>;
42
+
43
+ export { EthersSigner, type EthersSignerConfig, readConfidentialBalanceOfContract, readSupportsInterfaceContract, readUnderlyingTokenContract, readWrapperExistsContract, readWrapperForTokenContract, writeConfidentialBatchTransferContract, writeConfidentialTransferContract, writeFinalizeUnwrapContract, writeSetOperatorContract, writeUnwrapContract, writeUnwrapFromBalanceContract, writeWrapContract, writeWrapETHContract };