@zama-fhe/sdk 3.8.0-beta.2 → 3.8.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/base-signer.cjs +1 -1
- package/dist/cjs/base-signer.cjs.map +1 -1
- package/dist/cjs/index.cjs +1 -1
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/internal/index.cjs +1 -1
- package/dist/cjs/internal/index.cjs.map +1 -1
- package/dist/cjs/telemetry.cjs +1 -1
- package/dist/cjs/typed-data.cjs +2 -0
- package/dist/cjs/typed-data.cjs.map +1 -0
- package/dist/cjs/viem/index.cjs +1 -1
- package/dist/cjs/viem/index.cjs.map +1 -1
- package/dist/esm/{base-signer-BoBsvn5Q.js → base-signer-BEWVhKlH.js} +2 -2
- package/dist/esm/base-signer-BEWVhKlH.js.map +1 -0
- package/dist/esm/{base-signer-BxIDBDTF.d.ts → base-signer-DGO8GM9a.d.ts} +2 -2
- package/dist/esm/cleartext/index.d.ts +2 -2
- package/dist/esm/cleartext/index.js +1 -1
- package/dist/esm/{cleartext-CvCakQal.js → cleartext-BsMrAaxi.js} +2 -2
- package/dist/esm/{cleartext-CvCakQal.js.map → cleartext-BsMrAaxi.js.map} +1 -1
- package/dist/esm/{cleartext-BnTAN4-g.d.ts → cleartext-DZV82a7W.d.ts} +2 -2
- package/dist/esm/{decryption-B0mY2M8N.d.ts → decryption-MH_UY_yy.d.ts} +2 -2
- package/dist/esm/{encrypt-worker-client-BW88njEe.d.ts → encrypt-worker-client-DqAHdt-l.d.ts} +2 -2
- package/dist/esm/ethers/index.d.ts +3 -3
- package/dist/esm/ethers/index.js +1 -1
- package/dist/esm/{fhevm-relayer-CGvejcdJ.js → fhevm-relayer-DAu9xIks.js} +2 -2
- package/dist/esm/{fhevm-relayer-CGvejcdJ.js.map → fhevm-relayer-DAu9xIks.js.map} +1 -1
- package/dist/esm/index-BgczDdN3.d.ts +1 -0
- package/dist/esm/{index-fsWBYM8S.d.ts → index-CNFee7vV.d.ts} +3 -3
- package/dist/esm/{index-DXCcwJ77.d.ts → index-DMgfOH3H.d.ts} +6 -6
- package/dist/esm/index.d.ts +8 -8
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal/index.d.ts +12 -4
- package/dist/esm/internal/index.js +1 -1
- package/dist/esm/internal/index.js.map +1 -1
- package/dist/esm/node/index.d.ts +3 -3
- package/dist/esm/node/index.js +1 -1
- package/dist/esm/query/index.d.ts +5 -5
- package/dist/esm/{telemetry-BDnhC-vh.js → telemetry-BDYRJ84h.js} +2 -2
- package/dist/esm/{telemetry-BDnhC-vh.js.map → telemetry-BDYRJ84h.js.map} +1 -1
- package/dist/esm/typed-data-eAgGr9V-.js +2 -0
- package/dist/esm/typed-data-eAgGr9V-.js.map +1 -0
- package/dist/esm/{types-C2ccCjoA.d.ts → types-C2G1AnCb.d.ts} +2 -2
- package/dist/esm/{types-CHepK8MK.d.ts → types-Cbyk9_mq.d.ts} +13 -3
- package/dist/esm/{types-Dc1fpXWt.d.ts → types-DHdQGM4M.d.ts} +2 -2
- package/dist/esm/vaults/index.d.ts +3 -3
- package/dist/esm/vaults/index.js +1 -1
- package/dist/esm/viem/index.d.ts +3 -3
- package/dist/esm/viem/index.js +1 -1
- package/dist/esm/viem/index.js.map +1 -1
- package/dist/esm/web/index.d.ts +2 -2
- package/dist/esm/web/index.js +1 -1
- package/package.json +1 -1
- package/dist/esm/base-signer-BoBsvn5Q.js.map +0 -1
- package/dist/esm/index-DkN4q5Cm.d.ts +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../fhevm-relayer.cjs"),t=require("../relayer.cjs"),n=require("../fatal-batch.cjs").t;function
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../fhevm-relayer.cjs"),t=require("../relayer.cjs"),n=require("../fatal-batch.cjs"),r=require("../typed-data.cjs"),i=n.t;function a(e,n,r){let a=i[e],o=a?new a(n):new t.r(e,n,e===t.i.RelayerRequestFailed?{retryable:r.retryable}:void 0);return o.retryable&&t.y(r.retryAfter)?Object.assign(o,{retryAfter:r.retryAfter}):o}function o(e,t){return e.onWalletAccountChange(t)}exports.reviveZamaError=a,exports.subscribeWalletAccountChanges=o,exports.toFhevmAuth=e.n,exports.toViemTypedData=r.t;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["fatalBatchErrors","ZamaError","ZamaErrorCode","isValidRetryAfterSeconds"],"sources":["../../../src/errors/revive.ts","../../../src/internal/wallet-events.ts"],"sourcesContent":["import { isValidRetryAfterSeconds } from \"../utils/error\";\nimport { ZamaError, ZamaErrorCode } from \"./base\";\nimport { fatalBatchErrors } from \"./fatal-batch\";\n\nconst callbackErrors: Partial<Record<ZamaErrorCode, new (message: string) => ZamaError>> =\n fatalBatchErrors;\n\n/** Restores callback failures whose class identity controls batch termination. */\nexport function reviveZamaError(\n code: ZamaErrorCode,\n message: string,\n options: { retryable: boolean; retryAfter?: number },\n): ZamaError {\n const Constructor = callbackErrors[code];\n const error = Constructor\n ? new Constructor(message)\n : new ZamaError(\n code,\n message,\n code === ZamaErrorCode.RelayerRequestFailed ? { retryable: options.retryable } : undefined,\n );\n if (error.retryable && isValidRetryAfterSeconds(options.retryAfter)) {\n return Object.assign(error, { retryAfter: options.retryAfter });\n }\n return error;\n}\n","import type { WalletAccountListener } from \"../types/signer\";\nimport type { ZamaSDK } from \"../zama-sdk\";\n\n/** Subscribe after the SDK's wallet cleanup, through the internal integration entry point. */\nexport function subscribeWalletAccountChanges(\n sdk: ZamaSDK,\n listener: WalletAccountListener,\n): () => void {\n return sdk.onWalletAccountChange(listener);\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["fatalBatchErrors","ZamaError","ZamaErrorCode","isValidRetryAfterSeconds"],"sources":["../../../src/errors/revive.ts","../../../src/internal/wallet-events.ts"],"sourcesContent":["import { isValidRetryAfterSeconds } from \"../utils/error\";\nimport { ZamaError, ZamaErrorCode } from \"./base\";\nimport { fatalBatchErrors } from \"./fatal-batch\";\n\nconst callbackErrors: Partial<Record<ZamaErrorCode, new (message: string) => ZamaError>> =\n fatalBatchErrors;\n\n/** Restores callback failures whose class identity controls batch termination. */\nexport function reviveZamaError(\n code: ZamaErrorCode,\n message: string,\n options: { retryable: boolean; retryAfter?: number },\n): ZamaError {\n const Constructor = callbackErrors[code];\n const error = Constructor\n ? new Constructor(message)\n : new ZamaError(\n code,\n message,\n code === ZamaErrorCode.RelayerRequestFailed ? { retryable: options.retryable } : undefined,\n );\n if (error.retryable && isValidRetryAfterSeconds(options.retryAfter)) {\n return Object.assign(error, { retryAfter: options.retryAfter });\n }\n return error;\n}\n","import type { WalletAccountListener } from \"../types/signer\";\nimport type { ZamaSDK } from \"../zama-sdk\";\n\n/** Subscribe after the SDK's wallet cleanup, through the internal integration entry point. */\nexport function subscribeWalletAccountChanges(\n sdk: ZamaSDK,\n listener: WalletAccountListener,\n): () => void {\n return sdk.onWalletAccountChange(listener);\n}\n"],"mappings":"sMAIM,EACJA,EAAAA,EAGF,SAAgB,EACd,EACA,EACA,EACW,CACX,IAAM,EAAc,EAAe,GAC7B,EAAQ,EACV,IAAI,EAAY,CAAO,EACvB,IAAIC,EAAAA,EACF,EACA,EACA,IAASC,EAAAA,EAAc,qBAAuB,CAAE,UAAW,EAAQ,SAAU,EAAI,IAAA,EACnF,EAIJ,OAHI,EAAM,WAAaC,EAAAA,EAAyB,EAAQ,UAAU,EACzD,OAAO,OAAO,EAAO,CAAE,WAAY,EAAQ,UAAW,CAAC,EAEzD,CACT,CCrBA,SAAgB,EACd,EACA,EACY,CACZ,OAAO,EAAI,sBAAsB,CAAQ,CAC3C"}
|
package/dist/cjs/telemetry.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(e,t){return{"x-zama-sdk-version":`3.8.0-beta.
|
|
1
|
+
function e(e,t){return{"x-zama-sdk-version":`3.8.0-beta.4`,"x-zama-sdk-layer":e.state.layer,"x-zama-sdk-runtime":e.runtime,...t!==void 0&&{"x-zama-sdk-operation":t}}}function t(e,t){return Object.assign({},e,{operation:e?.operation??t})}function n(e){let t=e.ZAMA_SDK_TELEMETRY?.trim().toLowerCase();return t===`0`||t===`false`}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return n}});
|
|
2
2
|
//# sourceMappingURL=telemetry.cjs.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(t){return typeof t==`bigint`?t.toString():Array.isArray(t)?t.map(e):typeof t==`object`&&t&&Object.getPrototypeOf(t)===Object.prototype?Object.fromEntries(Object.entries(t).map(([t,n])=>[t,e(n)])):t}function t(t){let{EIP712Domain:n,...r}=t.types,{chainId:i,...a}=t.domain;return{primaryType:t.primaryType,types:r,domain:i===void 0?a:{...a,chainId:Number(i)},message:e(t.message)}}Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return t}});
|
|
2
|
+
//# sourceMappingURL=typed-data.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typed-data.cjs","names":[],"sources":["../../src/viem/typed-data.ts"],"sourcesContent":["import type { TypedDataDefinition } from \"viem\";\nimport type { EIP712TypedData } from \"../relayer/types\";\n\n// A browser extension that patches bigint JSON serialization turns `1n` into `\"1n\"` and the wallet rejects it.\nfunction withoutBigInts(value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n if (Array.isArray(value)) {\n return value.map(withoutBigInts);\n }\n // A `Uint8Array` rebuilt as a plain object makes viem throw.\n if (\n value !== null &&\n typeof value === \"object\" &&\n Object.getPrototypeOf(value) === Object.prototype\n ) {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [key, withoutBigInts(entry)]),\n );\n }\n return value;\n}\n\n/**\n * Convert a decryption-permit {@link EIP712TypedData} into what viem's `signTypedData`\n * takes: `EIP712Domain` removed, `chainId` a number, no `bigint` left in the payload.\n */\nexport function toViemTypedData(typedData: EIP712TypedData): TypedDataDefinition {\n const { EIP712Domain: _, ...types } = typedData.types;\n // viem derives `EIP712Domain` from runtime value types and drops a string `chainId` from the signed domain.\n const { chainId, ...domain } = typedData.domain;\n return {\n primaryType: typedData.primaryType,\n types,\n domain: chainId === undefined ? domain : { ...domain, chainId: Number(chainId) },\n message: withoutBigInts(typedData.message),\n // Cast: the input is structurally typed, so viem's generics cannot correlate `primaryType`, `types` and `message`.\n } as TypedDataDefinition;\n}\n"],"mappings":"AAIA,SAAS,EAAe,EAAyB,CAiB/C,OAhBI,OAAO,GAAU,SACZ,EAAM,SAAS,EAEpB,MAAM,QAAQ,CAAK,EACd,EAAM,IAAI,CAAc,EAK/B,OAAO,GAAU,UADjB,GAEA,OAAO,eAAe,CAAK,IAAM,OAAO,UAEjC,OAAO,YACZ,OAAO,QAAQ,CAAK,CAAC,CAAC,KAAK,CAAC,EAAK,KAAW,CAAC,EAAK,EAAe,CAAK,CAAC,CAAC,CAC1E,EAEK,CACT,CAMA,SAAgB,EAAgB,EAAiD,CAC/E,GAAM,CAAE,aAAc,EAAG,GAAG,GAAU,EAAU,MAE1C,CAAE,UAAS,GAAG,GAAW,EAAU,OACzC,MAAO,CACL,YAAa,EAAU,YACvB,QACA,OAAQ,IAAY,IAAA,GAAY,EAAS,CAAE,GAAG,EAAQ,QAAS,OAAO,CAAO,CAAE,EAC/E,QAAS,EAAe,EAAU,OAAO,CAE3C,CACF"}
|
package/dist/cjs/viem/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../erc165.cjs"),t=require("../base-signer.cjs"),n=require("../wrappers-registry.cjs"),r=require("../eip1193-subscribe.cjs");let
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../erc165.cjs"),t=require("../base-signer.cjs"),n=require("../wrappers-registry.cjs"),r=require("../typed-data.cjs"),i=require("../eip1193-subscribe.cjs");let a=require("viem");var o=class{#e;constructor(e){this.#e=e.publicClient}async getChainId(){return this.#e.getChainId()}async readContract(e){return this.#e.readContract(e)}async waitForTransactionReceipt(e){return this.#e.waitForTransactionReceipt({hash:e})}async getBlockTimestamp(){return(await this.#e.getBlock()).timestamp}async prepareTransaction(t){let{from:n,calldata:r}=t,i=(0,a.encodeFunctionData)({abi:r.abi,functionName:r.functionName,args:r.args}),o=this.#e.getChainId(),s=t.nonce===void 0?this.#e.getTransactionCount({address:n,blockTag:`pending`}):Promise.resolve(t.nonce),c=t.gasLimit===void 0?r.gas??this.#e.estimateGas({account:n,to:r.address,data:i,value:r.value??0n}).catch(t=>{throw new e.H(`ViemProvider.prepareTransaction: gas estimation reverted for ${r.functionName} on ${r.address}`,{cause:t})}):Promise.resolve(t.gasLimit),l=t.fees??this.#e.estimateFeesPerGas(),[u,d,f,p]=await Promise.all([o,s,c,l]);return(0,a.serializeTransaction)({type:`eip1559`,chainId:u,nonce:d,to:r.address,data:i,value:r.value??0n,gas:f,maxFeePerGas:p.maxFeePerGas,maxPriorityFeePerGas:p.maxPriorityFeePerGas})}};function s(e){if(!(!e.account||!e.chain))return{address:(0,a.getAddress)(e.account.address),chainId:e.chain.id}}var c=class extends t.t{#e;#t;#n;constructor(e){super(s(e.walletClient)),this.#e=e.walletClient,this.#t=e.ethereum,this.#n=this.#i()}#r(t){if(!this.#e.account)throw new e.B(t);return{walletClient:this.#e,account:this.#e.account}}async signTypedData(e){let{walletClient:t,account:n}=this.#r(`signTypedData`);return t.signTypedData({account:n,...r.t(e)})}async writeContract(e){let{walletClient:t,account:n}=this.#r(`writeContract`);return t.writeContract({chain:t.chain,account:n,...e})}#i(){return this.#t?i.t({provider:this.#t,getInitialWalletAccount:()=>s(this.#e),onWalletAccountChange:({next:e})=>{this.walletAccount.setSnapshot(e)}}):()=>{}}onDispose(){this.#n()}};function l(e){return t.i(new c({walletClient:e.walletClient,ethereum:e.ethereum}),new o({publicClient:e.publicClient}),e)}function u(e){if(!e.account)throw TypeError(`WalletClient has no account`);return e.account}function d(t,n,r){return t.readContract(e.h(n,r))}function f(t,n){return t.readContract(e.E(n))}function p(t,n,r){return t.readContract(e.s(n,r))}function m(t,n,r,i,a){return t.writeContract({chain:t.chain,account:u(t),...e.v(n,r,i,a)})}function h(t,n,r,i,a,o){return t.writeContract({chain:t.chain,account:u(t),...e.D(n,r,i,a,o)})}function g(t,n,r,i,a){return t.writeContract({chain:t.chain,account:u(t),...e.O(n,r,i,a)})}function _(t,n,r,i,a){return t.writeContract({chain:t.chain,account:u(t),...e.x(n,r,i,a)})}function v(t,n,r,i){return t.writeContract({chain:t.chain,account:u(t),...e.T(n,r,i)})}function y(t,n,r,i){return t.writeContract({chain:t.chain,account:u(t),...e.A(n,r,i)})}function b(e,t){return e.readContract(n.i(t))}function x(e,t){return e.readContract(n.a(t))}function S(e,t,r,i){return e.readContract(n.o(t,r,i))}function C(e,t,r){return e.readContract(n.r(t,r))}function w(e,t,r){return e.readContract(n.t(t,r))}function T(e,t,r){return e.readContract(n.n(t,r))}function E(e,t,r){return e.readContract(n.s(t,r))}exports.BaseSigner=t.t,exports.ViemProvider=o,exports.ViemSigner=c,exports.ZamaSDKEvents=e.F,exports.createConfig=l,exports.readConfidentialBalanceOfContract=d,exports.readConfidentialTokenAddressContract=w,exports.readIsConfidentialTokenValidContract=E,exports.readSupportsInterfaceContract=p,exports.readTokenAddressContract=T,exports.readTokenPairContract=C,exports.readTokenPairsContract=b,exports.readTokenPairsLengthContract=x,exports.readTokenPairsSliceContract=S,exports.readUnderlyingTokenContract=f,exports.writeConfidentialTransferContract=m,exports.writeFinalizeUnwrapContract=_,exports.writeSetOperatorContract=v,exports.writeUnwrapContract=h,exports.writeUnwrapFromBalanceContract=g,exports.writeWrapContract=y;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["#publicClient","TransactionRevertedError","BaseSigner","#walletClient","#ethereum","#unsubscribeProvider","#subscribeToProvider","WalletNotConnectedError","#requireAccount","eip1193Subscribe","buildZamaConfig","confidentialBalanceOfContract","underlyingContract","supportsInterfaceContract","confidentialTransferContract","unwrapContract","unwrapFromBalanceContract","finalizeUnwrapContract","setOperatorContract","wrapContract","getTokenPairsContract","getTokenPairsLengthContract","getTokenPairsSliceContract","getTokenPairContract","getConfidentialTokenAddressContract","getTokenAddressContract","isConfidentialTokenValidContract"],"sources":["../../../src/viem/viem-provider.ts","../../../src/viem/viem-signer.ts","../../../src/viem/config.ts","../../../src/viem/contracts.ts"],"sourcesContent":["import {\n encodeFunctionData,\n serializeTransaction,\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type ContractFunctionReturnType,\n type Hex,\n type PublicClient,\n} from \"viem\";\nimport { TransactionRevertedError } from \"../errors\";\nimport type {\n ContractAbi,\n GenericProvider,\n ReadContractConfig,\n TransactionReceipt,\n WriteContractArgs,\n WriteContractConfig,\n WriteFunctionName,\n} from \"../types\";\n\n/** Configuration for {@link ViemProvider}. */\nexport interface ViemProviderConfig {\n /** A viem `PublicClient` backing all read operations. */\n publicClient: PublicClient;\n}\n\n/**\n * Read-only {@link GenericProvider} backed by a viem `PublicClient`.\n *\n * Use this for integrations that only need public chain reads before the user has Pair with a\n * {@link ViemSigner} when wallet authority is required; the two can share a transport or point at\n * independent RPCs.\n *\n * @example\n * ```ts\n * const publicClient = createPublicClient({ chain: sepolia, transport: http(ALCHEMY_URL) });\n * const provider = new ViemProvider({ publicClient });\n * ```\n */\nexport class ViemProvider implements GenericProvider {\n readonly #publicClient: PublicClient;\n\n constructor(config: ViemProviderConfig) {\n this.#publicClient = config.publicClient;\n }\n\n /** Return the chain ID of the connected network. */\n async getChainId(): Promise<number> {\n return this.#publicClient.getChainId();\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 return this.#publicClient.readContract(config);\n }\n\n /** Wait for a transaction to be mined and return its receipt. */\n async waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt> {\n return this.#publicClient.waitForTransactionReceipt({ hash });\n }\n\n /** Return the latest block timestamp in seconds. */\n async getBlockTimestamp(): Promise<bigint> {\n const block = await this.#publicClient.getBlock();\n return block.timestamp;\n }\n\n /** Build a fully-populated, RLP-encoded unsigned transaction ready to be signed offline. */\n async prepareTransaction<\n const TAbi extends ContractAbi,\n TFunctionName extends WriteFunctionName<TAbi>,\n const TArgs extends WriteContractArgs<TAbi, TFunctionName>,\n >(args: {\n from: Address;\n calldata: WriteContractConfig<TAbi, TFunctionName, TArgs>;\n nonce?: number;\n gasLimit?: bigint;\n fees?: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint };\n }): Promise<Hex> {\n const { from, calldata } = args;\n const data = encodeFunctionData({\n abi: calldata.abi as Abi,\n functionName: calldata.functionName as string,\n args: calldata.args as readonly unknown[],\n });\n // Wrap the estimateGas leg so a pre-flight revert (the most common\n // prepareTransaction failure) surfaces as a typed error with the\n // function name + cause. Other legs propagate as-is — failures there\n // (chainId, nonce, fee data) are rare and usually self-explanatory.\n // Skip the network round-trips entirely when the caller supplied\n // overrides — useful for custodians with their own nonce/fee managers.\n const chainIdPromise = this.#publicClient.getChainId();\n const noncePromise =\n args.nonce !== undefined\n ? Promise.resolve(args.nonce)\n : this.#publicClient.getTransactionCount({ address: from, blockTag: \"pending\" });\n const gasPromise =\n args.gasLimit !== undefined\n ? Promise.resolve(args.gasLimit)\n : (calldata.gas ??\n this.#publicClient\n .estimateGas({ account: from, to: calldata.address, data, value: calldata.value ?? 0n })\n .catch((error: unknown) => {\n throw new TransactionRevertedError(\n `ViemProvider.prepareTransaction: gas estimation reverted for ${calldata.functionName} on ${calldata.address}`,\n { cause: error },\n );\n }));\n const feesPromise = args.fees ?? this.#publicClient.estimateFeesPerGas();\n const [chainId, nonce, gas, fees] = await Promise.all([\n chainIdPromise,\n noncePromise,\n gasPromise,\n feesPromise,\n ]);\n return serializeTransaction({\n type: \"eip1559\",\n chainId,\n nonce,\n to: calldata.address,\n data,\n value: calldata.value ?? 0n,\n gas,\n maxFeePerGas: fees.maxFeePerGas,\n maxPriorityFeePerGas: fees.maxPriorityFeePerGas,\n });\n }\n}\n","import type {\n Account,\n Abi,\n ContractFunctionArgs,\n ContractFunctionName,\n EIP1193Provider,\n WalletClient,\n Hex,\n} from \"viem\";\nimport { getAddress } from \"viem\";\nimport type { writeContract } from \"viem/actions\";\nimport { WalletNotConnectedError } 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\";\n\n/**\n * Configuration for {@link ViemSigner}.\n *\n * The optional `ethereum` field is needed for `subscribe()` (EIP-1193\n * `accountsChanged` / `disconnect` events). It cannot be auto-extracted from\n * `walletClient` because viem's `custom(ethereum)` transport captures the\n * provider in a closure and does **not** expose `on` / `removeListener` on\n * `walletClient.transport`.\n *\n * If you omit `ethereum`, `subscribe()` returns a no-op. For automatic\n * wallet lifecycle handling, consider using `WagmiSigner` instead.\n */\nexport interface ViemSignerConfig {\n /** Wallet client for signing and write operations. */\n walletClient: WalletClient;\n /** Raw EIP-1193 provider enabling wallet lifecycle events; omit for a no-op `subscribe()`. */\n ethereum?: EIP1193Provider;\n}\n\n// viem requires uint values as bigints, but the KMS permit message carries them\n// as decimal strings. Convert by declared field type rather than by name so every\n// permit version is covered (V1 `durationDays`, V2 `durationSeconds`, ...).\nfunction messageWithBigIntUints(typedData: EIP712TypedData): Record<string, unknown> {\n const fields = (typedData.primaryType ? typedData.types[typedData.primaryType] : undefined) ?? [];\n const message: Record<string, unknown> = { ...typedData.message };\n for (const { name, type } of fields) {\n if (/^uint\\d*$/.test(type)) {\n message[name] = BigInt(message[name] as string | number | bigint);\n }\n }\n return message;\n}\n\nfunction walletAccountFromWalletClient(walletClient: WalletClient): WalletAccount | undefined {\n if (!walletClient.account || !walletClient.chain) {\n return undefined;\n }\n const address = getAddress(walletClient.account.address);\n return { address, chainId: walletClient.chain.id };\n}\n\n/**\n * {@link GenericSigner} backed by a viem `WalletClient` for EIP-712 signing and\n * write transactions. Pass `ethereum` in {@link ViemSignerConfig} to track\n * wallet lifecycle events.\n */\nexport class ViemSigner extends BaseSigner {\n readonly #walletClient: WalletClient;\n readonly #ethereum?: EIP1193Provider;\n readonly #unsubscribeProvider: () => void;\n\n constructor(config: ViemSignerConfig) {\n super(walletAccountFromWalletClient(config.walletClient));\n this.#walletClient = config.walletClient;\n this.#ethereum = config.ethereum;\n this.#unsubscribeProvider = this.#subscribeToProvider();\n }\n\n #requireAccount(operation: string): { walletClient: WalletClient; account: Account } {\n if (!this.#walletClient.account) {\n throw new WalletNotConnectedError(operation);\n }\n return { walletClient: this.#walletClient, account: this.#walletClient.account };\n }\n\n /** Sign EIP-712 typed data (used for decrypt authorization). */\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const { walletClient, account } = this.#requireAccount(\"signTypedData\");\n const { EIP712Domain: _, ...sigTypes } = typedData.types;\n return walletClient.signTypedData({\n account,\n primaryType: typedData.primaryType,\n types: sigTypes,\n domain: typedData.domain,\n message: messageWithBigIntUints(typedData),\n // Cast: EIP712TypedData is structural (`Eip712Like`), so viem cannot correlate primaryType/types/message and the inferred `message` collapses to `never`.\n } as Parameters<typeof walletClient.signTypedData>[0]);\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 { walletClient, account } = this.#requireAccount(\"writeContract\");\n return walletClient.writeContract({\n chain: walletClient.chain,\n account,\n ...config,\n } as Parameters<typeof writeContract>[1]);\n }\n\n #subscribeToProvider(): () => void {\n if (!this.#ethereum) {\n return () => {};\n }\n return eip1193Subscribe({\n provider: this.#ethereum,\n getInitialWalletAccount: () => walletAccountFromWalletClient(this.#walletClient),\n onWalletAccountChange: ({ next }) => {\n this.walletAccount.setSnapshot(next);\n },\n });\n }\n\n /** Unsubscribe from the EIP-1193 provider's wallet lifecycle events. */\n protected override onDispose(): void {\n this.#unsubscribeProvider();\n }\n}\n","import type { FheChain } from \"../chains\";\nimport type { ZamaConfig } from \"../config/types\";\nimport { buildZamaConfig } from \"../config/build\";\nimport { ViemProvider } from \"./viem-provider\";\nimport { ViemSigner } from \"./viem-signer\";\nimport type { ZamaConfigViem } from \"./types\";\n\n/** Create a {@link ZamaConfig} from viem clients. */\nexport function createConfig<const TChains extends readonly [FheChain, ...FheChain[]]>(\n params: ZamaConfigViem<TChains>,\n): ZamaConfig {\n const signer = new ViemSigner({ walletClient: params.walletClient, ethereum: params.ethereum });\n const provider = new ViemProvider({ publicClient: params.publicClient });\n return buildZamaConfig(signer, provider, params);\n}\n","import type { PublicClient, WalletClient, Address, Hex } from \"viem\";\nimport type { EncryptedValue } from \"../relayer/types\";\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\n// ── Helpers ────────────────────────────────────────────────\n\nfunction requireAccount(client: WalletClient) {\n if (!client.account) {\n throw new TypeError(\"WalletClient has no account\");\n }\n return client.account;\n}\n\n// ── Read helpers ────────────────────────────────────────────\n\n/** Reads a token's confidential (encrypted) balance handle for `userAddress` via a viem client. */\nexport function readConfidentialBalanceOfContract(\n client: PublicClient,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return client.readContract(confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\n/** Reads the underlying ERC-20 address wrapped by a confidential wrapper via a viem client. */\nexport function readUnderlyingTokenContract(client: PublicClient, wrapperAddress: Address) {\n return client.readContract(underlyingContract(wrapperAddress));\n}\n\n/** Reads whether a token implements the given ERC-165 interface id via a viem client. */\nexport function readSupportsInterfaceContract(\n client: PublicClient,\n tokenAddress: Address,\n interfaceId: Address,\n) {\n return client.readContract(supportsInterfaceContract(tokenAddress, interfaceId));\n}\n\n// ── Write helpers ───────────────────────────────────────────\n\n/** Submits a confidential transfer of an encrypted amount to `to` via a viem wallet client. */\nexport function writeConfidentialTransferContract(\n client: WalletClient,\n tokenAddress: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\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 a viem wallet client. */\nexport function writeUnwrapContract(\n client: WalletClient,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof),\n });\n}\n\n/** Submits an unwrap of the full encrypted balance from `from` to `to` via a viem wallet client. */\nexport function writeUnwrapFromBalanceContract(\n client: WalletClient,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: EncryptedValue,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance),\n });\n}\n\n/** Finalizes a pending unwrap request with the decrypted amount and decryption proof via a viem wallet client. */\nexport function writeFinalizeUnwrapContract(\n client: WalletClient,\n wrapper: Address,\n unwrapRequestId: EncryptedValue,\n unwrapAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...finalizeUnwrapContract(wrapper, unwrapRequestId, unwrapAmountCleartext, decryptionProof),\n });\n}\n\n/** Authorizes `operator` on a token, until an optional expiry timestamp, via a viem wallet client. */\nexport function writeSetOperatorContract(\n client: WalletClient,\n tokenAddress: Address,\n operator: Address,\n until?: number,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...setOperatorContract(tokenAddress, operator, until),\n });\n}\n\n/** Wraps `amount` of the underlying ERC-20 into confidential tokens credited to `to` via a viem wallet client. */\nexport function writeWrapContract(\n client: WalletClient,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...wrapContract(wrapperAddress, to, amount),\n });\n}\n\n// ── Registry read helpers ──────────────────────────────────\n\n/** Reads all underlying/confidential token pairs from a wrappers registry via a viem client. */\nexport function readTokenPairsContract(client: PublicClient, registry: Address) {\n return client.readContract(getTokenPairsContract(registry));\n}\n\n/** Reads the number of token pairs in a wrappers registry via a viem client. */\nexport function readTokenPairsLengthContract(client: PublicClient, registry: Address) {\n return client.readContract(getTokenPairsLengthContract(registry));\n}\n\n/** Reads a slice of token pairs (`fromIndex` to `toIndex`) from a wrappers registry via a viem client. */\nexport function readTokenPairsSliceContract(\n client: PublicClient,\n registry: Address,\n fromIndex: bigint,\n toIndex: bigint,\n) {\n return client.readContract(getTokenPairsSliceContract(registry, fromIndex, toIndex));\n}\n\n/** Reads the token pair at `index` from a wrappers registry via a viem client. */\nexport function readTokenPairContract(client: PublicClient, registry: Address, index: bigint) {\n return client.readContract(getTokenPairContract(registry, index));\n}\n\n/** Reads the confidential token registered for a given underlying token in a wrappers registry via a viem client. */\nexport function readConfidentialTokenAddressContract(\n client: PublicClient,\n registry: Address,\n tokenAddress: Address,\n) {\n return client.readContract(getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\n/** Reads the underlying token registered for a given confidential token in a wrappers registry via a viem client. */\nexport function readTokenAddressContract(\n client: PublicClient,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return client.readContract(getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\n/** Reads whether a confidential token is registered and valid in a wrappers registry via a viem client. */\nexport function readIsConfidentialTokenValidContract(\n client: PublicClient,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return client.readContract(isConfidentialTokenValidContract(registry, confidentialTokenAddress));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["#publicClient","TransactionRevertedError","BaseSigner","#walletClient","#ethereum","#unsubscribeProvider","#subscribeToProvider","WalletNotConnectedError","#requireAccount","toViemTypedData","eip1193Subscribe","buildZamaConfig","confidentialBalanceOfContract","underlyingContract","supportsInterfaceContract","confidentialTransferContract","unwrapContract","unwrapFromBalanceContract","finalizeUnwrapContract","setOperatorContract","wrapContract","getTokenPairsContract","getTokenPairsLengthContract","getTokenPairsSliceContract","getTokenPairContract","getConfidentialTokenAddressContract","getTokenAddressContract","isConfidentialTokenValidContract"],"sources":["../../../src/viem/viem-provider.ts","../../../src/viem/viem-signer.ts","../../../src/viem/config.ts","../../../src/viem/contracts.ts"],"sourcesContent":["import {\n encodeFunctionData,\n serializeTransaction,\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type ContractFunctionReturnType,\n type Hex,\n type PublicClient,\n} from \"viem\";\nimport { TransactionRevertedError } from \"../errors\";\nimport type {\n ContractAbi,\n GenericProvider,\n ReadContractConfig,\n TransactionReceipt,\n WriteContractArgs,\n WriteContractConfig,\n WriteFunctionName,\n} from \"../types\";\n\n/** Configuration for {@link ViemProvider}. */\nexport interface ViemProviderConfig {\n /** A viem `PublicClient` backing all read operations. */\n publicClient: PublicClient;\n}\n\n/**\n * Read-only {@link GenericProvider} backed by a viem `PublicClient`.\n *\n * Use this for integrations that only need public chain reads before the user has Pair with a\n * {@link ViemSigner} when wallet authority is required; the two can share a transport or point at\n * independent RPCs.\n *\n * @example\n * ```ts\n * const publicClient = createPublicClient({ chain: sepolia, transport: http(ALCHEMY_URL) });\n * const provider = new ViemProvider({ publicClient });\n * ```\n */\nexport class ViemProvider implements GenericProvider {\n readonly #publicClient: PublicClient;\n\n constructor(config: ViemProviderConfig) {\n this.#publicClient = config.publicClient;\n }\n\n /** Return the chain ID of the connected network. */\n async getChainId(): Promise<number> {\n return this.#publicClient.getChainId();\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 return this.#publicClient.readContract(config);\n }\n\n /** Wait for a transaction to be mined and return its receipt. */\n async waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt> {\n return this.#publicClient.waitForTransactionReceipt({ hash });\n }\n\n /** Return the latest block timestamp in seconds. */\n async getBlockTimestamp(): Promise<bigint> {\n const block = await this.#publicClient.getBlock();\n return block.timestamp;\n }\n\n /** Build a fully-populated, RLP-encoded unsigned transaction ready to be signed offline. */\n async prepareTransaction<\n const TAbi extends ContractAbi,\n TFunctionName extends WriteFunctionName<TAbi>,\n const TArgs extends WriteContractArgs<TAbi, TFunctionName>,\n >(args: {\n from: Address;\n calldata: WriteContractConfig<TAbi, TFunctionName, TArgs>;\n nonce?: number;\n gasLimit?: bigint;\n fees?: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint };\n }): Promise<Hex> {\n const { from, calldata } = args;\n const data = encodeFunctionData({\n abi: calldata.abi as Abi,\n functionName: calldata.functionName as string,\n args: calldata.args as readonly unknown[],\n });\n // Wrap the estimateGas leg so a pre-flight revert (the most common\n // prepareTransaction failure) surfaces as a typed error with the\n // function name + cause. Other legs propagate as-is — failures there\n // (chainId, nonce, fee data) are rare and usually self-explanatory.\n // Skip the network round-trips entirely when the caller supplied\n // overrides — useful for custodians with their own nonce/fee managers.\n const chainIdPromise = this.#publicClient.getChainId();\n const noncePromise =\n args.nonce !== undefined\n ? Promise.resolve(args.nonce)\n : this.#publicClient.getTransactionCount({ address: from, blockTag: \"pending\" });\n const gasPromise =\n args.gasLimit !== undefined\n ? Promise.resolve(args.gasLimit)\n : (calldata.gas ??\n this.#publicClient\n .estimateGas({ account: from, to: calldata.address, data, value: calldata.value ?? 0n })\n .catch((error: unknown) => {\n throw new TransactionRevertedError(\n `ViemProvider.prepareTransaction: gas estimation reverted for ${calldata.functionName} on ${calldata.address}`,\n { cause: error },\n );\n }));\n const feesPromise = args.fees ?? this.#publicClient.estimateFeesPerGas();\n const [chainId, nonce, gas, fees] = await Promise.all([\n chainIdPromise,\n noncePromise,\n gasPromise,\n feesPromise,\n ]);\n return serializeTransaction({\n type: \"eip1559\",\n chainId,\n nonce,\n to: calldata.address,\n data,\n value: calldata.value ?? 0n,\n gas,\n maxFeePerGas: fees.maxFeePerGas,\n maxPriorityFeePerGas: fees.maxPriorityFeePerGas,\n });\n }\n}\n","import type {\n Account,\n Abi,\n ContractFunctionArgs,\n ContractFunctionName,\n EIP1193Provider,\n WalletClient,\n Hex,\n} from \"viem\";\nimport { getAddress } from \"viem\";\nimport type { writeContract } from \"viem/actions\";\nimport { WalletNotConnectedError } 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 { toViemTypedData } from \"./typed-data\";\n\n/**\n * Configuration for {@link ViemSigner}.\n *\n * The optional `ethereum` field is needed for `subscribe()` (EIP-1193\n * `accountsChanged` / `disconnect` events). It cannot be auto-extracted from\n * `walletClient` because viem's `custom(ethereum)` transport captures the\n * provider in a closure and does **not** expose `on` / `removeListener` on\n * `walletClient.transport`.\n *\n * If you omit `ethereum`, `subscribe()` returns a no-op. For automatic\n * wallet lifecycle handling, consider using `WagmiSigner` instead.\n */\nexport interface ViemSignerConfig {\n /** Wallet client for signing and write operations. */\n walletClient: WalletClient;\n /** Raw EIP-1193 provider enabling wallet lifecycle events; omit for a no-op `subscribe()`. */\n ethereum?: EIP1193Provider;\n}\n\nfunction walletAccountFromWalletClient(walletClient: WalletClient): WalletAccount | undefined {\n if (!walletClient.account || !walletClient.chain) {\n return undefined;\n }\n const address = getAddress(walletClient.account.address);\n return { address, chainId: walletClient.chain.id };\n}\n\n/**\n * {@link GenericSigner} backed by a viem `WalletClient` for EIP-712 signing and\n * write transactions. Pass `ethereum` in {@link ViemSignerConfig} to track\n * wallet lifecycle events.\n */\nexport class ViemSigner extends BaseSigner {\n readonly #walletClient: WalletClient;\n readonly #ethereum?: EIP1193Provider;\n readonly #unsubscribeProvider: () => void;\n\n constructor(config: ViemSignerConfig) {\n super(walletAccountFromWalletClient(config.walletClient));\n this.#walletClient = config.walletClient;\n this.#ethereum = config.ethereum;\n this.#unsubscribeProvider = this.#subscribeToProvider();\n }\n\n #requireAccount(operation: string): { walletClient: WalletClient; account: Account } {\n if (!this.#walletClient.account) {\n throw new WalletNotConnectedError(operation);\n }\n return { walletClient: this.#walletClient, account: this.#walletClient.account };\n }\n\n /** Sign EIP-712 typed data (used for decrypt authorization). */\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const { walletClient, account } = this.#requireAccount(\"signTypedData\");\n return walletClient.signTypedData({ account, ...toViemTypedData(typedData) });\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 { walletClient, account } = this.#requireAccount(\"writeContract\");\n return walletClient.writeContract({\n chain: walletClient.chain,\n account,\n ...config,\n } as Parameters<typeof writeContract>[1]);\n }\n\n #subscribeToProvider(): () => void {\n if (!this.#ethereum) {\n return () => {};\n }\n return eip1193Subscribe({\n provider: this.#ethereum,\n getInitialWalletAccount: () => walletAccountFromWalletClient(this.#walletClient),\n onWalletAccountChange: ({ next }) => {\n this.walletAccount.setSnapshot(next);\n },\n });\n }\n\n /** Unsubscribe from the EIP-1193 provider's wallet lifecycle events. */\n protected override onDispose(): void {\n this.#unsubscribeProvider();\n }\n}\n","import type { FheChain } from \"../chains\";\nimport type { ZamaConfig } from \"../config/types\";\nimport { buildZamaConfig } from \"../config/build\";\nimport { ViemProvider } from \"./viem-provider\";\nimport { ViemSigner } from \"./viem-signer\";\nimport type { ZamaConfigViem } from \"./types\";\n\n/** Create a {@link ZamaConfig} from viem clients. */\nexport function createConfig<const TChains extends readonly [FheChain, ...FheChain[]]>(\n params: ZamaConfigViem<TChains>,\n): ZamaConfig {\n const signer = new ViemSigner({ walletClient: params.walletClient, ethereum: params.ethereum });\n const provider = new ViemProvider({ publicClient: params.publicClient });\n return buildZamaConfig(signer, provider, params);\n}\n","import type { PublicClient, WalletClient, Address, Hex } from \"viem\";\nimport type { EncryptedValue } from \"../relayer/types\";\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\n// ── Helpers ────────────────────────────────────────────────\n\nfunction requireAccount(client: WalletClient) {\n if (!client.account) {\n throw new TypeError(\"WalletClient has no account\");\n }\n return client.account;\n}\n\n// ── Read helpers ────────────────────────────────────────────\n\n/** Reads a token's confidential (encrypted) balance handle for `userAddress` via a viem client. */\nexport function readConfidentialBalanceOfContract(\n client: PublicClient,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return client.readContract(confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\n/** Reads the underlying ERC-20 address wrapped by a confidential wrapper via a viem client. */\nexport function readUnderlyingTokenContract(client: PublicClient, wrapperAddress: Address) {\n return client.readContract(underlyingContract(wrapperAddress));\n}\n\n/** Reads whether a token implements the given ERC-165 interface id via a viem client. */\nexport function readSupportsInterfaceContract(\n client: PublicClient,\n tokenAddress: Address,\n interfaceId: Address,\n) {\n return client.readContract(supportsInterfaceContract(tokenAddress, interfaceId));\n}\n\n// ── Write helpers ───────────────────────────────────────────\n\n/** Submits a confidential transfer of an encrypted amount to `to` via a viem wallet client. */\nexport function writeConfidentialTransferContract(\n client: WalletClient,\n tokenAddress: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\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 a viem wallet client. */\nexport function writeUnwrapContract(\n client: WalletClient,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: EncryptedValue,\n inputProof: Hex,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof),\n });\n}\n\n/** Submits an unwrap of the full encrypted balance from `from` to `to` via a viem wallet client. */\nexport function writeUnwrapFromBalanceContract(\n client: WalletClient,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: EncryptedValue,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance),\n });\n}\n\n/** Finalizes a pending unwrap request with the decrypted amount and decryption proof via a viem wallet client. */\nexport function writeFinalizeUnwrapContract(\n client: WalletClient,\n wrapper: Address,\n unwrapRequestId: EncryptedValue,\n unwrapAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...finalizeUnwrapContract(wrapper, unwrapRequestId, unwrapAmountCleartext, decryptionProof),\n });\n}\n\n/** Authorizes `operator` on a token, until an optional expiry timestamp, via a viem wallet client. */\nexport function writeSetOperatorContract(\n client: WalletClient,\n tokenAddress: Address,\n operator: Address,\n until?: number,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...setOperatorContract(tokenAddress, operator, until),\n });\n}\n\n/** Wraps `amount` of the underlying ERC-20 into confidential tokens credited to `to` via a viem wallet client. */\nexport function writeWrapContract(\n client: WalletClient,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n) {\n return client.writeContract({\n chain: client.chain,\n account: requireAccount(client),\n ...wrapContract(wrapperAddress, to, amount),\n });\n}\n\n// ── Registry read helpers ──────────────────────────────────\n\n/** Reads all underlying/confidential token pairs from a wrappers registry via a viem client. */\nexport function readTokenPairsContract(client: PublicClient, registry: Address) {\n return client.readContract(getTokenPairsContract(registry));\n}\n\n/** Reads the number of token pairs in a wrappers registry via a viem client. */\nexport function readTokenPairsLengthContract(client: PublicClient, registry: Address) {\n return client.readContract(getTokenPairsLengthContract(registry));\n}\n\n/** Reads a slice of token pairs (`fromIndex` to `toIndex`) from a wrappers registry via a viem client. */\nexport function readTokenPairsSliceContract(\n client: PublicClient,\n registry: Address,\n fromIndex: bigint,\n toIndex: bigint,\n) {\n return client.readContract(getTokenPairsSliceContract(registry, fromIndex, toIndex));\n}\n\n/** Reads the token pair at `index` from a wrappers registry via a viem client. */\nexport function readTokenPairContract(client: PublicClient, registry: Address, index: bigint) {\n return client.readContract(getTokenPairContract(registry, index));\n}\n\n/** Reads the confidential token registered for a given underlying token in a wrappers registry via a viem client. */\nexport function readConfidentialTokenAddressContract(\n client: PublicClient,\n registry: Address,\n tokenAddress: Address,\n) {\n return client.readContract(getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\n/** Reads the underlying token registered for a given confidential token in a wrappers registry via a viem client. */\nexport function readTokenAddressContract(\n client: PublicClient,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return client.readContract(getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\n/** Reads whether a confidential token is registered and valid in a wrappers registry via a viem client. */\nexport function readIsConfidentialTokenValidContract(\n client: PublicClient,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return client.readContract(isConfidentialTokenValidContract(registry, confidentialTokenAddress));\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{p as e,r as t,t as n}from"./relayer-C3jVhqSK.js";import{a as r,c as i,r as a,s as o,u as s}from"./signing-C6nbPCyd.js";import{B as c,F as l,L as u,P as d,d as f,f as p,j as m,m as h,p as g}from"./erc165-B8gx2luK.js";import{r as _}from"./applied-runtime-3fzqBC2V.js";import{a as v,i as ee,n as y,o as te,r as b,s as x,t as S}from"./primitives-Cym-3HKa.js";import{t as C}from"./validation-ClSvPh6P.js";import{a as ne,i as re,n as w,o as T,r as ie,s as ae,t as E}from"./wrappers-registry-Cm3JJeqx.js";import{a as D,c as O,l as oe,n as se,o as ce,s as le,u as ue}from"./chains-BwlDI944.js";import{getAddress as k,toBytes as A,toHex as j,zeroAddress as de}from"viem";import{hasFhevmRuntimeConfig as fe,setFhevmRuntimeConfig as pe}from"@fhevm/sdk/viem";import{z as M}from"zod/mini";var N=class{#e=null;#t=null;#n;#r;#i;constructor(e=`CredentialStore`,t=1,n=`credentials`){this.#n=e,this.#r=t,this.#i=n}#a(){return this.#e?Promise.resolve(this.#e):(this.#t||=new Promise((e,t)=>{let n=indexedDB.open(this.#n,this.#r);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(this.#i)||e.createObjectStore(this.#i,{keyPath:`key`})},n.onsuccess=()=>{this.#e=n.result,this.#t=null,this.#e.onversionchange=()=>{this.#e?.close(),this.#e=null,this.#t=null},this.#e.onclose=()=>{this.#e=null,this.#t=null},e(this.#e)},n.onerror=()=>{this.#e=null,this.#t=null,t(n.error)}}),this.#t)}async#o(e,t){let n=await this.#a();return new Promise((r,i)=>{let a=n.transaction(this.#i,e);a.onabort=()=>i(a.error??Error(`Transaction aborted`));let o=t(a.objectStore(this.#i));e===`readonly`?o.onsuccess=()=>r(o.result):a.oncomplete=()=>r(o.result),o.onerror=()=>i(o.error)})}async get(e){return(await this.#o(`readonly`,t=>t.get(e)))?.value??null}async set(e,t){await this.#o(`readwrite`,n=>n.put({key:e,value:t}))}async delete(e){await this.#o(`readwrite`,t=>t.delete(e))}async clear(){await this.#o(`readwrite`,e=>e.clear())}};const me=new N;var P=class{#e=new Map;async get(e){return this.#e.get(e)??null}async set(e,t){this.#e.set(e,t)}async delete(e){this.#e.delete(e)}};const he=new P;function ge(){return typeof window<`u`?new N(`CredentialStore`):new P}function _e(e=ge(),t=e){return{storage:e,permitStorage:t}}function ve(e,t,r){let i=e.map(e=>e.id),a=[...new Set(i.filter((e,t)=>i.indexOf(e)!==t))];if(a.length>0)throw new n(`Duplicate chain id(s) [${a.join(`, `)}] in the chains array. Each chain id must appear only once. Note: hardhat and anvil are aliases (both use 31337).`);let o=Object.keys(t).map(Number).filter(e=>!i.includes(e));o.length>0&&r.warn(`Relayer entries for chain(s) [${o.join(`, `)}] are ignored: those chains are not in the chains array. Add the chain config to use them, or drop the relayer entries.`);let s=new Map;for(let r of e){let e=t[r.id];if(!e)throw new n(`Chain ${r.id} has no relayer configured. Add a relayer entry: relayers: { [${r.id}]: web() }`);s.set(r.id,{chain:r,relayerConfig:e})}return s}var ye=class{#e;#t;#n;constructor(e,t,r,i){if(e.length===0)throw new n(`At least one chain is required.`);this.#e=new Map(e.map(e=>[e.id,e])),this.#n=e[0].id;let a=new Map;for(let[n,{relayerConfig:o,chain:s}]of ve(e,t,r))a.set(n,o.createRelayer(s,r,i));this.#t=a}get chains(){return[...this.#e.values()]}get chain(){let e=this.#e.get(this.#n);if(e===void 0)throw new n(`Chain ${this.#n} is not configured. Add it to the chains array.`);return e}switchChain(e){this.#n=e}dispose(){for(let e of new Set(this.#t.values()))e.dispose?.()}get relayer(){let e=this.#t.get(this.chain.id);if(e===void 0)throw new n(`No relayer configured for chain ${this.#n}. Add it to the relayers object.`);return e}};const F={version:1,info:`zama-sdk-keypair-wrapping-v1`,ivLengthBytes:12,tagLengthBytes:16};function I(e){return new Uint8Array(e)}function L(e){return I(new TextEncoder().encode(JSON.stringify([e.publicKey,e.createdAt,e.expiresAt,e.tkmsVersion??null])))}function be(e){return typeof e==`string`?new TextEncoder().encode(e):I(e)}var xe=class{#e;#t;constructor(e){this.#e=e}async baseKey(){return this.#t??=this.#n(this.#e),this.#t}async#n(e){let t=be(e),n=await crypto.subtle.importKey(`raw`,t,`HKDF`,!1,[`deriveKey`]);return t.fill(0),e instanceof Uint8Array&&e.fill(0),this.#e=void 0,n}};async function R(e,t){let n=await e.baseKey();return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:new TextEncoder().encode(t),info:new TextEncoder().encode(F.info)},n,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}async function Se(e,t,n,r){let i=await R(t,n),a=crypto.getRandomValues(new Uint8Array(F.ivLengthBytes)),o=await crypto.subtle.encrypt({name:`AES-GCM`,iv:a,additionalData:L(r)},i,I(A(e)));return{wrappedPrivateKey:j(new Uint8Array(o)),iv:j(a)}}async function Ce(e,t,n,r){let i=await R(t,n),a=await crypto.subtle.decrypt({name:`AES-GCM`,iv:I(A(e.iv)),additionalData:L(r)},i,I(A(e.wrappedPrivateKey)));return j(new Uint8Array(a))}function we(e){return typeof e==`object`&&!!e&&`name`in e&&e.name===`OperationError`}const z=86400;function B(){return Math.floor(Date.now()/1e3)}function V(e){return[...new Set(e.map(S))].sort()}function Te(e){let{chainId:t}=e.domain;return typeof t==`bigint`?{...e,domain:{...e.domain,chainId:t.toString()}}:e}const H=`transportKeyPairTTL must be a positive integer number of seconds`,Ee=`permitTTL must be a positive integer number of days`,De=`transportKeyPairScope must be a non-empty string`,U=`transportKeyPairDerivationSecret must be a Uint8Array of at least 32 bytes or a string of at least 64 characters (256 bits of entropy): source it from a CSPRNG or secrets manager, not a human-memorable passphrase`,Oe=365*z,ke=M.int({error:H}).check(M.positive({error:H}),M.maximum(Oe,`transportKeyPairTTL must not exceed the fhevm ACL maximum of ${Oe}s (365 days)`)),Ae=M.int({error:Ee}).check(M.positive({error:Ee}),M.maximum(365,`permitTTL must not exceed the V1 permit maximum of 365 days`)),je=M.string({error:De}).check(M.minLength(1,De)),Me=M.union([M.string({error:U}).check(M.minLength(64,U)),M.instanceof(Uint8Array,{error:U}).check(M.refine(e=>e.byteLength>=32,{error:U}))],{error:U}),Ne=M.object({publicKey:b,privateKey:b,createdAt:x,expiresAt:te,tkmsVersion:M.optional(M.string())}),W=M.object({domain:M.record(M.string(),M.unknown()),primaryType:M.optional(M.string()),types:M.record(M.string(),M.array(M.object({name:M.string(),type:M.string()}))),message:M.record(M.string(),M.unknown())}),G=M.object({version:M.int().check(M.positive()),eip712:W,signature:b,signerAddress:y}),K=M.object({keypairPublicKey:b,contractAddresses:M.array(y).check(M.maxLength(10)),serializedPermit:G,startTimestamp:x,durationDays:v}),Pe=M.array(K),Fe=M.array(M.string()),Ie=M.object({version:M.literal(1),eip712:W,signerAddress:y}),Le=`iv must be a ${F.ivLengthBytes}-byte hex string`,Re=`wrappedPrivateKey must be a whole number of bytes and at least ${F.tagLengthBytes} bytes (the AES-GCM authentication tag)`;function ze(e){return(e.length-2)/2}const Be=M.object({wrappingVersion:M.literal(F.version,{error:`wrappingVersion must be a wrapping scheme this SDK can read`}),publicKey:b,wrappedPrivateKey:b.check(M.refine(e=>e.length%2==0&&ze(e)>=F.tagLengthBytes,{error:Re})),iv:b.check(M.refine(e=>ze(e)===F.ivLengthBytes,{error:Le})),createdAt:x,expiresAt:te,tkmsVersion:M.optional(M.string())});function Ve(e){let t={publicKey:e.publicKey,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(t.tkmsVersion=e.tkmsVersion),t}const q={version:F.version,schema:Be,async encode(e,t,n){let{wrappedPrivateKey:r,iv:i}=await Se(e.privateKey,t,n,Ve(e)),a={wrappingVersion:F.version,publicKey:e.publicKey,wrappedPrivateKey:r,iv:i,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(a.tkmsVersion=e.tkmsVersion),a},async decode(e,t,n){let r=await Ce({wrappedPrivateKey:e.wrappedPrivateKey,iv:e.iv},t,n,Ve(e)),i={publicKey:e.publicKey,privateKey:r,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(i.tkmsVersion=e.tkmsVersion),i}},He=new Map([[q.version,q]]),Ue=q;function We(e){let t=e;return t.wrappingVersion!==void 0||t.wrappedPrivateKey!==void 0&&t.iv!==void 0}function Ge(e){if(typeof e!=`object`||!e||!We(e)){let t=Ne.safeParse(e);return t.success?{kind:`plaintext`,keyPair:t.data}:{kind:`unrecognized`}}let t=e.wrappingVersion,n=typeof t==`number`?He.get(t):void 0;if(n===void 0)return{kind:`unsupported-version`,version:t};let r=n.schema.safeParse(e);if(!r.success)return{kind:`corrupt-wrapped`};let i=r.data;return{kind:`wrapped`,expiresAt:i.expiresAt,decode:(e,t)=>n.decode(i,e,t)}}function Ke(e,t,n){return Ue.encode(e,t,n)}function qe(e){return`keypair:${e}`}function J(e){return`keypair:scope:${e}`}function Y(e){return`permits:${e.signerAddress}:${e.chainId}:${e.delegatorAddress}`}function X(e){return`permits-index:${e}`}function Je(e){return`scope:${e}`}function Ye(e,t){return{"wrapped-without-secret":`Transport key pair for scope "${t}" is wrapped, but this instance has no transportKeyPairDerivationSecret configured. Every instance sharing this scope must use the same transportKeyPairDerivationSecret; once they do, call permits.revokeTransportKeyPair() to rotate the entry.`,"unwrapped-under-secret":`Transport key pair for scope "${t}" is stored unwrapped, but this instance is configured with a transportKeyPairDerivationSecret. A peer instance sharing this scope is running without the secret: configure the same transportKeyPairDerivationSecret everywhere, then call permits.revokeTransportKeyPair() to migrate the scope to a wrapped entry.`,"unwrap-failed":`Transport key pair for scope "${t}" failed to unwrap. This usually means another instance created it with a different transportKeyPairDerivationSecret: every instance sharing this scope must use the same secret. It can also mean the stored entry is corrupted.`,"corrupt-wrapped":`Transport key pair for scope "${t}" is wrapped but structurally invalid: the stored iv or ciphertext is not a shape this wrapping scheme can produce. This usually means the stored entry is corrupted, or instances sharing this scope are running mismatched wrapping-scheme versions.`}[e]}const Xe={"unwrapped-under-secret":`unwrapped transport key pair entry found while a transportKeyPairDerivationSecret is configured`,"unwrap-failed":`transport key pair entry failed to unwrap (wrong transportKeyPairDerivationSecret?)`,"corrupt-wrapped":`structurally invalid wrapped transport key pair entry`};function Ze(e,t){let n=typeof e==`number`?`wrappingVersion ${e}`:`no wrappingVersion this build recognizes`;return`Transport key pair ${t===void 0?`for this signer`:`for scope "${t}"`} was written under a wrapping scheme this SDK build cannot read (${n}). The entry is preserved instead of regenerated, since an instance that understands the scheme may still be using it: ${t===void 0?`run a build that supports it, or call permits.clear() to discard the entry deliberately`:`run a build that supports it everywhere, or call permits.revokeTransportKeyPair() to rotate the scope`}.`}var Qe=class{#e;#t;#n;#r;#i;#a;#o=new Map;#s=new Map;constructor(e){this.#e=e.generator,this.#t=e.storage,this.#n=e.ttl,this.#r=e.logger,this.#i=e.scope,this.#a=e.derivationSecret}#c(e){return this.#i===void 0?`signer:${e}`:Je(this.#i)}#l(e){return this.#i===void 0?qe(e):J(this.#i)}async readStored(e){return this.#u(this.#l(e),this.#c(e))}async#u(e,t){let n=await this.#t.get(e);if(n==null)return null;let i=Ge(n);if(i.kind===`unsupported-version`)throw this.#f(e,Ze(i.version,this.#i));if(i.kind===`unrecognized`)return await this.#m(e,`malformed transport key pair entry`),null;let a=this.#a;if(a===void 0)return i.kind===`plaintext`?await this.#p(e,i.keyPair.expiresAt)?null:i.keyPair:this.#d(e,`wrapped-without-secret`);if(i.kind===`plaintext`)return this.#d(e,`unwrapped-under-secret`);if(i.kind===`corrupt-wrapped`)return this.#d(e,`corrupt-wrapped`);if(await this.#p(e,i.expiresAt))return null;try{return await i.decode(a,t)}catch(t){if(!we(t))throw this.#r.error(`transport key pair unwrap failed unexpectedly`,{key:e,error:t}),new r(`Transport key pair unwrap failed unexpectedly.`,{cause:t});return this.#d(e,`unwrap-failed`,t)}}async#d(e,t,n){if(this.#i!==void 0)throw this.#f(e,Ye(t,this.#i),n);if(t===`wrapped-without-secret`)throw this.#f(e,`Transport key pair for this signer is wrapped, but this instance has no transportKeyPairDerivationSecret configured. Configure the same transportKeyPairDerivationSecret the entry was written with. To downgrade to plaintext at rest on purpose, discard the stored entry first by calling permits.clear(), then run without the secret.`,n);let r=Xe[t];return this.#r.warn(r,{key:e}),await this.#m(e,r),null}#f(e,t,n){return this.#r.error(t,{key:e}),new r(t,{cause:n})}async#p(e,t){return B()<t?!1:(await this.#m(e,`expired transport key pair entry`),!0)}async#m(e,t){this.#r.debug(`discarding transport key pair entry`,{key:e,reason:t}),await m(`delete transport key pair entry`,()=>this.#t.delete(e),this.#r)}async getOrCreate(e,t){return this.#h(this.#l(e),this.#c(e),{strict:t?.strict})}async#h(e,t,n){let i=n?.strict??!1,a=`${e}::${i}`,o=this.#o.get(a);if(o)return o;let c=this.#s.get(e)??0,l=(async()=>{let n=await this.#u(e,t);if(n!==null)return n;let a=await this.#e(),o=B(),l=o+this.#n,u={publicKey:a.publicKey,privateKey:a.privateKey,createdAt:o,expiresAt:l};a.tkmsVersion&&(u.tkmsVersion=a.tkmsVersion);let d=u;if(this.#a!==void 0)try{d=await Ke(u,this.#a,t)}catch(t){let n=`Failed to wrap the transport private key for at-rest storage.`;throw this.#r.error(n,{key:e,error:t}),new r(n,{cause:t})}if((this.#s.get(e)??0)===c)i?await this.#t.set(e,d):await m(`persist transport key pair`,()=>this.#t.set(e,d),this.#r);else if(i)throw new s(`The transport key pair was rotated while it was being generated, so the freshly generated key pair could not be persisted. Retry.`);return u})().finally(()=>{this.#o.delete(a)});return this.#o.set(a,l),l}async clear(e){let t=qe(e);await m(`delete transport key pair entry`,()=>this.#t.delete(t),this.#r)}async evict(e){let t=this.#l(e);await m(`evict transport key pair entry`,()=>this.#t.delete(t),this.#r)}async clearScope(){if(this.#i===void 0)return;let e=J(this.#i);this.#s.set(e,(this.#s.get(e)??0)+1),await this.#t.delete(e)}async warmScope(){this.#i!==void 0&&await this.#h(J(this.#i),Je(this.#i),{strict:!0})}};function $e(e){return C(Ie,e)}function et(e,t){let n=new Set(e.flatMap(e=>e.contractAddresses));return t.filter(e=>!n.has(e))}function tt(e){let t=[];for(let n=0;n<e.length;n+=10)t.push(e.slice(n,n+10));return t}function nt(e,t,n){return e.filter(e=>e.keypairPublicKey===t&&n<e.startTimestamp+e.durationDays*86400)}function rt(e,t){let n=new Set(t);return e.filter(e=>!e.contractAddresses.some(e=>n.has(e)))}function Z(e,t){return[...new Set([...e,...t])].sort()}function it(e,t,n){let r=new Set(n),i=e.filter(e=>new Set([...e.contractAddresses,...t]).size<=10);if(i.length===0)return null;function a(e){return e.contractAddresses.reduce((e,t)=>e+ +!!r.has(t),0)}let o=Math.max(...i.map(a));return i.filter(e=>a(e)===o).reduce((e,t)=>t.startTimestamp>e.startTimestamp?t:e)}var at=class{#e;#t;constructor(e){this.#e=e.storage,this.#t=e.logger}async list(e){let t=Y(e),n=await this.#e.get(t);if(n==null)return[];let r=Pe.safeParse(n);return r.success?r.data:(await this.clearScope(e),[])}async listUsableAndPrune(e,t){let n=await this.list(e),r=nt(n,t,Math.floor(Date.now()/1e3));return r.length!==n.length&&(r.length===0?await this.clearScope(e):await m(`update permit entry`,()=>this.#e.set(Y(e),r),this.#t)),r}async append(e,t){if(t.length===0)return;let n=t.map(e=>K.parse(e)),r=await this.list(e);await this.#e.set(Y(e),[...r,...n]),await this.#r(e)}async replace(e,t,n){let r=K.parse(n),i=(await this.list(e)).filter(e=>e.serializedPermit.signature!==t);await this.#e.set(Y(e),[...i,r]),await this.#r(e)}async deletePermitsTouching(e,t){let n=await this.list(e);if(n.length===0)return;let r=rt(n,t);r.length===0?await this.clearScope(e):await this.#e.set(Y(e),r)}async clearScope(e){await this.#a(Y(e)),await this.#i(e)}async clearAllForSigner(e){let t=X(e),n=await this.#n(t);await Promise.all(n.map(e=>this.#a(e))),await m(`delete permit index`,()=>this.#e.delete(t),this.#t)}async#n(e){let t=await this.#e.get(e);if(t==null)return[];let n=Fe.safeParse(t);return n.success?n.data:(await m(`delete permit index`,()=>this.#e.delete(e),this.#t),[])}async#r(e){let t=X(e.signerAddress),n=Y(e),r=await this.#n(t);r.includes(n)||await this.#e.set(t,[...r,n])}async#i(e){let t=X(e.signerAddress),n=Y(e),r=await this.#n(t),i=r.filter(e=>e!==n);i.length!==r.length&&(i.length===0?await m(`delete permit index`,()=>this.#e.delete(t),this.#t):await m(`update permit index`,()=>this.#e.set(t,i),this.#t))}async#a(e){await m(`delete permit entry`,()=>this.#e.delete(e),this.#t)}};async function ot(e,t,n){let r=e.get(t);if(r!==void 0)return r;let i=await n();return e.set(t,i),i}var st=class{#e;#t;#n;#r;#i;#a;#o;#s;#c=new Map;constructor(e){this.#e=new Qe({generator:async()=>{let t=e.router.relayer,n=await t.generateTransportKeyPair();return t.serializeTransportKeyPair({transportKeyPair:n})},storage:e.storage,ttl:e.transportKeyPairTTL,logger:e.logger,scope:e.scope,derivationSecret:e.derivationSecret}),this.#t=new at({storage:e.permitStorage??e.storage,logger:e.logger}),this.#n=e.router,this.#r=e.signer,this.#i=e.permitTTL,this.#a=e.logger,this.#o=e.emitEvent,this.#s=e.scope}#l(e){if(!this.#r)throw new u(e);return this.#r}#u(e,t,n=``){let r=a(t,{operation:e});return n&&(r.message=n+r.message),this.#o({type:l.PermitError,operation:e,error:r}),r}async grantPermit(e,t){let n=t===void 0?`grantPermit`:`grantDelegationPermit`,r,i,a;try{r=S(this.#l(`grantPermit`).requireWalletAccount(`grantPermit`).address),i=V(e),a=this.#f(r,t)}catch(e){throw this.#u(n,e)}let o=await this.#e.getOrCreate(r);if(i.length===0)return{keypair:o,permissions:[]};let s;try{s=await this.#t.listUsableAndPrune(a,o.publicKey)}catch(e){throw this.#u(n,e)}let c=et(s,i);if(c.length>0){let e=it(s,c,i);if(e!==null){let t=Z(e.contractAddresses,c),n=await this.#p({chunk:t,keypair:o,scope:a});await m(`replace permit`,()=>this.#t.replace(a,e.serializedPermit.signature,n),this.#a),s[s.indexOf(e)]=n}else for(let e of tt(c)){let t=await this.#p({chunk:e,keypair:o,scope:a});s.push(t),await m(`persist permit`,()=>this.#t.append(a,[t]),this.#a)}}let l=new Set(i);return{keypair:o,permissions:s.filter(e=>e.contractAddresses.some(e=>l.has(e)))}}async preparePermit(e){let t=V(e.contracts).length;if(t>10)throw new n(`preparePermit: request.contracts must not exceed 10 addresses (got ${t}). Use batchPreparePermits to split them across permits.`);let[r]=await this.batchPreparePermits(e);return d(r,`batchPreparePermits result`),r}async batchPreparePermits(e){let t=S(e.signer),r=V(e.contracts);if(r.length===0)throw new n(`request.contracts must not be empty.`);let i=e.delegator?S(e.delegator):void 0;if(i!==void 0&&i===t)throw new n(`request.delegator must differ from request.signer: self-delegation is not allowed.`);let a=e.durationDays===void 0?this.#i:C(Ae,e.durationDays),o=this.#n.relayer,s=await this.#e.getOrCreate(t,{strict:!0}),c=await o.parseTransportKeyPair(s),l=B();return Promise.all(tt(r).map(async e=>({version:1,eip712:Te(W.parse(await o.createUnsignedLegacyDecryptionPermitEip712({transportKeyPair:c,contractAddresses:e,startTimestamp:l,durationSeconds:a*z,...i&&{delegatorAddress:i}}))),signerAddress:t})))}async batchRegisterPermits(e){if(e.length===0)throw new n(`permits must not be empty.`);let t={relayer:this.#n.relayer,activeChainId:this.#n.chain.id,storedKeyPairs:new Map,transportKeyPairs:new Map},r=[];for(let[n,{prepared:i,signature:a}]of e.entries()){let o=e.length>1?`permits[${n}]: `:``;r.push(await this.#d(i,a,t,o))}for(let{scope:e,permission:t}of r)await m(`replace permit`,()=>this.#t.replace(e,t.serializedPermit.signature,t),this.#a)}async#d(e,t,{relayer:r,activeChainId:a,storedKeyPairs:c,transportKeyPairs:l},u){let d;try{d=$e(e)}catch(e){throw this.#u(`registerPermit`,e,u)}let{domain:f,message:p}=d.eip712,m=Number(f.chainId);if(m!==a)throw this.#u(`registerPermit`,new o({preparedChainId:m,activeChainId:a}),u);let h=Number(p.startTimestamp),g=Number(p.durationDays);if(B()>=h+g*86400)throw this.#u(`registerPermit`,new i(`registerPermit: the prepared permit's validity window (starting ${h}, ${g}d) has already elapsed. Prepare the permit again.`),u);let _=d.signerAddress,v=await ot(c,_,()=>this.#e.readStored(_));if(v===null||v.publicKey!==p.publicKey)throw new s(`${u}registerPermit: the transport key pair changed since the permit was prepared. Prepare it again to rebind the signature request to the current key pair.`);try{let e=await ot(l,_,()=>r.parseTransportKeyPair(v)),i=await r.parseSignedDecryptionPermit({serializedPermit:{version:d.version,eip712:d.eip712,signature:t,signerAddress:_},transportKeyPair:e});if(i.version!==1)throw new n(`registerPermit: expected a V1 signed permit, got version ${i.version}.`);let o=C(G,await r.serializeSignedDecryptionPermit({signedPermit:i})),s={keypairPublicKey:v.publicKey,contractAddresses:V(i.eip712.message.contractAddresses),serializedPermit:o,startTimestamp:Number(i.eip712.message.startTimestamp),durationDays:Number(i.eip712.message.durationDays)};return{scope:{signerAddress:_,chainId:a,delegatorAddress:S(i.encryptedDataOwnerAddress)},permission:s}}catch(e){throw this.#u(`registerPermit`,e,u)}}async hasPermit(e,t){if(e.length===0)return!0;let n=this.#r?.walletAccount.getSnapshot();if(!n)return!1;let i=S(n.address),a;try{a=await this.#e.readStored(i)}catch(e){if(!(e instanceof r))throw e;return!1}if(a===null)return!1;let o=this.#f(i,t);return et(await this.#t.listUsableAndPrune(o,a.publicKey),V(e)).length===0}async revokePermits(e){let t=S(this.#l(`revokePermits`).requireWalletAccount(`revokePermits`).address);if(e===void 0){await this.#t.clearAllForSigner(t);return}let n=V(e);n.length!==0&&await this.#t.deletePermitsTouching(this.#f(t),n)}#f(e,t){return{signerAddress:e,chainId:this.#n.chain.id,delegatorAddress:t?S(t):e}}async clearCredentials(){let e=S(this.#l(`clearCredentials`).requireWalletAccount(`clearCredentials`).address);await this.#e.clear(e),await this.#t.clearAllForSigner(e)}async revokeTransportKeyPair(e){if(this.#s===void 0)throw new n(`revokeTransportKeyPair() requires a transportKeyPairScope to be configured on this SDK instance — there is no shared key pair to revoke.`);if(e!==this.#s)throw new n(`revokeTransportKeyPair("${e}") does not match the configured scope ("${this.#s}").`);await this.#e.clearScope()}async warmTransportKeyPair(e){await this.#e.getOrCreate(S(e))}async warmTransportKeyPairScope(e){if(this.#s===void 0)throw new n(`warmTransportKeyPairScope() requires a transportKeyPairScope to be configured on this SDK instance — there is no shared key pair to warm.`);if(e!==this.#s)throw new n(`warmTransportKeyPairScope("${e}") does not match the configured scope ("${this.#s}").`);await this.#e.warmScope()}async handleWalletAccountChange(e,t){let n=e?S(e.address):void 0;n!==(t?S(t.address):void 0)&&n&&(await this.#e.clear(n),await this.#t.clearAllForSigner(n))}async#p(n){let{chunk:r,keypair:i,scope:a}=n,o=B(),s=a.delegatorAddress!==a.signerAddress,c=this.#n.relayer;try{let e={transportKeyPair:await c.parseTransportKeyPair(i),contractAddresses:r,startTimestamp:o,durationSeconds:this.#i*z,signerAddress:a.signerAddress,signer:this.#l(`signPermit`)},t=s?await c.signDecryptionPermit({...e,delegatorAddress:a.delegatorAddress}):await c.signDecryptionPermit(e),n=C(G,await c.serializeSignedDecryptionPermit({signedPermit:t}));return{keypairPublicKey:i.publicKey,contractAddresses:r,serializedPermit:n,startTimestamp:o,durationDays:this.#i}}catch(n){let r=s?`grantDelegationPermit`:`grantPermit`;throw!(n instanceof t)&&n instanceof Error&&e(n.message)&&await this.#e.evict(a.signerAddress),this.#u(r,n)}}async evictTransportKeyPair(){let e=this.#r?.walletAccount.getSnapshot();e&&await this.#e.evict(S(e.address))}async recoverPermits(e,t,n){let r=this.#l(`recoverPermits`).requireWalletAccount(`recoverPermits`),i=this.#f(S(r.address),t),a=Y(i),o=this.#c.get(a);if(o)return await o,this.grantPermit(e,t);let s=await this.#m(i),c=this.#c.get(a);if(c)return await c,this.grantPermit(e,t);if(s===null)return this.grantPermit(e,t);let l=new Set(n??[]);if(l.size>0&&!s.some(e=>l.has(e.serializedPermit.signature)))return this.grantPermit(e,t);let u=s.filter(e=>!l.has(e.serializedPermit.signature)),d=s.flatMap(e=>e.contractAddresses),f=this.#h(i,d,e,u,t).finally(()=>{this.#c.delete(a)});return this.#c.set(a,f),await f,this.grantPermit(e,t)}async#m(e){try{return await this.#t.list(e)}catch(e){return this.#a.warn(`read permits for recovery failed`,{error:e}),null}}async#h(e,t,n,r,i){await m(`evict revoked permits`,()=>this.#t.clearScope(e),this.#a);try{await this.grantPermit(Z(t,V(n)),i)}catch(t){throw r.length>0&&await m(`restore surviving permits`,async()=>{let t=await this.#t.list(e),n=new Set(t.map(e=>e.serializedPermit.signature)),i=r.filter(e=>!n.has(e.serializedPermit.signature));i.length>0&&await this.#t.append(e,i)},this.#a),t}}},ct=class{#e;#t=`[zama-sdk]`;constructor(e){this.#e=e}error(e,t){this.#e?.error(`${this.#t} ${e}`,t)}warn(e,t){this.#e?.warn(`${this.#t} ${e}`,t)}info(e,t){this.#e?.info(`${this.#t} ${e}`,t)}debug(e,t){this.#e?.debug(`${this.#t} ${e}`,t)}warnAlways(e){console.warn(`${this.#t} ${e}`),this.warn(e)}};const lt={[ce.id]:ce.registryAddress,[le.id]:le.registryAddress,[oe.id]:oe.registryAddress,[O.id]:O.registryAddress,[D.id]:D.registryAddress,[ue.id]:ue.registryAddress,[se.id]:se.registryAddress},ut=M.record(M.string().check(M.regex(/^\d+$/,`expected numeric chain id key`)),y),dt=ee,Q=300*1e3;var ft=class{provider;#e;#t;#n=new Map;constructor(e){this.provider=e.provider,this.#e=Object.assign({},lt,C(M.optional(ut),e.registryAddresses)),this.#t=C(dt,e.registryTTL??86400)*1e3}getAddress(e){return this.#e[e]}#r(e){let t=this.#n.get(e);if(t){if(Date.now()>=t.expiresAt){this.#n.delete(e);return}return t.data}}#i(e,t,n=this.#t){return this.#n.set(e,{data:t,expiresAt:Date.now()+n}),t}refresh(){this.#n.clear()}get ttlMs(){return this.#t}async getRegistryAddress(){let e=await this.provider.getChainId(),t=this.#e[e];if(!t)throw new n(`No wrappers registry address configured for chain ${e}.\nPass a registryAddresses entry for this chain.`);return k(t)}async listPairs(e={}){let t=e.page??1,r=e.pageSize??100,i=e.metadata??!1;if(t<1)throw new n(`page must be >= 1, got ${t}`);if(r<1)throw new n(`pageSize must be >= 1, got ${r}`);let a=await this.getRegistryAddress(),o=`total:${a}`,s=this.#r(o);if(s===void 0){let e=await this.provider.readContract(ne(a));s=this.#i(o,Number(e))}let c=BigInt((t-1)*r),l=c+BigInt(r)>BigInt(s)?BigInt(s):c+BigInt(r);if(c>=BigInt(s))return{items:[],total:s,page:t,pageSize:r};let u=`slice:${a}:${c}:${l}`,d=this.#r(u);if(d===void 0){let e=await this.provider.readContract(T(a,c,l));d=this.#i(u,[...e])}if(!i)return{items:d,total:s,page:t,pageSize:r};let f=`metadata:${a}:${c}:${l}`,p=this.#r(f);if(p===void 0){let e=await Promise.allSettled(d.map(e=>this.#a(e))),t=e.some(e=>e.status===`rejected`),n=e.map((e,t)=>e.status===`fulfilled`?e.value:Object.assign({},d[t],{metadataFailed:!0,underlying:{name:`Unknown`,symbol:`???`,decimals:0,totalSupply:0n},confidential:{name:`Unknown`,symbol:`???`,decimals:0}}));p=this.#i(f,n,t?Q:void 0)}return{items:p,total:s,page:t,pageSize:r}}async#a(e){let[t,n,r,i,a,o,s]=await Promise.all([this.provider.readContract(g(e.tokenAddress)),this.provider.readContract(h(e.tokenAddress)),this.provider.readContract(f(e.tokenAddress)),this.provider.readContract(p(e.tokenAddress)),this.provider.readContract(g(e.confidentialTokenAddress)),this.provider.readContract(h(e.confidentialTokenAddress)),this.provider.readContract(f(e.confidentialTokenAddress))]);return{...e,underlying:{name:t,symbol:n,decimals:r,totalSupply:i},confidential:{name:a,symbol:o,decimals:s}}}async getConfidentialToken(e){let t=await this.getRegistryAddress(),n=k(e),r=`ct:${t}:${n}`,i=this.#r(r);if(i!==void 0)return i;let[a,o]=await this.provider.readContract(E(t,n));return o===de?this.#i(r,null,Q):this.#i(r,{confidentialTokenAddress:o,isValid:a})}async getUnderlyingToken(e){let t=await this.getRegistryAddress(),n=k(e),r=`ut:${t}:${n}`,i=this.#r(r);if(i!==void 0)return i;let[a,o]=await this.provider.readContract(w(t,n));return o===de?this.#i(r,null,Q):this.#i(r,{tokenAddress:o,isValid:a})}async getTokenPairs(){let e=await this.getRegistryAddress();return this.provider.readContract(re(e))}async getTokenPairsLength(){let e=await this.getRegistryAddress();return this.provider.readContract(ne(e))}async getTokenPairsSlice(e,t){let n=await this.getRegistryAddress();return this.provider.readContract(T(n,e,t))}async getTokenPair(e){let t=await this.getRegistryAddress();return this.provider.readContract(ie(t,e))}async getConfidentialTokenAddress(e){let t=await this.getRegistryAddress();return this.provider.readContract(E(t,k(e)))}async getTokenAddress(e){let t=await this.getRegistryAddress();return this.provider.readContract(w(t,k(e)))}async isConfidentialTokenValid(e){let t=await this.getRegistryAddress();return this.provider.readContract(ae(t,k(e)))}};function pt(e,t,n){let r=new ct(n.logger),i=n.logger,a={wasmAssetLoadMode:`auto`,moduleVersions:`auto`,logger:{error:(e,t)=>i?.error(e,{cause:t}),warn:e=>i?.warn(e),debug:e=>i?.debug(e)},...n.runtime};if(fe()){let e=`runtime configuration is already set and cannot be changed.`;n.runtime===void 0?r.debug(e):r.warn(e)}else pe(a),_(a);let{storage:o,permitStorage:s}=_e(n.storage,n.permitStorage),c=n.telemetry===!1?void 0:{layer:`core`},l=new ye(n.chains,n.relayers,r,c);return{chains:n.chains,router:l,provider:t,signer:e,storage:o,permitStorage:s,transportKeyPairTTL:C(ke,n.transportKeyPairTTL??2592e3),permitTTL:C(Ae,n.permitTTL??30),transportKeyPairScope:n.transportKeyPairScope===void 0?void 0:C(je,n.transportKeyPairScope),registryTTL:C(dt,n.registryTTL??86400),logger:r,onEvent:n.onEvent,telemetry:c}}function mt(e,t){return e?.address===t?.address&&e?.chainId===t?.chainId}var $=class{#e=new Set;#t;#n;constructor(e){this.#t=e,this.#n=e!==void 0}getSnapshot(){return this.#t}isReady(){return this.#n}setSnapshot(e){this.#n=!0;let t=this.#t;mt(t,e)||(this.#t=e,this.#r({previous:t,next:e}))}subscribe(e){this.#e.add(e);let t=this.#t;return t&&e({previous:void 0,next:t}),()=>{this.#e.delete(e)}}#r(e){for(let t of this.#e)t(e)}};function ht(e){return new $(e)}var gt=class{walletAccount;#e=!1;constructor(e){this.walletAccount=new $(e)}requireWalletAccount(e){let t=this.walletAccount.getSnapshot();if(!t)throw new c(e);return t}dispose(){this.#e||(this.#e=!0,this.onDispose())}[Symbol.dispose](){this.dispose()}onDispose(){}};export{lt as a,$e as c,P as d,he as f,pt as i,Me as l,me as m,$ as n,ft as o,N as p,ht as r,st as s,gt as t,xe as u};
|
|
2
|
-
//# sourceMappingURL=base-signer-
|
|
1
|
+
import{p as e,r as t,t as n}from"./relayer-C3jVhqSK.js";import{a as r,c as i,r as a,s as o,u as s}from"./signing-C6nbPCyd.js";import{B as c,F as l,L as u,P as d,d as f,f as p,j as m,m as h,p as g}from"./erc165-B8gx2luK.js";import{r as _}from"./applied-runtime-3fzqBC2V.js";import{a as v,i as ee,n as y,o as te,r as b,s as x,t as S}from"./primitives-Cym-3HKa.js";import{t as C}from"./validation-ClSvPh6P.js";import{a as ne,i as re,n as w,o as T,r as ie,s as ae,t as E}from"./wrappers-registry-Cm3JJeqx.js";import{a as D,c as O,l as oe,n as se,o as ce,s as le,u as ue}from"./chains-BwlDI944.js";import{getAddress as k,toBytes as A,toHex as j,zeroAddress as de}from"viem";import{hasFhevmRuntimeConfig as fe,setFhevmRuntimeConfig as pe}from"@fhevm/sdk/viem";import{z as M}from"zod/mini";var N=class{#e=null;#t=null;#n;#r;#i;constructor(e=`CredentialStore`,t=1,n=`credentials`){this.#n=e,this.#r=t,this.#i=n}#a(){return this.#e?Promise.resolve(this.#e):(this.#t||=new Promise((e,t)=>{let n=indexedDB.open(this.#n,this.#r);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(this.#i)||e.createObjectStore(this.#i,{keyPath:`key`})},n.onsuccess=()=>{this.#e=n.result,this.#t=null,this.#e.onversionchange=()=>{this.#e?.close(),this.#e=null,this.#t=null},this.#e.onclose=()=>{this.#e=null,this.#t=null},e(this.#e)},n.onerror=()=>{this.#e=null,this.#t=null,t(n.error)}}),this.#t)}async#o(e,t){let n=await this.#a();return new Promise((r,i)=>{let a=n.transaction(this.#i,e);a.onabort=()=>i(a.error??Error(`Transaction aborted`));let o=t(a.objectStore(this.#i));e===`readonly`?o.onsuccess=()=>r(o.result):a.oncomplete=()=>r(o.result),o.onerror=()=>i(o.error)})}async get(e){return(await this.#o(`readonly`,t=>t.get(e)))?.value??null}async set(e,t){await this.#o(`readwrite`,n=>n.put({key:e,value:t}))}async delete(e){await this.#o(`readwrite`,t=>t.delete(e))}async clear(){await this.#o(`readwrite`,e=>e.clear())}};const me=new N;var P=class{#e=new Map;async get(e){return this.#e.get(e)??null}async set(e,t){this.#e.set(e,t)}async delete(e){this.#e.delete(e)}};const he=new P;function ge(){return typeof window<`u`?new N(`CredentialStore`):new P}function _e(e=ge(),t=e){return{storage:e,permitStorage:t}}function ve(e,t,r){let i=e.map(e=>e.id),a=[...new Set(i.filter((e,t)=>i.indexOf(e)!==t))];if(a.length>0)throw new n(`Duplicate chain id(s) [${a.join(`, `)}] in the chains array. Each chain id must appear only once. Note: hardhat and anvil are aliases (both use 31337).`);let o=Object.keys(t).map(Number).filter(e=>!i.includes(e));o.length>0&&r.warn(`Relayer entries for chain(s) [${o.join(`, `)}] are ignored: those chains are not in the chains array. Add the chain config to use them, or drop the relayer entries.`);let s=new Map;for(let r of e){let e=t[r.id];if(!e)throw new n(`Chain ${r.id} has no relayer configured. Add a relayer entry: relayers: { [${r.id}]: web() }`);s.set(r.id,{chain:r,relayerConfig:e})}return s}var ye=class{#e;#t;#n;constructor(e,t,r,i){if(e.length===0)throw new n(`At least one chain is required.`);this.#e=new Map(e.map(e=>[e.id,e])),this.#n=e[0].id;let a=new Map;for(let[n,{relayerConfig:o,chain:s}]of ve(e,t,r))a.set(n,o.createRelayer(s,r,i));this.#t=a}get chains(){return[...this.#e.values()]}get chain(){let e=this.#e.get(this.#n);if(e===void 0)throw new n(`Chain ${this.#n} is not configured. Add it to the chains array.`);return e}switchChain(e){this.#n=e}dispose(){for(let e of new Set(this.#t.values()))e.dispose?.()}get relayer(){let e=this.#t.get(this.chain.id);if(e===void 0)throw new n(`No relayer configured for chain ${this.#n}. Add it to the relayers object.`);return e}};const F={version:1,info:`zama-sdk-keypair-wrapping-v1`,ivLengthBytes:12,tagLengthBytes:16};function I(e){return new Uint8Array(e)}function L(e){return I(new TextEncoder().encode(JSON.stringify([e.publicKey,e.createdAt,e.expiresAt,e.tkmsVersion??null])))}function be(e){return typeof e==`string`?new TextEncoder().encode(e):I(e)}var xe=class{#e;#t;constructor(e){this.#e=e}async baseKey(){return this.#t??=this.#n(this.#e),this.#t}async#n(e){let t=be(e),n=await crypto.subtle.importKey(`raw`,t,`HKDF`,!1,[`deriveKey`]);return t.fill(0),e instanceof Uint8Array&&e.fill(0),this.#e=void 0,n}};async function R(e,t){let n=await e.baseKey();return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:new TextEncoder().encode(t),info:new TextEncoder().encode(F.info)},n,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}async function Se(e,t,n,r){let i=await R(t,n),a=crypto.getRandomValues(new Uint8Array(F.ivLengthBytes)),o=await crypto.subtle.encrypt({name:`AES-GCM`,iv:a,additionalData:L(r)},i,I(A(e)));return{wrappedPrivateKey:j(new Uint8Array(o)),iv:j(a)}}async function Ce(e,t,n,r){let i=await R(t,n),a=await crypto.subtle.decrypt({name:`AES-GCM`,iv:I(A(e.iv)),additionalData:L(r)},i,I(A(e.wrappedPrivateKey)));return j(new Uint8Array(a))}function we(e){return typeof e==`object`&&!!e&&`name`in e&&e.name===`OperationError`}const z=86400;function B(){return Math.floor(Date.now()/1e3)}function V(e){return[...new Set(e.map(S))].sort()}function Te(e){let{chainId:t}=e.domain;return typeof t==`bigint`?{...e,domain:{...e.domain,chainId:t.toString()}}:e}const H=`transportKeyPairTTL must be a positive integer number of seconds`,Ee=`permitTTL must be a positive integer number of days`,De=`transportKeyPairScope must be a non-empty string`,U=`transportKeyPairDerivationSecret must be a Uint8Array of at least 32 bytes or a string of at least 64 characters (256 bits of entropy): source it from a CSPRNG or secrets manager, not a human-memorable passphrase`,Oe=365*z,ke=M.int({error:H}).check(M.positive({error:H}),M.maximum(Oe,`transportKeyPairTTL must not exceed the fhevm ACL maximum of ${Oe}s (365 days)`)),Ae=M.int({error:Ee}).check(M.positive({error:Ee}),M.maximum(365,`permitTTL must not exceed the V1 permit maximum of 365 days`)),je=M.string({error:De}).check(M.minLength(1,De)),Me=M.union([M.string({error:U}).check(M.minLength(64,U)),M.instanceof(Uint8Array,{error:U}).check(M.refine(e=>e.byteLength>=32,{error:U}))],{error:U}),Ne=M.object({publicKey:b,privateKey:b,createdAt:x,expiresAt:te,tkmsVersion:M.optional(M.string())}),W=M.object({domain:M.record(M.string(),M.unknown()),primaryType:M.optional(M.string()),types:M.record(M.string(),M.array(M.object({name:M.string(),type:M.string()}))),message:M.record(M.string(),M.unknown())}),G=M.object({version:M.int().check(M.positive()),eip712:W,signature:b,signerAddress:y}),K=M.object({keypairPublicKey:b,contractAddresses:M.array(y).check(M.maxLength(10)),serializedPermit:G,startTimestamp:x,durationDays:v}),Pe=M.array(K),Fe=M.array(M.string()),Ie=M.object({version:M.literal(1),eip712:W,signerAddress:y}),Le=`iv must be a ${F.ivLengthBytes}-byte hex string`,Re=`wrappedPrivateKey must be a whole number of bytes and at least ${F.tagLengthBytes} bytes (the AES-GCM authentication tag)`;function ze(e){return(e.length-2)/2}const Be=M.object({wrappingVersion:M.literal(F.version,{error:`wrappingVersion must be a wrapping scheme this SDK can read`}),publicKey:b,wrappedPrivateKey:b.check(M.refine(e=>e.length%2==0&&ze(e)>=F.tagLengthBytes,{error:Re})),iv:b.check(M.refine(e=>ze(e)===F.ivLengthBytes,{error:Le})),createdAt:x,expiresAt:te,tkmsVersion:M.optional(M.string())});function Ve(e){let t={publicKey:e.publicKey,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(t.tkmsVersion=e.tkmsVersion),t}const q={version:F.version,schema:Be,async encode(e,t,n){let{wrappedPrivateKey:r,iv:i}=await Se(e.privateKey,t,n,Ve(e)),a={wrappingVersion:F.version,publicKey:e.publicKey,wrappedPrivateKey:r,iv:i,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(a.tkmsVersion=e.tkmsVersion),a},async decode(e,t,n){let r=await Ce({wrappedPrivateKey:e.wrappedPrivateKey,iv:e.iv},t,n,Ve(e)),i={publicKey:e.publicKey,privateKey:r,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(i.tkmsVersion=e.tkmsVersion),i}},He=new Map([[q.version,q]]),Ue=q;function We(e){let t=e;return t.wrappingVersion!==void 0||t.wrappedPrivateKey!==void 0&&t.iv!==void 0}function Ge(e){if(typeof e!=`object`||!e||!We(e)){let t=Ne.safeParse(e);return t.success?{kind:`plaintext`,keyPair:t.data}:{kind:`unrecognized`}}let t=e.wrappingVersion,n=typeof t==`number`?He.get(t):void 0;if(n===void 0)return{kind:`unsupported-version`,version:t};let r=n.schema.safeParse(e);if(!r.success)return{kind:`corrupt-wrapped`};let i=r.data;return{kind:`wrapped`,expiresAt:i.expiresAt,decode:(e,t)=>n.decode(i,e,t)}}function Ke(e,t,n){return Ue.encode(e,t,n)}function qe(e){return`keypair:${e}`}function J(e){return`keypair:scope:${e}`}function Y(e){return`permits:${e.signerAddress}:${e.chainId}:${e.delegatorAddress}`}function X(e){return`permits-index:${e}`}function Je(e){return`scope:${e}`}function Ye(e,t){return{"wrapped-without-secret":`Transport key pair for scope "${t}" is wrapped, but this instance has no transportKeyPairDerivationSecret configured. Every instance sharing this scope must use the same transportKeyPairDerivationSecret; once they do, call permits.revokeTransportKeyPair() to rotate the entry.`,"unwrapped-under-secret":`Transport key pair for scope "${t}" is stored unwrapped, but this instance is configured with a transportKeyPairDerivationSecret. A peer instance sharing this scope is running without the secret: configure the same transportKeyPairDerivationSecret everywhere, then call permits.revokeTransportKeyPair() to migrate the scope to a wrapped entry.`,"unwrap-failed":`Transport key pair for scope "${t}" failed to unwrap. This usually means another instance created it with a different transportKeyPairDerivationSecret: every instance sharing this scope must use the same secret. It can also mean the stored entry is corrupted.`,"corrupt-wrapped":`Transport key pair for scope "${t}" is wrapped but structurally invalid: the stored iv or ciphertext is not a shape this wrapping scheme can produce. This usually means the stored entry is corrupted, or instances sharing this scope are running mismatched wrapping-scheme versions.`}[e]}const Xe={"unwrapped-under-secret":`unwrapped transport key pair entry found while a transportKeyPairDerivationSecret is configured`,"unwrap-failed":`transport key pair entry failed to unwrap (wrong transportKeyPairDerivationSecret?)`,"corrupt-wrapped":`structurally invalid wrapped transport key pair entry`};function Ze(e,t){let n=typeof e==`number`?`wrappingVersion ${e}`:`no wrappingVersion this build recognizes`;return`Transport key pair ${t===void 0?`for this signer`:`for scope "${t}"`} was written under a wrapping scheme this SDK build cannot read (${n}). The entry is preserved instead of regenerated, since an instance that understands the scheme may still be using it: ${t===void 0?`run a build that supports it, or call permits.clear() to discard the entry deliberately`:`run a build that supports it everywhere, or call permits.revokeTransportKeyPair() to rotate the scope`}.`}var Qe=class{#e;#t;#n;#r;#i;#a;#o=new Map;#s=new Map;constructor(e){this.#e=e.generator,this.#t=e.storage,this.#n=e.ttl,this.#r=e.logger,this.#i=e.scope,this.#a=e.derivationSecret}#c(e){return this.#i===void 0?`signer:${e}`:Je(this.#i)}#l(e){return this.#i===void 0?qe(e):J(this.#i)}async readStored(e){return this.#u(this.#l(e),this.#c(e))}async#u(e,t){let n=await this.#t.get(e);if(n==null)return null;let i=Ge(n);if(i.kind===`unsupported-version`)throw this.#f(e,Ze(i.version,this.#i));if(i.kind===`unrecognized`)return await this.#m(e,`malformed transport key pair entry`),null;let a=this.#a;if(a===void 0)return i.kind===`plaintext`?await this.#p(e,i.keyPair.expiresAt)?null:i.keyPair:this.#d(e,`wrapped-without-secret`);if(i.kind===`plaintext`)return this.#d(e,`unwrapped-under-secret`);if(i.kind===`corrupt-wrapped`)return this.#d(e,`corrupt-wrapped`);if(await this.#p(e,i.expiresAt))return null;try{return await i.decode(a,t)}catch(t){if(!we(t))throw this.#r.error(`transport key pair unwrap failed unexpectedly`,{key:e,error:t}),new r(`Transport key pair unwrap failed unexpectedly.`,{cause:t});return this.#d(e,`unwrap-failed`,t)}}async#d(e,t,n){if(this.#i!==void 0)throw this.#f(e,Ye(t,this.#i),n);if(t===`wrapped-without-secret`)throw this.#f(e,`Transport key pair for this signer is wrapped, but this instance has no transportKeyPairDerivationSecret configured. Configure the same transportKeyPairDerivationSecret the entry was written with. To downgrade to plaintext at rest on purpose, discard the stored entry first by calling permits.clear(), then run without the secret.`,n);let r=Xe[t];return this.#r.warn(r,{key:e}),await this.#m(e,r),null}#f(e,t,n){return this.#r.error(t,{key:e}),new r(t,{cause:n})}async#p(e,t){return B()<t?!1:(await this.#m(e,`expired transport key pair entry`),!0)}async#m(e,t){this.#r.debug(`discarding transport key pair entry`,{key:e,reason:t}),await m(`delete transport key pair entry`,()=>this.#t.delete(e),this.#r)}async getOrCreate(e,t){return this.#h(this.#l(e),this.#c(e),{strict:t?.strict})}async#h(e,t,n){let i=n?.strict??!1,a=`${e}::${i}`,o=this.#o.get(a);if(o)return o;let c=this.#s.get(e)??0,l=(async()=>{let n=await this.#u(e,t);if(n!==null)return n;let a=await this.#e(),o=B(),l=o+this.#n,u={publicKey:a.publicKey,privateKey:a.privateKey,createdAt:o,expiresAt:l};a.tkmsVersion&&(u.tkmsVersion=a.tkmsVersion);let d=u;if(this.#a!==void 0)try{d=await Ke(u,this.#a,t)}catch(t){let n=`Failed to wrap the transport private key for at-rest storage.`;throw this.#r.error(n,{key:e,error:t}),new r(n,{cause:t})}if((this.#s.get(e)??0)===c)i?await this.#t.set(e,d):await m(`persist transport key pair`,()=>this.#t.set(e,d),this.#r);else if(i)throw new s(`The transport key pair was rotated while it was being generated, so the freshly generated key pair could not be persisted. Retry.`);return u})().finally(()=>{this.#o.delete(a)});return this.#o.set(a,l),l}async clear(e){let t=qe(e);await m(`delete transport key pair entry`,()=>this.#t.delete(t),this.#r)}async evict(e){let t=this.#l(e);await m(`evict transport key pair entry`,()=>this.#t.delete(t),this.#r)}async clearScope(){if(this.#i===void 0)return;let e=J(this.#i);this.#s.set(e,(this.#s.get(e)??0)+1),await this.#t.delete(e)}async warmScope(){this.#i!==void 0&&await this.#h(J(this.#i),Je(this.#i),{strict:!0})}};function $e(e){return C(Ie,e)}function et(e,t){let n=new Set(e.flatMap(e=>e.contractAddresses));return t.filter(e=>!n.has(e))}function tt(e){let t=[];for(let n=0;n<e.length;n+=10)t.push(e.slice(n,n+10));return t}function nt(e,t,n){return e.filter(e=>e.keypairPublicKey===t&&n<e.startTimestamp+e.durationDays*86400)}function rt(e,t){let n=new Set(t);return e.filter(e=>!e.contractAddresses.some(e=>n.has(e)))}function Z(e,t){return[...new Set([...e,...t])].sort()}function it(e,t,n){let r=new Set(n),i=e.filter(e=>new Set([...e.contractAddresses,...t]).size<=10);if(i.length===0)return null;function a(e){return e.contractAddresses.reduce((e,t)=>e+ +!!r.has(t),0)}let o=Math.max(...i.map(a));return i.filter(e=>a(e)===o).reduce((e,t)=>t.startTimestamp>e.startTimestamp?t:e)}var at=class{#e;#t;constructor(e){this.#e=e.storage,this.#t=e.logger}async list(e){let t=Y(e),n=await this.#e.get(t);if(n==null)return[];let r=Pe.safeParse(n);return r.success?r.data:(await this.clearScope(e),[])}async listUsableAndPrune(e,t){let n=await this.list(e),r=nt(n,t,Math.floor(Date.now()/1e3));return r.length!==n.length&&(r.length===0?await this.clearScope(e):await m(`update permit entry`,()=>this.#e.set(Y(e),r),this.#t)),r}async append(e,t){if(t.length===0)return;let n=t.map(e=>K.parse(e)),r=await this.list(e);await this.#e.set(Y(e),[...r,...n]),await this.#r(e)}async replace(e,t,n){let r=K.parse(n),i=(await this.list(e)).filter(e=>e.serializedPermit.signature!==t);await this.#e.set(Y(e),[...i,r]),await this.#r(e)}async deletePermitsTouching(e,t){let n=await this.list(e);if(n.length===0)return;let r=rt(n,t);r.length===0?await this.clearScope(e):await this.#e.set(Y(e),r)}async clearScope(e){await this.#a(Y(e)),await this.#i(e)}async clearAllForSigner(e){let t=X(e),n=await this.#n(t);await Promise.all(n.map(e=>this.#a(e))),await m(`delete permit index`,()=>this.#e.delete(t),this.#t)}async#n(e){let t=await this.#e.get(e);if(t==null)return[];let n=Fe.safeParse(t);return n.success?n.data:(await m(`delete permit index`,()=>this.#e.delete(e),this.#t),[])}async#r(e){let t=X(e.signerAddress),n=Y(e),r=await this.#n(t);r.includes(n)||await this.#e.set(t,[...r,n])}async#i(e){let t=X(e.signerAddress),n=Y(e),r=await this.#n(t),i=r.filter(e=>e!==n);i.length!==r.length&&(i.length===0?await m(`delete permit index`,()=>this.#e.delete(t),this.#t):await m(`update permit index`,()=>this.#e.set(t,i),this.#t))}async#a(e){await m(`delete permit entry`,()=>this.#e.delete(e),this.#t)}};async function ot(e,t,n){let r=e.get(t);if(r!==void 0)return r;let i=await n();return e.set(t,i),i}var st=class{#e;#t;#n;#r;#i;#a;#o;#s;#c=new Map;constructor(e){this.#e=new Qe({generator:async()=>{let t=e.router.relayer,n=await t.generateTransportKeyPair();return t.serializeTransportKeyPair({transportKeyPair:n})},storage:e.storage,ttl:e.transportKeyPairTTL,logger:e.logger,scope:e.scope,derivationSecret:e.derivationSecret}),this.#t=new at({storage:e.permitStorage??e.storage,logger:e.logger}),this.#n=e.router,this.#r=e.signer,this.#i=e.permitTTL,this.#a=e.logger,this.#o=e.emitEvent,this.#s=e.scope}#l(e){if(!this.#r)throw new u(e);return this.#r}#u(e,t,n=``){let r=a(t,{operation:e});return n&&(r.message=n+r.message),this.#o({type:l.PermitError,operation:e,error:r}),r}async grantPermit(e,t){let n=t===void 0?`grantPermit`:`grantDelegationPermit`,r,i,a;try{r=S(this.#l(`grantPermit`).requireWalletAccount(`grantPermit`).address),i=V(e),a=this.#f(r,t)}catch(e){throw this.#u(n,e)}let o=await this.#e.getOrCreate(r);if(i.length===0)return{keypair:o,permissions:[]};let s;try{s=await this.#t.listUsableAndPrune(a,o.publicKey)}catch(e){throw this.#u(n,e)}let c=et(s,i);if(c.length>0){let e=it(s,c,i);if(e!==null){let t=Z(e.contractAddresses,c),n=await this.#p({chunk:t,keypair:o,scope:a});await m(`replace permit`,()=>this.#t.replace(a,e.serializedPermit.signature,n),this.#a),s[s.indexOf(e)]=n}else for(let e of tt(c)){let t=await this.#p({chunk:e,keypair:o,scope:a});s.push(t),await m(`persist permit`,()=>this.#t.append(a,[t]),this.#a)}}let l=new Set(i);return{keypair:o,permissions:s.filter(e=>e.contractAddresses.some(e=>l.has(e)))}}async preparePermit(e){let t=V(e.contracts).length;if(t>10)throw new n(`preparePermit: request.contracts must not exceed 10 addresses (got ${t}). Use batchPreparePermits to split them across permits.`);let[r]=await this.batchPreparePermits(e);return d(r,`batchPreparePermits result`),r}async batchPreparePermits(e){let t=S(e.signer),r=V(e.contracts);if(r.length===0)throw new n(`request.contracts must not be empty.`);let i=e.delegator?S(e.delegator):void 0;if(i!==void 0&&i===t)throw new n(`request.delegator must differ from request.signer: self-delegation is not allowed.`);let a=e.durationDays===void 0?this.#i:C(Ae,e.durationDays),o=this.#n.relayer,s=await this.#e.getOrCreate(t,{strict:!0}),c=await o.parseTransportKeyPair(s),l=B();return Promise.all(tt(r).map(async e=>({version:1,eip712:Te(W.parse(await o.createUnsignedLegacyDecryptionPermitEip712({transportKeyPair:c,contractAddresses:e,startTimestamp:l,durationSeconds:a*z,...i&&{delegatorAddress:i}}))),signerAddress:t})))}async batchRegisterPermits(e){if(e.length===0)throw new n(`permits must not be empty.`);let t={relayer:this.#n.relayer,activeChainId:this.#n.chain.id,storedKeyPairs:new Map,transportKeyPairs:new Map},r=[];for(let[n,{prepared:i,signature:a}]of e.entries()){let o=e.length>1?`permits[${n}]: `:``;r.push(await this.#d(i,a,t,o))}for(let{scope:e,permission:t}of r)await m(`replace permit`,()=>this.#t.replace(e,t.serializedPermit.signature,t),this.#a)}async#d(e,t,{relayer:r,activeChainId:a,storedKeyPairs:c,transportKeyPairs:l},u){let d;try{d=$e(e)}catch(e){throw this.#u(`registerPermit`,e,u)}let{domain:f,message:p}=d.eip712,m=Number(f.chainId);if(m!==a)throw this.#u(`registerPermit`,new o({preparedChainId:m,activeChainId:a}),u);let h=Number(p.startTimestamp),g=Number(p.durationDays);if(B()>=h+g*86400)throw this.#u(`registerPermit`,new i(`registerPermit: the prepared permit's validity window (starting ${h}, ${g}d) has already elapsed. Prepare the permit again.`),u);let _=d.signerAddress,v=await ot(c,_,()=>this.#e.readStored(_));if(v===null||v.publicKey!==p.publicKey)throw new s(`${u}registerPermit: the transport key pair changed since the permit was prepared. Prepare it again to rebind the signature request to the current key pair.`);try{let e=await ot(l,_,()=>r.parseTransportKeyPair(v)),i=await r.parseSignedDecryptionPermit({serializedPermit:{version:d.version,eip712:d.eip712,signature:t,signerAddress:_},transportKeyPair:e});if(i.version!==1)throw new n(`registerPermit: expected a V1 signed permit, got version ${i.version}.`);let o=C(G,await r.serializeSignedDecryptionPermit({signedPermit:i})),s={keypairPublicKey:v.publicKey,contractAddresses:V(i.eip712.message.contractAddresses),serializedPermit:o,startTimestamp:Number(i.eip712.message.startTimestamp),durationDays:Number(i.eip712.message.durationDays)};return{scope:{signerAddress:_,chainId:a,delegatorAddress:S(i.encryptedDataOwnerAddress)},permission:s}}catch(e){throw this.#u(`registerPermit`,e,u)}}async hasPermit(e,t){if(e.length===0)return!0;let n=this.#r?.walletAccount.getSnapshot();if(!n)return!1;let i=S(n.address),a;try{a=await this.#e.readStored(i)}catch(e){if(!(e instanceof r))throw e;return!1}if(a===null)return!1;let o=this.#f(i,t);return et(await this.#t.listUsableAndPrune(o,a.publicKey),V(e)).length===0}async revokePermits(e){let t=S(this.#l(`revokePermits`).requireWalletAccount(`revokePermits`).address);if(e===void 0){await this.#t.clearAllForSigner(t);return}let n=V(e);n.length!==0&&await this.#t.deletePermitsTouching(this.#f(t),n)}#f(e,t){return{signerAddress:e,chainId:this.#n.chain.id,delegatorAddress:t?S(t):e}}async clearCredentials(){let e=S(this.#l(`clearCredentials`).requireWalletAccount(`clearCredentials`).address);await this.#e.clear(e),await this.#t.clearAllForSigner(e)}async revokeTransportKeyPair(e){if(this.#s===void 0)throw new n(`revokeTransportKeyPair() requires a transportKeyPairScope to be configured on this SDK instance — there is no shared key pair to revoke.`);if(e!==this.#s)throw new n(`revokeTransportKeyPair("${e}") does not match the configured scope ("${this.#s}").`);await this.#e.clearScope()}async warmTransportKeyPair(e){await this.#e.getOrCreate(S(e))}async warmTransportKeyPairScope(e){if(this.#s===void 0)throw new n(`warmTransportKeyPairScope() requires a transportKeyPairScope to be configured on this SDK instance — there is no shared key pair to warm.`);if(e!==this.#s)throw new n(`warmTransportKeyPairScope("${e}") does not match the configured scope ("${this.#s}").`);await this.#e.warmScope()}async handleWalletAccountChange(e,t){let n=e?S(e.address):void 0;n!==(t?S(t.address):void 0)&&n&&(await this.#e.clear(n),await this.#t.clearAllForSigner(n))}async#p(n){let{chunk:r,keypair:i,scope:a}=n,o=B(),s=a.delegatorAddress!==a.signerAddress,c=this.#n.relayer;try{let e={transportKeyPair:await c.parseTransportKeyPair(i),contractAddresses:r,startTimestamp:o,durationSeconds:this.#i*z,signerAddress:a.signerAddress,signer:this.#l(`signPermit`)},t=s?await c.signDecryptionPermit({...e,delegatorAddress:a.delegatorAddress}):await c.signDecryptionPermit(e),n=C(G,await c.serializeSignedDecryptionPermit({signedPermit:t}));return{keypairPublicKey:i.publicKey,contractAddresses:r,serializedPermit:n,startTimestamp:o,durationDays:this.#i}}catch(n){let r=s?`grantDelegationPermit`:`grantPermit`;throw!(n instanceof t)&&n instanceof Error&&e(n.message)&&await this.#e.evict(a.signerAddress),this.#u(r,n)}}async evictTransportKeyPair(){let e=this.#r?.walletAccount.getSnapshot();e&&await this.#e.evict(S(e.address))}async recoverPermits(e,t,n){let r=this.#l(`recoverPermits`).requireWalletAccount(`recoverPermits`),i=this.#f(S(r.address),t),a=Y(i),o=this.#c.get(a);if(o)return await o,this.grantPermit(e,t);let s=await this.#m(i),c=this.#c.get(a);if(c)return await c,this.grantPermit(e,t);if(s===null)return this.grantPermit(e,t);let l=new Set(n??[]);if(l.size>0&&!s.some(e=>l.has(e.serializedPermit.signature)))return this.grantPermit(e,t);let u=s.filter(e=>!l.has(e.serializedPermit.signature)),d=s.flatMap(e=>e.contractAddresses),f=this.#h(i,d,e,u,t).finally(()=>{this.#c.delete(a)});return this.#c.set(a,f),await f,this.grantPermit(e,t)}async#m(e){try{return await this.#t.list(e)}catch(e){return this.#a.warn(`read permits for recovery failed`,{error:e}),null}}async#h(e,t,n,r,i){await m(`evict revoked permits`,()=>this.#t.clearScope(e),this.#a);try{await this.grantPermit(Z(t,V(n)),i)}catch(t){throw r.length>0&&await m(`restore surviving permits`,async()=>{let t=await this.#t.list(e),n=new Set(t.map(e=>e.serializedPermit.signature)),i=r.filter(e=>!n.has(e.serializedPermit.signature));i.length>0&&await this.#t.append(e,i)},this.#a),t}}},ct=class{#e;#t=`[zama-sdk]`;constructor(e){this.#e=e}error(e,t){this.#e?.error(`${this.#t} ${e}`,t)}warn(e,t){this.#e?.warn(`${this.#t} ${e}`,t)}info(e,t){this.#e?.info(`${this.#t} ${e}`,t)}debug(e,t){this.#e?.debug(`${this.#t} ${e}`,t)}warnAlways(e){console.warn(`${this.#t} ${e}`),this.warn(e)}};const lt={[ce.id]:ce.registryAddress,[le.id]:le.registryAddress,[oe.id]:oe.registryAddress,[O.id]:O.registryAddress,[D.id]:D.registryAddress,[ue.id]:ue.registryAddress,[se.id]:se.registryAddress},ut=M.record(M.string().check(M.regex(/^\d+$/,`expected numeric chain id key`)),y),dt=ee,Q=300*1e3;var ft=class{provider;#e;#t;#n=new Map;constructor(e){this.provider=e.provider,this.#e=Object.assign({},lt,C(M.optional(ut),e.registryAddresses)),this.#t=C(dt,e.registryTTL??86400)*1e3}getAddress(e){return this.#e[e]}#r(e){let t=this.#n.get(e);if(t){if(Date.now()>=t.expiresAt){this.#n.delete(e);return}return t.data}}#i(e,t,n=this.#t){return this.#n.set(e,{data:t,expiresAt:Date.now()+n}),t}refresh(){this.#n.clear()}get ttlMs(){return this.#t}async getRegistryAddress(){let e=await this.provider.getChainId(),t=this.#e[e];if(!t)throw new n(`No wrappers registry address configured for chain ${e}.\nPass a registryAddresses entry for this chain.`);return k(t)}async listPairs(e={}){let t=e.page??1,r=e.pageSize??100,i=e.metadata??!1;if(t<1)throw new n(`page must be >= 1, got ${t}`);if(r<1)throw new n(`pageSize must be >= 1, got ${r}`);let a=await this.getRegistryAddress(),o=`total:${a}`,s=this.#r(o);if(s===void 0){let e=await this.provider.readContract(ne(a));s=this.#i(o,Number(e))}let c=BigInt((t-1)*r),l=c+BigInt(r)>BigInt(s)?BigInt(s):c+BigInt(r);if(c>=BigInt(s))return{items:[],total:s,page:t,pageSize:r};let u=`slice:${a}:${c}:${l}`,d=this.#r(u);if(d===void 0){let e=await this.provider.readContract(T(a,c,l));d=this.#i(u,[...e])}if(!i)return{items:d,total:s,page:t,pageSize:r};let f=`metadata:${a}:${c}:${l}`,p=this.#r(f);if(p===void 0){let e=await Promise.allSettled(d.map(e=>this.#a(e))),t=e.some(e=>e.status===`rejected`),n=e.map((e,t)=>e.status===`fulfilled`?e.value:Object.assign({},d[t],{metadataFailed:!0,underlying:{name:`Unknown`,symbol:`???`,decimals:0,totalSupply:0n},confidential:{name:`Unknown`,symbol:`???`,decimals:0}}));p=this.#i(f,n,t?Q:void 0)}return{items:p,total:s,page:t,pageSize:r}}async#a(e){let[t,n,r,i,a,o,s]=await Promise.all([this.provider.readContract(g(e.tokenAddress)),this.provider.readContract(h(e.tokenAddress)),this.provider.readContract(f(e.tokenAddress)),this.provider.readContract(p(e.tokenAddress)),this.provider.readContract(g(e.confidentialTokenAddress)),this.provider.readContract(h(e.confidentialTokenAddress)),this.provider.readContract(f(e.confidentialTokenAddress))]);return{...e,underlying:{name:t,symbol:n,decimals:r,totalSupply:i},confidential:{name:a,symbol:o,decimals:s}}}async getConfidentialToken(e){let t=await this.getRegistryAddress(),n=k(e),r=`ct:${t}:${n}`,i=this.#r(r);if(i!==void 0)return i;let[a,o]=await this.provider.readContract(E(t,n));return o===de?this.#i(r,null,Q):this.#i(r,{confidentialTokenAddress:o,isValid:a})}async getUnderlyingToken(e){let t=await this.getRegistryAddress(),n=k(e),r=`ut:${t}:${n}`,i=this.#r(r);if(i!==void 0)return i;let[a,o]=await this.provider.readContract(w(t,n));return o===de?this.#i(r,null,Q):this.#i(r,{tokenAddress:o,isValid:a})}async getTokenPairs(){let e=await this.getRegistryAddress();return this.provider.readContract(re(e))}async getTokenPairsLength(){let e=await this.getRegistryAddress();return this.provider.readContract(ne(e))}async getTokenPairsSlice(e,t){let n=await this.getRegistryAddress();return this.provider.readContract(T(n,e,t))}async getTokenPair(e){let t=await this.getRegistryAddress();return this.provider.readContract(ie(t,e))}async getConfidentialTokenAddress(e){let t=await this.getRegistryAddress();return this.provider.readContract(E(t,k(e)))}async getTokenAddress(e){let t=await this.getRegistryAddress();return this.provider.readContract(w(t,k(e)))}async isConfidentialTokenValid(e){let t=await this.getRegistryAddress();return this.provider.readContract(ae(t,k(e)))}};function pt(e,t,n){let r=new ct(n.logger),i=n.logger,a={wasmAssetLoadMode:`auto`,moduleVersions:`auto`,logger:{error:(e,t)=>i?.error(e,{cause:t}),warn:e=>i?.warn(e),debug:e=>i?.debug(e)},...n.runtime};if(fe()){let e=`runtime configuration is already set and cannot be changed.`;n.runtime===void 0?r.debug(e):r.warn(e)}else pe(a),_(a);let{storage:o,permitStorage:s}=_e(n.storage,n.permitStorage),c=n.telemetry===!1?void 0:{layer:`core`},l=new ye(n.chains,n.relayers,r,c);return{chains:n.chains,router:l,provider:t,signer:e,storage:o,permitStorage:s,transportKeyPairTTL:C(ke,n.transportKeyPairTTL??2592e3),permitTTL:C(Ae,n.permitTTL??30),clearCredentialsOnWalletChange:n.clearCredentialsOnWalletChange??!0,transportKeyPairScope:n.transportKeyPairScope===void 0?void 0:C(je,n.transportKeyPairScope),registryTTL:C(dt,n.registryTTL??86400),logger:r,onEvent:n.onEvent,telemetry:c}}function mt(e,t){return e?.address===t?.address&&e?.chainId===t?.chainId}var $=class{#e=new Set;#t;#n;constructor(e){this.#t=e,this.#n=e!==void 0}getSnapshot(){return this.#t}isReady(){return this.#n}setSnapshot(e){this.#n=!0;let t=this.#t;mt(t,e)||(this.#t=e,this.#r({previous:t,next:e}))}subscribe(e){this.#e.add(e);let t=this.#t;return t&&e({previous:void 0,next:t}),()=>{this.#e.delete(e)}}#r(e){for(let t of this.#e)t(e)}};function ht(e){return new $(e)}var gt=class{walletAccount;#e=!1;constructor(e){this.walletAccount=new $(e)}requireWalletAccount(e){let t=this.walletAccount.getSnapshot();if(!t)throw new c(e);return t}dispose(){this.#e||(this.#e=!0,this.onDispose())}[Symbol.dispose](){this.dispose()}onDispose(){}};export{lt as a,$e as c,P as d,he as f,pt as i,Me as l,me as m,$ as n,ft as o,N as p,ht as r,st as s,gt as t,xe as u};
|
|
2
|
+
//# sourceMappingURL=base-signer-BEWVhKlH.js.map
|