@zama-fhe/sdk 3.0.0-alpha.2 → 3.0.0-alpha.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +207 -122
- package/dist/cjs/build.cjs +2 -0
- package/dist/cjs/build.cjs.map +1 -0
- package/dist/cjs/chains/index.cjs +1 -0
- package/dist/cjs/chains.cjs +2 -0
- package/dist/cjs/chains.cjs.map +1 -0
- package/dist/cjs/cleartext/index.cjs +1 -1
- package/dist/cjs/eip1193-subscribe.cjs +1 -1
- package/dist/cjs/eip1193-subscribe.cjs.map +1 -1
- package/dist/cjs/encryption.cjs +2 -0
- package/dist/cjs/encryption.cjs.map +1 -0
- package/dist/cjs/ethers/index.cjs +1 -1
- package/dist/cjs/ethers/index.cjs.map +1 -1
- package/dist/cjs/index.cjs +73 -73
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/query/index.cjs +1 -1
- package/dist/cjs/query/index.cjs.map +1 -1
- package/dist/cjs/readonly-token.cjs +1 -1
- package/dist/cjs/readonly-token.cjs.map +1 -1
- package/dist/cjs/relayer-cleartext.cjs +2 -0
- package/dist/cjs/relayer-cleartext.cjs.map +1 -0
- package/dist/cjs/relayer-sdk.worker.js +71 -71
- package/dist/cjs/relayer.cjs +1 -1
- package/dist/cjs/relayer.cjs.map +1 -1
- package/dist/cjs/viem/index.cjs +1 -1
- package/dist/cjs/viem/index.cjs.map +1 -1
- package/dist/cjs/wrappers-registry.cjs +1 -1
- package/dist/cjs/wrappers-registry.cjs.map +1 -1
- package/dist/esm/{assertions-BARApuMj.js → assertions-CfqI3AJv.js} +1 -1
- package/dist/esm/{assertions-BARApuMj.js.map → assertions-CfqI3AJv.js.map} +1 -1
- package/dist/esm/build-CvenCk6R.js +2 -0
- package/dist/esm/build-CvenCk6R.js.map +1 -0
- package/dist/esm/chains/index.d.ts +3 -0
- package/dist/esm/chains/index.js +1 -0
- package/dist/esm/chains-aHmrozPh.js +2 -0
- package/dist/esm/chains-aHmrozPh.js.map +1 -0
- package/dist/esm/cleartext/index.d.ts +2 -86
- package/dist/esm/cleartext/index.js +1 -1
- package/dist/esm/cleartext-BHu6-LCv.d.ts +19 -0
- package/dist/esm/cleartext-I-etE_7S.js +2 -0
- package/dist/esm/cleartext-I-etE_7S.js.map +1 -0
- package/dist/esm/eip1193-subscribe-CcotSOIm.js +2 -0
- package/dist/esm/eip1193-subscribe-CcotSOIm.js.map +1 -0
- package/dist/esm/{encryption-CmIPBcfP.js → encryption-YS-Kb7qm.js} +2 -2
- package/dist/esm/{encryption-CmIPBcfP.js.map → encryption-YS-Kb7qm.js.map} +1 -1
- package/dist/esm/ethers/index.d.ts +53 -8
- package/dist/esm/ethers/index.js +1 -1
- package/dist/esm/ethers/index.js.map +1 -1
- package/dist/esm/{hex-D_B-zoId.js → hex-BZVTzEK6.js} +2 -2
- package/dist/esm/{hex-D_B-zoId.js.map → hex-BZVTzEK6.js.map} +1 -1
- package/dist/esm/{relayer-utils-iSPis4x-.d.ts → index-BTY0MxOt.d.ts} +50 -23
- package/dist/esm/{onchain-events-2VNiL78c.d.ts → index-BdyljG1F.d.ts} +387 -1505
- package/dist/esm/index.d.ts +61 -93
- package/dist/esm/index.js +73 -73
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/memory-storage-CFXqXUcm.js +2 -0
- package/dist/esm/memory-storage-CFXqXUcm.js.map +1 -0
- package/dist/esm/node/index.d.ts +88 -110
- package/dist/esm/node/index.js +1 -1
- package/dist/esm/node/index.js.map +1 -1
- package/dist/esm/node/relayer-sdk.node-worker.js +1 -1
- package/dist/esm/node/relayer-sdk.node-worker.js.map +1 -1
- package/dist/esm/query/index.d.ts +40 -50
- package/dist/esm/query/index.js +1 -1
- package/dist/esm/query/index.js.map +1 -1
- package/dist/esm/readonly-token-DCLOYhws.js +2 -0
- package/dist/esm/readonly-token-DCLOYhws.js.map +1 -0
- package/dist/esm/{relayer-C6u3eOlN.js → relayer-7Hd00A6X.js} +2 -2
- package/dist/esm/relayer-7Hd00A6X.js.map +1 -0
- package/dist/esm/{relayer-sdk.types-CGfXwKcB.d.ts → relayer-cleartext-DJkSUlZ2.d.ts} +263 -106
- package/dist/esm/relayer-cleartext-SZCM9wTx.js +2 -0
- package/dist/esm/relayer-cleartext-SZCM9wTx.js.map +1 -0
- package/dist/esm/relayer-sdk.worker.js +71 -71
- package/dist/esm/types-C1S426x4.d.ts +48 -0
- package/dist/esm/types-CVyJHEya.d.ts +14 -0
- package/dist/esm/types-DePjTTbo.d.ts +30 -0
- package/dist/esm/types-FY7ciI37.d.ts +615 -0
- package/dist/esm/viem/index.d.ts +39 -11
- package/dist/esm/viem/index.js +1 -1
- package/dist/esm/viem/index.js.map +1 -1
- package/dist/esm/wrappers-registry-CXNs4eR0.js +2 -0
- package/dist/esm/wrappers-registry-CXNs4eR0.js.map +1 -0
- package/package.json +17 -3
- package/dist/cjs/cleartext.cjs +0 -2
- package/dist/cjs/cleartext.cjs.map +0 -1
- package/dist/esm/cleartext-Cs28cTsa.js +0 -2
- package/dist/esm/cleartext-Cs28cTsa.js.map +0 -1
- package/dist/esm/eip1193-subscribe-Cl_wlVuQ.js +0 -2
- package/dist/esm/eip1193-subscribe-Cl_wlVuQ.js.map +0 -1
- package/dist/esm/memory-storage-F8xjMzVy.js +0 -2
- package/dist/esm/memory-storage-F8xjMzVy.js.map +0 -1
- package/dist/esm/readonly-token-D4GjTj0q.js +0 -2
- package/dist/esm/readonly-token-D4GjTj0q.js.map +0 -1
- package/dist/esm/relayer-C6u3eOlN.js.map +0 -1
- package/dist/esm/relayer-sdk-DPqytEbO.d.ts +0 -44
- package/dist/esm/relayer-utils-BeoTNDM4.js +0 -2
- package/dist/esm/relayer-utils-BeoTNDM4.js.map +0 -1
- package/dist/esm/wrappers-registry-ydyySM9g.js +0 -2
- 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 {
|
|
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 {
|
|
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
|
|
43
|
-
| ------------------------- |
|
|
44
|
-
| `@zama-fhe/sdk` | Core SDK
|
|
45
|
-
| `@zama-fhe/sdk/
|
|
46
|
-
| `@zama-fhe/sdk/
|
|
47
|
-
| `@zama-fhe/sdk/
|
|
48
|
-
| `@zama-fhe/sdk/
|
|
49
|
-
| `@zama-fhe/sdk/
|
|
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 {
|
|
66
|
-
import {
|
|
67
|
-
import {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
###
|
|
109
|
+
### Browser (ethers)
|
|
107
110
|
|
|
108
111
|
```ts
|
|
109
|
-
import { ZamaSDK } from "@zama-fhe/sdk";
|
|
110
|
-
import {
|
|
111
|
-
import {
|
|
112
|
-
import {
|
|
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
|
|
130
|
+
const sdk = new ZamaSDK(config);
|
|
131
|
+
const token = sdk.createToken("0xEncryptedERC20Address");
|
|
132
|
+
const balance = await token.balanceOf();
|
|
133
|
+
```
|
|
115
134
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
###
|
|
173
|
+
### createConfig
|
|
142
174
|
|
|
143
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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(
|
|
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 {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
###
|
|
497
|
+
### Chain Objects
|
|
429
498
|
|
|
430
|
-
|
|
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
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
|
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
|
-
|
|
512
|
+
Use with `createConfig`:
|
|
439
513
|
|
|
440
514
|
```ts
|
|
441
|
-
import {
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
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
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
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
|
|
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.
|
|
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,
|
|
630
|
-
| `
|
|
631
|
-
| `
|
|
632
|
-
| `
|
|
633
|
-
| `
|
|
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
|
|
752
|
-
|
|
|
753
|
-
| `ZERO_HANDLE`
|
|
754
|
-
| `ERC7984_INTERFACE_ID`
|
|
755
|
-
| `ERC7984_WRAPPER_INTERFACE_ID`
|
|
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.
|
|
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
|
|
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/
|
|
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"}
|