@zama-fhe/sdk 3.0.0-alpha.19 → 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 (88) hide show
  1. package/README.md +153 -91
  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/encryption.cjs +2 -0
  9. package/dist/cjs/encryption.cjs.map +1 -0
  10. package/dist/cjs/ethers/index.cjs +1 -1
  11. package/dist/cjs/ethers/index.cjs.map +1 -1
  12. package/dist/cjs/index.cjs +73 -54
  13. package/dist/cjs/index.cjs.map +1 -1
  14. package/dist/cjs/query/index.cjs +1 -1
  15. package/dist/cjs/readonly-token.cjs +1 -1
  16. package/dist/cjs/readonly-token.cjs.map +1 -1
  17. package/dist/cjs/relayer-cleartext.cjs +2 -0
  18. package/dist/cjs/relayer-cleartext.cjs.map +1 -0
  19. package/dist/cjs/relayer-sdk.worker.js +71 -52
  20. package/dist/cjs/relayer.cjs +1 -1
  21. package/dist/cjs/relayer.cjs.map +1 -1
  22. package/dist/cjs/viem/index.cjs +1 -1
  23. package/dist/cjs/viem/index.cjs.map +1 -1
  24. package/dist/cjs/wrappers-registry.cjs +1 -1
  25. package/dist/cjs/wrappers-registry.cjs.map +1 -1
  26. package/dist/esm/{assertions-BARApuMj.js → assertions-CfqI3AJv.js} +1 -1
  27. package/dist/esm/{assertions-BARApuMj.js.map → assertions-CfqI3AJv.js.map} +1 -1
  28. package/dist/esm/build-CvenCk6R.js +2 -0
  29. package/dist/esm/build-CvenCk6R.js.map +1 -0
  30. package/dist/esm/chains/index.d.ts +3 -0
  31. package/dist/esm/chains/index.js +1 -0
  32. package/dist/esm/chains-aHmrozPh.js +2 -0
  33. package/dist/esm/chains-aHmrozPh.js.map +1 -0
  34. package/dist/esm/cleartext/index.d.ts +2 -80
  35. package/dist/esm/cleartext/index.js +1 -1
  36. package/dist/esm/cleartext-BHu6-LCv.d.ts +19 -0
  37. package/dist/esm/cleartext-I-etE_7S.js +2 -0
  38. package/dist/esm/cleartext-I-etE_7S.js.map +1 -0
  39. package/dist/esm/{eip1193-subscribe-D_wgOonV.js → eip1193-subscribe-CcotSOIm.js} +1 -1
  40. package/dist/esm/{eip1193-subscribe-D_wgOonV.js.map → eip1193-subscribe-CcotSOIm.js.map} +1 -1
  41. package/dist/esm/{encryption-DvWFOIwL.js → encryption-YS-Kb7qm.js} +2 -2
  42. package/dist/esm/{encryption-DvWFOIwL.js.map → encryption-YS-Kb7qm.js.map} +1 -1
  43. package/dist/esm/ethers/index.d.ts +9 -2
  44. package/dist/esm/ethers/index.js +1 -1
  45. package/dist/esm/ethers/index.js.map +1 -1
  46. package/dist/esm/{hex-D_B-zoId.js → hex-BZVTzEK6.js} +2 -2
  47. package/dist/esm/{hex-D_B-zoId.js.map → hex-BZVTzEK6.js.map} +1 -1
  48. package/dist/esm/{relayer-utils-iSPis4x-.d.ts → index-BTY0MxOt.d.ts} +50 -23
  49. package/dist/esm/{onchain-events-BS8d85Xb.d.ts → index-BdyljG1F.d.ts} +19 -446
  50. package/dist/esm/index.d.ts +61 -87
  51. package/dist/esm/index.js +73 -54
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/memory-storage-CFXqXUcm.js +2 -0
  54. package/dist/esm/memory-storage-CFXqXUcm.js.map +1 -0
  55. package/dist/esm/node/index.d.ts +88 -104
  56. package/dist/esm/node/index.js +1 -1
  57. package/dist/esm/node/index.js.map +1 -1
  58. package/dist/esm/node/relayer-sdk.node-worker.js +1 -1
  59. package/dist/esm/node/relayer-sdk.node-worker.js.map +1 -1
  60. package/dist/esm/query/index.d.ts +3 -3
  61. package/dist/esm/query/index.js +1 -1
  62. package/dist/esm/{readonly-token-B1VArgzt.js → readonly-token-DCLOYhws.js} +2 -2
  63. package/dist/esm/{readonly-token-B1VArgzt.js.map → readonly-token-DCLOYhws.js.map} +1 -1
  64. package/dist/esm/{relayer-8ObvIuu-.js → relayer-7Hd00A6X.js} +1 -1
  65. package/dist/esm/{relayer-8ObvIuu-.js.map → relayer-7Hd00A6X.js.map} +1 -1
  66. package/dist/esm/{relayer-sdk.types-CjoorKLx.d.ts → relayer-cleartext-DJkSUlZ2.d.ts} +189 -25
  67. package/dist/esm/relayer-cleartext-SZCM9wTx.js +2 -0
  68. package/dist/esm/relayer-cleartext-SZCM9wTx.js.map +1 -0
  69. package/dist/esm/relayer-sdk.worker.js +71 -52
  70. package/dist/esm/types-C1S426x4.d.ts +48 -0
  71. package/dist/esm/types-CVyJHEya.d.ts +14 -0
  72. package/dist/esm/types-DePjTTbo.d.ts +30 -0
  73. package/dist/esm/types-FY7ciI37.d.ts +615 -0
  74. package/dist/esm/viem/index.d.ts +9 -2
  75. package/dist/esm/viem/index.js +1 -1
  76. package/dist/esm/viem/index.js.map +1 -1
  77. package/dist/esm/{wrappers-registry-DuhA_F3e.js → wrappers-registry-CXNs4eR0.js} +1 -1
  78. package/dist/esm/{wrappers-registry-DuhA_F3e.js.map → wrappers-registry-CXNs4eR0.js.map} +1 -1
  79. package/package.json +16 -2
  80. package/dist/cjs/cleartext.cjs +0 -2
  81. package/dist/cjs/cleartext.cjs.map +0 -1
  82. package/dist/esm/cleartext-DYPrlSQh.js +0 -2
  83. package/dist/esm/cleartext-DYPrlSQh.js.map +0 -1
  84. package/dist/esm/memory-storage-GS1uT4ua.js +0 -2
  85. package/dist/esm/memory-storage-GS1uT4ua.js.map +0 -1
  86. package/dist/esm/relayer-sdk-CJSXb0YT.d.ts +0 -38
  87. package/dist/esm/relayer-utils-DDa_R8Ft.js +0 -2
  88. package/dist/esm/relayer-utils-DDa_R8Ft.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");
@@ -441,38 +494,47 @@ const sdk = new ZamaSDK({
441
494
  | `getChainId` | `() => Promise<number>` | Resolve the current chain ID. Called lazily; the pool is re-initialized on chain change. |
442
495
  | `transports` | `Record<number, FhevmInstanceConfig>` | Chain-specific configs keyed by chain ID (includes relayerUrl, network, auth, contract addresses). |
443
496
 
444
- ### Network Preset Configs
497
+ ### Chain Objects
498
+
499
+ Pre-configured chain objects from `@zama-fhe/sdk/chains`. Each includes contract addresses, relayer URLs, and an `id` alias for relayer config keys:
445
500
 
446
- 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:
501
+ ```ts
502
+ import { sepolia, mainnet, hoodi, hardhat } from "@zama-fhe/sdk/chains";
503
+ ```
447
504
 
448
- | Config | Chain ID | Description |
449
- | --------------- | -------- | ----------------------------------- |
450
- | `SepoliaConfig` | 11155111 | Sepolia testnet contract addresses. |
451
- | `MainnetConfig` | 1 | Mainnet contract addresses. |
452
- | `HardhatConfig` | 31337 | Local Hardhat node addresses. |
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 |
453
511
 
454
- 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`:
455
513
 
456
514
  ```ts
457
- import { SepoliaConfig, MainnetConfig } from "@zama-fhe/sdk";
458
-
459
- // Browser proxy through your backend
460
- const transports = {
461
- [SepoliaConfig.chainId]: {
462
- ...SepoliaConfig,
463
- relayerUrl: "https://your-app.com/api/relayer/11155111",
464
- network: "https://sepolia.infura.io/v3/KEY",
465
- },
466
- };
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";
467
519
 
468
- // Node.js auth is safe server-side
469
- const transports = {
470
- [SepoliaConfig.chainId]: {
471
- ...SepoliaConfig,
472
- network: "https://sepolia.infura.io/v3/KEY",
473
- 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(),
474
528
  },
475
- };
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";
476
538
  ```
477
539
 
478
540
  ## GenericSigner Interface
@@ -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;
@@ -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"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../wrappers-registry.cjs`),t=require(`../eip1193-subscribe.cjs`);let n=require(`viem`),r=require(`ethers`);var i=class{#e;#t;constructor(e){`ethereum`in e?(this.#e=new r.BrowserProvider(e.ethereum).getSigner(),this.#t=e.ethereum):this.#e=Promise.resolve(e.signer)}async getChainId(){let e=(await this.#e).provider;if(!e)throw TypeError(`Signer has no provider — cannot read chain ID`);let t=await e.getNetwork();return Number(t.chainId)}async getAddress(){return(0,n.getAddress)(await(await this.#e).getAddress())}async signTypedData(e){let t=await this.#e,{domain:r,types:i,message:a}=e,{EIP712Domain:o,...s}=i,c=Object.fromEntries(Object.entries(s).map(([e,t])=>[e,[...t]])),l=await t.signTypedData(r,c,a);if(!(0,n.isHex)(l))throw TypeError(`Expected hex string, got: ${l}`);return l}async writeContract(e){let t=await this.#e,i=new r.ethers.Contract(e.address,e.abi,t),a={};e.value!==void 0&&(a.value=e.value),e.gas!==void 0&&(a.gasLimit=e.gas);let o=await i[e.functionName](...e.args,a);if(!(0,n.isHex)(o.hash))throw TypeError(`Expected hex string, got: ${o.hash}`);return o.hash}subscribe(e){return t.t({provider:this.#t,getInitialIdentity:async()=>{let e=await this.#e,t=e.provider;if(!t)return;let[r,i]=await Promise.all([e.getAddress(),t.getNetwork()]),a=Number(i.chainId);return{address:(0,n.getAddress)(r),chainId:a}},onIdentityChange:e})}},a=class{#e;constructor(e){`ethereum`in e?this.#e=new r.BrowserProvider(e.ethereum):this.#e=e.provider}async getChainId(){let e=await this.#e.getNetwork();return Number(e.chainId)}async readContract(e){return new r.ethers.Contract(e.address,e.abi,this.#e).getFunction(e.functionName)(...e.args)}async getBlockTimestamp(){let e=await this.#e.getBlock(`latest`);if(!e)throw Error(`Failed to fetch latest block`);if(e.timestamp===null)throw Error(`Latest block has no timestamp`);return BigInt(e.timestamp)}async waitForTransactionReceipt(e){let t=await this.#e.waitForTransaction(e);if(!t)throw Error(`Transaction receipt not found`);return{logs:t.logs.map(e=>({topics:e.topics.filter(e=>e!==null),data:e.data}))}}};function o(e){return{to:e.address,data:(0,n.encodeFunctionData)({abi:e.abi,functionName:e.functionName,args:e.args}),...e.gas===void 0?{}:{gasLimit:e.gas},...e.value===void 0?{}:{value:e.value}}}async function s(e,t){let r=await e.call(o(t));if(!(0,n.isHex)(r))throw TypeError(`Expected hex string, got: ${r}`);return(0,n.decodeFunctionResult)({abi:t.abi,functionName:t.functionName,data:r})}async function c(e,t){let r=await e.sendTransaction(o(t));if(!(0,n.isHex)(r.hash))throw TypeError(`Expected hex string, got: ${r.hash}`);return r.hash}function l(t,n,r){return s(t,e.v(n,r))}function u(t,n){return s(t,e.g(n))}function d(t,n,r){return s(t,e.p(n,r))}function f(t,n,r,i,a){return c(t,e.b(n,r,i,a))}function p(t,n,r,i,a,o){return c(t,e.E(n,r,i,a,o))}function m(t,n,r,i,a){return c(t,e.D(n,r,i,a))}function h(t,n,r,i,a){return c(t,e.m(n,r,i,a))}function g(t,n,r,i){return c(t,e.w(n,r,i))}function _(t,n,r,i){return c(t,e._(n,r,i))}function v(t,n){return s(t,e.i(n))}function y(t,n){return s(t,e.a(n))}function b(t,n,r,i){return s(t,e.o(n,r,i))}function x(t,n,r){return s(t,e.r(n,r))}function S(t,n,r){return s(t,e.t(n,r))}function C(t,n,r){return s(t,e.n(n,r))}function w(t,n,r){return s(t,e.s(n,r))}exports.EthersProvider=a,exports.EthersSigner=i,Object.defineProperty(exports,`ProviderRpcError`,{enumerable:!0,get:function(){return n.ProviderRpcError}}),exports.readConfidentialBalanceOfContract=l,exports.readConfidentialTokenAddressContract=S,exports.readIsConfidentialTokenValidContract=w,exports.readSupportsInterfaceContract=d,exports.readTokenAddressContract=C,exports.readTokenPairContract=x,exports.readTokenPairsContract=v,exports.readTokenPairsLengthContract=y,exports.readTokenPairsSliceContract=b,exports.readUnderlyingTokenContract=u,exports.writeConfidentialTransferContract=f,exports.writeFinalizeUnwrapContract=h,exports.writeSetOperatorContract=g,exports.writeUnwrapContract=p,exports.writeUnwrapFromBalanceContract=m,exports.writeWrapContract=_;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../build.cjs`),t=require(`../wrappers-registry.cjs`),n=require(`../eip1193-subscribe.cjs`);let r=require(`viem`),i=require(`ethers`);var a=class{#e;constructor(e){`ethereum`in e?this.#e=new i.BrowserProvider(e.ethereum):this.#e=e.provider}async getChainId(){let e=await this.#e.getNetwork();return Number(e.chainId)}async readContract(e){return new i.ethers.Contract(e.address,e.abi,this.#e).getFunction(e.functionName)(...e.args)}async getBlockTimestamp(){let e=await this.#e.getBlock(`latest`);if(!e)throw Error(`Failed to fetch latest block`);if(e.timestamp===null)throw Error(`Latest block has no timestamp`);return BigInt(e.timestamp)}async waitForTransactionReceipt(e){let t=await this.#e.waitForTransaction(e);if(!t)throw Error(`Transaction receipt not found`);return{logs:t.logs.map(e=>({topics:e.topics.filter(e=>e!==null),data:e.data}))}}},o=class{#e;#t;constructor(e){`ethereum`in e?(this.#e=new i.BrowserProvider(e.ethereum).getSigner(),this.#t=e.ethereum):this.#e=Promise.resolve(e.signer)}async getChainId(){let e=(await this.#e).provider;if(!e)throw TypeError(`Signer has no provider — cannot read chain ID`);let t=await e.getNetwork();return Number(t.chainId)}async getAddress(){return(0,r.getAddress)(await(await this.#e).getAddress())}async signTypedData(e){let t=await this.#e,{domain:n,types:i,message:a}=e,{EIP712Domain:o,...s}=i,c=Object.fromEntries(Object.entries(s).map(([e,t])=>[e,[...t]])),l=await t.signTypedData(n,c,a);if(!(0,r.isHex)(l))throw TypeError(`Expected hex string, got: ${l}`);return l}async writeContract(e){let t=await this.#e,n=new i.ethers.Contract(e.address,e.abi,t),a={};e.value!==void 0&&(a.value=e.value),e.gas!==void 0&&(a.gasLimit=e.gas);let o=await n[e.functionName](...e.args,a);if(!(0,r.isHex)(o.hash))throw TypeError(`Expected hex string, got: ${o.hash}`);return o.hash}subscribe(e){return n.t({provider:this.#t,getInitialIdentity:async()=>{let e=await this.#e,t=e.provider;if(!t)return;let[n,i]=await Promise.all([e.getAddress(),t.getNetwork()]),a=Number(i.chainId);return{address:(0,r.getAddress)(n),chainId:a}},onIdentityChange:e})}};function s(t){if(`signer`in t&&t.signer){let n=new o({signer:t.signer});if(!t.signer.provider)throw Error(`createConfig requires a Signer with an attached provider for chain reads`);return e.t(n,new a({provider:t.signer.provider}),t)}return e.t(new o({ethereum:t.ethereum}),`provider`in t&&t.provider?new a({provider:t.provider}):new a({ethereum:t.ethereum}),t)}function c(e){return{to:e.address,data:(0,r.encodeFunctionData)({abi:e.abi,functionName:e.functionName,args:e.args}),...e.gas===void 0?{}:{gasLimit:e.gas},...e.value===void 0?{}:{value:e.value}}}async function l(e,t){let n=await e.call(c(t));if(!(0,r.isHex)(n))throw TypeError(`Expected hex string, got: ${n}`);return(0,r.decodeFunctionResult)({abi:t.abi,functionName:t.functionName,data:n})}async function u(e,t){let n=await e.sendTransaction(c(t));if(!(0,r.isHex)(n.hash))throw TypeError(`Expected hex string, got: ${n.hash}`);return n.hash}function d(e,n,r){return l(e,t.v(n,r))}function f(e,n){return l(e,t.g(n))}function p(e,n,r){return l(e,t.p(n,r))}function m(e,n,r,i,a){return u(e,t.b(n,r,i,a))}function h(e,n,r,i,a,o){return u(e,t.E(n,r,i,a,o))}function g(e,n,r,i,a){return u(e,t.D(n,r,i,a))}function _(e,n,r,i,a){return u(e,t.m(n,r,i,a))}function v(e,n,r,i){return u(e,t.w(n,r,i))}function y(e,n,r,i){return u(e,t._(n,r,i))}function b(e,n){return l(e,t.i(n))}function x(e,n){return l(e,t.a(n))}function S(e,n,r,i){return l(e,t.o(n,r,i))}function C(e,n,r){return l(e,t.r(n,r))}function w(e,n,r){return l(e,t.t(n,r))}function T(e,n,r){return l(e,t.n(n,r))}function E(e,n,r){return l(e,t.s(n,r))}exports.EthersProvider=a,exports.EthersSigner=o,Object.defineProperty(exports,`ProviderRpcError`,{enumerable:!0,get:function(){return r.ProviderRpcError}}),exports.createConfig=s,exports.readConfidentialBalanceOfContract=d,exports.readConfidentialTokenAddressContract=w,exports.readIsConfidentialTokenValidContract=E,exports.readSupportsInterfaceContract=p,exports.readTokenAddressContract=T,exports.readTokenPairContract=C,exports.readTokenPairsContract=b,exports.readTokenPairsLengthContract=x,exports.readTokenPairsSliceContract=S,exports.readUnderlyingTokenContract=f,exports.writeConfidentialTransferContract=m,exports.writeFinalizeUnwrapContract=_,exports.writeSetOperatorContract=v,exports.writeUnwrapContract=h,exports.writeUnwrapFromBalanceContract=g,exports.writeWrapContract=y;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["#signerPromise","#eip1193","BrowserProvider","eip1193Subscribe","#readProvider","BrowserProvider","confidentialBalanceOfContract","underlyingContract","supportsInterfaceContract","confidentialTransferContract","unwrapContract","unwrapFromBalanceContract","finalizeUnwrapContract","setOperatorContract","wrapContract","getTokenPairsContract","getTokenPairsLengthContract","getTokenPairsSliceContract","getTokenPairContract","getConfidentialTokenAddressContract","getTokenAddressContract","isConfidentialTokenValidContract"],"sources":["../../../src/ethers/ethers-signer.ts","../../../src/ethers/ethers-provider.ts","../../../src/ethers/contracts.ts"],"sourcesContent":["import { ethers, BrowserProvider, type Signer } from \"ethers\";\nimport {\n getAddress,\n isHex,\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type EIP1193Provider,\n type Hex,\n} from \"viem\";\nimport type { EIP712TypedData } from \"../relayer/relayer-sdk.types\";\nimport type { GenericSigner, SignerIdentityListener, WriteContractConfig } from \"../types\";\nimport { eip1193Subscribe } from \"../signer/eip1193-subscribe\";\n\n/**\n * Configuration for {@link EthersSigner}.\n *\n * Two variants:\n *\n * - **Browser** — `{ ethereum }`: pass the raw EIP-1193 provider (e.g. `window.ethereum`).\n * A `BrowserProvider` is created internally and `subscribe()` works automatically.\n *\n * - **Node / direct signer** — `{ signer }`: pass an ethers `Signer` (e.g. `Wallet`).\n * `subscribe()` is not available since there is no EIP-1193 provider.\n *\n * For public chain reads, construct a separate {@link EthersProvider}.\n */\nexport type EthersSignerConfig = { ethereum: EIP1193Provider } | { signer: Signer };\n\n/**\n * GenericSigner backed by ethers.\n *\n * Accepts either a raw EIP-1193 provider (`{ ethereum }`) which creates a\n * `BrowserProvider` internally, or a `Signer` directly (`{ signer }`)\n * for Node.js scripts.\n *\n * @param config - {@link EthersSignerConfig}\n */\nexport class EthersSigner implements GenericSigner {\n readonly #signerPromise: Promise<Signer>;\n readonly #eip1193?: EIP1193Provider;\n\n constructor(config: EthersSignerConfig) {\n if (\"ethereum\" in config) {\n const browserProvider = new BrowserProvider(config.ethereum);\n this.#signerPromise = browserProvider.getSigner();\n this.#eip1193 = config.ethereum;\n } else {\n this.#signerPromise = Promise.resolve(config.signer);\n }\n }\n\n async getChainId(): Promise<number> {\n const signer = await this.#signerPromise;\n const provider = signer.provider;\n if (!provider) {\n throw new TypeError(\"Signer has no provider — cannot read chain ID\");\n }\n const network = await provider.getNetwork();\n return Number(network.chainId);\n }\n\n async getAddress(): Promise<Address> {\n const signer = await this.#signerPromise;\n return getAddress(await signer.getAddress());\n }\n\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.#signerPromise;\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const mutableSigTypes = Object.fromEntries(\n Object.entries(sigTypes).map(([key, fields]) => [key, [...fields]]),\n );\n const sig = await signer.signTypedData(domain, mutableSigTypes, message);\n if (!isHex(sig)) {\n throw new TypeError(`Expected hex string, got: ${sig}`);\n }\n return sig;\n }\n\n async writeContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n const TArgs extends ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\", TFunctionName>,\n >(config: WriteContractConfig<TAbi, TFunctionName, TArgs>): Promise<Hex> {\n const signer = await this.#signerPromise;\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, signer);\n const overrides: { gasLimit?: bigint; value?: bigint } = {};\n if (config.value !== undefined) {\n overrides.value = config.value;\n }\n if (config.gas !== undefined) {\n overrides.gasLimit = config.gas;\n }\n const tx = await contract[config.functionName]!(\n ...(config.args as readonly unknown[]),\n overrides,\n );\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n }\n\n subscribe(onIdentityChange: SignerIdentityListener): () => void {\n return eip1193Subscribe({\n provider: this.#eip1193,\n getInitialIdentity: async () => {\n const signer = await this.#signerPromise;\n const provider = signer.provider;\n if (!provider) {\n return undefined;\n }\n const [address, network] = await Promise.all([signer.getAddress(), provider.getNetwork()]);\n const chainId = Number(network.chainId);\n return { address: getAddress(address), chainId };\n },\n onIdentityChange,\n });\n }\n}\n","import { ethers, BrowserProvider } from \"ethers\";\nimport type {\n Abi,\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionReturnType,\n EIP1193Provider,\n Hex,\n} from \"viem\";\nimport type { GenericProvider, ReadContractConfig, TransactionReceipt } from \"../types\";\n\n/**\n * Configuration for {@link EthersProvider}.\n *\n * Two variants:\n *\n * - **EIP-1193** — `{ ethereum }`: pass the raw EIP-1193 provider (e.g. `window.ethereum`).\n * A `BrowserProvider` is created internally.\n *\n * - **Pre-built** — `{ provider }`: pass any ethers `Provider`\n * (e.g. `JsonRpcProvider`, `WebSocketProvider`).\n */\nexport type EthersProviderConfig = { ethereum: EIP1193Provider } | { provider: ethers.Provider };\n\n/**\n * Read-only {@link GenericProvider} backed by ethers v6.\n *\n * Use this for integrations that only need public chain reads — server\n * indexers, SSR, dashboards, explorers, or dApps before the user has\n * connected their wallet.\n *\n * @example\n * ```ts\n * // Dedicated RPC\n * const provider = new EthersProvider({\n * provider: new ethers.JsonRpcProvider(ALCHEMY_URL),\n * });\n *\n * // Wallet-sourced RPC (shares transport with EthersSigner)\n * const provider = new EthersProvider({ ethereum: window.ethereum });\n * ```\n */\nexport class EthersProvider implements GenericProvider {\n readonly #readProvider: ethers.Provider;\n\n constructor(config: EthersProviderConfig) {\n if (\"ethereum\" in config) {\n this.#readProvider = new BrowserProvider(config.ethereum);\n } else {\n this.#readProvider = config.provider;\n }\n }\n\n async getChainId(): Promise<number> {\n const network = await this.#readProvider.getNetwork();\n return Number(network.chainId);\n }\n\n async readContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n const TArgs extends ContractFunctionArgs<TAbi, \"pure\" | \"view\", TFunctionName>,\n >(\n config: ReadContractConfig<TAbi, TFunctionName, TArgs>,\n ): Promise<ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName, TArgs>> {\n const contract = new ethers.Contract(\n config.address,\n config.abi as ethers.InterfaceAbi,\n this.#readProvider,\n );\n const fn = contract.getFunction(config.functionName);\n return fn(...(config.args as readonly unknown[])) as Promise<\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName, TArgs>\n >;\n }\n\n async getBlockTimestamp(): Promise<bigint> {\n const block = await this.#readProvider.getBlock(\"latest\");\n if (!block) {\n throw new Error(\"Failed to fetch latest block\");\n }\n if (block.timestamp === null) {\n throw new Error(\"Latest block has no timestamp\");\n }\n return BigInt(block.timestamp);\n }\n\n async waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt> {\n const receipt = await this.#readProvider.waitForTransaction(hash);\n if (!receipt) {\n throw new Error(\"Transaction receipt not found\");\n }\n return {\n logs: receipt.logs.map((log) => ({\n topics: log.topics.filter((t): t is Hex => t !== null),\n data: log.data as Hex,\n })),\n };\n }\n}\n","import {\n decodeFunctionResult,\n encodeFunctionData,\n isHex,\n type Abi,\n type Address,\n type Hex,\n} from \"viem\";\n\nimport type { Handle } from \"../relayer/relayer-sdk.types\";\n\nimport {\n confidentialBalanceOfContract,\n confidentialTransferContract,\n finalizeUnwrapContract,\n setOperatorContract,\n supportsInterfaceContract,\n underlyingContract,\n unwrapContract,\n unwrapFromBalanceContract,\n wrapContract,\n getTokenPairsContract,\n getTokenPairsLengthContract,\n getTokenPairsSliceContract,\n getTokenPairContract,\n getConfidentialTokenAddressContract,\n getTokenAddressContract,\n isConfidentialTokenValidContract,\n} from \"../contracts\";\n\ninterface TransactionRequestConfig {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n gas?: bigint;\n value?: bigint;\n}\n\ninterface EthersTransactionRequest {\n to: Address;\n data: Hex;\n gasLimit?: bigint;\n value?: bigint;\n}\n\ninterface EthersTransactionResponse {\n hash: string;\n}\n\ninterface EthersCallProvider {\n call(tx: EthersTransactionRequest): Promise<string>;\n}\n\ninterface EthersTransactionSigner extends EthersCallProvider {\n sendTransaction(tx: EthersTransactionRequest): Promise<EthersTransactionResponse>;\n}\n\nfunction toTransactionRequest(config: TransactionRequestConfig): EthersTransactionRequest {\n return {\n to: config.address,\n data: encodeFunctionData({\n abi: config.abi as Abi,\n functionName: config.functionName as never,\n args: config.args as never,\n }),\n ...(config.gas !== undefined ? { gasLimit: config.gas } : {}),\n ...(config.value !== undefined ? { value: config.value } : {}),\n };\n}\n\nasync function ethersRead<T>(\n provider: EthersCallProvider,\n config: TransactionRequestConfig,\n): Promise<T> {\n const data = await provider.call(toTransactionRequest(config));\n if (!isHex(data)) {\n throw new TypeError(`Expected hex string, got: ${data}`);\n }\n return decodeFunctionResult({\n abi: config.abi as Abi,\n functionName: config.functionName as never,\n data,\n }) as T;\n}\n\nasync function ethersWrite(\n signer: EthersTransactionSigner,\n config: TransactionRequestConfig,\n): Promise<Hex> {\n const tx = await signer.sendTransaction(toTransactionRequest(config));\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n}\n\n// ── Read helpers ────────────────────────────────────────────\n\nexport function readConfidentialBalanceOfContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\nexport function readUnderlyingTokenContract(provider: EthersCallProvider, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\nexport function readSupportsInterfaceContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n interfaceId: Address,\n) {\n return ethersRead(provider, supportsInterfaceContract(tokenAddress, interfaceId));\n}\n\n// ── Write helpers ───────────────────────────────────────────\n\nexport function writeConfidentialTransferContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n to: Address,\n handle: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, confidentialTransferContract(tokenAddress, to, handle, inputProof));\n}\n\nexport function writeUnwrapContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\nexport function writeUnwrapFromBalanceContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: Handle,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\nexport function writeFinalizeUnwrapContract(\n signer: EthersTransactionSigner,\n wrapper: Address,\n unwrapRequestId: Handle,\n burntAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, unwrapRequestId, burntAmountCleartext, decryptionProof),\n );\n}\n\nexport function writeSetOperatorContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n spender: Address,\n timestamp?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, spender, timestamp));\n}\n\nexport function writeWrapContract(\n signer: EthersTransactionSigner,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n) {\n return ethersWrite(signer, wrapContract(wrapperAddress, to, amount));\n}\n\n// ── Registry read helpers ──────────────────────────────────\n\nexport function readTokenPairsContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsContract(registry));\n}\n\nexport function readTokenPairsLengthContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsLengthContract(registry));\n}\n\nexport function readTokenPairsSliceContract(\n provider: EthersCallProvider,\n registry: Address,\n fromIndex: bigint,\n toIndex: bigint,\n) {\n return ethersRead(provider, getTokenPairsSliceContract(registry, fromIndex, toIndex));\n}\n\nexport function readTokenPairContract(\n provider: EthersCallProvider,\n registry: Address,\n index: bigint,\n) {\n return ethersRead(provider, getTokenPairContract(registry, index));\n}\n\nexport function readConfidentialTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\nexport function readTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\nexport function readIsConfidentialTokenValidContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, isConfidentialTokenValidContract(registry, confidentialTokenAddress));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["#readProvider","BrowserProvider","#signerPromise","#eip1193","BrowserProvider","eip1193Subscribe","buildZamaConfig","confidentialBalanceOfContract","underlyingContract","supportsInterfaceContract","confidentialTransferContract","unwrapContract","unwrapFromBalanceContract","finalizeUnwrapContract","setOperatorContract","wrapContract","getTokenPairsContract","getTokenPairsLengthContract","getTokenPairsSliceContract","getTokenPairContract","getConfidentialTokenAddressContract","getTokenAddressContract","isConfidentialTokenValidContract"],"sources":["../../../src/ethers/ethers-provider.ts","../../../src/ethers/ethers-signer.ts","../../../src/ethers/config.ts","../../../src/ethers/contracts.ts"],"sourcesContent":["import { ethers, BrowserProvider } from \"ethers\";\nimport type {\n Abi,\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionReturnType,\n EIP1193Provider,\n Hex,\n} from \"viem\";\nimport type { GenericProvider, ReadContractConfig, TransactionReceipt } from \"../types\";\n\n/**\n * Configuration for {@link EthersProvider}.\n *\n * Two variants:\n *\n * - **EIP-1193** — `{ ethereum }`: pass the raw EIP-1193 provider (e.g. `window.ethereum`).\n * A `BrowserProvider` is created internally.\n *\n * - **Pre-built** — `{ provider }`: pass any ethers `Provider`\n * (e.g. `JsonRpcProvider`, `WebSocketProvider`).\n */\nexport type EthersProviderConfig = { ethereum: EIP1193Provider } | { provider: ethers.Provider };\n\n/**\n * Read-only {@link GenericProvider} backed by ethers v6.\n *\n * Use this for integrations that only need public chain reads — server\n * indexers, SSR, dashboards, explorers, or dApps before the user has\n * connected their wallet.\n *\n * @example\n * ```ts\n * // Dedicated RPC\n * const provider = new EthersProvider({\n * provider: new ethers.JsonRpcProvider(ALCHEMY_URL),\n * });\n *\n * // Wallet-sourced RPC (shares transport with EthersSigner)\n * const provider = new EthersProvider({ ethereum: window.ethereum });\n * ```\n */\nexport class EthersProvider implements GenericProvider {\n readonly #readProvider: ethers.Provider;\n\n constructor(config: EthersProviderConfig) {\n if (\"ethereum\" in config) {\n this.#readProvider = new BrowserProvider(config.ethereum);\n } else {\n this.#readProvider = config.provider;\n }\n }\n\n async getChainId(): Promise<number> {\n const network = await this.#readProvider.getNetwork();\n return Number(network.chainId);\n }\n\n async readContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n const TArgs extends ContractFunctionArgs<TAbi, \"pure\" | \"view\", TFunctionName>,\n >(\n config: ReadContractConfig<TAbi, TFunctionName, TArgs>,\n ): Promise<ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName, TArgs>> {\n const contract = new ethers.Contract(\n config.address,\n config.abi as ethers.InterfaceAbi,\n this.#readProvider,\n );\n const fn = contract.getFunction(config.functionName);\n return fn(...(config.args as readonly unknown[])) as Promise<\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName, TArgs>\n >;\n }\n\n async getBlockTimestamp(): Promise<bigint> {\n const block = await this.#readProvider.getBlock(\"latest\");\n if (!block) {\n throw new Error(\"Failed to fetch latest block\");\n }\n if (block.timestamp === null) {\n throw new Error(\"Latest block has no timestamp\");\n }\n return BigInt(block.timestamp);\n }\n\n async waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt> {\n const receipt = await this.#readProvider.waitForTransaction(hash);\n if (!receipt) {\n throw new Error(\"Transaction receipt not found\");\n }\n return {\n logs: receipt.logs.map((log) => ({\n topics: log.topics.filter((t): t is Hex => t !== null),\n data: log.data as Hex,\n })),\n };\n }\n}\n","import { ethers, BrowserProvider, type Signer } from \"ethers\";\nimport {\n getAddress,\n isHex,\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type EIP1193Provider,\n type Hex,\n} from \"viem\";\nimport type { EIP712TypedData } from \"../relayer/relayer-sdk.types\";\nimport type { GenericSigner, SignerIdentityListener, WriteContractConfig } from \"../types\";\nimport { eip1193Subscribe } from \"../signer/eip1193-subscribe\";\n\n/**\n * Configuration for {@link EthersSigner}.\n *\n * Two variants:\n *\n * - **Browser** — `{ ethereum }`: pass the raw EIP-1193 provider (e.g. `window.ethereum`).\n * A `BrowserProvider` is created internally and `subscribe()` works automatically.\n *\n * - **Node / direct signer** — `{ signer }`: pass an ethers `Signer` (e.g. `Wallet`).\n * `subscribe()` is not available since there is no EIP-1193 provider.\n *\n * For public chain reads, construct a separate {@link EthersProvider}.\n */\nexport type EthersSignerConfig = { ethereum: EIP1193Provider } | { signer: Signer };\n\n/**\n * GenericSigner backed by ethers.\n *\n * Accepts either a raw EIP-1193 provider (`{ ethereum }`) which creates a\n * `BrowserProvider` internally, or a `Signer` directly (`{ signer }`)\n * for Node.js scripts.\n *\n * @param config - {@link EthersSignerConfig}\n */\nexport class EthersSigner implements GenericSigner {\n readonly #signerPromise: Promise<Signer>;\n readonly #eip1193?: EIP1193Provider;\n\n constructor(config: EthersSignerConfig) {\n if (\"ethereum\" in config) {\n const browserProvider = new BrowserProvider(config.ethereum);\n this.#signerPromise = browserProvider.getSigner();\n this.#eip1193 = config.ethereum;\n } else {\n this.#signerPromise = Promise.resolve(config.signer);\n }\n }\n\n async getChainId(): Promise<number> {\n const signer = await this.#signerPromise;\n const provider = signer.provider;\n if (!provider) {\n throw new TypeError(\"Signer has no provider — cannot read chain ID\");\n }\n const network = await provider.getNetwork();\n return Number(network.chainId);\n }\n\n async getAddress(): Promise<Address> {\n const signer = await this.#signerPromise;\n return getAddress(await signer.getAddress());\n }\n\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.#signerPromise;\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const mutableSigTypes = Object.fromEntries(\n Object.entries(sigTypes).map(([key, fields]) => [key, [...fields]]),\n );\n const sig = await signer.signTypedData(domain, mutableSigTypes, message);\n if (!isHex(sig)) {\n throw new TypeError(`Expected hex string, got: ${sig}`);\n }\n return sig;\n }\n\n async writeContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n const TArgs extends ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\", TFunctionName>,\n >(config: WriteContractConfig<TAbi, TFunctionName, TArgs>): Promise<Hex> {\n const signer = await this.#signerPromise;\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, signer);\n const overrides: { gasLimit?: bigint; value?: bigint } = {};\n if (config.value !== undefined) {\n overrides.value = config.value;\n }\n if (config.gas !== undefined) {\n overrides.gasLimit = config.gas;\n }\n const tx = await contract[config.functionName]!(\n ...(config.args as readonly unknown[]),\n overrides,\n );\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n }\n\n subscribe(onIdentityChange: SignerIdentityListener): () => void {\n return eip1193Subscribe({\n provider: this.#eip1193,\n getInitialIdentity: async () => {\n const signer = await this.#signerPromise;\n const provider = signer.provider;\n if (!provider) {\n return undefined;\n }\n const [address, network] = await Promise.all([signer.getAddress(), provider.getNetwork()]);\n const chainId = Number(network.chainId);\n return { address: getAddress(address), chainId };\n },\n onIdentityChange,\n });\n }\n}\n","import type { FheChain } from \"../chains\";\nimport { buildZamaConfig } from \"../config/build\";\nimport type { ZamaConfig } from \"../config/types\";\nimport { EthersProvider } from \"./ethers-provider\";\nimport { EthersSigner } from \"./ethers-signer\";\nimport type { ZamaConfigEthers } from \"./types\";\n\n/** Create a {@link ZamaConfig} from ethers types. */\nexport function createConfig<const TChains extends readonly [FheChain, ...FheChain[]]>(\n params: ZamaConfigEthers<TChains>,\n): ZamaConfig {\n if (\"signer\" in params && params.signer) {\n const signer = new EthersSigner({ signer: params.signer });\n if (!params.signer.provider) {\n throw new Error(\"createConfig requires a Signer with an attached provider for chain reads\");\n }\n const provider = new EthersProvider({ provider: params.signer.provider });\n return buildZamaConfig(signer, provider, params);\n }\n\n const signer = new EthersSigner({ ethereum: params.ethereum });\n const provider =\n \"provider\" in params && params.provider\n ? new EthersProvider({ provider: params.provider })\n : new EthersProvider({ ethereum: params.ethereum });\n return buildZamaConfig(signer, provider, params);\n}\n","import {\n decodeFunctionResult,\n encodeFunctionData,\n isHex,\n type Abi,\n type Address,\n type Hex,\n} from \"viem\";\n\nimport type { Handle } from \"../relayer/relayer-sdk.types\";\n\nimport {\n confidentialBalanceOfContract,\n confidentialTransferContract,\n finalizeUnwrapContract,\n setOperatorContract,\n supportsInterfaceContract,\n underlyingContract,\n unwrapContract,\n unwrapFromBalanceContract,\n wrapContract,\n getTokenPairsContract,\n getTokenPairsLengthContract,\n getTokenPairsSliceContract,\n getTokenPairContract,\n getConfidentialTokenAddressContract,\n getTokenAddressContract,\n isConfidentialTokenValidContract,\n} from \"../contracts\";\n\ninterface TransactionRequestConfig {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n gas?: bigint;\n value?: bigint;\n}\n\ninterface EthersTransactionRequest {\n to: Address;\n data: Hex;\n gasLimit?: bigint;\n value?: bigint;\n}\n\ninterface EthersTransactionResponse {\n hash: string;\n}\n\ninterface EthersCallProvider {\n call(tx: EthersTransactionRequest): Promise<string>;\n}\n\ninterface EthersTransactionSigner extends EthersCallProvider {\n sendTransaction(tx: EthersTransactionRequest): Promise<EthersTransactionResponse>;\n}\n\nfunction toTransactionRequest(config: TransactionRequestConfig): EthersTransactionRequest {\n return {\n to: config.address,\n data: encodeFunctionData({\n abi: config.abi as Abi,\n functionName: config.functionName as never,\n args: config.args as never,\n }),\n ...(config.gas !== undefined ? { gasLimit: config.gas } : {}),\n ...(config.value !== undefined ? { value: config.value } : {}),\n };\n}\n\nasync function ethersRead<T>(\n provider: EthersCallProvider,\n config: TransactionRequestConfig,\n): Promise<T> {\n const data = await provider.call(toTransactionRequest(config));\n if (!isHex(data)) {\n throw new TypeError(`Expected hex string, got: ${data}`);\n }\n return decodeFunctionResult({\n abi: config.abi as Abi,\n functionName: config.functionName as never,\n data,\n }) as T;\n}\n\nasync function ethersWrite(\n signer: EthersTransactionSigner,\n config: TransactionRequestConfig,\n): Promise<Hex> {\n const tx = await signer.sendTransaction(toTransactionRequest(config));\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n}\n\n// ── Read helpers ────────────────────────────────────────────\n\nexport function readConfidentialBalanceOfContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\nexport function readUnderlyingTokenContract(provider: EthersCallProvider, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\nexport function readSupportsInterfaceContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n interfaceId: Address,\n) {\n return ethersRead(provider, supportsInterfaceContract(tokenAddress, interfaceId));\n}\n\n// ── Write helpers ───────────────────────────────────────────\n\nexport function writeConfidentialTransferContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n to: Address,\n handle: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, confidentialTransferContract(tokenAddress, to, handle, inputProof));\n}\n\nexport function writeUnwrapContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\nexport function writeUnwrapFromBalanceContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: Handle,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\nexport function writeFinalizeUnwrapContract(\n signer: EthersTransactionSigner,\n wrapper: Address,\n unwrapRequestId: Handle,\n burntAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, unwrapRequestId, burntAmountCleartext, decryptionProof),\n );\n}\n\nexport function writeSetOperatorContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n spender: Address,\n timestamp?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, spender, timestamp));\n}\n\nexport function writeWrapContract(\n signer: EthersTransactionSigner,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n) {\n return ethersWrite(signer, wrapContract(wrapperAddress, to, amount));\n}\n\n// ── Registry read helpers ──────────────────────────────────\n\nexport function readTokenPairsContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsContract(registry));\n}\n\nexport function readTokenPairsLengthContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsLengthContract(registry));\n}\n\nexport function readTokenPairsSliceContract(\n provider: EthersCallProvider,\n registry: Address,\n fromIndex: bigint,\n toIndex: bigint,\n) {\n return ethersRead(provider, getTokenPairsSliceContract(registry, fromIndex, toIndex));\n}\n\nexport function readTokenPairContract(\n provider: EthersCallProvider,\n registry: Address,\n index: bigint,\n) {\n return ethersRead(provider, getTokenPairContract(registry, index));\n}\n\nexport function readConfidentialTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\nexport function readTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\nexport function readIsConfidentialTokenValidContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, isConfidentialTokenValidContract(registry, confidentialTokenAddress));\n}\n"],"mappings":"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"}