@zama-fhe/sdk 3.0.0-alpha.2 → 3.0.0-alpha.20

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 (99) hide show
  1. package/README.md +207 -122
  2. package/dist/cjs/build.cjs +2 -0
  3. package/dist/cjs/build.cjs.map +1 -0
  4. package/dist/cjs/chains/index.cjs +1 -0
  5. package/dist/cjs/chains.cjs +2 -0
  6. package/dist/cjs/chains.cjs.map +1 -0
  7. package/dist/cjs/cleartext/index.cjs +1 -1
  8. package/dist/cjs/eip1193-subscribe.cjs +1 -1
  9. package/dist/cjs/eip1193-subscribe.cjs.map +1 -1
  10. package/dist/cjs/encryption.cjs +2 -0
  11. package/dist/cjs/encryption.cjs.map +1 -0
  12. package/dist/cjs/ethers/index.cjs +1 -1
  13. package/dist/cjs/ethers/index.cjs.map +1 -1
  14. package/dist/cjs/index.cjs +73 -73
  15. package/dist/cjs/index.cjs.map +1 -1
  16. package/dist/cjs/query/index.cjs +1 -1
  17. package/dist/cjs/query/index.cjs.map +1 -1
  18. package/dist/cjs/readonly-token.cjs +1 -1
  19. package/dist/cjs/readonly-token.cjs.map +1 -1
  20. package/dist/cjs/relayer-cleartext.cjs +2 -0
  21. package/dist/cjs/relayer-cleartext.cjs.map +1 -0
  22. package/dist/cjs/relayer-sdk.worker.js +71 -71
  23. package/dist/cjs/relayer.cjs +1 -1
  24. package/dist/cjs/relayer.cjs.map +1 -1
  25. package/dist/cjs/viem/index.cjs +1 -1
  26. package/dist/cjs/viem/index.cjs.map +1 -1
  27. package/dist/cjs/wrappers-registry.cjs +1 -1
  28. package/dist/cjs/wrappers-registry.cjs.map +1 -1
  29. package/dist/esm/{assertions-BARApuMj.js → assertions-CfqI3AJv.js} +1 -1
  30. package/dist/esm/{assertions-BARApuMj.js.map → assertions-CfqI3AJv.js.map} +1 -1
  31. package/dist/esm/build-CvenCk6R.js +2 -0
  32. package/dist/esm/build-CvenCk6R.js.map +1 -0
  33. package/dist/esm/chains/index.d.ts +3 -0
  34. package/dist/esm/chains/index.js +1 -0
  35. package/dist/esm/chains-aHmrozPh.js +2 -0
  36. package/dist/esm/chains-aHmrozPh.js.map +1 -0
  37. package/dist/esm/cleartext/index.d.ts +2 -86
  38. package/dist/esm/cleartext/index.js +1 -1
  39. package/dist/esm/cleartext-BHu6-LCv.d.ts +19 -0
  40. package/dist/esm/cleartext-I-etE_7S.js +2 -0
  41. package/dist/esm/cleartext-I-etE_7S.js.map +1 -0
  42. package/dist/esm/eip1193-subscribe-CcotSOIm.js +2 -0
  43. package/dist/esm/eip1193-subscribe-CcotSOIm.js.map +1 -0
  44. package/dist/esm/{encryption-CmIPBcfP.js → encryption-YS-Kb7qm.js} +2 -2
  45. package/dist/esm/{encryption-CmIPBcfP.js.map → encryption-YS-Kb7qm.js.map} +1 -1
  46. package/dist/esm/ethers/index.d.ts +53 -8
  47. package/dist/esm/ethers/index.js +1 -1
  48. package/dist/esm/ethers/index.js.map +1 -1
  49. package/dist/esm/{hex-D_B-zoId.js → hex-BZVTzEK6.js} +2 -2
  50. package/dist/esm/{hex-D_B-zoId.js.map → hex-BZVTzEK6.js.map} +1 -1
  51. package/dist/esm/{relayer-utils-iSPis4x-.d.ts → index-BTY0MxOt.d.ts} +50 -23
  52. package/dist/esm/{onchain-events-2VNiL78c.d.ts → index-BdyljG1F.d.ts} +387 -1505
  53. package/dist/esm/index.d.ts +61 -93
  54. package/dist/esm/index.js +73 -73
  55. package/dist/esm/index.js.map +1 -1
  56. package/dist/esm/memory-storage-CFXqXUcm.js +2 -0
  57. package/dist/esm/memory-storage-CFXqXUcm.js.map +1 -0
  58. package/dist/esm/node/index.d.ts +88 -110
  59. package/dist/esm/node/index.js +1 -1
  60. package/dist/esm/node/index.js.map +1 -1
  61. package/dist/esm/node/relayer-sdk.node-worker.js +1 -1
  62. package/dist/esm/node/relayer-sdk.node-worker.js.map +1 -1
  63. package/dist/esm/query/index.d.ts +40 -50
  64. package/dist/esm/query/index.js +1 -1
  65. package/dist/esm/query/index.js.map +1 -1
  66. package/dist/esm/readonly-token-DCLOYhws.js +2 -0
  67. package/dist/esm/readonly-token-DCLOYhws.js.map +1 -0
  68. package/dist/esm/{relayer-C6u3eOlN.js → relayer-7Hd00A6X.js} +2 -2
  69. package/dist/esm/relayer-7Hd00A6X.js.map +1 -0
  70. package/dist/esm/{relayer-sdk.types-CGfXwKcB.d.ts → relayer-cleartext-DJkSUlZ2.d.ts} +263 -106
  71. package/dist/esm/relayer-cleartext-SZCM9wTx.js +2 -0
  72. package/dist/esm/relayer-cleartext-SZCM9wTx.js.map +1 -0
  73. package/dist/esm/relayer-sdk.worker.js +71 -71
  74. package/dist/esm/types-C1S426x4.d.ts +48 -0
  75. package/dist/esm/types-CVyJHEya.d.ts +14 -0
  76. package/dist/esm/types-DePjTTbo.d.ts +30 -0
  77. package/dist/esm/types-FY7ciI37.d.ts +615 -0
  78. package/dist/esm/viem/index.d.ts +39 -11
  79. package/dist/esm/viem/index.js +1 -1
  80. package/dist/esm/viem/index.js.map +1 -1
  81. package/dist/esm/wrappers-registry-CXNs4eR0.js +2 -0
  82. package/dist/esm/wrappers-registry-CXNs4eR0.js.map +1 -0
  83. package/package.json +17 -3
  84. package/dist/cjs/cleartext.cjs +0 -2
  85. package/dist/cjs/cleartext.cjs.map +0 -1
  86. package/dist/esm/cleartext-Cs28cTsa.js +0 -2
  87. package/dist/esm/cleartext-Cs28cTsa.js.map +0 -1
  88. package/dist/esm/eip1193-subscribe-Cl_wlVuQ.js +0 -2
  89. package/dist/esm/eip1193-subscribe-Cl_wlVuQ.js.map +0 -1
  90. package/dist/esm/memory-storage-F8xjMzVy.js +0 -2
  91. package/dist/esm/memory-storage-F8xjMzVy.js.map +0 -1
  92. package/dist/esm/readonly-token-D4GjTj0q.js +0 -2
  93. package/dist/esm/readonly-token-D4GjTj0q.js.map +0 -1
  94. package/dist/esm/relayer-C6u3eOlN.js.map +0 -1
  95. package/dist/esm/relayer-sdk-DPqytEbO.d.ts +0 -44
  96. package/dist/esm/relayer-utils-BeoTNDM4.js +0 -2
  97. package/dist/esm/relayer-utils-BeoTNDM4.js.map +0 -1
  98. package/dist/esm/wrappers-registry-ydyySM9g.js +0 -2
  99. package/dist/esm/wrappers-registry-ydyySM9g.js.map +0 -1
package/README.md CHANGED
@@ -26,27 +26,30 @@ The SDK ships both ESM and CommonJS builds. Most modern toolchains use ESM autom
26
26
  ### ESM (recommended)
27
27
 
28
28
  ```ts
29
- import { ZamaSDK, RelayerWeb, IndexedDBStorage } from "@zama-fhe/sdk";
29
+ import { web, ZamaSDK } from "@zama-fhe/sdk";
30
+ import { createConfig } from "@zama-fhe/sdk/viem";
31
+ import { sepolia } from "@zama-fhe/sdk/chains";
30
32
  import { ViemSigner } from "@zama-fhe/sdk/viem";
31
33
  ```
32
34
 
33
35
  ### CommonJS
34
36
 
35
37
  ```js
36
- const { ZamaSDK, RelayerWeb } = require("@zama-fhe/sdk");
37
- const { EthersSigner } = require("@zama-fhe/sdk/ethers");
38
+ const { web, ZamaSDK } = require("@zama-fhe/sdk");
39
+ const { createConfig, EthersSigner } = require("@zama-fhe/sdk/ethers");
38
40
  ```
39
41
 
40
42
  ### Available subpath exports
41
43
 
42
- | Subpath | Description | CJS |
43
- | ------------------------- | ------------------------------------ | --- |
44
- | `@zama-fhe/sdk` | Core SDK (ZamaSDK, RelayerWeb, etc.) | Yes |
45
- | `@zama-fhe/sdk/viem` | Viem adapter (ViemSigner) | Yes |
46
- | `@zama-fhe/sdk/ethers` | Ethers adapter (EthersSigner) | Yes |
47
- | `@zama-fhe/sdk/node` | Node.js backend (RelayerNode) | No |
48
- | `@zama-fhe/sdk/query` | TanStack Query integration | Yes |
49
- | `@zama-fhe/sdk/cleartext` | Cleartext testing adapter | Yes |
44
+ | Subpath | Description | CJS |
45
+ | ------------------------- | -------------------------------------------- | --- |
46
+ | `@zama-fhe/sdk` | Core SDK, config, relayers, RelayerWeb, etc. | Yes |
47
+ | `@zama-fhe/sdk/chains` | Pre-configured chain objects | Yes |
48
+ | `@zama-fhe/sdk/viem` | Viem adapter (ViemSigner) | Yes |
49
+ | `@zama-fhe/sdk/ethers` | Ethers adapter (EthersSigner) | Yes |
50
+ | `@zama-fhe/sdk/node` | Node.js backend (RelayerNode) | No |
51
+ | `@zama-fhe/sdk/query` | TanStack Query integration | Yes |
52
+ | `@zama-fhe/sdk/cleartext` | Cleartext testing adapter | Yes |
50
53
 
51
54
  > **Note:** The `@zama-fhe/sdk/node` subpath is ESM-only because it relies on `node:worker_threads` which is inherently ESM-oriented.
52
55
 
@@ -59,38 +62,38 @@ The SDK works with all TypeScript `moduleResolution` modes:
59
62
 
60
63
  ## Quick Start
61
64
 
62
- ### Browser
65
+ ### Browser (viem)
63
66
 
64
67
  ```ts
65
- import { ZamaSDK, RelayerWeb, IndexedDBStorage } from "@zama-fhe/sdk";
66
- import { ViemSigner } from "@zama-fhe/sdk/viem";
67
- import { mainnet, sepolia } from "viem/chains";
68
-
69
- // 1. Create signer and relayer
70
- const signer = new ViemSigner({ walletClient, publicClient });
71
-
72
- const sdk = new ZamaSDK({
73
- relayer: new RelayerWeb({
74
- getChainId: () => signer.getChainId(),
75
- transports: {
76
- [mainnet.id]: {
77
- relayerUrl: "https://your-app.com/api/relayer/1",
78
- network: "https://mainnet.infura.io/v3/YOUR_KEY",
79
- },
80
- [sepolia.id]: {
81
- relayerUrl: "https://your-app.com/api/relayer/11155111",
82
- network: "https://sepolia.infura.io/v3/YOUR_KEY",
83
- },
84
- },
85
- }),
86
- signer,
87
- storage: new IndexedDBStorage(),
68
+ import { web, ZamaSDK } from "@zama-fhe/sdk";
69
+ import { createConfig } from "@zama-fhe/sdk/viem";
70
+ import { sepolia, mainnet } from "@zama-fhe/sdk/chains";
71
+ import type { FheChain } from "@zama-fhe/sdk/chains";
72
+
73
+ const mySepolia = {
74
+ ...sepolia,
75
+ relayerUrl: "https://your-app.com/api/relayer/11155111",
76
+ } as const satisfies FheChain;
77
+ const myMainnet = {
78
+ ...mainnet,
79
+ relayerUrl: "https://your-app.com/api/relayer/1",
80
+ } as const satisfies FheChain;
81
+
82
+ // 1. Create the config
83
+ const config = createConfig({
84
+ chains: [mySepolia, myMainnet],
85
+ publicClient,
86
+ walletClient,
87
+ relayers: {
88
+ [mySepolia.id]: web(),
89
+ [myMainnet.id]: web(),
90
+ },
88
91
  });
89
92
 
93
+ const sdk = new ZamaSDK(config);
94
+
90
95
  // 2. Create a token instance (wrapper is auto-discovered if omitted)
91
96
  const token = sdk.createToken("0xEncryptedERC20Address");
92
- // Or provide the wrapper explicitly:
93
- // const token = sdk.createToken("0xEncryptedERC20Address", "0xWrapperAddress");
94
97
 
95
98
  // 3. Shield (wrap) public tokens into confidential tokens
96
99
  const { txHash } = await token.shield(1000n);
@@ -103,51 +106,101 @@ console.log("Confidential balance:", balance);
103
106
  const transferTx = await token.confidentialTransfer("0xRecipient", 500n);
104
107
  ```
105
108
 
106
- ### Node.js
109
+ ### Browser (ethers)
107
110
 
108
111
  ```ts
109
- import { ZamaSDK } from "@zama-fhe/sdk";
110
- import { RelayerNode, asyncLocalStorage } from "@zama-fhe/sdk/node";
111
- import { ViemSigner } from "@zama-fhe/sdk/viem";
112
- import { mainnet, sepolia } from "viem/chains";
112
+ import { web, ZamaSDK } from "@zama-fhe/sdk";
113
+ import { createConfig } from "@zama-fhe/sdk/ethers";
114
+ import { sepolia } from "@zama-fhe/sdk/chains";
115
+ import type { FheChain } from "@zama-fhe/sdk/chains";
116
+
117
+ const mySepolia = {
118
+ ...sepolia,
119
+ relayerUrl: "https://your-app.com/api/relayer/11155111",
120
+ } as const satisfies FheChain;
121
+
122
+ const config = createConfig({
123
+ chains: [mySepolia],
124
+ ethereum: window.ethereum!,
125
+ relayers: {
126
+ [mySepolia.id]: web(),
127
+ },
128
+ });
113
129
 
114
- const signer = new ViemSigner({ walletClient, publicClient });
130
+ const sdk = new ZamaSDK(config);
131
+ const token = sdk.createToken("0xEncryptedERC20Address");
132
+ const balance = await token.balanceOf();
133
+ ```
115
134
 
116
- const sdk = new ZamaSDK({
117
- relayer: new RelayerNode({
118
- getChainId: () => signer.getChainId(),
119
- poolSize: 4, // number of worker threads (default: min(CPUs, 4))
120
- transports: {
121
- [mainnet.id]: {
122
- network: "https://mainnet.infura.io/v3/YOUR_KEY",
123
- auth: { __type: "ApiKeyHeader", value: process.env.RELAYER_API_KEY },
124
- },
125
- [sepolia.id]: {
126
- network: "https://sepolia.infura.io/v3/YOUR_KEY",
127
- auth: { __type: "ApiKeyHeader", value: process.env.RELAYER_API_KEY },
128
- },
129
- },
130
- }),
131
- signer,
132
- storage: asyncLocalStorage,
135
+ ### Node.js
136
+
137
+ ```ts
138
+ import { ZamaSDK, memoryStorage } from "@zama-fhe/sdk";
139
+ import { node } from "@zama-fhe/sdk/node";
140
+ import { createConfig } from "@zama-fhe/sdk/viem";
141
+ import { sepolia, mainnet, type FheChain } from "@zama-fhe/sdk/chains";
142
+
143
+ const mySepolia = {
144
+ ...sepolia,
145
+ network: "https://sepolia.infura.io/v3/YOUR_KEY",
146
+ auth: { __type: "ApiKeyHeader" as const, value: process.env.RELAYER_API_KEY! },
147
+ } as const satisfies FheChain;
148
+
149
+ const myMainnet = {
150
+ ...mainnet,
151
+ network: "https://mainnet.infura.io/v3/YOUR_KEY",
152
+ auth: { __type: "ApiKeyHeader" as const, value: process.env.RELAYER_API_KEY! },
153
+ } as const satisfies FheChain;
154
+
155
+ const config = createConfig({
156
+ chains: [mySepolia, myMainnet],
157
+ publicClient,
158
+ walletClient,
159
+ storage: memoryStorage,
160
+ relayers: {
161
+ [mySepolia.id]: node({ poolSize: 4 }),
162
+ [myMainnet.id]: node({ poolSize: 4 }),
163
+ },
133
164
  });
134
165
 
166
+ const sdk = new ZamaSDK(config);
135
167
  const token = sdk.createToken("0xEncryptedERC20Address");
136
168
  const balance = await token.balanceOf();
137
169
  ```
138
170
 
139
171
  ## Core Concepts
140
172
 
141
- ### ZamaSDK
173
+ ### createConfig
142
174
 
143
- Entry point to the SDK. Composes a relayer backend with a signer and storage layer. Manages sessions, credentials, and acts as a factory for contract instances.
175
+ The recommended way to configure the SDK. Takes chains, relayers, and a signer adapter and returns a config object for `ZamaSDK`. Import `createConfig` from the adapter subpath that matches your Web3 library.
144
176
 
145
177
  ```ts
146
- const sdk = new ZamaSDK({
147
- relayer, // RelayerSDK either RelayerWeb (browser) or RelayerNode (Node.js)
148
- signer, // GenericSigner
149
- storage, // GenericStorage
178
+ import { web, ZamaSDK } from "@zama-fhe/sdk";
179
+ import { createConfig } from "@zama-fhe/sdk/viem";
180
+ import { sepolia } from "@zama-fhe/sdk/chains";
181
+ import type { FheChain } from "@zama-fhe/sdk/chains";
182
+
183
+ const mySepolia = { ...sepolia, relayerUrl: "/api/relayer/11155111" } as const satisfies FheChain;
184
+
185
+ const config = createConfig({
186
+ chains: [mySepolia],
187
+ publicClient,
188
+ walletClient, // or use createConfig from @zama-fhe/sdk/ethers with { ethereum }
189
+ relayers: {
190
+ [mySepolia.id]: web(),
191
+ },
150
192
  });
193
+ const sdk = new ZamaSDK(config);
194
+ ```
195
+
196
+ Transport functions: `web()` (browser, WASM in Web Worker), `node()` from `@zama-fhe/sdk/node` (Node.js, worker threads), `cleartext()` (local dev, no FHE).
197
+
198
+ ### ZamaSDK
199
+
200
+ Entry point to the SDK. Composes a relayer backend with a signer and storage layer. Manages sessions, credentials, and acts as a factory for contract instances. Accepts a config from `createConfig` or a manual config object.
201
+
202
+ ```ts
203
+ const sdk = new ZamaSDK(config); // from createConfig
151
204
 
152
205
  // Read-only — balances, metadata, decryption. No wrapper needed.
153
206
  const readonlyToken = sdk.createReadonlyToken("0xTokenAddress");
@@ -186,7 +239,7 @@ Full read/write interface for a single confidential ERC-20. Extends `ReadonlyTok
186
239
  | `unwrap(amount)` | Request unwrap for a specific amount (low-level, requires manual finalization). |
187
240
  | `unwrapAll()` | Request unwrap for the entire balance (low-level, requires manual finalization). |
188
241
  | `resumeUnshield(unwrapTxHash, callbacks?)` | Resume an interrupted unshield from an existing unwrap tx hash. Goes straight to wait receipt → finalize. |
189
- | `finalizeUnwrap(unwrapRequestId)` | Complete unwrap with public decryption proof. |
242
+ | `finalizeUnwrap(unwrapRequestIdOrAmount)` | Complete unwrap with public decryption proof. Pass `unwrapRequestId` from upgraded events, or the legacy encrypted amount handle. |
190
243
  | `confidentialTransfer(to, amount)` | Encrypted transfer. Encrypts amount, then calls the contract. |
191
244
  | `confidentialTransferFrom(from, to, amt)` | Operator encrypted transfer. |
192
245
  | `approve(spender, until?)` | Set operator approval. `until` defaults to now + 1 hour. |
@@ -264,17 +317,33 @@ const results = await Token.batchRevokeDelegation(tokens, "0xDelegate");
264
317
  The unshield flow is two-phase: unwrap tx, then finalize. If the page reloads between phases, the unwrap tx hash is lost. Use these utilities to persist it:
265
318
 
266
319
  ```ts
267
- import { savePendingUnshield, loadPendingUnshield, clearPendingUnshield } from "@zama-fhe/sdk";
268
-
269
- // Save the unwrap hash before finalization
270
- await savePendingUnshield(storage, wrapperAddress, unwrapTxHash);
271
-
272
- // On next load, check for pending unshields
320
+ import {
321
+ savePendingUnshield,
322
+ loadPendingUnshield,
323
+ loadPendingUnshieldRequest,
324
+ clearPendingUnshield,
325
+ } from "@zama-fhe/sdk";
326
+
327
+ // Save before finalization.
328
+ // Pass unwrapRequestId from upgraded UnwrapRequested events when available.
329
+ const event = findUnwrapRequested(receipt.logs);
330
+ await savePendingUnshield(storage, wrapperAddress, unwrapTxHash, event.unwrapRequestId);
331
+
332
+ // On next load, resume with the tx hash only (works for both legacy and upgraded wrappers)
273
333
  const pending = await loadPendingUnshield(storage, wrapperAddress);
274
334
  if (pending) {
275
335
  await token.resumeUnshield(pending);
276
336
  await clearPendingUnshield(storage, wrapperAddress);
277
337
  }
338
+
339
+ // Or load the full request object to access unwrapRequestId directly
340
+ const request = await loadPendingUnshieldRequest(storage, wrapperAddress);
341
+ if (request) {
342
+ // request.unwrapTxHash — always present
343
+ // request.unwrapRequestId — present for requests from upgraded wrappers
344
+ await token.resumeUnshield(request.unwrapTxHash);
345
+ await clearPendingUnshield(storage, wrapperAddress);
346
+ }
278
347
  ```
279
348
 
280
349
  ### Storage
@@ -425,38 +494,47 @@ const sdk = new ZamaSDK({
425
494
  | `getChainId` | `() => Promise<number>` | Resolve the current chain ID. Called lazily; the pool is re-initialized on chain change. |
426
495
  | `transports` | `Record<number, FhevmInstanceConfig>` | Chain-specific configs keyed by chain ID (includes relayerUrl, network, auth, contract addresses). |
427
496
 
428
- ### Network Preset Configs
497
+ ### Chain Objects
429
498
 
430
- Both the main entry (`@zama-fhe/sdk`) and the `/node` sub-path re-export preset configs so you don't need to import from `@zama-fhe/relayer-sdk` directly:
499
+ Pre-configured chain objects from `@zama-fhe/sdk/chains`. Each includes contract addresses, relayer URLs, and an `id` alias for relayer config keys:
431
500
 
432
- | Config | Chain ID | Description |
433
- | --------------- | -------- | ----------------------------------- |
434
- | `SepoliaConfig` | 11155111 | Sepolia testnet contract addresses. |
435
- | `MainnetConfig` | 1 | Mainnet contract addresses. |
436
- | `HardhatConfig` | 31337 | Local Hardhat node addresses. |
501
+ ```ts
502
+ import { sepolia, mainnet, hoodi, hardhat } from "@zama-fhe/sdk/chains";
503
+ ```
504
+
505
+ | Chain | Chain ID | Description |
506
+ | --------- | ---------- | ------------------ |
507
+ | `mainnet` | `1` | Ethereum Mainnet |
508
+ | `sepolia` | `11155111` | Sepolia Testnet |
509
+ | `hoodi` | `17000` | Hoodi Testnet |
510
+ | `hardhat` | `31337` | Local Hardhat node |
437
511
 
438
- Each preset provides contract addresses and default relayer URL. Override `network` (RPC URL) for your environment. Browser apps should override `relayerUrl` with a proxy; server-side apps add `auth`:
512
+ Use with `createConfig`:
439
513
 
440
514
  ```ts
441
- import { SepoliaConfig, MainnetConfig } from "@zama-fhe/sdk";
442
-
443
- // Browser proxy through your backend
444
- const transports = {
445
- [SepoliaConfig.chainId]: {
446
- ...SepoliaConfig,
447
- relayerUrl: "https://your-app.com/api/relayer/11155111",
448
- network: "https://sepolia.infura.io/v3/KEY",
449
- },
450
- };
515
+ import { web } from "@zama-fhe/sdk";
516
+ import { createConfig } from "@zama-fhe/sdk/viem";
517
+ import { sepolia } from "@zama-fhe/sdk/chains";
518
+ import type { FheChain } from "@zama-fhe/sdk/chains";
451
519
 
452
- // Node.js auth is safe server-side
453
- const transports = {
454
- [SepoliaConfig.chainId]: {
455
- ...SepoliaConfig,
456
- network: "https://sepolia.infura.io/v3/KEY",
457
- auth: { __type: "ApiKeyHeader", value: process.env.RELAYER_API_KEY },
520
+ const mySepolia = { ...sepolia, relayerUrl: "/api/relayer/11155111" } as const satisfies FheChain;
521
+
522
+ const config = createConfig({
523
+ chains: [mySepolia],
524
+ publicClient,
525
+ walletClient,
526
+ relayers: {
527
+ [mySepolia.id]: web(),
458
528
  },
459
- };
529
+ });
530
+ ```
531
+
532
+ ### Legacy Network Preset Configs
533
+
534
+ The legacy `SepoliaConfig`, `MainnetConfig`, and `HardhatConfig` objects are still available for manual `RelayerWeb`/`RelayerNode` construction:
535
+
536
+ ```ts
537
+ import { SepoliaConfig, MainnetConfig, HardhatConfig } from "@zama-fhe/sdk";
460
538
  ```
461
539
 
462
540
  ## GenericSigner Interface
@@ -534,15 +612,20 @@ interface ContractCallConfig {
534
612
 
535
613
  ### Wrapper
536
614
 
537
- | Function | Description |
538
- | -------------------------------------------------------------------- | --------------------------------------------------- |
539
- | `wrapContract(wrapper, to, amount)` | Wrap ERC-20 tokens. |
540
- | `unwrapContract(token, from, to, encryptedAmount, inputProof)` | Request unwrap with encrypted amount. |
541
- | `unwrapFromBalanceContract(token, from, to, encryptedBalance)` | Request unwrap using on-chain balance handle. |
542
- | `finalizeUnwrapContract(wrapper, unwrapRequestId, cleartext, proof)` | Finalize unwrap with decryption proof. |
543
- | `underlyingContract(wrapper)` | Read underlying ERC-20 address. |
544
- | `inferredTotalSupplyContract(wrapper)` | Read inferred plaintext total supply. |
545
- | `totalSupplyContract(wrapper)` | Deprecated alias for `inferredTotalSupplyContract`. |
615
+ | Function | Description |
616
+ | -------------------------------------------------------------------- | --------------------------------------------- |
617
+ | `wrapContract(wrapper, to, amount)` | Wrap ERC-20 tokens. |
618
+ | `unwrapContract(token, from, to, encryptedAmount, inputProof)` | Request unwrap with encrypted amount. |
619
+ | `unwrapFromBalanceContract(token, from, to, encryptedBalance)` | Request unwrap using on-chain balance handle. |
620
+ | `finalizeUnwrapContract(wrapper, unwrapRequestId, cleartext, proof)` | Finalize unwrap with decryption proof. |
621
+ | `underlyingContract(wrapper)` | Read underlying ERC-20 address. |
622
+ | `inferredTotalSupplyContract(wrapper)` | Read inferred plaintext total supply. |
623
+ | `totalSupplyContract(wrapper)` | Deprecated legacy `totalSupply()` builder. |
624
+
625
+ For transition-safe total supply reads, prefer `totalSupplyQueryOptions` or React
626
+ `useTotalSupply`. They detect the wrapper ERC-165 interface ID and call
627
+ `inferredTotalSupply()` on upgraded wrappers or legacy `totalSupply()` on pre-upgrade
628
+ wrappers.
546
629
 
547
630
  ### ERC-165
548
631
 
@@ -618,19 +701,20 @@ const logs = await publicClient.getLogs({
618
701
  });
619
702
  ```
620
703
 
621
- Individual topic hashes are accessible via the `Topics` object: `Topics.ConfidentialTransfer`, `Topics.Wrapped`, `Topics.UnwrapRequested`, `Topics.UnwrappedFinalized`, `Topics.UnwrappedStarted`.
704
+ Individual topic hashes are accessible via the `Topics` object: `Topics.ConfidentialTransfer`, `Topics.Wrapped`, `Topics.UnwrapRequested`, `Topics.UnwrapRequestedLegacy`, `Topics.UnwrapFinalized`, `Topics.UnwrapFinalizedLegacy`, and `Topics.UnwrappedStarted`. `Topics.UnwrappedFinalized` remains as a deprecated alias for the upgraded finalized topic.
622
705
 
623
706
  ### Decoders
624
707
 
625
- | Function | Returns |
626
- | --------------------------------- | ----------------------------------------------------------------------------------------------------------- |
627
- | `decodeConfidentialTransfer(log)` | `ConfidentialTransferEvent \| null` — `{ from, to, encryptedAmountHandle }` |
628
- | `decodeWrapped(log)` | `WrappedEvent \| null` — `{ to, amountIn }` |
629
- | `decodeUnwrapRequested(log)` | `UnwrapRequestedEvent \| null` — `{ receiver, unwrapRequestId, encryptedAmount }` |
630
- | `decodeUnwrappedFinalized(log)` | `UnwrappedFinalizedEvent \| null` — `{ receiver, unwrapRequestId, encryptedAmount, cleartextAmount }` |
631
- | `decodeUnwrappedStarted(log)` | `UnwrappedStartedEvent \| null` — `{ returnVal, requestId, txId, to, refund, requestedAmount, burnAmount }` |
632
- | `decodeOnChainEvent(log)` | `OnChainEvent \| null` — tries all decoders |
633
- | `decodeOnChainEvents(logs)` | `OnChainEvent[]` — batch decode, skips unrecognized logs |
708
+ | Function | Returns |
709
+ | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
710
+ | `decodeConfidentialTransfer(log)` | `ConfidentialTransferEvent \| null` — `{ from, to, encryptedAmountHandle }` |
711
+ | `decodeWrapped(log)` | `WrappedEvent \| null` — `{ to, amountIn }` |
712
+ | `decodeUnwrapRequested(log)` | `UnwrapRequestedEvent \| null` — `{ receiver, encryptedAmount, unwrapRequestId? }` |
713
+ | `decodeUnwrapFinalized(log)` | `UnwrapFinalizedEvent \| null` — `{ receiver, encryptedAmount, cleartextAmount, unwrapRequestId? }` |
714
+ | `decodeUnwrappedFinalized(log)` | **Deprecated.** Like `decodeUnwrapFinalized(log)` but always returns `eventName: "UnwrappedFinalized"` not a transparent alias. Update switch statements to use `decodeUnwrapFinalized` and `"UnwrapFinalized"` instead. |
715
+ | `decodeUnwrappedStarted(log)` | `UnwrappedStartedEvent \| null` — `{ returnVal, requestId, txId, to, refund, requestedAmount, burnAmount }` |
716
+ | `decodeOnChainEvent(log)` | `OnChainEvent \| null` — tries all decoders |
717
+ | `decodeOnChainEvents(logs)` | `OnChainEvent[]` — batch decode, skips unrecognized logs |
634
718
 
635
719
  ### Finder Helpers
636
720
 
@@ -748,11 +832,12 @@ Low-level FHE operations are available on the relayer backend via `sdk.relayer`:
748
832
 
749
833
  ## Constants
750
834
 
751
- | Constant | Value | Description |
752
- | ------------------------------ | --------------------------------- | --------------------------------------------- |
753
- | `ZERO_HANDLE` | `"0x0000...0000"` (32 zero bytes) | Sentinel for empty/zero encrypted values. |
754
- | `ERC7984_INTERFACE_ID` | `"0x4958f2a4"` | ERC-165 interface ID for confidential tokens. |
755
- | `ERC7984_WRAPPER_INTERFACE_ID` | `"0xf1f4c25a"` | ERC-165 interface ID for wrapper contracts. |
835
+ | Constant | Value | Description |
836
+ | ------------------------------------- | --------------------------------- | ---------------------------------------------------- |
837
+ | `ZERO_HANDLE` | `"0x0000...0000"` (32 zero bytes) | Sentinel for empty/zero encrypted values. |
838
+ | `ERC7984_INTERFACE_ID` | `"0x4958f2a4"` | ERC-165 interface ID for confidential tokens. |
839
+ | `ERC7984_WRAPPER_INTERFACE_ID` | `"0x1f1c62b2"` | ERC-165 interface ID for upgraded wrapper contracts. |
840
+ | `ERC7984_WRAPPER_INTERFACE_ID_LEGACY` | `"0xd04584ba"` | ERC-165 interface ID for legacy wrapper contracts. |
756
841
 
757
842
  ## Exported ABIs
758
843
 
@@ -0,0 +1,2 @@
1
+ const e=require(`./relayer.cjs`),t=require(`./wrappers-registry.cjs`);var n=class{#e=null;#t=null;#n;#r;#i;constructor(e=`CredentialStore`,t=1,n=`credentials`){this.#n=e,this.#r=t,this.#i=n}#a(){return this.#e?Promise.resolve(this.#e):(this.#t||=new Promise((e,t)=>{let n=indexedDB.open(this.#n,this.#r);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(this.#i)||e.createObjectStore(this.#i,{keyPath:`key`})},n.onsuccess=()=>{this.#e=n.result,this.#t=null,this.#e.onversionchange=()=>{console.warn(`IndexedDB "${this.#n}" closing due to version change from another tab`),this.#e?.close(),this.#e=null,this.#t=null},this.#e.onclose=()=>{this.#e=null,this.#t=null},e(this.#e)},n.onerror=()=>{this.#e=null,this.#t=null,t(n.error)}}),this.#t)}async#o(e,t){let n=await this.#a();return new Promise((r,i)=>{let a=n.transaction(this.#i,e);a.onabort=()=>i(a.error??Error(`Transaction aborted`));let o=t(a.objectStore(this.#i));e===`readonly`?o.onsuccess=()=>r(o.result):a.oncomplete=()=>r(o.result),o.onerror=()=>i(o.error)})}async get(e){return(await this.#o(`readonly`,t=>t.get(e)))?.value??null}async set(e,t){await this.#o(`readwrite`,n=>n.put({key:e,value:t}))}async delete(e){await this.#o(`readwrite`,t=>t.delete(e))}async clear(){await this.#o(`readwrite`,e=>e.clear())}};const r=new n;var i=class{#e=new Map;async get(e){return this.#e.get(e)??null}async set(e,t){this.#e.set(e,t)}async delete(e){this.#e.delete(e)}};const a=new i;function o(){return typeof window<`u`?new n(`CredentialStore`):new i}function s(){return typeof window<`u`?new n(`SessionStore`):new i}function c(e=o(),t=s()){return{storage:e,sessionStorage:t}}function l(t,n){let r=new Map(t.map(e=>[e.id,e]));if(r.size!==t.length){let n=t.map(e=>e.id);throw new e.t(`Duplicate chain id(s) [${[...new Set(n.filter((e,t)=>n.indexOf(e)!==t))].join(`, `)}] in the chains array. Each chain id must appear only once. Note: hardhat and anvil are aliases (both use 31337).`)}let i=new Map(Object.entries(n)),a=new Map;for(let t of r.keys()){let n=r.get(t),o=i.get(String(t));if(!o)throw new e.t(`Chain ${t} has no relayer configured. Add a relayer entry: relayers: { [${t}]: web() }`);if(!n)throw new e.t(`Chain ${t} has a relayer configured but no entry in the chains array. Add the chain config to the chains array.`);a.set(t,{chain:n,relayer:o})}let o=new Set(Object.keys(n).map(Number)),s=new Set([...o].filter(e=>!r.has(e)));if(s.size>0)throw new e.t(`Relayer entries for chain(s) [${[...s].join(`, `)}] have no matching entry in the chains array. Remove them or add the corresponding chain config.`);return a}var u=class{#e;#t;#n;#r;constructor(t,n){if(t.length===0)throw new e.t(`At least one chain is required.`);this.#e=new Map(t.map(e=>[e.id,e])),this.#r=t[0].id;let r=l(t,n),i=new Map;for(let[e,t]of r){let n=t.relayer,r=i.get(n);r||(r=[],i.set(n,r)),r.push([e,t.chain])}let a=new Map,o=[];try{for(let[e,t]of i){let n=t.map(([,e])=>e),r=e.createWorker?.(n);r&&o.push(r);for(let[n,i]of t)a.set(n,e.createRelayer(i,r))}}catch(e){for(let e of o)try{e.terminate()}catch{}throw e}this.#t=a,this.#n=o}get chains(){return[...this.#e.values()]}get chain(){let e=this.#e.get(this.#r);return t.M(e,`RelayerDispatcher: chain`),e}switchChain(t){if(!this.#e.has(t))throw new e.t(`No relayer configured for chain ${t}. Add it to the chains array.`);this.#r=t}get#i(){let e=this.#t.get(this.#r);return t.M(e,`RelayerDispatcher: relayer`),e}generateKeypair(){return this.#i.generateKeypair()}createEIP712(e,t,n,r){return this.#i.createEIP712(e,t,n,r)}encrypt(e){return this.#i.encrypt(e)}userDecrypt(e){return this.#i.userDecrypt(e)}publicDecrypt(e){return this.#i.publicDecrypt(e)}createDelegatedUserDecryptEIP712(e,t,n,r,i){return this.#i.createDelegatedUserDecryptEIP712(e,t,n,r,i)}delegatedUserDecrypt(e){return this.#i.delegatedUserDecrypt(e)}requestZKProofVerification(e){return this.#i.requestZKProofVerification(e)}getPublicKey(){return this.#i.getPublicKey()}getPublicParams(e){return this.#i.getPublicParams(e)}getAclAddress(){return this.#i.getAclAddress()}terminate(){let e=[];for(let n of new Set(this.#t.values()))try{n.terminate()}catch(n){e.push(t.L(n))}for(let n of new Set(this.#n))try{n.terminate()}catch(n){e.push(t.L(n))}if(e.length>0)throw AggregateError(e,`Failed to terminate relayer resources`)}[Symbol.dispose](){this.terminate()}};function d(e,t,n){let{storage:r,sessionStorage:i}=c(n.storage,n.sessionStorage),a=new u(n.chains,n.relayers);return{chains:n.chains,relayer:a,provider:t,signer:e,storage:r,sessionStorage:i,keypairTTL:n.keypairTTL,sessionTTL:n.sessionTTL,registryTTL:n.registryTTL,onEvent:n.onEvent}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return d}});
2
+ //# sourceMappingURL=build.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.cjs","names":["#dbName","#dbVersion","#storeName","#db","#dbPromise","#withTransaction","#getDB","#map","ConfigurationError","#chains","#relayers","#workers","ConfigurationError","#chainId","#active","toError"],"sources":["../../src/storage/indexeddb-storage.ts","../../src/storage/memory-storage.ts","../../src/config/resolve.ts","../../src/relayer/relayer-dispatcher.ts","../../src/config/build.ts"],"sourcesContent":["\"use client\";\n\nimport type { GenericStorage } from \"../types\";\n\n/**\n * IndexedDB-backed {@link GenericStorage}.\n *\n * Stores encrypted credential objects keyed by a hashed wallet address.\n * Encryption is handled by {@link CredentialsManager} — this store only\n * persists opaque values.\n */\nexport class IndexedDBStorage implements GenericStorage {\n #db: IDBDatabase | null = null;\n #dbPromise: Promise<IDBDatabase> | null = null;\n #dbName: string;\n #dbVersion: number;\n #storeName: string;\n\n constructor(dbName = \"CredentialStore\", dbVersion = 1, storeName = \"credentials\") {\n this.#dbName = dbName;\n this.#dbVersion = dbVersion;\n this.#storeName = storeName;\n }\n\n #getDB(): Promise<IDBDatabase> {\n if (this.#db) {\n return Promise.resolve(this.#db);\n }\n if (this.#dbPromise) {\n return this.#dbPromise;\n }\n\n this.#dbPromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(this.#dbName, this.#dbVersion);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(this.#storeName)) {\n db.createObjectStore(this.#storeName, { keyPath: \"key\" });\n }\n };\n\n request.onsuccess = () => {\n this.#db = request.result;\n this.#dbPromise = null;\n this.#db.onversionchange = () => {\n // oxlint-disable-next-line no-console\n console.warn(\n `IndexedDB \"${this.#dbName}\" closing due to version change from another tab`,\n );\n this.#db?.close();\n this.#db = null;\n this.#dbPromise = null;\n };\n this.#db.onclose = () => {\n this.#db = null;\n this.#dbPromise = null;\n };\n resolve(this.#db);\n };\n\n request.onerror = () => {\n this.#db = null;\n this.#dbPromise = null;\n reject(request.error);\n };\n });\n\n return this.#dbPromise;\n }\n\n async #withTransaction<T>(\n mode: IDBTransactionMode,\n fn: (store: IDBObjectStore) => IDBRequest,\n ): Promise<T> {\n const db = await this.#getDB();\n return new Promise((resolve, reject) => {\n const tx = db.transaction(this.#storeName, mode);\n tx.onabort = () => reject(tx.error ?? new Error(\"Transaction aborted\"));\n const request = fn(tx.objectStore(this.#storeName));\n if (mode === \"readonly\") {\n request.onsuccess = () => resolve(request.result);\n } else {\n tx.oncomplete = () => resolve(request.result);\n }\n request.onerror = () => reject(request.error);\n });\n }\n\n async get<T = unknown>(key: string): Promise<T | null> {\n const result = await this.#withTransaction<{ value: T } | undefined>(\"readonly\", (store) =>\n store.get(key),\n );\n return result?.value ?? null;\n }\n\n async set<T = unknown>(key: string, value: T): Promise<void> {\n await this.#withTransaction<void>(\"readwrite\", (store) => store.put({ key, value }));\n }\n\n async delete(key: string): Promise<void> {\n await this.#withTransaction<void>(\"readwrite\", (store) => store.delete(key));\n }\n\n async clear(): Promise<void> {\n await this.#withTransaction<void>(\"readwrite\", (store) => store.clear());\n }\n}\n\n/** Default singleton for application-wide use. */\nexport const indexedDBStorage = new IndexedDBStorage();\n","import type { GenericStorage } from \"../types\";\n\n/** In-memory credential store. Credentials are lost on page reload. */\nexport class MemoryStorage implements GenericStorage {\n #map = new Map<string, unknown>();\n\n async get<T = unknown>(key: string): Promise<T | null> {\n return (this.#map.get(key) as T) ?? null;\n }\n\n async set<T = unknown>(key: string, value: T): Promise<void> {\n this.#map.set(key, value);\n }\n\n async delete(key: string): Promise<void> {\n this.#map.delete(key);\n }\n}\n\n/** Default singleton for application-wide use. */\nexport const memoryStorage = new MemoryStorage();\n","import type { FheChain } from \"../chains\";\nimport { ConfigurationError } from \"../errors\";\nimport { IndexedDBStorage } from \"../storage/indexeddb-storage\";\nimport { MemoryStorage } from \"../storage/memory-storage\";\nimport type { GenericStorage } from \"../types\";\nimport type { RelayerConfig } from \"./types\";\n\n// ── Storage defaults ─────────────────────────────────────────────────────────\n\nfunction getDefaultStorage(): GenericStorage {\n return typeof window !== \"undefined\"\n ? new IndexedDBStorage(\"CredentialStore\")\n : new MemoryStorage();\n}\n\nfunction getDefaultSessionStorage(): GenericStorage {\n return typeof window !== \"undefined\" ? new IndexedDBStorage(\"SessionStore\") : new MemoryStorage();\n}\n\nexport function resolveStorage(\n storage: GenericStorage | undefined = getDefaultStorage(),\n sessionStorage: GenericStorage | undefined = getDefaultSessionStorage(),\n): { storage: GenericStorage; sessionStorage: GenericStorage } {\n return { storage, sessionStorage };\n}\n\n// ── Chain relayer resolution ────────────────────────────────────────────────\n\nexport interface ResolvedChainRelayer {\n chain: FheChain;\n relayer: RelayerConfig;\n}\n\nexport function resolveChainRelayers(\n chains: readonly FheChain[],\n relayers: Readonly<Record<number, RelayerConfig>>,\n): Map<number, ResolvedChainRelayer> {\n const chainMap = new Map(chains.map((c) => [c.id, c]));\n if (chainMap.size !== chains.length) {\n const ids = chains.map((c) => c.id);\n const dupes = [...new Set(ids.filter((id, i) => ids.indexOf(id) !== i))];\n throw new ConfigurationError(\n `Duplicate chain id(s) [${dupes.join(\", \")}] in the chains array. ` +\n `Each chain id must appear only once. Note: hardhat and anvil are aliases (both use 31337).`,\n );\n }\n const relayerMap = new Map(Object.entries(relayers));\n const result = new Map<number, ResolvedChainRelayer>();\n\n for (const id of chainMap.keys()) {\n const chainConfig = chainMap.get(id);\n const relayerConfig = relayerMap.get(String(id));\n\n if (!relayerConfig) {\n throw new ConfigurationError(\n `Chain ${id} has no relayer configured. ` +\n `Add a relayer entry: relayers: { [${id}]: web() }`,\n );\n }\n\n if (!chainConfig) {\n throw new ConfigurationError(\n `Chain ${id} has a relayer configured but no entry in the chains array. ` +\n `Add the chain config to the chains array.`,\n );\n }\n\n result.set(id, {\n chain: chainConfig,\n relayer: relayerConfig,\n });\n }\n\n const relayerIdSet = new Set(Object.keys(relayers).map(Number));\n const orphaned = new Set([...relayerIdSet].filter((id) => !chainMap.has(id)));\n if (orphaned.size > 0) {\n throw new ConfigurationError(\n `Relayer entries for chain(s) [${[...orphaned].join(\", \")}] have no matching entry ` +\n `in the chains array. Remove them or add the corresponding chain config.`,\n );\n }\n\n return result;\n}\n","import type {\n InputProofBytesType,\n KeypairType,\n KmsDelegatedUserDecryptEIP712Type,\n ZKProofLike,\n} from \"@zama-fhe/relayer-sdk/bundle\";\nimport type { Address, Hex } from \"viem\";\nimport type { FheChain } from \"../chains/types\";\nimport type { RelayerConfig } from \"../config/types\";\nimport { resolveChainRelayers } from \"../config/resolve\";\nimport { ConfigurationError } from \"../errors\";\nimport { assertNonNullable, toError } from \"../utils\";\nimport type { RelayerSDK } from \"./relayer-sdk\";\nimport type {\n ClearValueType,\n DelegatedUserDecryptParams,\n EIP712TypedData,\n EncryptParams,\n EncryptResult,\n Handle,\n PublicDecryptResult,\n PublicKeyData,\n PublicParamsData,\n UserDecryptParams,\n} from \"./relayer-sdk.types\";\n\n/** Anything with a synchronous `terminate()` method (workers, pools). */\nexport interface WorkerLike {\n terminate(): void;\n}\n\n/**\n * Owns chain management (chains / activeChain / switchChain) and delegates\n * every {@link RelayerSDK} operation to the relayer for the currently active\n * chain.\n *\n * Groups chains by relayer config reference identity, calls `createWorker`\n * once per group with all chain configs, then calls `createRelayer`\n * per chain with the shared worker.\n *\n * Workers/pools are held separately from relayers so the dispatcher can\n * terminate them directly — relayers never own worker lifecycle.\n */\nexport class RelayerDispatcher implements RelayerSDK, Disposable {\n readonly #chains: Map<number, FheChain>;\n readonly #relayers: Map<number, RelayerSDK>;\n readonly #workers: readonly WorkerLike[];\n #chainId: number;\n\n constructor(\n chains: readonly [FheChain, ...FheChain[]],\n configs: Readonly<Record<number, RelayerConfig>>,\n ) {\n if (chains.length === 0) {\n throw new ConfigurationError(\"At least one chain is required.\");\n }\n this.#chains = new Map(chains.map((c) => [c.id, c]));\n this.#chainId = chains[0].id;\n\n const chainRelayers = resolveChainRelayers(chains, configs);\n\n // Group chains by relayer config reference — same object = same group = shared worker.\n const groups = new Map<RelayerConfig, Array<[number, FheChain]>>();\n for (const [chainId, config] of chainRelayers) {\n const key = config.relayer;\n let group = groups.get(key);\n if (!group) {\n group = [];\n groups.set(key, group);\n }\n group.push([chainId, config.chain]);\n }\n\n // For each group: create shared worker once, then create per-chain relayers.\n const relayers = new Map<number, RelayerSDK>();\n const workers: WorkerLike[] = [];\n try {\n for (const [relayerCfg, groupChains] of groups) {\n const allChainConfigs = groupChains.map(([, chain]) => chain);\n const worker = relayerCfg.createWorker?.(allChainConfigs);\n if (worker) {\n workers.push(worker);\n }\n for (const [chainId, chain] of groupChains) {\n relayers.set(chainId, relayerCfg.createRelayer(chain, worker));\n }\n }\n } catch (error) {\n for (const w of workers) {\n try {\n w.terminate();\n } catch {\n /* best-effort cleanup */\n }\n }\n throw error;\n }\n\n this.#relayers = relayers;\n this.#workers = workers;\n }\n\n get chains(): readonly FheChain[] {\n return [...this.#chains.values()];\n }\n\n get chain(): FheChain {\n const chain = this.#chains.get(this.#chainId);\n assertNonNullable(chain, \"RelayerDispatcher: chain\");\n return chain;\n }\n\n switchChain(chainId: number): void {\n if (!this.#chains.has(chainId)) {\n throw new ConfigurationError(\n `No relayer configured for chain ${chainId}. Add it to the chains array.`,\n );\n }\n this.#chainId = chainId;\n }\n\n get #active(): RelayerSDK {\n const relayer = this.#relayers.get(this.#chainId);\n assertNonNullable(relayer, \"RelayerDispatcher: relayer\");\n return relayer;\n }\n\n generateKeypair(): Promise<KeypairType<Hex>> {\n return this.#active.generateKeypair();\n }\n\n createEIP712(\n publicKey: Hex,\n contractAddresses: Address[],\n startTimestamp: number,\n durationDays?: number,\n ): Promise<EIP712TypedData> {\n return this.#active.createEIP712(publicKey, contractAddresses, startTimestamp, durationDays);\n }\n\n encrypt(params: EncryptParams): Promise<EncryptResult> {\n return this.#active.encrypt(params);\n }\n\n userDecrypt(params: UserDecryptParams): Promise<Readonly<Record<Handle, ClearValueType>>> {\n return this.#active.userDecrypt(params);\n }\n\n publicDecrypt(handles: Handle[]): Promise<PublicDecryptResult> {\n return this.#active.publicDecrypt(handles);\n }\n\n createDelegatedUserDecryptEIP712(\n publicKey: Hex,\n contractAddresses: Address[],\n delegatorAddress: Address,\n startTimestamp: number,\n durationDays?: number,\n ): Promise<KmsDelegatedUserDecryptEIP712Type> {\n return this.#active.createDelegatedUserDecryptEIP712(\n publicKey,\n contractAddresses,\n delegatorAddress,\n startTimestamp,\n durationDays,\n );\n }\n\n delegatedUserDecrypt(\n params: DelegatedUserDecryptParams,\n ): Promise<Readonly<Record<Handle, ClearValueType>>> {\n return this.#active.delegatedUserDecrypt(params);\n }\n\n requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType> {\n return this.#active.requestZKProofVerification(zkProof);\n }\n\n getPublicKey(): Promise<PublicKeyData | null> {\n return this.#active.getPublicKey();\n }\n\n getPublicParams(bits: number): Promise<PublicParamsData | null> {\n return this.#active.getPublicParams(bits);\n }\n\n getAclAddress(): Promise<Address> {\n return this.#active.getAclAddress();\n }\n\n terminate(): void {\n const errors: Error[] = [];\n\n // Clean up relayer-owned caches (no worker termination).\n for (const r of new Set(this.#relayers.values())) {\n try {\n r.terminate();\n } catch (e) {\n errors.push(toError(e));\n }\n }\n\n // Terminate the actual workers/pools (deduplicated).\n for (const w of new Set(this.#workers)) {\n try {\n w.terminate();\n } catch (e) {\n errors.push(toError(e));\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, \"Failed to terminate relayer resources\");\n }\n }\n\n [Symbol.dispose](): void {\n this.terminate();\n }\n}\n","import { RelayerDispatcher } from \"../relayer/relayer-dispatcher\";\nimport type { GenericProvider, GenericSigner } from \"../types\";\nimport { resolveStorage } from \"./resolve\";\nimport type { ZamaConfig, ZamaConfigBase } from \"./types\";\n\n/**\n * @internal Shared config builder — not part of the public API.\n */\nexport function buildZamaConfig(\n signer: GenericSigner,\n provider: GenericProvider,\n params: ZamaConfigBase,\n): ZamaConfig {\n const { storage, sessionStorage } = resolveStorage(params.storage, params.sessionStorage);\n\n const relayer = new RelayerDispatcher(params.chains, params.relayers);\n\n return {\n chains: params.chains,\n relayer,\n provider,\n signer,\n storage,\n sessionStorage,\n keypairTTL: params.keypairTTL,\n sessionTTL: params.sessionTTL,\n registryTTL: params.registryTTL,\n onEvent: params.onEvent,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chains.cjs`);exports.anvil=e.t,exports.chains=e.n,exports.hardhat=e.r,exports.hoodi=e.i,exports.mainnet=e.a,exports.sepolia=e.o;
@@ -0,0 +1,2 @@
1
+ const e={id:1,gatewayChainId:261131,relayerUrl:`https://relayer.mainnet.zama.org/v2`,network:`https://ethereum-rpc.publicnode.com`,aclContractAddress:`0xcA2E8f1F656CD25C01F05d0b243Ab1ecd4a8ffb6`,kmsContractAddress:`0x77627828a55156b04Ac0DC0eb30467f1a552BB03`,inputVerifierContractAddress:`0xCe0FC2e05CFff1B719EFF7169f7D80Af770c8EA2`,verifyingContractAddressDecryption:`0x0f6024a97684f7d90ddb0fAAD79cB15F2C888D24`,verifyingContractAddressInputVerification:`0xcB1bB072f38bdAF0F328CdEf1Fc6eDa1DF029287`,registryAddress:`0xeb5015fF021DB115aCe010f23F55C2591059bBA0`},t={id:11155111,gatewayChainId:10901,relayerUrl:`https://relayer.testnet.zama.org/v2`,network:`https://ethereum-sepolia-rpc.publicnode.com`,aclContractAddress:`0xf0Ffdc93b7E186bC2f8CB3dAA75D86d1930A433D`,kmsContractAddress:`0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A`,inputVerifierContractAddress:`0xBBC1fFCdc7C316aAAd72E807D9b0272BE8F84DA0`,verifyingContractAddressDecryption:`0x5D8BD78e2ea6bbE41f26dFe9fdaEAa349e077478`,verifyingContractAddressInputVerification:`0x483b9dE06E4E4C7D35CCf5837A1668487406D955`,registryAddress:`0x2f0750Bbb0A246059d80e94c454586a7F27a128e`},n={id:560048,gatewayChainId:10901,relayerUrl:``,network:`https://rpc.hoodi.ethpandaops.io`,aclContractAddress:`0x6D3FAf6f86e1fF9F3B0831Dda920AbA1cBd5bd68`,kmsContractAddress:`0x901F8942346f7AB3a01F6D7613119Bca447Bb030`,inputVerifierContractAddress:`0x36772142b74871f255CbD7A3e89B401d3e45825f`,verifyingContractAddressDecryption:`0x5ffdaAB0373E62E2ea2944776209aEf29E631A64`,verifyingContractAddressInputVerification:`0x812b06e1CDCE800494b79fFE4f925A504a9A9810`,registryAddress:`0x1807aE2f693F8530DFB126D0eF98F2F2518F292f`,executorAddress:`0xC316692627de536368d82e9121F1D44a550894E6`},r={id:31337,gatewayChainId:10901,relayerUrl:``,network:`http://127.0.0.1:8545`,aclContractAddress:`0x50157CFfD6bBFA2DECe204a89ec419c23ef5755D`,inputVerifierContractAddress:`0x36772142b74871f255CbD7A3e89B401d3e45825f`,kmsContractAddress:`0x901F8942346f7AB3a01F6D7613119Bca447Bb030`,verifyingContractAddressDecryption:`0x5ffdaAB0373E62E2ea2944776209aEf29E631A64`,verifyingContractAddressInputVerification:`0x812b06e1CDCE800494b79fFE4f925A504a9A9810`,registryAddress:void 0,executorAddress:`0xe3a9105a3a932253A70F126eb1E3b589C643dD24`},i=r,a={[e.id]:e,[t.id]:t,[n.id]:n,[r.id]:r};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return i}});
2
+ //# sourceMappingURL=chains.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.cjs","names":[],"sources":["../../src/chains/configs.ts"],"sourcesContent":["import type { FheChain } from \"./types\";\n\n/**\n * Mainnet network configuration (chainId 1).\n *\n * Contract addresses mirror `MainnetConfigV2` from `@zama-fhe/relayer-sdk`.\n * They are duplicated here because the `/bundle` export path only exposes\n * types at build time (runtime values require `/web` or `/node` which pull\n * in WASM). `satisfies FheChain` ensures structural drift is caught at\n * compile time.\n */\nexport const mainnet = {\n id: 1,\n gatewayChainId: 261131,\n relayerUrl: \"https://relayer.mainnet.zama.org/v2\",\n network: \"https://ethereum-rpc.publicnode.com\",\n aclContractAddress: \"0xcA2E8f1F656CD25C01F05d0b243Ab1ecd4a8ffb6\",\n kmsContractAddress: \"0x77627828a55156b04Ac0DC0eb30467f1a552BB03\",\n inputVerifierContractAddress: \"0xCe0FC2e05CFff1B719EFF7169f7D80Af770c8EA2\",\n verifyingContractAddressDecryption: \"0x0f6024a97684f7d90ddb0fAAD79cB15F2C888D24\",\n verifyingContractAddressInputVerification: \"0xcB1bB072f38bdAF0F328CdEf1Fc6eDa1DF029287\",\n registryAddress: \"0xeb5015fF021DB115aCe010f23F55C2591059bBA0\",\n} as const satisfies FheChain;\n\n/**\n * Sepolia testnet network configuration (chainId 11155111).\n */\nexport const sepolia = {\n id: 11155111,\n gatewayChainId: 10901,\n relayerUrl: \"https://relayer.testnet.zama.org/v2\",\n network: \"https://ethereum-sepolia-rpc.publicnode.com\",\n aclContractAddress: \"0xf0Ffdc93b7E186bC2f8CB3dAA75D86d1930A433D\",\n kmsContractAddress: \"0xbE0E383937d564D7FF0BC3b46c51f0bF8d5C311A\",\n inputVerifierContractAddress: \"0xBBC1fFCdc7C316aAAd72E807D9b0272BE8F84DA0\",\n verifyingContractAddressDecryption: \"0x5D8BD78e2ea6bbE41f26dFe9fdaEAa349e077478\",\n verifyingContractAddressInputVerification: \"0x483b9dE06E4E4C7D35CCf5837A1668487406D955\",\n registryAddress: \"0x2f0750Bbb0A246059d80e94c454586a7F27a128e\",\n} as const satisfies FheChain;\n\n/**\n * Hoodi testnet configuration (chainId 560048).\n *\n * Hoodi does not have full FHE infrastructure — use with `cleartext()` transport.\n * Contract addresses match the cleartext deployment.\n */\nexport const hoodi = {\n id: 560048,\n gatewayChainId: 10901,\n relayerUrl: \"\",\n network: \"https://rpc.hoodi.ethpandaops.io\",\n aclContractAddress: \"0x6D3FAf6f86e1fF9F3B0831Dda920AbA1cBd5bd68\",\n kmsContractAddress: \"0x901F8942346f7AB3a01F6D7613119Bca447Bb030\",\n inputVerifierContractAddress: \"0x36772142b74871f255CbD7A3e89B401d3e45825f\",\n verifyingContractAddressDecryption: \"0x5ffdaAB0373E62E2ea2944776209aEf29E631A64\",\n verifyingContractAddressInputVerification: \"0x812b06e1CDCE800494b79fFE4f925A504a9A9810\",\n registryAddress: \"0x1807aE2f693F8530DFB126D0eF98F2F2518F292f\",\n executorAddress: \"0xC316692627de536368d82e9121F1D44a550894E6\",\n} as const satisfies FheChain;\n\n/**\n * Hardhat local network configuration (chainId 31337).\n *\n * The addresses in this configuration must match those of your deployment.\n */\nexport const hardhat = {\n id: 31337,\n gatewayChainId: 10901,\n relayerUrl: \"\",\n network: \"http://127.0.0.1:8545\",\n aclContractAddress: \"0x50157CFfD6bBFA2DECe204a89ec419c23ef5755D\",\n inputVerifierContractAddress: \"0x36772142b74871f255CbD7A3e89B401d3e45825f\",\n kmsContractAddress: \"0x901F8942346f7AB3a01F6D7613119Bca447Bb030\",\n verifyingContractAddressDecryption: \"0x5ffdaAB0373E62E2ea2944776209aEf29E631A64\",\n verifyingContractAddressInputVerification: \"0x812b06e1CDCE800494b79fFE4f925A504a9A9810\",\n registryAddress: undefined,\n executorAddress: \"0xe3a9105a3a932253A70F126eb1E3b589C643dD24\",\n} as const satisfies FheChain;\n\n/** Alias for {@link hardhat}. */\nexport const anvil = hardhat;\n\n/**\n * Built-in chain configurations keyed by chain ID.\n */\nexport const chains: Record<number, FheChain> = {\n [mainnet.id]: mainnet,\n [sepolia.id]: sepolia,\n [hoodi.id]: hoodi,\n [hardhat.id]: hardhat,\n} as const;\n"],"mappings":"AAWA,MAAa,EAAU,CACrB,GAAI,EACJ,eAAgB,OAChB,WAAY,sCACZ,QAAS,sCACT,mBAAoB,6CACpB,mBAAoB,6CACpB,6BAA8B,6CAC9B,mCAAoC,6CACpC,0CAA2C,6CAC3C,gBAAiB,6CAClB,CAKY,EAAU,CACrB,GAAI,SACJ,eAAgB,MAChB,WAAY,sCACZ,QAAS,8CACT,mBAAoB,6CACpB,mBAAoB,6CACpB,6BAA8B,6CAC9B,mCAAoC,6CACpC,0CAA2C,6CAC3C,gBAAiB,6CAClB,CAQY,EAAQ,CACnB,GAAI,OACJ,eAAgB,MAChB,WAAY,GACZ,QAAS,mCACT,mBAAoB,6CACpB,mBAAoB,6CACpB,6BAA8B,6CAC9B,mCAAoC,6CACpC,0CAA2C,6CAC3C,gBAAiB,6CACjB,gBAAiB,6CAClB,CAOY,EAAU,CACrB,GAAI,MACJ,eAAgB,MAChB,WAAY,GACZ,QAAS,wBACT,mBAAoB,6CACpB,6BAA8B,6CAC9B,mBAAoB,6CACpB,mCAAoC,6CACpC,0CAA2C,6CAC3C,gBAAiB,IAAA,GACjB,gBAAiB,6CAClB,CAGY,EAAQ,EAKR,EAAmC,EAC7C,EAAQ,IAAK,GACb,EAAQ,IAAK,GACb,EAAM,IAAK,GACX,EAAQ,IAAK,EACf"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../cleartext.cjs`);exports.RelayerCleartext=e.r,exports.hardhatCleartextConfig=e.t,exports.hoodiCleartextConfig=e.n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../relayer-cleartext.cjs`);exports.RelayerCleartext=e.t;
@@ -1,2 +1,2 @@
1
- let e=require(`viem`);function t(t,n,{onDisconnect:r=()=>{},onAccountChange:i=()=>{},onChainChange:a}){if(!t)return()=>{};let o;n().then(e=>{o=e}).catch(()=>{});let s=t=>{if(t.length===0)return o=void 0,r();if(!t[0])return;let n;try{n=(0,e.getAddress)(t[0])}catch{return}(!o||n!==o)&&i(n),o=n},c=()=>r(),l=a?e=>a(Number.parseInt(e,16)):void 0;return t.on(`accountsChanged`,s),t.on(`disconnect`,c),l&&t.on(`chainChanged`,l),()=>{t.removeListener(`accountsChanged`,s),t.removeListener(`disconnect`,c),l&&t.removeListener(`chainChanged`,l)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return t}});
1
+ let e=require(`viem`);function t(t){if(t)try{return(0,e.getAddress)(t)}catch{return}}function n(e){let t=Number(e);return Number.isSafeInteger(t)&&t>0?t:void 0}function r({provider:e,getInitialIdentity:r,onIdentityChange:i}){if(!e)return()=>{};let a,o,s,c=!0,l=0;function u(){l+=1}function d(){if(!c)return;let e=o&&s!==void 0?{address:o,chainId:s}:void 0;if(a?.address===e?.address&&a?.chainId===e?.chainId)return;let t=a;a=e,i({previous:t,next:e})}let f=e=>{if(u(),e.length===0||!e[0]){o=void 0,s=void 0,d();return}let n=t(e[0]);n&&(o=n,d())},p=()=>{u(),o=void 0,s=void 0,d()},m=e=>{u();let t=n(e);t&&(s=t,d())};if(e.on(`accountsChanged`,f),e.on(`disconnect`,p),e.on(`chainChanged`,m),r){let e=l;Promise.resolve().then(r).then(t=>{!c||l!==e||(a=t,o=t?.address,s=t?.chainId)}).catch(e=>{console.warn(`[zama-sdk] initial identity load failed:`,e)})}return()=>{c=!1,e.removeListener(`accountsChanged`,f),e.removeListener(`disconnect`,p),e.removeListener(`chainChanged`,m)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
2
2
  //# sourceMappingURL=eip1193-subscribe.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"eip1193-subscribe.cjs","names":[],"sources":["../../src/token/eip1193-subscribe.ts"],"sourcesContent":["import {\n getAddress as checksumAddress,\n type Address,\n type EIP1193EventMap,\n type EIP1193Provider,\n} from \"viem\";\nimport type { SignerLifecycleCallbacks } from \"../types\";\n\n/**\n * Subscribe to EIP-1193 wallet lifecycle events on a raw provider.\n * Shared by `ViemSigner` and `EthersSigner` to avoid duplicating the\n * `accountsChanged` / `disconnect` wiring.\n *\n * @param provider - An EIP-1193 provider, or `undefined` if unavailable.\n * @param getAddress - Async function returning the current wallet address.\n * @param callbacks - Lifecycle callbacks to invoke on disconnect or account change.\n * @returns An unsubscribe function (no-op when provider is undefined).\n */\nexport function eip1193Subscribe(\n provider: Pick<EIP1193Provider, \"on\" | \"removeListener\"> | undefined,\n getAddress: () => Promise<Address>,\n { onDisconnect = () => {}, onAccountChange = () => {}, onChainChange }: SignerLifecycleCallbacks,\n): () => void {\n if (!provider) {\n return () => {};\n }\n\n let currentAddress: Address | undefined;\n getAddress()\n .then((addr) => {\n currentAddress = addr;\n })\n .catch(() => {});\n\n const handleAccountsChanged: EIP1193EventMap[\"accountsChanged\"] = (accounts) => {\n if (accounts.length === 0) {\n currentAddress = undefined;\n return onDisconnect();\n }\n if (!accounts[0]) {\n return;\n }\n let nextAddress: Address;\n try {\n nextAddress = checksumAddress(accounts[0]);\n } catch {\n return;\n }\n if (!currentAddress || nextAddress !== currentAddress) {\n onAccountChange(nextAddress);\n }\n currentAddress = nextAddress;\n };\n const handleDisconnect: EIP1193EventMap[\"disconnect\"] = () => onDisconnect();\n const handleChainChanged = onChainChange\n ? (chainId: string) => onChainChange(Number.parseInt(chainId, 16))\n : undefined;\n\n provider.on(\"accountsChanged\", handleAccountsChanged);\n provider.on(\"disconnect\", handleDisconnect);\n if (handleChainChanged) {\n (provider as EIP1193Provider).on(\n \"chainChanged\",\n handleChainChanged as EIP1193EventMap[\"chainChanged\"],\n );\n }\n\n return () => {\n provider.removeListener(\"accountsChanged\", handleAccountsChanged);\n provider.removeListener(\"disconnect\", handleDisconnect);\n if (handleChainChanged) {\n (provider as EIP1193Provider).removeListener(\n \"chainChanged\",\n handleChainChanged as EIP1193EventMap[\"chainChanged\"],\n );\n }\n };\n}\n"],"mappings":"sBAkBA,SAAgB,EACd,EACA,EACA,CAAE,mBAAqB,GAAI,sBAAwB,GAAI,iBAC3C,CACZ,GAAI,CAAC,EACH,UAAa,GAGf,IAAI,EACJ,GAAY,CACT,KAAM,GAAS,CACd,EAAiB,GACjB,CACD,UAAY,GAAG,CAElB,IAAM,EAA6D,GAAa,CAC9E,GAAI,EAAS,SAAW,EAEtB,MADA,GAAiB,IAAA,GACV,GAAc,CAEvB,GAAI,CAAC,EAAS,GACZ,OAEF,IAAI,EACJ,GAAI,CACF,GAAA,EAAA,EAAA,YAA8B,EAAS,GAAG,MACpC,CACN,QAEE,CAAC,GAAkB,IAAgB,IACrC,EAAgB,EAAY,CAE9B,EAAiB,GAEb,MAAwD,GAAc,CACtE,EAAqB,EACtB,GAAoB,EAAc,OAAO,SAAS,EAAS,GAAG,CAAC,CAChE,IAAA,GAWJ,OATA,EAAS,GAAG,kBAAmB,EAAsB,CACrD,EAAS,GAAG,aAAc,EAAiB,CACvC,GACD,EAA6B,GAC5B,eACA,EACD,KAGU,CACX,EAAS,eAAe,kBAAmB,EAAsB,CACjE,EAAS,eAAe,aAAc,EAAiB,CACnD,GACD,EAA6B,eAC5B,eACA,EACD"}
1
+ {"version":3,"file":"eip1193-subscribe.cjs","names":[],"sources":["../../src/signer/eip1193-subscribe.ts"],"sourcesContent":["import {\n getAddress as checksumAddress,\n type Address,\n type EIP1193EventMap,\n type EIP1193Provider,\n} from \"viem\";\nimport type { SignerIdentity, SignerIdentityListener } from \"../types\";\n\ntype MinimalProvider = Pick<EIP1193Provider, \"on\" | \"removeListener\">;\n\nexport interface Eip1193SubscribeConfig {\n provider: MinimalProvider | undefined;\n getInitialIdentity?: () => SignerIdentity | undefined | Promise<SignerIdentity | undefined>;\n onIdentityChange: SignerIdentityListener;\n}\n\nfunction normalizeAddress(address: Address | undefined): Address | undefined {\n if (!address) {\n return undefined;\n }\n try {\n return checksumAddress(address);\n } catch {\n return undefined;\n }\n}\n\nfunction parseChainId(chainId: string): number | undefined {\n const parsed = Number(chainId);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;\n}\n\n/**\n * Subscribe to EIP-1193 wallet events and translate them into\n * {@link SignerIdentityChange} transitions.\n *\n * Shared by `ViemSigner` and `EthersSigner`. Listeners are attached before the\n * adapter's initial identity loader runs; if any real provider event arrives\n * first, the stale loader result is ignored.\n */\nexport function eip1193Subscribe({\n provider,\n getInitialIdentity,\n onIdentityChange,\n}: Eip1193SubscribeConfig): () => void {\n if (!provider) {\n return () => {};\n }\n\n let current: SignerIdentity | undefined;\n let observedAddress: Address | undefined;\n let observedChainId: number | undefined;\n let active = true;\n let eventVersion = 0;\n\n function markEvent(): void {\n eventVersion += 1;\n }\n\n function reconcile(): void {\n if (!active) {\n return;\n }\n const next =\n observedAddress && observedChainId !== undefined\n ? { address: observedAddress, chainId: observedChainId }\n : undefined;\n if (current?.address === next?.address && current?.chainId === next?.chainId) {\n return;\n }\n const previous = current;\n current = next;\n onIdentityChange({ previous, next });\n }\n\n const handleAccountsChanged: EIP1193EventMap[\"accountsChanged\"] = (accounts) => {\n markEvent();\n if (accounts.length === 0 || !accounts[0]) {\n observedAddress = undefined;\n observedChainId = undefined;\n reconcile();\n return;\n }\n\n const nextAddress = normalizeAddress(accounts[0]);\n if (!nextAddress) {\n return;\n }\n\n observedAddress = nextAddress;\n reconcile();\n };\n\n const handleDisconnect: EIP1193EventMap[\"disconnect\"] = () => {\n markEvent();\n observedAddress = undefined;\n observedChainId = undefined;\n reconcile();\n };\n\n const handleChainChanged: EIP1193EventMap[\"chainChanged\"] = (chainId) => {\n markEvent();\n const nextChainId = parseChainId(chainId);\n if (!nextChainId) {\n return;\n }\n\n observedChainId = nextChainId;\n reconcile();\n };\n\n provider.on(\"accountsChanged\", handleAccountsChanged);\n provider.on(\"disconnect\", handleDisconnect);\n provider.on(\"chainChanged\", handleChainChanged);\n\n if (getInitialIdentity) {\n const initialEventVersion = eventVersion;\n Promise.resolve()\n .then(getInitialIdentity)\n .then((identity) => {\n if (!active || eventVersion !== initialEventVersion) {\n return;\n }\n current = identity;\n observedAddress = identity?.address;\n observedChainId = identity?.chainId;\n })\n .catch((error) => {\n // oxlint-disable-next-line no-console\n console.warn(\"[zama-sdk] initial identity load failed:\", error);\n });\n }\n\n return () => {\n active = false;\n provider.removeListener(\"accountsChanged\", handleAccountsChanged);\n provider.removeListener(\"disconnect\", handleDisconnect);\n provider.removeListener(\"chainChanged\", handleChainChanged);\n };\n}\n"],"mappings":"sBAgBA,SAAS,EAAiB,EAAmD,CACtE,KAGL,GAAI,CACF,OAAA,EAAA,EAAA,YAAuB,EAAQ,MACzB,CACN,QAIJ,SAAS,EAAa,EAAqC,CACzD,IAAM,EAAS,OAAO,EAAQ,CAC9B,OAAO,OAAO,cAAc,EAAO,EAAI,EAAS,EAAI,EAAS,IAAA,GAW/D,SAAgB,EAAiB,CAC/B,WACA,qBACA,oBACqC,CACrC,GAAI,CAAC,EACH,UAAa,GAGf,IAAI,EACA,EACA,EACA,EAAS,GACT,EAAe,EAEnB,SAAS,GAAkB,CACzB,GAAgB,EAGlB,SAAS,GAAkB,CACzB,GAAI,CAAC,EACH,OAEF,IAAM,EACJ,GAAmB,IAAoB,IAAA,GACnC,CAAE,QAAS,EAAiB,QAAS,EAAiB,CACtD,IAAA,GACN,GAAI,GAAS,UAAY,GAAM,SAAW,GAAS,UAAY,GAAM,QACnE,OAEF,IAAM,EAAW,EACjB,EAAU,EACV,EAAiB,CAAE,WAAU,OAAM,CAAC,CAGtC,IAAM,EAA6D,GAAa,CAE9E,GADA,GAAW,CACP,EAAS,SAAW,GAAK,CAAC,EAAS,GAAI,CACzC,EAAkB,IAAA,GAClB,EAAkB,IAAA,GAClB,GAAW,CACX,OAGF,IAAM,EAAc,EAAiB,EAAS,GAAG,CAC5C,IAIL,EAAkB,EAClB,GAAW,GAGP,MAAwD,CAC5D,GAAW,CACX,EAAkB,IAAA,GAClB,EAAkB,IAAA,GAClB,GAAW,EAGP,EAAuD,GAAY,CACvE,GAAW,CACX,IAAM,EAAc,EAAa,EAAQ,CACpC,IAIL,EAAkB,EAClB,GAAW,GAOb,GAJA,EAAS,GAAG,kBAAmB,EAAsB,CACrD,EAAS,GAAG,aAAc,EAAiB,CAC3C,EAAS,GAAG,eAAgB,EAAmB,CAE3C,EAAoB,CACtB,IAAM,EAAsB,EAC5B,QAAQ,SAAS,CACd,KAAK,EAAmB,CACxB,KAAM,GAAa,CACd,CAAC,GAAU,IAAiB,IAGhC,EAAU,EACV,EAAkB,GAAU,QAC5B,EAAkB,GAAU,UAC5B,CACD,MAAO,GAAU,CAEhB,QAAQ,KAAK,2CAA4C,EAAM,EAC/D,CAGN,UAAa,CACX,EAAS,GACT,EAAS,eAAe,kBAAmB,EAAsB,CACjE,EAAS,eAAe,aAAc,EAAiB,CACvD,EAAS,eAAe,eAAgB,EAAmB"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./relayer.cjs`);var t=class extends e.r{constructor(t,n){super(e.i.EncryptionFailed,t,n),this.name=`EncryptionFailedError`}},n=class extends e.r{constructor(t,n){super(e.i.DecryptionFailed,t,n),this.name=`DecryptionFailedError`}};Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return n}});
2
+ //# sourceMappingURL=encryption.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.cjs","names":["ZamaError","ZamaErrorCode"],"sources":["../../src/errors/encryption.ts"],"sourcesContent":["import { ZamaError, ZamaErrorCode } from \"./base\";\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"],"mappings":"iCAGA,IAAa,EAAb,cAA2CA,EAAAA,CAAU,CACnD,YAAY,EAAiB,EAAwB,CACnD,MAAMC,EAAAA,EAAc,iBAAkB,EAAS,EAAQ,CACvD,KAAK,KAAO,0BAKH,EAAb,cAA2CD,EAAAA,CAAU,CACnD,YAAY,EAAiB,EAAwB,CACnD,MAAMC,EAAAA,EAAc,iBAAkB,EAAS,EAAQ,CACvD,KAAK,KAAO"}