@zama-fhe/sdk 3.4.0-alpha.10 → 3.4.0-alpha.12
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.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../sdk-events.cjs"),t=require("../base-signer.cjs"),n=require("../eip1193-subscribe.cjs");let r=require("viem"),i=require("ethers");
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../sdk-events.cjs"),t=require("../base-signer.cjs"),n=require("../eip1193-subscribe.cjs");let r=require("viem"),i=require("ethers");function a(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 o(e,t){let n=await e.call(a(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 s(e,t){let n=await e.sendTransaction(a(t));if(!(0,r.isHex)(n.hash))throw TypeError(`Expected hex string, got: ${n.hash}`);return n.hash}function c(t,n,r){return o(t,e.w(n,r))}function l(t,n){return o(t,e.F(n))}function u(t,n,r){return o(t,e.g(n,r))}function d(t,n,r,i,a){return s(t,e.D(n,r,i,a))}function f(t,n,r,i,a,o){return s(t,e.I(n,r,i,a,o))}function p(t,n,r,i,a){return s(t,e.L(n,r,i,a))}function m(t,n,r,i,a){return s(t,e.A(n,r,i,a))}function h(t,n,r,i){return s(t,e.P(n,r,i))}function g(t,n,r,i){return s(t,e.R(n,r,i))}function _(t,n){return o(t,e.o(n))}function v(t,n){return o(t,e.s(n))}function y(t,n,r,i){return o(t,e.c(n,r,i))}function b(t,n,r){return o(t,e.a(n,r))}function x(t,n,r){return o(t,e.r(n,r))}function S(t,n,r){return o(t,e.i(n,r))}function C(t,n,r){return o(t,e.l(n,r))}var w=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 o(this.#e,{address:e.address,abi:e.abi,functionName:e.functionName,args: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}))}}},T=class extends t.t{#e;#t;#n;#r;#i;constructor(t){super(),`ethereum`in t?(this.#e=new i.BrowserProvider(t.ethereum),this.#n=t.ethereum,this.#r=n.t({provider:t.ethereum,getInitialWalletAccount:()=>this.#l(),onWalletAccountChange:({next:e})=>{this.walletAccount.setSnapshot(e)}})):(this.#t=t.signer,this.#r=()=>{},e.z(`refresh wallet account`,async()=>{await this.refreshWalletAccount()}))}requireWalletAccount(t){let n=this.walletAccount.getSnapshot();if(!n&&!this.walletAccount.isReady())throw new e.H(t);if(!n)throw new e.U(t);return n}refreshWalletAccount(){return this.#n?this.#c():this.#t?this.#s(this.#t):Promise.resolve(void 0)}onDispose(){this.#r()}async#a(){if(this.#t)return this.#t;if(!this.#e)throw new e.B(`resolveSigner`);return this.#e.getSigner()}async#o(e){let t=e.provider;if(!t)return;let[n,i]=await Promise.all([e.getAddress(),t.getNetwork()]);return{address:(0,r.getAddress)(n),chainId:Number(i.chainId)}}async signTypedData(e){let t=await this.#a(),{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.#a(),n=new i.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.getFunction(e.functionName)(...e.args,a);if(!(0,r.isHex)(o.hash))throw TypeError(`Expected hex string, got: ${o.hash}`);return o.hash}async#s(e){return this.#i??=this.#o(e).then(e=>(this.walletAccount.setSnapshot(e),e)).finally(()=>{this.#i=void 0}),this.#i}async#c(){let e=await this.#l();return this.walletAccount.setSnapshot(e),e}async#l(){let e=this.#n;if(!e)return;let[t,n]=await Promise.all([e.request({method:`eth_accounts`}),e.request({method:`eth_chainId`})]);if(!Array.isArray(t)||typeof t[0]!=`string`)return;let i=Number(n);if(!(!Number.isSafeInteger(i)||i<=0))return{address:(0,r.getAddress)(t[0]),chainId:i}}};function E(e){if(`signer`in e&&e.signer){let n=new T({signer:e.signer});if(!e.signer.provider)throw Error(`createConfig requires a Signer with an attached provider for chain reads`);return t.i(n,new w({provider:e.signer.provider}),e)}return t.i(new T({ethereum:e.ethereum}),`provider`in e&&e.provider?new w({provider:e.provider}):new w({ethereum:e.ethereum}),e)}exports.BaseSigner=t.t,exports.EthersProvider=w,exports.EthersSigner=T,Object.defineProperty(exports,"ProviderRpcError",{enumerable:!0,get:function(){return r.ProviderRpcError}}),exports.ZamaSDKEvents=e.t,exports.createConfig=E,exports.readConfidentialBalanceOfContract=c,exports.readConfidentialTokenAddressContract=x,exports.readIsConfidentialTokenValidContract=C,exports.readSupportsInterfaceContract=u,exports.readTokenAddressContract=S,exports.readTokenPairContract=b,exports.readTokenPairsContract=_,exports.readTokenPairsLengthContract=v,exports.readTokenPairsSliceContract=y,exports.readUnderlyingTokenContract=l,exports.writeConfidentialTransferContract=d,exports.writeFinalizeUnwrapContract=m,exports.writeSetOperatorContract=h,exports.writeUnwrapContract=f,exports.writeUnwrapFromBalanceContract=p,exports.writeWrapContract=g;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["#readProvider","BrowserProvider","BaseSigner","#browserProvider","#directSigner","#eip1193","#unsubscribeProvider","BrowserProvider","eip1193Subscribe","#loadBrowserWalletAccount","swallow","WalletAccountNotReadyError","WalletNotConnectedError","#refreshFromEthereum","#refreshFromSigner","#resolveSigner","SignerNotConfiguredError","#walletAccountFromSigner","Contract","#accountPromise","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 before the user has connected their\n * 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 /** Return the chain ID of the connected network. */\n async getChainId(): Promise<number> {\n const network = await this.#readProvider.getNetwork();\n return Number(network.chainId);\n }\n\n /** Execute a read-only call and return the decoded result. */\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 /** Return the latest block timestamp in seconds. */\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 /** Wait for a transaction to be mined and return its receipt. */\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 BrowserProvider,\n Contract,\n type InterfaceAbi,\n type Signer,\n type TypedDataDomain,\n} from \"ethers\";\nimport {\n getAddress,\n isHex,\n type Abi,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type EIP1193Provider,\n type Hex,\n} from \"viem\";\nimport {\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n WalletNotConnectedError,\n} from \"../errors\";\nimport type { EIP712TypedData } from \"../relayer/types\";\nimport { BaseSigner } from \"../signer/base-signer\";\nimport { eip1193Subscribe } from \"../signer/eip1193-subscribe\";\nimport type { WalletAccount, WriteContractConfig } from \"../types\";\nimport { swallow } from \"../utils\";\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 wallet events update `walletAccount`.\n *\n * - **Node / direct signer** — `{ signer }`: pass an ethers `Signer` (e.g. `Wallet`).\n * The initial wallet account is discovered asynchronously and emitted through\n * `walletAccount` once available.\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 extends BaseSigner {\n readonly #browserProvider?: BrowserProvider;\n readonly #directSigner?: Signer;\n readonly #eip1193?: EIP1193Provider;\n readonly #unsubscribeProvider: () => void;\n #accountPromise: Promise<WalletAccount | undefined> | undefined;\n\n constructor(config: EthersSignerConfig) {\n super();\n if (\"ethereum\" in config) {\n this.#browserProvider = new BrowserProvider(config.ethereum);\n this.#eip1193 = config.ethereum;\n this.#unsubscribeProvider = eip1193Subscribe({\n provider: config.ethereum,\n getInitialWalletAccount: () => this.#loadBrowserWalletAccount(),\n onWalletAccountChange: ({ next }) => {\n this.walletAccount.setSnapshot(next);\n },\n });\n } else {\n this.#directSigner = config.signer;\n this.#unsubscribeProvider = () => {};\n // The signer is constructed before `createConfig`, so it cannot reach the\n // SDK-wide logger; this best-effort refresh stays silent. A failed refresh\n // still surfaces via the typed WalletAccountNotReadyError on next use.\n void swallow(\"refresh wallet account\", async () => {\n await this.refreshWalletAccount();\n });\n }\n }\n\n /**\n * Return the connected wallet account, or throw {@link WalletAccountNotReadyError}\n * while the initial async lookup is pending, or {@link WalletNotConnectedError}\n * when no wallet is connected.\n */\n override requireWalletAccount(operation: string): WalletAccount {\n const account = this.walletAccount.getSnapshot();\n if (!account && !this.walletAccount.isReady()) {\n throw new WalletAccountNotReadyError(operation);\n }\n if (!account) {\n throw new WalletNotConnectedError(operation);\n }\n return account;\n }\n\n /** Re-fetch the wallet account from the provider or signer and update `walletAccount`. */\n refreshWalletAccount(): Promise<WalletAccount | undefined> {\n if (this.#eip1193) {\n return this.#refreshFromEthereum();\n }\n if (this.#directSigner) {\n return this.#refreshFromSigner(this.#directSigner);\n }\n return Promise.resolve(undefined);\n }\n\n /** Unsubscribe from the EIP-1193 provider's wallet lifecycle events. */\n protected override onDispose(): void {\n this.#unsubscribeProvider();\n }\n\n async #resolveSigner(): Promise<Signer> {\n if (this.#directSigner) {\n return this.#directSigner;\n }\n if (!this.#browserProvider) {\n throw new SignerNotConfiguredError(\"resolveSigner\");\n }\n return this.#browserProvider.getSigner();\n }\n\n async #walletAccountFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n const provider = signer.provider;\n if (!provider) {\n return undefined;\n }\n const [address, network] = await Promise.all([signer.getAddress(), provider.getNetwork()]);\n return { address: getAddress(address), chainId: Number(network.chainId) };\n }\n\n /** Sign EIP-712 typed data (used for decrypt authorization). */\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.#resolveSigner();\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const mutableSigTypes = Object.fromEntries(\n Object.entries(sigTypes).map(([name, fields]) => [name, [...fields]]),\n );\n const sig = await signer.signTypedData(domain as TypedDataDomain, mutableSigTypes, message);\n if (!isHex(sig)) {\n throw new TypeError(`Expected hex string, got: ${sig}`);\n }\n return sig;\n }\n\n /** Send a write transaction and return the tx hash. */\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.#resolveSigner();\n const contract = new Contract(config.address, config.abi as 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 fn = contract.getFunction(config.functionName);\n const tx = await fn(...(config.args as readonly unknown[]), overrides);\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n }\n\n async #refreshFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n this.#accountPromise ??= this.#walletAccountFromSigner(signer)\n .then((account) => {\n this.walletAccount.setSnapshot(account);\n return account;\n })\n .finally(() => {\n this.#accountPromise = undefined;\n });\n return this.#accountPromise;\n }\n\n async #refreshFromEthereum(): Promise<WalletAccount | undefined> {\n const account = await this.#loadBrowserWalletAccount();\n this.walletAccount.setSnapshot(account);\n return account;\n }\n\n async #loadBrowserWalletAccount(): Promise<WalletAccount | undefined> {\n const ethereum = this.#eip1193;\n if (!ethereum) {\n return undefined;\n }\n const [accounts, chainIdValue] = await Promise.all([\n ethereum.request({ method: \"eth_accounts\" }),\n ethereum.request({ method: \"eth_chainId\" }),\n ]);\n if (!Array.isArray(accounts) || typeof accounts[0] !== \"string\") {\n return undefined;\n }\n const chainId = Number(chainIdValue);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) {\n return undefined;\n }\n return { address: getAddress(accounts[0]), chainId };\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 { EncryptedValue } from \"../relayer/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\n/** Minimal transaction request accepted by the ethers contract helpers. */\nexport interface EthersTransactionRequest {\n /** Target contract address. */\n to: Address;\n /** ABI-encoded call data. */\n data: Hex;\n /** Optional gas limit for the transaction. */\n gasLimit?: bigint;\n /** Optional native-token value to send with the call, in wei. */\n value?: bigint;\n}\n\n/** Minimal transaction response returned by an {@link EthersTransactionSigner}. */\nexport interface EthersTransactionResponse {\n /** Hash of the submitted transaction. */\n hash: string;\n}\n\n/** Minimal read-only ethers provider shape used by the read contract helpers. */\nexport interface EthersCallProvider {\n /** Performs an `eth_call` and resolves to the raw hex return data. */\n call(tx: EthersTransactionRequest): Promise<string>;\n}\n\n/** Minimal ethers signer shape used by the write contract helpers. */\nexport interface EthersTransactionSigner extends EthersCallProvider {\n /** Signs and broadcasts a transaction, resolving to the transaction response. */\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\n/** Reads a token's confidential (encrypted) balance handle for `userAddress` via an ethers provider. */\nexport function readConfidentialBalanceOfContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\n/** Reads the underlying ERC-20 address wrapped by a confidential wrapper via an ethers provider. */\nexport function readUnderlyingTokenContract(provider: EthersCallProvider, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\n/** Reads whether a token implements the given ERC-165 interface id via an ethers provider. */\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\n/** Submits a confidential transfer of an encrypted amount to `to` via an ethers signer. */\nexport function writeConfidentialTransferContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return ethersWrite(\n signer,\n confidentialTransferContract(tokenAddress, to, encryptedAmount, inputProof),\n );\n}\n\n/** Submits an unwrap of an encrypted amount from `from` to `to` on a confidential ERC-20 via an ethers signer. */\nexport function writeUnwrapContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\n/** Submits an unwrap of the full encrypted balance from `from` to `to` via an ethers signer. */\nexport function writeUnwrapFromBalanceContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: EncryptedValue,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\n/** Finalizes a pending unwrap request with the decrypted amount and decryption proof via an ethers signer. */\nexport function writeFinalizeUnwrapContract(\n signer: EthersTransactionSigner,\n wrapper: Address,\n unwrapRequestId: EncryptedValue,\n unwrapAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, unwrapRequestId, unwrapAmountCleartext, decryptionProof),\n );\n}\n\n/** Authorizes `operator` on a token, until an optional expiry timestamp, via an ethers signer. */\nexport function writeSetOperatorContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n operator: Address,\n until?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, operator, until));\n}\n\n/** Wraps `amount` of the underlying ERC-20 into confidential tokens credited to `to` via an ethers signer. */\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\n/** Reads all underlying/confidential token pairs from a wrappers registry via an ethers provider. */\nexport function readTokenPairsContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsContract(registry));\n}\n\n/** Reads the number of token pairs in a wrappers registry via an ethers provider. */\nexport function readTokenPairsLengthContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsLengthContract(registry));\n}\n\n/** Reads a slice of token pairs (`fromIndex` to `toIndex`) from a wrappers registry via an ethers provider. */\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\n/** Reads the token pair at `index` from a wrappers registry via an ethers provider. */\nexport function readTokenPairContract(\n provider: EthersCallProvider,\n registry: Address,\n index: bigint,\n) {\n return ethersRead(provider, getTokenPairContract(registry, index));\n}\n\n/** Reads the confidential token registered for a given underlying token in a wrappers registry via an ethers provider. */\nexport function readConfidentialTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\n/** Reads the underlying token registered for a given confidential token in a wrappers registry via an ethers provider. */\nexport function readTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\n/** Reads whether a confidential token is registered and valid in a wrappers registry via an ethers provider. */\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":["confidentialBalanceOfContract","underlyingContract","supportsInterfaceContract","confidentialTransferContract","unwrapContract","unwrapFromBalanceContract","finalizeUnwrapContract","setOperatorContract","wrapContract","getTokenPairsContract","getTokenPairsLengthContract","getTokenPairsSliceContract","getTokenPairContract","getConfidentialTokenAddressContract","getTokenAddressContract","isConfidentialTokenValidContract","#readProvider","BrowserProvider","BaseSigner","#browserProvider","#directSigner","#eip1193","#unsubscribeProvider","BrowserProvider","eip1193Subscribe","#loadBrowserWalletAccount","swallow","WalletAccountNotReadyError","WalletNotConnectedError","#refreshFromEthereum","#refreshFromSigner","#resolveSigner","SignerNotConfiguredError","#walletAccountFromSigner","Contract","#accountPromise","buildZamaConfig"],"sources":["../../../src/ethers/contracts.ts","../../../src/ethers/ethers-provider.ts","../../../src/ethers/ethers-signer.ts","../../../src/ethers/config.ts"],"sourcesContent":["import {\n decodeFunctionResult,\n encodeFunctionData,\n isHex,\n type Abi,\n type Address,\n type Hex,\n} from \"viem\";\n\nimport type { EncryptedValue } from \"../relayer/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\n/** Minimal transaction request accepted by the ethers contract helpers. */\nexport interface EthersTransactionRequest {\n /** Target contract address. */\n to: Address;\n /** ABI-encoded call data. */\n data: Hex;\n /** Optional gas limit for the transaction. */\n gasLimit?: bigint;\n /** Optional native-token value to send with the call, in wei. */\n value?: bigint;\n}\n\n/** Minimal transaction response returned by an {@link EthersTransactionSigner}. */\nexport interface EthersTransactionResponse {\n /** Hash of the submitted transaction. */\n hash: string;\n}\n\n/** Minimal read-only ethers provider shape used by the read contract helpers. */\nexport interface EthersCallProvider {\n /** Performs an `eth_call` and resolves to the raw hex return data. */\n call(tx: EthersTransactionRequest): Promise<string>;\n}\n\n/** Minimal ethers signer shape used by the write contract helpers. */\nexport interface EthersTransactionSigner extends EthersCallProvider {\n /** Signs and broadcasts a transaction, resolving to the transaction response. */\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\n/**\n * Performs an `eth_call` through an ethers provider and decodes the result with viem, so every\n * ethers-backed read — the generic {@link EthersProvider.readContract} and the pre-built\n * `readXxxContract` helpers alike — produces viem-identical shapes (small ints as `number`, named\n * tuples as keyed objects, empty output as `undefined`). ethers is the transport only; viem owns\n * encoding and decoding.\n *\n * @internal\n */\nexport async 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\n/** Reads a token's confidential (encrypted) balance handle for `userAddress` via an ethers provider. */\nexport function readConfidentialBalanceOfContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\n/** Reads the underlying ERC-20 address wrapped by a confidential wrapper via an ethers provider. */\nexport function readUnderlyingTokenContract(provider: EthersCallProvider, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\n/** Reads whether a token implements the given ERC-165 interface id via an ethers provider. */\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\n/** Submits a confidential transfer of an encrypted amount to `to` via an ethers signer. */\nexport function writeConfidentialTransferContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return ethersWrite(\n signer,\n confidentialTransferContract(tokenAddress, to, encryptedAmount, inputProof),\n );\n}\n\n/** Submits an unwrap of an encrypted amount from `from` to `to` on a confidential ERC-20 via an ethers signer. */\nexport function writeUnwrapContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\n/** Submits an unwrap of the full encrypted balance from `from` to `to` via an ethers signer. */\nexport function writeUnwrapFromBalanceContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: EncryptedValue,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\n/** Finalizes a pending unwrap request with the decrypted amount and decryption proof via an ethers signer. */\nexport function writeFinalizeUnwrapContract(\n signer: EthersTransactionSigner,\n wrapper: Address,\n unwrapRequestId: EncryptedValue,\n unwrapAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, unwrapRequestId, unwrapAmountCleartext, decryptionProof),\n );\n}\n\n/** Authorizes `operator` on a token, until an optional expiry timestamp, via an ethers signer. */\nexport function writeSetOperatorContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n operator: Address,\n until?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, operator, until));\n}\n\n/** Wraps `amount` of the underlying ERC-20 into confidential tokens credited to `to` via an ethers signer. */\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\n/** Reads all underlying/confidential token pairs from a wrappers registry via an ethers provider. */\nexport function readTokenPairsContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsContract(registry));\n}\n\n/** Reads the number of token pairs in a wrappers registry via an ethers provider. */\nexport function readTokenPairsLengthContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsLengthContract(registry));\n}\n\n/** Reads a slice of token pairs (`fromIndex` to `toIndex`) from a wrappers registry via an ethers provider. */\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\n/** Reads the token pair at `index` from a wrappers registry via an ethers provider. */\nexport function readTokenPairContract(\n provider: EthersCallProvider,\n registry: Address,\n index: bigint,\n) {\n return ethersRead(provider, getTokenPairContract(registry, index));\n}\n\n/** Reads the confidential token registered for a given underlying token in a wrappers registry via an ethers provider. */\nexport function readConfidentialTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\n/** Reads the underlying token registered for a given confidential token in a wrappers registry via an ethers provider. */\nexport function readTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\n/** Reads whether a confidential token is registered and valid in a wrappers registry via an ethers provider. */\nexport function readIsConfidentialTokenValidContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, isConfidentialTokenValidContract(registry, confidentialTokenAddress));\n}\n","import { BrowserProvider } from \"ethers\";\nimport type { ethers } 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\";\nimport { ethersRead } from \"./contracts\";\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 before the user has connected their\n * 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 /** Return the chain ID of the connected network. */\n async getChainId(): Promise<number> {\n const network = await this.#readProvider.getNetwork();\n return Number(network.chainId);\n }\n\n /**\n * Execute a read-only call and return the decoded result.\n *\n * ethers is the transport only: the call goes out over `provider.call`, and viem does the\n * encoding and decoding (via {@link ethersRead}). That keeps the result identical to\n * `ViemProvider` — the return-type contract both providers implement — rather than re-deriving\n * viem's decoding rules (small ints as `number`, named tuples as keyed objects, empty output as\n * `undefined`) from ethers' own decoded values.\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 return ethersRead(this.#readProvider, {\n address: config.address,\n abi: config.abi as readonly unknown[],\n functionName: config.functionName,\n args: config.args as readonly unknown[],\n });\n }\n\n /** Return the latest block timestamp in seconds. */\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 /** Wait for a transaction to be mined and return its receipt. */\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 BrowserProvider,\n Contract,\n type InterfaceAbi,\n type Signer,\n type TypedDataDomain,\n} from \"ethers\";\nimport {\n getAddress,\n isHex,\n type Abi,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type EIP1193Provider,\n type Hex,\n} from \"viem\";\nimport {\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n WalletNotConnectedError,\n} from \"../errors\";\nimport type { EIP712TypedData } from \"../relayer/types\";\nimport { BaseSigner } from \"../signer/base-signer\";\nimport { eip1193Subscribe } from \"../signer/eip1193-subscribe\";\nimport type { WalletAccount, WriteContractConfig } from \"../types\";\nimport { swallow } from \"../utils\";\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 wallet events update `walletAccount`.\n *\n * - **Node / direct signer** — `{ signer }`: pass an ethers `Signer` (e.g. `Wallet`).\n * The initial wallet account is discovered asynchronously and emitted through\n * `walletAccount` once available.\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 extends BaseSigner {\n readonly #browserProvider?: BrowserProvider;\n readonly #directSigner?: Signer;\n readonly #eip1193?: EIP1193Provider;\n readonly #unsubscribeProvider: () => void;\n #accountPromise: Promise<WalletAccount | undefined> | undefined;\n\n constructor(config: EthersSignerConfig) {\n super();\n if (\"ethereum\" in config) {\n this.#browserProvider = new BrowserProvider(config.ethereum);\n this.#eip1193 = config.ethereum;\n this.#unsubscribeProvider = eip1193Subscribe({\n provider: config.ethereum,\n getInitialWalletAccount: () => this.#loadBrowserWalletAccount(),\n onWalletAccountChange: ({ next }) => {\n this.walletAccount.setSnapshot(next);\n },\n });\n } else {\n this.#directSigner = config.signer;\n this.#unsubscribeProvider = () => {};\n // The signer is constructed before `createConfig`, so it cannot reach the\n // SDK-wide logger; this best-effort refresh stays silent. A failed refresh\n // still surfaces via the typed WalletAccountNotReadyError on next use.\n void swallow(\"refresh wallet account\", async () => {\n await this.refreshWalletAccount();\n });\n }\n }\n\n /**\n * Return the connected wallet account, or throw {@link WalletAccountNotReadyError}\n * while the initial async lookup is pending, or {@link WalletNotConnectedError}\n * when no wallet is connected.\n */\n override requireWalletAccount(operation: string): WalletAccount {\n const account = this.walletAccount.getSnapshot();\n if (!account && !this.walletAccount.isReady()) {\n throw new WalletAccountNotReadyError(operation);\n }\n if (!account) {\n throw new WalletNotConnectedError(operation);\n }\n return account;\n }\n\n /** Re-fetch the wallet account from the provider or signer and update `walletAccount`. */\n refreshWalletAccount(): Promise<WalletAccount | undefined> {\n if (this.#eip1193) {\n return this.#refreshFromEthereum();\n }\n if (this.#directSigner) {\n return this.#refreshFromSigner(this.#directSigner);\n }\n return Promise.resolve(undefined);\n }\n\n /** Unsubscribe from the EIP-1193 provider's wallet lifecycle events. */\n protected override onDispose(): void {\n this.#unsubscribeProvider();\n }\n\n async #resolveSigner(): Promise<Signer> {\n if (this.#directSigner) {\n return this.#directSigner;\n }\n if (!this.#browserProvider) {\n throw new SignerNotConfiguredError(\"resolveSigner\");\n }\n return this.#browserProvider.getSigner();\n }\n\n async #walletAccountFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n const provider = signer.provider;\n if (!provider) {\n return undefined;\n }\n const [address, network] = await Promise.all([signer.getAddress(), provider.getNetwork()]);\n return { address: getAddress(address), chainId: Number(network.chainId) };\n }\n\n /** Sign EIP-712 typed data (used for decrypt authorization). */\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.#resolveSigner();\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const mutableSigTypes = Object.fromEntries(\n Object.entries(sigTypes).map(([name, fields]) => [name, [...fields]]),\n );\n const sig = await signer.signTypedData(domain as TypedDataDomain, mutableSigTypes, message);\n if (!isHex(sig)) {\n throw new TypeError(`Expected hex string, got: ${sig}`);\n }\n return sig;\n }\n\n /** Send a write transaction and return the tx hash. */\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.#resolveSigner();\n const contract = new Contract(config.address, config.abi as 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 fn = contract.getFunction(config.functionName);\n const tx = await fn(...(config.args as readonly unknown[]), overrides);\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n }\n\n async #refreshFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n this.#accountPromise ??= this.#walletAccountFromSigner(signer)\n .then((account) => {\n this.walletAccount.setSnapshot(account);\n return account;\n })\n .finally(() => {\n this.#accountPromise = undefined;\n });\n return this.#accountPromise;\n }\n\n async #refreshFromEthereum(): Promise<WalletAccount | undefined> {\n const account = await this.#loadBrowserWalletAccount();\n this.walletAccount.setSnapshot(account);\n return account;\n }\n\n async #loadBrowserWalletAccount(): Promise<WalletAccount | undefined> {\n const ethereum = this.#eip1193;\n if (!ethereum) {\n return undefined;\n }\n const [accounts, chainIdValue] = await Promise.all([\n ethereum.request({ method: \"eth_accounts\" }),\n ethereum.request({ method: \"eth_chainId\" }),\n ]);\n if (!Array.isArray(accounts) || typeof accounts[0] !== \"string\") {\n return undefined;\n }\n const chainId = Number(chainIdValue);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) {\n return undefined;\n }\n return { address: getAddress(accounts[0]), chainId };\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"],"mappings":"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"}
|
|
@@ -95,7 +95,15 @@ declare class EthersProvider implements GenericProvider {
|
|
|
95
95
|
constructor(config: EthersProviderConfig);
|
|
96
96
|
/** Return the chain ID of the connected network. */
|
|
97
97
|
getChainId(): Promise<number>;
|
|
98
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* Execute a read-only call and return the decoded result.
|
|
100
|
+
*
|
|
101
|
+
* ethers is the transport only: the call goes out over `provider.call`, and viem does the
|
|
102
|
+
* encoding and decoding (via {@link ethersRead}). That keeps the result identical to
|
|
103
|
+
* `ViemProvider` — the return-type contract both providers implement — rather than re-deriving
|
|
104
|
+
* viem's decoding rules (small ints as `number`, named tuples as keyed objects, empty output as
|
|
105
|
+
* `undefined`) from ethers' own decoded values.
|
|
106
|
+
*/
|
|
99
107
|
readContract<const TAbi extends Abi | readonly unknown[], TFunctionName extends ContractFunctionName<TAbi, "pure" | "view">, const TArgs extends ContractFunctionArgs<TAbi, "pure" | "view", TFunctionName>>(config: ReadContractConfig<TAbi, TFunctionName, TArgs>): Promise<ContractFunctionReturnType<TAbi, "pure" | "view", TFunctionName, TArgs>>;
|
|
100
108
|
/** Return the latest block timestamp in seconds. */
|
|
101
109
|
getBlockTimestamp(): Promise<bigint>;
|
package/dist/esm/ethers/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{A as e,B as t,D as n,F as r,H as i,I as a,L as o,P as s,R as c,U as l,a as u,c as d,g as f,i as p,l as m,o as h,r as g,s as _,t as v,w as y,z as b}from"../sdk-events-D3VCMK3Z.js";import{i as x,t as S}from"../base-signer-DPZVcfyP.js";import{t as C}from"../eip1193-subscribe-CNxVHW6y.js";import{ProviderRpcError as w,decodeFunctionResult as T,encodeFunctionData as E,getAddress as D,isHex as O}from"viem";import{BrowserProvider as k,Contract as A
|
|
1
|
+
import{A as e,B as t,D as n,F as r,H as i,I as a,L as o,P as s,R as c,U as l,a as u,c as d,g as f,i as p,l as m,o as h,r as g,s as _,t as v,w as y,z as b}from"../sdk-events-D3VCMK3Z.js";import{i as x,t as S}from"../base-signer-DPZVcfyP.js";import{t as C}from"../eip1193-subscribe-CNxVHW6y.js";import{ProviderRpcError as w,decodeFunctionResult as T,encodeFunctionData as E,getAddress as D,isHex as O}from"viem";import{BrowserProvider as k,Contract as A}from"ethers";function j(e){return{to:e.address,data:E({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 M(e,t){let n=await e.call(j(t));if(!O(n))throw TypeError(`Expected hex string, got: ${n}`);return T({abi:t.abi,functionName:t.functionName,data:n})}async function N(e,t){let n=await e.sendTransaction(j(t));if(!O(n.hash))throw TypeError(`Expected hex string, got: ${n.hash}`);return n.hash}function P(e,t,n){return M(e,y(t,n))}function F(e,t){return M(e,r(t))}function I(e,t,n){return M(e,f(t,n))}function L(e,t,r,i,a){return N(e,n(t,r,i,a))}function R(e,t,n,r,i,o){return N(e,a(t,n,r,i,o))}function z(e,t,n,r,i){return N(e,o(t,n,r,i))}function B(t,n,r,i,a){return N(t,e(n,r,i,a))}function V(e,t,n,r){return N(e,s(t,n,r))}function H(e,t,n,r){return N(e,c(t,n,r))}function U(e,t){return M(e,h(t))}function W(e,t){return M(e,_(t))}function G(e,t,n,r){return M(e,d(t,n,r))}function K(e,t,n){return M(e,u(t,n))}function q(e,t,n){return M(e,g(t,n))}function J(e,t,n){return M(e,p(t,n))}function Y(e,t,n){return M(e,m(t,n))}var X=class{#e;constructor(e){`ethereum`in e?this.#e=new k(e.ethereum):this.#e=e.provider}async getChainId(){let e=await this.#e.getNetwork();return Number(e.chainId)}async readContract(e){return M(this.#e,{address:e.address,abi:e.abi,functionName:e.functionName,args: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}))}}},Z=class extends S{#e;#t;#n;#r;#i;constructor(e){super(),`ethereum`in e?(this.#e=new k(e.ethereum),this.#n=e.ethereum,this.#r=C({provider:e.ethereum,getInitialWalletAccount:()=>this.#l(),onWalletAccountChange:({next:e})=>{this.walletAccount.setSnapshot(e)}})):(this.#t=e.signer,this.#r=()=>{},b(`refresh wallet account`,async()=>{await this.refreshWalletAccount()}))}requireWalletAccount(e){let t=this.walletAccount.getSnapshot();if(!t&&!this.walletAccount.isReady())throw new i(e);if(!t)throw new l(e);return t}refreshWalletAccount(){return this.#n?this.#c():this.#t?this.#s(this.#t):Promise.resolve(void 0)}onDispose(){this.#r()}async#a(){if(this.#t)return this.#t;if(!this.#e)throw new t(`resolveSigner`);return this.#e.getSigner()}async#o(e){let t=e.provider;if(!t)return;let[n,r]=await Promise.all([e.getAddress(),t.getNetwork()]);return{address:D(n),chainId:Number(r.chainId)}}async signTypedData(e){let t=await this.#a(),{domain:n,types:r,message:i}=e,{EIP712Domain:a,...o}=r,s=Object.fromEntries(Object.entries(o).map(([e,t])=>[e,[...t]])),c=await t.signTypedData(n,s,i);if(!O(c))throw TypeError(`Expected hex string, got: ${c}`);return c}async writeContract(e){let t=await this.#a(),n=new A(e.address,e.abi,t),r={};e.value!==void 0&&(r.value=e.value),e.gas!==void 0&&(r.gasLimit=e.gas);let i=await n.getFunction(e.functionName)(...e.args,r);if(!O(i.hash))throw TypeError(`Expected hex string, got: ${i.hash}`);return i.hash}async#s(e){return this.#i??=this.#o(e).then(e=>(this.walletAccount.setSnapshot(e),e)).finally(()=>{this.#i=void 0}),this.#i}async#c(){let e=await this.#l();return this.walletAccount.setSnapshot(e),e}async#l(){let e=this.#n;if(!e)return;let[t,n]=await Promise.all([e.request({method:`eth_accounts`}),e.request({method:`eth_chainId`})]);if(!Array.isArray(t)||typeof t[0]!=`string`)return;let r=Number(n);if(!(!Number.isSafeInteger(r)||r<=0))return{address:D(t[0]),chainId:r}}};function Q(e){if(`signer`in e&&e.signer){let t=new Z({signer:e.signer});if(!e.signer.provider)throw Error(`createConfig requires a Signer with an attached provider for chain reads`);return x(t,new X({provider:e.signer.provider}),e)}return x(new Z({ethereum:e.ethereum}),`provider`in e&&e.provider?new X({provider:e.provider}):new X({ethereum:e.ethereum}),e)}export{S as BaseSigner,X as EthersProvider,Z as EthersSigner,w as ProviderRpcError,v as ZamaSDKEvents,Q as createConfig,P as readConfidentialBalanceOfContract,q as readConfidentialTokenAddressContract,Y as readIsConfidentialTokenValidContract,I as readSupportsInterfaceContract,J as readTokenAddressContract,K as readTokenPairContract,U as readTokenPairsContract,W as readTokenPairsLengthContract,G as readTokenPairsSliceContract,F as readUnderlyingTokenContract,L as writeConfidentialTransferContract,B as writeFinalizeUnwrapContract,V as writeSetOperatorContract,R as writeUnwrapContract,z as writeUnwrapFromBalanceContract,H as writeWrapContract};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#readProvider","#browserProvider","#directSigner","#eip1193","#unsubscribeProvider","#loadBrowserWalletAccount","#refreshFromEthereum","#refreshFromSigner","#resolveSigner","#walletAccountFromSigner","#accountPromise"],"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 before the user has connected their\n * 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 /** Return the chain ID of the connected network. */\n async getChainId(): Promise<number> {\n const network = await this.#readProvider.getNetwork();\n return Number(network.chainId);\n }\n\n /** Execute a read-only call and return the decoded result. */\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 /** Return the latest block timestamp in seconds. */\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 /** Wait for a transaction to be mined and return its receipt. */\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 BrowserProvider,\n Contract,\n type InterfaceAbi,\n type Signer,\n type TypedDataDomain,\n} from \"ethers\";\nimport {\n getAddress,\n isHex,\n type Abi,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type EIP1193Provider,\n type Hex,\n} from \"viem\";\nimport {\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n WalletNotConnectedError,\n} from \"../errors\";\nimport type { EIP712TypedData } from \"../relayer/types\";\nimport { BaseSigner } from \"../signer/base-signer\";\nimport { eip1193Subscribe } from \"../signer/eip1193-subscribe\";\nimport type { WalletAccount, WriteContractConfig } from \"../types\";\nimport { swallow } from \"../utils\";\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 wallet events update `walletAccount`.\n *\n * - **Node / direct signer** — `{ signer }`: pass an ethers `Signer` (e.g. `Wallet`).\n * The initial wallet account is discovered asynchronously and emitted through\n * `walletAccount` once available.\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 extends BaseSigner {\n readonly #browserProvider?: BrowserProvider;\n readonly #directSigner?: Signer;\n readonly #eip1193?: EIP1193Provider;\n readonly #unsubscribeProvider: () => void;\n #accountPromise: Promise<WalletAccount | undefined> | undefined;\n\n constructor(config: EthersSignerConfig) {\n super();\n if (\"ethereum\" in config) {\n this.#browserProvider = new BrowserProvider(config.ethereum);\n this.#eip1193 = config.ethereum;\n this.#unsubscribeProvider = eip1193Subscribe({\n provider: config.ethereum,\n getInitialWalletAccount: () => this.#loadBrowserWalletAccount(),\n onWalletAccountChange: ({ next }) => {\n this.walletAccount.setSnapshot(next);\n },\n });\n } else {\n this.#directSigner = config.signer;\n this.#unsubscribeProvider = () => {};\n // The signer is constructed before `createConfig`, so it cannot reach the\n // SDK-wide logger; this best-effort refresh stays silent. A failed refresh\n // still surfaces via the typed WalletAccountNotReadyError on next use.\n void swallow(\"refresh wallet account\", async () => {\n await this.refreshWalletAccount();\n });\n }\n }\n\n /**\n * Return the connected wallet account, or throw {@link WalletAccountNotReadyError}\n * while the initial async lookup is pending, or {@link WalletNotConnectedError}\n * when no wallet is connected.\n */\n override requireWalletAccount(operation: string): WalletAccount {\n const account = this.walletAccount.getSnapshot();\n if (!account && !this.walletAccount.isReady()) {\n throw new WalletAccountNotReadyError(operation);\n }\n if (!account) {\n throw new WalletNotConnectedError(operation);\n }\n return account;\n }\n\n /** Re-fetch the wallet account from the provider or signer and update `walletAccount`. */\n refreshWalletAccount(): Promise<WalletAccount | undefined> {\n if (this.#eip1193) {\n return this.#refreshFromEthereum();\n }\n if (this.#directSigner) {\n return this.#refreshFromSigner(this.#directSigner);\n }\n return Promise.resolve(undefined);\n }\n\n /** Unsubscribe from the EIP-1193 provider's wallet lifecycle events. */\n protected override onDispose(): void {\n this.#unsubscribeProvider();\n }\n\n async #resolveSigner(): Promise<Signer> {\n if (this.#directSigner) {\n return this.#directSigner;\n }\n if (!this.#browserProvider) {\n throw new SignerNotConfiguredError(\"resolveSigner\");\n }\n return this.#browserProvider.getSigner();\n }\n\n async #walletAccountFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n const provider = signer.provider;\n if (!provider) {\n return undefined;\n }\n const [address, network] = await Promise.all([signer.getAddress(), provider.getNetwork()]);\n return { address: getAddress(address), chainId: Number(network.chainId) };\n }\n\n /** Sign EIP-712 typed data (used for decrypt authorization). */\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.#resolveSigner();\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const mutableSigTypes = Object.fromEntries(\n Object.entries(sigTypes).map(([name, fields]) => [name, [...fields]]),\n );\n const sig = await signer.signTypedData(domain as TypedDataDomain, mutableSigTypes, message);\n if (!isHex(sig)) {\n throw new TypeError(`Expected hex string, got: ${sig}`);\n }\n return sig;\n }\n\n /** Send a write transaction and return the tx hash. */\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.#resolveSigner();\n const contract = new Contract(config.address, config.abi as 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 fn = contract.getFunction(config.functionName);\n const tx = await fn(...(config.args as readonly unknown[]), overrides);\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n }\n\n async #refreshFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n this.#accountPromise ??= this.#walletAccountFromSigner(signer)\n .then((account) => {\n this.walletAccount.setSnapshot(account);\n return account;\n })\n .finally(() => {\n this.#accountPromise = undefined;\n });\n return this.#accountPromise;\n }\n\n async #refreshFromEthereum(): Promise<WalletAccount | undefined> {\n const account = await this.#loadBrowserWalletAccount();\n this.walletAccount.setSnapshot(account);\n return account;\n }\n\n async #loadBrowserWalletAccount(): Promise<WalletAccount | undefined> {\n const ethereum = this.#eip1193;\n if (!ethereum) {\n return undefined;\n }\n const [accounts, chainIdValue] = await Promise.all([\n ethereum.request({ method: \"eth_accounts\" }),\n ethereum.request({ method: \"eth_chainId\" }),\n ]);\n if (!Array.isArray(accounts) || typeof accounts[0] !== \"string\") {\n return undefined;\n }\n const chainId = Number(chainIdValue);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) {\n return undefined;\n }\n return { address: getAddress(accounts[0]), chainId };\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 { EncryptedValue } from \"../relayer/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\n/** Minimal transaction request accepted by the ethers contract helpers. */\nexport interface EthersTransactionRequest {\n /** Target contract address. */\n to: Address;\n /** ABI-encoded call data. */\n data: Hex;\n /** Optional gas limit for the transaction. */\n gasLimit?: bigint;\n /** Optional native-token value to send with the call, in wei. */\n value?: bigint;\n}\n\n/** Minimal transaction response returned by an {@link EthersTransactionSigner}. */\nexport interface EthersTransactionResponse {\n /** Hash of the submitted transaction. */\n hash: string;\n}\n\n/** Minimal read-only ethers provider shape used by the read contract helpers. */\nexport interface EthersCallProvider {\n /** Performs an `eth_call` and resolves to the raw hex return data. */\n call(tx: EthersTransactionRequest): Promise<string>;\n}\n\n/** Minimal ethers signer shape used by the write contract helpers. */\nexport interface EthersTransactionSigner extends EthersCallProvider {\n /** Signs and broadcasts a transaction, resolving to the transaction response. */\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\n/** Reads a token's confidential (encrypted) balance handle for `userAddress` via an ethers provider. */\nexport function readConfidentialBalanceOfContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\n/** Reads the underlying ERC-20 address wrapped by a confidential wrapper via an ethers provider. */\nexport function readUnderlyingTokenContract(provider: EthersCallProvider, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\n/** Reads whether a token implements the given ERC-165 interface id via an ethers provider. */\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\n/** Submits a confidential transfer of an encrypted amount to `to` via an ethers signer. */\nexport function writeConfidentialTransferContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return ethersWrite(\n signer,\n confidentialTransferContract(tokenAddress, to, encryptedAmount, inputProof),\n );\n}\n\n/** Submits an unwrap of an encrypted amount from `from` to `to` on a confidential ERC-20 via an ethers signer. */\nexport function writeUnwrapContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\n/** Submits an unwrap of the full encrypted balance from `from` to `to` via an ethers signer. */\nexport function writeUnwrapFromBalanceContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: EncryptedValue,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\n/** Finalizes a pending unwrap request with the decrypted amount and decryption proof via an ethers signer. */\nexport function writeFinalizeUnwrapContract(\n signer: EthersTransactionSigner,\n wrapper: Address,\n unwrapRequestId: EncryptedValue,\n unwrapAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, unwrapRequestId, unwrapAmountCleartext, decryptionProof),\n );\n}\n\n/** Authorizes `operator` on a token, until an optional expiry timestamp, via an ethers signer. */\nexport function writeSetOperatorContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n operator: Address,\n until?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, operator, until));\n}\n\n/** Wraps `amount` of the underlying ERC-20 into confidential tokens credited to `to` via an ethers signer. */\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\n/** Reads all underlying/confidential token pairs from a wrappers registry via an ethers provider. */\nexport function readTokenPairsContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsContract(registry));\n}\n\n/** Reads the number of token pairs in a wrappers registry via an ethers provider. */\nexport function readTokenPairsLengthContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsLengthContract(registry));\n}\n\n/** Reads a slice of token pairs (`fromIndex` to `toIndex`) from a wrappers registry via an ethers provider. */\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\n/** Reads the token pair at `index` from a wrappers registry via an ethers provider. */\nexport function readTokenPairContract(\n provider: EthersCallProvider,\n registry: Address,\n index: bigint,\n) {\n return ethersRead(provider, getTokenPairContract(registry, index));\n}\n\n/** Reads the confidential token registered for a given underlying token in a wrappers registry via an ethers provider. */\nexport function readConfidentialTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\n/** Reads the underlying token registered for a given confidential token in a wrappers registry via an ethers provider. */\nexport function readTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\n/** Reads whether a confidential token is registered and valid in a wrappers registry via an ethers provider. */\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.js","names":["#readProvider","#browserProvider","#directSigner","#eip1193","#unsubscribeProvider","#loadBrowserWalletAccount","#refreshFromEthereum","#refreshFromSigner","#resolveSigner","#walletAccountFromSigner","#accountPromise"],"sources":["../../../src/ethers/contracts.ts","../../../src/ethers/ethers-provider.ts","../../../src/ethers/ethers-signer.ts","../../../src/ethers/config.ts"],"sourcesContent":["import {\n decodeFunctionResult,\n encodeFunctionData,\n isHex,\n type Abi,\n type Address,\n type Hex,\n} from \"viem\";\n\nimport type { EncryptedValue } from \"../relayer/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\n/** Minimal transaction request accepted by the ethers contract helpers. */\nexport interface EthersTransactionRequest {\n /** Target contract address. */\n to: Address;\n /** ABI-encoded call data. */\n data: Hex;\n /** Optional gas limit for the transaction. */\n gasLimit?: bigint;\n /** Optional native-token value to send with the call, in wei. */\n value?: bigint;\n}\n\n/** Minimal transaction response returned by an {@link EthersTransactionSigner}. */\nexport interface EthersTransactionResponse {\n /** Hash of the submitted transaction. */\n hash: string;\n}\n\n/** Minimal read-only ethers provider shape used by the read contract helpers. */\nexport interface EthersCallProvider {\n /** Performs an `eth_call` and resolves to the raw hex return data. */\n call(tx: EthersTransactionRequest): Promise<string>;\n}\n\n/** Minimal ethers signer shape used by the write contract helpers. */\nexport interface EthersTransactionSigner extends EthersCallProvider {\n /** Signs and broadcasts a transaction, resolving to the transaction response. */\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\n/**\n * Performs an `eth_call` through an ethers provider and decodes the result with viem, so every\n * ethers-backed read — the generic {@link EthersProvider.readContract} and the pre-built\n * `readXxxContract` helpers alike — produces viem-identical shapes (small ints as `number`, named\n * tuples as keyed objects, empty output as `undefined`). ethers is the transport only; viem owns\n * encoding and decoding.\n *\n * @internal\n */\nexport async 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\n/** Reads a token's confidential (encrypted) balance handle for `userAddress` via an ethers provider. */\nexport function readConfidentialBalanceOfContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\n/** Reads the underlying ERC-20 address wrapped by a confidential wrapper via an ethers provider. */\nexport function readUnderlyingTokenContract(provider: EthersCallProvider, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\n/** Reads whether a token implements the given ERC-165 interface id via an ethers provider. */\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\n/** Submits a confidential transfer of an encrypted amount to `to` via an ethers signer. */\nexport function writeConfidentialTransferContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return ethersWrite(\n signer,\n confidentialTransferContract(tokenAddress, to, encryptedAmount, inputProof),\n );\n}\n\n/** Submits an unwrap of an encrypted amount from `from` to `to` on a confidential ERC-20 via an ethers signer. */\nexport function writeUnwrapContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\n/** Submits an unwrap of the full encrypted balance from `from` to `to` via an ethers signer. */\nexport function writeUnwrapFromBalanceContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: EncryptedValue,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\n/** Finalizes a pending unwrap request with the decrypted amount and decryption proof via an ethers signer. */\nexport function writeFinalizeUnwrapContract(\n signer: EthersTransactionSigner,\n wrapper: Address,\n unwrapRequestId: EncryptedValue,\n unwrapAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, unwrapRequestId, unwrapAmountCleartext, decryptionProof),\n );\n}\n\n/** Authorizes `operator` on a token, until an optional expiry timestamp, via an ethers signer. */\nexport function writeSetOperatorContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n operator: Address,\n until?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, operator, until));\n}\n\n/** Wraps `amount` of the underlying ERC-20 into confidential tokens credited to `to` via an ethers signer. */\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\n/** Reads all underlying/confidential token pairs from a wrappers registry via an ethers provider. */\nexport function readTokenPairsContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsContract(registry));\n}\n\n/** Reads the number of token pairs in a wrappers registry via an ethers provider. */\nexport function readTokenPairsLengthContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsLengthContract(registry));\n}\n\n/** Reads a slice of token pairs (`fromIndex` to `toIndex`) from a wrappers registry via an ethers provider. */\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\n/** Reads the token pair at `index` from a wrappers registry via an ethers provider. */\nexport function readTokenPairContract(\n provider: EthersCallProvider,\n registry: Address,\n index: bigint,\n) {\n return ethersRead(provider, getTokenPairContract(registry, index));\n}\n\n/** Reads the confidential token registered for a given underlying token in a wrappers registry via an ethers provider. */\nexport function readConfidentialTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\n/** Reads the underlying token registered for a given confidential token in a wrappers registry via an ethers provider. */\nexport function readTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\n/** Reads whether a confidential token is registered and valid in a wrappers registry via an ethers provider. */\nexport function readIsConfidentialTokenValidContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, isConfidentialTokenValidContract(registry, confidentialTokenAddress));\n}\n","import { BrowserProvider } from \"ethers\";\nimport type { ethers } 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\";\nimport { ethersRead } from \"./contracts\";\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 before the user has connected their\n * 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 /** Return the chain ID of the connected network. */\n async getChainId(): Promise<number> {\n const network = await this.#readProvider.getNetwork();\n return Number(network.chainId);\n }\n\n /**\n * Execute a read-only call and return the decoded result.\n *\n * ethers is the transport only: the call goes out over `provider.call`, and viem does the\n * encoding and decoding (via {@link ethersRead}). That keeps the result identical to\n * `ViemProvider` — the return-type contract both providers implement — rather than re-deriving\n * viem's decoding rules (small ints as `number`, named tuples as keyed objects, empty output as\n * `undefined`) from ethers' own decoded values.\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 return ethersRead(this.#readProvider, {\n address: config.address,\n abi: config.abi as readonly unknown[],\n functionName: config.functionName,\n args: config.args as readonly unknown[],\n });\n }\n\n /** Return the latest block timestamp in seconds. */\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 /** Wait for a transaction to be mined and return its receipt. */\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 BrowserProvider,\n Contract,\n type InterfaceAbi,\n type Signer,\n type TypedDataDomain,\n} from \"ethers\";\nimport {\n getAddress,\n isHex,\n type Abi,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type EIP1193Provider,\n type Hex,\n} from \"viem\";\nimport {\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n WalletNotConnectedError,\n} from \"../errors\";\nimport type { EIP712TypedData } from \"../relayer/types\";\nimport { BaseSigner } from \"../signer/base-signer\";\nimport { eip1193Subscribe } from \"../signer/eip1193-subscribe\";\nimport type { WalletAccount, WriteContractConfig } from \"../types\";\nimport { swallow } from \"../utils\";\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 wallet events update `walletAccount`.\n *\n * - **Node / direct signer** — `{ signer }`: pass an ethers `Signer` (e.g. `Wallet`).\n * The initial wallet account is discovered asynchronously and emitted through\n * `walletAccount` once available.\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 extends BaseSigner {\n readonly #browserProvider?: BrowserProvider;\n readonly #directSigner?: Signer;\n readonly #eip1193?: EIP1193Provider;\n readonly #unsubscribeProvider: () => void;\n #accountPromise: Promise<WalletAccount | undefined> | undefined;\n\n constructor(config: EthersSignerConfig) {\n super();\n if (\"ethereum\" in config) {\n this.#browserProvider = new BrowserProvider(config.ethereum);\n this.#eip1193 = config.ethereum;\n this.#unsubscribeProvider = eip1193Subscribe({\n provider: config.ethereum,\n getInitialWalletAccount: () => this.#loadBrowserWalletAccount(),\n onWalletAccountChange: ({ next }) => {\n this.walletAccount.setSnapshot(next);\n },\n });\n } else {\n this.#directSigner = config.signer;\n this.#unsubscribeProvider = () => {};\n // The signer is constructed before `createConfig`, so it cannot reach the\n // SDK-wide logger; this best-effort refresh stays silent. A failed refresh\n // still surfaces via the typed WalletAccountNotReadyError on next use.\n void swallow(\"refresh wallet account\", async () => {\n await this.refreshWalletAccount();\n });\n }\n }\n\n /**\n * Return the connected wallet account, or throw {@link WalletAccountNotReadyError}\n * while the initial async lookup is pending, or {@link WalletNotConnectedError}\n * when no wallet is connected.\n */\n override requireWalletAccount(operation: string): WalletAccount {\n const account = this.walletAccount.getSnapshot();\n if (!account && !this.walletAccount.isReady()) {\n throw new WalletAccountNotReadyError(operation);\n }\n if (!account) {\n throw new WalletNotConnectedError(operation);\n }\n return account;\n }\n\n /** Re-fetch the wallet account from the provider or signer and update `walletAccount`. */\n refreshWalletAccount(): Promise<WalletAccount | undefined> {\n if (this.#eip1193) {\n return this.#refreshFromEthereum();\n }\n if (this.#directSigner) {\n return this.#refreshFromSigner(this.#directSigner);\n }\n return Promise.resolve(undefined);\n }\n\n /** Unsubscribe from the EIP-1193 provider's wallet lifecycle events. */\n protected override onDispose(): void {\n this.#unsubscribeProvider();\n }\n\n async #resolveSigner(): Promise<Signer> {\n if (this.#directSigner) {\n return this.#directSigner;\n }\n if (!this.#browserProvider) {\n throw new SignerNotConfiguredError(\"resolveSigner\");\n }\n return this.#browserProvider.getSigner();\n }\n\n async #walletAccountFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n const provider = signer.provider;\n if (!provider) {\n return undefined;\n }\n const [address, network] = await Promise.all([signer.getAddress(), provider.getNetwork()]);\n return { address: getAddress(address), chainId: Number(network.chainId) };\n }\n\n /** Sign EIP-712 typed data (used for decrypt authorization). */\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.#resolveSigner();\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const mutableSigTypes = Object.fromEntries(\n Object.entries(sigTypes).map(([name, fields]) => [name, [...fields]]),\n );\n const sig = await signer.signTypedData(domain as TypedDataDomain, mutableSigTypes, message);\n if (!isHex(sig)) {\n throw new TypeError(`Expected hex string, got: ${sig}`);\n }\n return sig;\n }\n\n /** Send a write transaction and return the tx hash. */\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.#resolveSigner();\n const contract = new Contract(config.address, config.abi as 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 fn = contract.getFunction(config.functionName);\n const tx = await fn(...(config.args as readonly unknown[]), overrides);\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n }\n\n async #refreshFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n this.#accountPromise ??= this.#walletAccountFromSigner(signer)\n .then((account) => {\n this.walletAccount.setSnapshot(account);\n return account;\n })\n .finally(() => {\n this.#accountPromise = undefined;\n });\n return this.#accountPromise;\n }\n\n async #refreshFromEthereum(): Promise<WalletAccount | undefined> {\n const account = await this.#loadBrowserWalletAccount();\n this.walletAccount.setSnapshot(account);\n return account;\n }\n\n async #loadBrowserWalletAccount(): Promise<WalletAccount | undefined> {\n const ethereum = this.#eip1193;\n if (!ethereum) {\n return undefined;\n }\n const [accounts, chainIdValue] = await Promise.all([\n ethereum.request({ method: \"eth_accounts\" }),\n ethereum.request({ method: \"eth_chainId\" }),\n ]);\n if (!Array.isArray(accounts) || typeof accounts[0] !== \"string\") {\n return undefined;\n }\n const chainId = Number(chainIdValue);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) {\n return undefined;\n }\n return { address: getAddress(accounts[0]), chainId };\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"],"mappings":"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"}
|