@zama-fhe/sdk 1.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,133 @@
1
+ import { confidentialBalanceOfContract, getWrapperContract, underlyingContract, wrapperExistsContract, supportsInterfaceContract, confidentialTransferContract, confidentialBatchTransferContract, unwrapContract, unwrapFromBalanceContract, finalizeUnwrapContract, setOperatorContract, wrapContract, wrapETHContract } from '../chunk-2FIUGJJY.js';
2
+ import '../chunk-CTX3H4CB.js';
3
+ import { ethers } from 'ethers';
4
+
5
+ function toHex(s) {
6
+ if (!s.startsWith("0x")) throw new TypeError(`Expected hex string, got: ${s}`);
7
+ return s;
8
+ }
9
+ var EthersSigner = class {
10
+ signerPromise;
11
+ constructor(config) {
12
+ const providerOrSigner = config.signer;
13
+ if ("getSigner" in providerOrSigner) {
14
+ this.signerPromise = providerOrSigner.getSigner();
15
+ } else {
16
+ this.signerPromise = Promise.resolve(providerOrSigner);
17
+ }
18
+ }
19
+ async getChainId() {
20
+ const signer = await this.signerPromise;
21
+ const provider = signer.provider;
22
+ if (!provider) throw new TypeError("Signer has no provider");
23
+ const network = await provider.getNetwork();
24
+ return Number(network.chainId);
25
+ }
26
+ async getAddress() {
27
+ const signer = await this.signerPromise;
28
+ return toHex(await signer.getAddress());
29
+ }
30
+ async signTypedData(typedData) {
31
+ const signer = await this.signerPromise;
32
+ const { domain, types, message } = typedData;
33
+ const { EIP712Domain: _, ...sigTypes } = types;
34
+ const sig = await signer.signTypedData(domain, sigTypes, message);
35
+ return toHex(sig);
36
+ }
37
+ async writeContract(config) {
38
+ const signer = await this.signerPromise;
39
+ const contract = new ethers.Contract(config.address, config.abi, signer);
40
+ const overrides = {};
41
+ if (config.value !== void 0) overrides.value = config.value;
42
+ const tx = await contract[config.functionName](...config.args, overrides);
43
+ return toHex(tx.hash);
44
+ }
45
+ async readContract(config) {
46
+ const signer = await this.signerPromise;
47
+ const contract = new ethers.Contract(config.address, config.abi, signer);
48
+ return contract[config.functionName](...config.args);
49
+ }
50
+ async waitForTransactionReceipt(hash) {
51
+ const signer = await this.signerPromise;
52
+ const provider = signer.provider;
53
+ if (!provider) throw new TypeError("Signer has no provider");
54
+ const receipt = await provider.waitForTransaction(hash);
55
+ if (!receipt) throw new Error("Transaction receipt not found");
56
+ return {
57
+ logs: receipt.logs.map((log) => ({
58
+ topics: log.topics.filter((t) => t !== null),
59
+ data: log.data
60
+ }))
61
+ };
62
+ }
63
+ };
64
+ async function ethersRead(provider, config) {
65
+ const contract = new ethers.Contract(config.address, config.abi, provider);
66
+ return contract[config.functionName](...config.args);
67
+ }
68
+ function toHex2(s) {
69
+ if (!s.startsWith("0x")) throw new TypeError(`Expected hex string, got: ${s}`);
70
+ return s;
71
+ }
72
+ async function ethersWrite(signer, config) {
73
+ const contract = new ethers.Contract(config.address, config.abi, signer);
74
+ const tx = await contract[config.functionName](...config.args, {
75
+ value: config.value
76
+ });
77
+ return toHex2(tx.hash);
78
+ }
79
+ function readConfidentialBalanceOfContract(provider, tokenAddress, userAddress) {
80
+ return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));
81
+ }
82
+ function readWrapperForTokenContract(provider, coordinator, tokenAddress) {
83
+ return ethersRead(provider, getWrapperContract(coordinator, tokenAddress));
84
+ }
85
+ function readUnderlyingTokenContract(provider, wrapperAddress) {
86
+ return ethersRead(provider, underlyingContract(wrapperAddress));
87
+ }
88
+ function readWrapperExistsContract(provider, coordinator, tokenAddress) {
89
+ return ethersRead(provider, wrapperExistsContract(coordinator, tokenAddress));
90
+ }
91
+ function readSupportsInterfaceContract(provider, tokenAddress, interfaceId) {
92
+ return ethersRead(provider, supportsInterfaceContract(tokenAddress, interfaceId));
93
+ }
94
+ function writeConfidentialTransferContract(signer, tokenAddress, to, handle, inputProof) {
95
+ return ethersWrite(signer, confidentialTransferContract(tokenAddress, to, handle, inputProof));
96
+ }
97
+ function writeConfidentialBatchTransferContract(signer, batcherAddress, tokenAddress, fromAddress, batchTransferData, fees) {
98
+ return ethersWrite(
99
+ signer,
100
+ confidentialBatchTransferContract(
101
+ batcherAddress,
102
+ tokenAddress,
103
+ fromAddress,
104
+ batchTransferData,
105
+ fees
106
+ )
107
+ );
108
+ }
109
+ function writeUnwrapContract(signer, encryptedErc20, from, to, encryptedAmount, inputProof) {
110
+ return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));
111
+ }
112
+ function writeUnwrapFromBalanceContract(signer, encryptedErc20, from, to, encryptedBalance) {
113
+ return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));
114
+ }
115
+ function writeFinalizeUnwrapContract(signer, wrapper, burntAmount, burntAmountCleartext, decryptionProof) {
116
+ return ethersWrite(
117
+ signer,
118
+ finalizeUnwrapContract(wrapper, burntAmount, burntAmountCleartext, decryptionProof)
119
+ );
120
+ }
121
+ function writeSetOperatorContract(signer, tokenAddress, spender, timestamp) {
122
+ return ethersWrite(signer, setOperatorContract(tokenAddress, spender, timestamp));
123
+ }
124
+ function writeWrapContract(signer, wrapperAddress, to, amount) {
125
+ return ethersWrite(signer, wrapContract(wrapperAddress, to, amount));
126
+ }
127
+ function writeWrapETHContract(signer, wrapperAddress, to, amount, value) {
128
+ return ethersWrite(signer, wrapETHContract(wrapperAddress, to, amount, value));
129
+ }
130
+
131
+ export { EthersSigner, readConfidentialBalanceOfContract, readSupportsInterfaceContract, readUnderlyingTokenContract, readWrapperExistsContract, readWrapperForTokenContract, writeConfidentialBatchTransferContract, writeConfidentialTransferContract, writeFinalizeUnwrapContract, writeSetOperatorContract, writeUnwrapContract, writeUnwrapFromBalanceContract, writeWrapContract, writeWrapETHContract };
132
+ //# sourceMappingURL=index.js.map
133
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ethers/ethers-signer.ts","../../src/ethers/contracts.ts"],"names":["ethers","toHex"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n GenericSigner,\n ContractCallConfig,\n TransactionReceipt,\n Hex,\n} from \"../token/token.types\";\nimport type { Address, EIP712TypedData } from \"../relayer/relayer-sdk.types\";\nimport { ethers, type BrowserProvider, type Signer } from \"ethers\";\n\n/** Validate and narrow a string to the `Hex` branded type. */\nfunction toHex(s: string): Hex {\n if (!s.startsWith(\"0x\")) throw new TypeError(`Expected hex string, got: ${s}`);\n return s as Hex;\n}\n\n/** Configuration for {@link EthersSigner}. */\nexport interface EthersSignerConfig {\n signer: BrowserProvider | Signer;\n}\n\n/**\n * GenericSigner backed by ethers.\n *\n * Accepts either a `BrowserProvider` (signer resolved lazily via `getSigner()`)\n * or a `Signer` directly (e.g. `Wallet` for Node.js scripts).\n *\n * @param config - {@link EthersSignerConfig} with signer or provider\n */\nexport class EthersSigner implements GenericSigner {\n private signerPromise: Promise<Signer>;\n\n constructor(config: EthersSignerConfig) {\n const providerOrSigner = config.signer;\n if (\"getSigner\" in providerOrSigner) {\n this.signerPromise = providerOrSigner.getSigner();\n } else {\n this.signerPromise = Promise.resolve(providerOrSigner);\n }\n }\n\n async getChainId(): Promise<number> {\n const signer = await this.signerPromise;\n const provider = signer.provider;\n if (!provider) throw new TypeError(\"Signer has no provider\");\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 toHex(await signer.getAddress()) as Address;\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 sig = await signer.signTypedData(domain, sigTypes, message);\n return toHex(sig);\n }\n\n async writeContract<C extends ContractCallConfig>(config: C): 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: Record<string, unknown> = {};\n if (config.value !== undefined) overrides.value = config.value;\n const tx = await contract[config.functionName]!(...config.args, overrides);\n return toHex(tx.hash);\n }\n\n async readContract<T, C extends ContractCallConfig>(config: C): Promise<T> {\n const signer = await this.signerPromise;\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, signer);\n return contract[config.functionName]!(...config.args) as Promise<T>;\n }\n\n async waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt> {\n const signer = await this.signerPromise;\n const provider = signer.provider;\n if (!provider) throw new TypeError(\"Signer has no provider\");\n const receipt = await provider.waitForTransaction(hash);\n if (!receipt) throw new Error(\"Transaction receipt not found\");\n return {\n logs: receipt.logs.map((log) => ({\n topics: log.topics.filter((t): t is string => t !== null),\n data: log.data,\n })),\n };\n }\n}\n","import { ethers, type Provider, type Signer } from \"ethers\";\nimport type { Address, Hex } from \"../relayer/relayer-sdk.types\";\nimport type { BatchTransferData } from \"../contracts\";\nimport {\n confidentialBalanceOfContract,\n confidentialBatchTransferContract,\n confidentialTransferContract,\n finalizeUnwrapContract,\n getWrapperContract,\n setOperatorContract,\n supportsInterfaceContract,\n underlyingContract,\n unwrapContract,\n unwrapFromBalanceContract,\n wrapContract,\n wrapETHContract,\n wrapperExistsContract,\n} from \"../contracts\";\n\ninterface ContractConfig {\n address: string;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n value?: bigint;\n}\n\nasync function ethersRead(provider: Provider | Signer, config: ContractConfig) {\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, provider);\n return contract[config.functionName]!(...config.args);\n}\n\n/** Validate and narrow a string to the `Hex` branded type. */\nfunction toHex(s: string): Hex {\n if (!s.startsWith(\"0x\")) throw new TypeError(`Expected hex string, got: ${s}`);\n return s as Hex;\n}\n\nasync function ethersWrite(signer: Signer, config: ContractConfig): Promise<Hex> {\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, signer);\n const tx = await contract[config.functionName]!(...config.args, {\n value: config.value,\n });\n return toHex(tx.hash);\n}\n\n// ── Read helpers ────────────────────────────────────────────\n\nexport function readConfidentialBalanceOfContract(\n provider: Provider | Signer,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\nexport function readWrapperForTokenContract(\n provider: Provider | Signer,\n coordinator: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getWrapperContract(coordinator, tokenAddress));\n}\n\nexport function readUnderlyingTokenContract(provider: Provider | Signer, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\nexport function readWrapperExistsContract(\n provider: Provider | Signer,\n coordinator: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, wrapperExistsContract(coordinator, tokenAddress));\n}\n\nexport function readSupportsInterfaceContract(\n provider: Provider | Signer,\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: Signer,\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 writeConfidentialBatchTransferContract(\n signer: Signer,\n batcherAddress: Address,\n tokenAddress: Address,\n fromAddress: Address,\n batchTransferData: BatchTransferData[],\n fees: bigint,\n) {\n return ethersWrite(\n signer,\n confidentialBatchTransferContract(\n batcherAddress,\n tokenAddress,\n fromAddress,\n batchTransferData,\n fees,\n ),\n );\n}\n\nexport function writeUnwrapContract(\n signer: Signer,\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: Signer,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: Address,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\nexport function writeFinalizeUnwrapContract(\n signer: Signer,\n wrapper: Address,\n burntAmount: Address,\n burntAmountCleartext: bigint,\n decryptionProof: Address,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, burntAmount, burntAmountCleartext, decryptionProof),\n );\n}\n\nexport function writeSetOperatorContract(\n signer: Signer,\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: Signer,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n) {\n return ethersWrite(signer, wrapContract(wrapperAddress, to, amount));\n}\n\nexport function writeWrapETHContract(\n signer: Signer,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n value: bigint,\n) {\n return ethersWrite(signer, wrapETHContract(wrapperAddress, to, amount, value));\n}\n"]}