@zama-fhe/sdk 3.7.0-beta.8 → 3.8.0-beta.1
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/telemetry.cjs +1 -1
- package/dist/esm/cleartext/index.js +1 -1
- package/dist/esm/{cleartext-C0ba9z6Z.js → cleartext-CJ4JSBH-.js} +2 -2
- package/dist/esm/{cleartext-C0ba9z6Z.js.map → cleartext-CJ4JSBH-.js.map} +1 -1
- package/dist/esm/{fhevm-relayer-BWhXU1WB.js → fhevm-relayer-Y3tLFeGo.js} +2 -2
- package/dist/esm/{fhevm-relayer-BWhXU1WB.js.map → fhevm-relayer-Y3tLFeGo.js.map} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/internal/index.js +1 -1
- package/dist/esm/node/index.js +1 -1
- package/dist/esm/{telemetry-DvJV3oBk.js → telemetry-DGsqUbRG.js} +2 -2
- package/dist/esm/{telemetry-DvJV3oBk.js.map → telemetry-DGsqUbRG.js.map} +1 -1
- package/dist/esm/vaults/index.js +1 -1
- package/dist/esm/web/index.js +1 -1
- package/package.json +1 -1
package/dist/cjs/telemetry.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(e,t){return{"x-zama-sdk-version":`3.
|
|
1
|
+
function e(e,t){return{"x-zama-sdk-version":`3.8.0-beta.1`,"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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"../cleartext-
|
|
1
|
+
import{t as e}from"../cleartext-CJ4JSBH-.js";export{e as cleartext};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./relayer-C3jVhqSK.js";import{t}from"./fhevm-relayer-
|
|
2
|
-
//# sourceMappingURL=cleartext-
|
|
1
|
+
import{t as e}from"./relayer-C3jVhqSK.js";import{t}from"./fhevm-relayer-Y3tLFeGo.js";function n(n){return{type:`cleartext`,createRelayer:(r,i)=>{if(!r.executorAddress)throw new e(`Cleartext relayer requires an executorAddress. Either use a chain preset that includes it (e.g. hardhat, hoodi) or set it on the chain definition.`);return new t({chain:r,options:n,cleartext:!0,logger:i})}}}export{n as t};
|
|
2
|
+
//# sourceMappingURL=cleartext-CJ4JSBH-.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleartext-
|
|
1
|
+
{"version":3,"file":"cleartext-CJ4JSBH-.js","names":[],"sources":["../../src/config/cleartext.ts"],"sourcesContent":["import { ConfigurationError } from \"../errors\";\nimport { FhevmRelayer } from \"../relayer/fhevm-relayer\";\nimport type { RelayerOptions } from \"../relayer/types\";\nimport type { CleartextRelayerConfig } from \"./types\";\n\n/**\n * Cleartext relayer — drives the FHE backend in cleartext mode (no FHE infrastructure).\n *\n * When `executorAddress` is set on the chain definition (e.g. `hardhat`, `hoodi`),\n * it is picked up automatically.\n *\n * @example\n * ```ts\n * // executorAddress comes from the chain preset:\n * relayers: { [hardhat.id]: cleartext({ batchRpcCalls: true }) }\n * ```\n */\nexport function cleartext(options?: RelayerOptions): CleartextRelayerConfig {\n return {\n type: \"cleartext\",\n createRelayer: (chain, logger) => {\n if (!chain.executorAddress) {\n throw new ConfigurationError(\n `Cleartext relayer requires an executorAddress. ` +\n `Either use a chain preset that includes it (e.g. hardhat, hoodi) ` +\n `or set it on the chain definition.`,\n );\n }\n return new FhevmRelayer({ chain, options, cleartext: true, logger });\n },\n };\n}\n"],"mappings":"qFAiBA,SAAgB,EAAU,EAAkD,CAC1E,MAAO,CACL,KAAM,YACN,eAAgB,EAAO,IAAW,CAChC,GAAI,CAAC,EAAM,gBACT,MAAM,IAAI,EACR,oJAGF,EAEF,OAAO,IAAI,EAAa,CAAE,QAAO,UAAS,UAAW,GAAM,QAAO,CAAC,CACrE,CACF,CACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{t as e,x as t,y as n}from"./relayer-C3jVhqSK.js";import{n as r}from"./encryption-6AVd-82z.js";import{n as i,t as a}from"./applied-runtime-3fzqBC2V.js";import{n as o}from"./telemetry-
|
|
1
|
+
import{t as e,x as t,y as n}from"./relayer-C3jVhqSK.js";import{n as r}from"./encryption-6AVd-82z.js";import{n as i,t as a}from"./applied-runtime-3fzqBC2V.js";import{n as o}from"./telemetry-DGsqUbRG.js";import{createPublicClient as s,custom as c,http as l}from"viem";import{createUnsignedLegacyDecryptionPermitEip712 as u}from"@fhevm/sdk/actions/base";import{createFhevmBaseClient as ee,createFhevmDecryptClient as te,createFhevmEncryptClient as d,hasFhevmRuntimeConfig as f}from"@fhevm/sdk/viem";import{createFhevmCleartextBaseClient as ne,createFhevmCleartextDecryptClient as re,createFhevmCleartextEncryptClient as p}from"@fhevm/sdk/viem/cleartext";function m(e){return{id:e.id,fhevm:{contracts:{acl:{address:e.aclContractAddress},inputVerifier:{address:e.inputVerifierContractAddress},kmsVerifier:{address:e.kmsContractAddress},protocolConfig:void 0},relayerUrl:e.relayerUrl,gateway:{id:e.gatewayChainId,contracts:{decryption:{address:e.verifyingContractAddressDecryption},inputVerification:{address:e.verifyingContractAddressInputVerification}}}}}}
|
|
2
2
|
/**
|
|
3
3
|
* @license
|
|
4
4
|
* Copyright 2019 Google LLC
|
|
5
5
|
* SPDX-License-Identifier: Apache-2.0
|
|
6
6
|
*/
|
|
7
7
|
const h=Symbol(`Comlink.proxy`),ie=Symbol(`Comlink.endpoint`),g=Symbol(`Comlink.releaseProxy`),_=Symbol(`Comlink.finalizer`),v=Symbol(`Comlink.thrown`),y=e=>typeof e==`object`&&!!e||typeof e==`function`,b=new Map([[`proxy`,{canHandle:e=>y(e)&&e[h],serialize(e){let{port1:t,port2:n}=new MessageChannel;return S(e,t),[n,[n]]},deserialize(e){return e.start(),w(e)}}],[`throw`,{canHandle:e=>y(e)&&v in e,serialize({value:e}){let t;return t=e instanceof Error?{isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:{isError:!1,value:e},[t,[]]},deserialize(e){throw e.isError?Object.assign(Error(e.value.message),e.value):e.value}}]]);function x(e,t){for(let n of e)if(t===n||n===`*`||n instanceof RegExp&&n.test(t))return!0;return!1}function S(e,t=globalThis,n=[`*`]){t.addEventListener(`message`,function r(i){if(!i||!i.data)return;if(!x(n,i.origin)){console.warn(`Invalid origin '${i.origin}' for comlink proxy`);return}let{id:a,type:o,path:s}=Object.assign({path:[]},i.data),c=(i.data.argumentList||[]).map(L),l;try{let t=s.slice(0,-1).reduce((e,t)=>e[t],e),n=s.reduce((e,t)=>e[t],e);switch(o){case`GET`:l=n;break;case`SET`:t[s.slice(-1)[0]]=L(i.data.value),l=!0;break;case`APPLY`:l=n.apply(t,c);break;case`CONSTRUCT`:l=F(new n(...c));break;case`ENDPOINT`:{let{port1:t,port2:n}=new MessageChannel;S(e,n),l=P(t,[t])}break;case`RELEASE`:l=void 0;break;default:return}}catch(e){l={value:e,[v]:0}}Promise.resolve(l).catch(e=>({value:e,[v]:0})).then(n=>{let[i,s]=I(n);t.postMessage(Object.assign(Object.assign({},i),{id:a}),s),o===`RELEASE`&&(t.removeEventListener(`message`,r),C(t),_ in e&&typeof e[_]==`function`&&e[_]())}).catch(e=>{let[n,r]=I({value:TypeError(`Unserializable return value`),[v]:0});t.postMessage(Object.assign(Object.assign({},n),{id:a}),r)})}),t.start&&t.start()}function ae(e){return e.constructor.name===`MessagePort`}function C(e){ae(e)&&e.close()}function w(e,t){let n=new Map;return e.addEventListener(`message`,function(e){let{data:t}=e;if(!t||!t.id)return;let r=n.get(t.id);if(r)try{r(t)}finally{n.delete(t.id)}}),j(e,n,[],t)}function T(e){if(e)throw Error(`Proxy has been released and is not useable`)}function E(e){return R(e,new Map,{type:`RELEASE`}).then(()=>{C(e)})}const D=new WeakMap,O=`FinalizationRegistry`in globalThis&&new FinalizationRegistry(e=>{let t=(D.get(e)||0)-1;D.set(e,t),t===0&&E(e)});function k(e,t){let n=(D.get(t)||0)+1;D.set(t,n),O&&O.register(e,t,e)}function A(e){O&&O.unregister(e)}function j(e,t,n=[],r=function(){}){let i=!1,a=new Proxy(r,{get(r,o){if(T(i),o===g)return()=>{A(a),E(e),t.clear(),i=!0};if(o===`then`){if(n.length===0)return{then:()=>a};let r=R(e,t,{type:`GET`,path:n.map(e=>e.toString())}).then(L);return r.then.bind(r)}return j(e,t,[...n,o])},set(r,a,o){T(i);let[s,c]=I(o);return R(e,t,{type:`SET`,path:[...n,a].map(e=>e.toString()),value:s},c).then(L)},apply(r,a,o){T(i);let s=n[n.length-1];if(s===ie)return R(e,t,{type:`ENDPOINT`}).then(L);if(s===`bind`)return j(e,t,n.slice(0,-1));let[c,l]=M(o);return R(e,t,{type:`APPLY`,path:n.map(e=>e.toString()),argumentList:c},l).then(L)},construct(r,a){T(i);let[o,s]=M(a);return R(e,t,{type:`CONSTRUCT`,path:n.map(e=>e.toString()),argumentList:o},s).then(L)}});return k(a,e),a}function oe(e){return Array.prototype.concat.apply([],e)}function M(e){let t=e.map(I);return[t.map(e=>e[0]),oe(t.map(e=>e[1]))]}const N=new WeakMap;function P(e,t){return N.set(e,t),e}function F(e){return Object.assign(e,{[h]:!0})}function I(e){for(let[t,n]of b)if(n.canHandle(e)){let[r,i]=n.serialize(e);return[{type:`HANDLER`,name:t,value:r},i]}return[{type:`RAW`,value:e},N.get(e)||[]]}function L(e){switch(e.type){case`HANDLER`:return b.get(e.name).deserialize(e.value);case`RAW`:return e.value}}function R(e,t,n,r){return new Promise(i=>{let a=z();t.set(a,i),e.start&&e.start(),e.postMessage(Object.assign({id:a},n),r)})}function z(){return[,,,,].fill(0).map(()=>Math.floor(Math.random()*(2**53-1)).toString(16)).join(`-`)}function B(e){return typeof e==`object`&&!!e&&e.wireError===!0}const V=[`statusCode`,`status`,`retryAfter`,`timeoutMs`,`relayerApiError`,`code`,`data`,`shortMessage`,`details`,`error`,`info`];function H(e){try{return structuredClone(e),!0}catch{return!1}}function U(e){let n=e.response;return t(n?.headers)}function W(e){try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function G(e){let t={};for(let n of V){let r=e[n];r!==void 0&&H(r)&&(t[n]=r)}if(!n(t.retryAfter)){let n=U(e);n!==void 0&&(t.retryAfter=n)}return t}function K(e,t=6){if(B(e))return e;let n=e=>t>0&&e!==void 0?K(e,t-1):void 0;if(e instanceof Error)return{wireError:!0,name:e.name,message:e.message,stack:e.stack,props:G(e),cause:n(e.cause)};if(typeof e==`object`&&e){let{message:t,cause:r}=e;return{wireError:!0,name:`Error`,message:typeof t==`string`?t:W(e),stack:void 0,props:G(e),cause:n(r)}}return{wireError:!0,name:`Error`,message:typeof e==`string`?e:W(e),stack:void 0,props:{},cause:void 0}}function q(e){let t=Error(e.message,e.cause?{cause:q(e.cause)}:{});return t.name=e.name,e.stack!==void 0&&(t.stack=e.stack),Object.assign(t,e.props),t}function se(){return new Worker(new URL(`./encrypt.worker.js`,import.meta.url),{type:`module`,name:`zama-fhe-encrypt`})}const J={spawn:1e4,init:3e5},Y=new WeakSet;var X=class extends Error{crashed;constructor(e,t){super(e,t),this.name=`WorkerUnavailableError`,this.crashed=t?.crashed??!1}};function ce(e){if(typeof e!=`object`||!e)return!1;let{name:t,message:n}=e;return t===`DataCloneError`||t===`TypeError`&&typeof n==`string`&&n.includes(`Unserializable return value`)}function Z(e){if(e?.aborted)throw e.reason??new DOMException(`The operation was aborted.`,`AbortError`)}const Q={count:0,last:void 0,warnedFor:-1};function le(e){if(e===void 0)return{key:e,transfers:[]};let t=e.publicKeyBytes.bytes,n=e.crsBytes.bytes;if(!(t instanceof Uint8Array)||!(n instanceof Uint8Array))return{key:e,transfers:[]};let r=t.slice(),i=n.slice();return{key:{...e,publicKeyBytes:{...e.publicKeyBytes,bytes:r},crsBytes:{...e.crsBytes,bytes:i}},transfers:[r.buffer,i.buffer]}}function ue(){let e,t=new Promise((t,n)=>{e=n});return t.catch(()=>{}),{initPromise:void 0,worker:void 0,api:void 0,doomed:t,doom:e}}var de=class{#e;#t;#n=!1;#r=Q;#i=0;#a=new Map;#o;#s=0;#c=!1;constructor(e){this.#e=e}init=()=>{let e=this.#t??=ue();if(e.initPromise===void 0){let t=this.#f(()=>this.#u(e)).catch(n=>{throw e.initPromise===t&&(e.initPromise=void 0),n});e.initPromise=t}return e.initPromise};encryptValue=e=>this.#f(()=>this.#l(t=>t.encryptValue(e),(t,n,r)=>t.encryptValue(n,{...e,options:r}),e.options));encryptValues=e=>this.#f(()=>this.#l(t=>t.encryptValues(e),(t,n,r)=>t.encryptValues(n,{...e,options:r}),e.options));dispose(){this.#c=!0,this.#p()}async#l(e,t,n){let{signal:r,onProgress:i,...a}=n??{};Z(r),await this.init(),Z(r);let o=this.#t,s=o?.api;if(this.#o!==void 0&&(this.#n||s===void 0))return e(await this.#o);if(o===void 0||s===void 0)return e(await this.#b(o,this.#r.last??new X(`Encrypt worker not running.`)));let c=this.#i++,l=()=>void s.abort(c).catch(()=>{});r?.addEventListener(`abort`,l,{once:!0}),i&&this.#a.set(c,i);try{let e=await this.#v(o,t(s,c,a));return this.#r=Q,e}catch(t){if(t instanceof X)return e(await this.#b(o,t));throw t}finally{this.#a.delete(c),r?.removeEventListener(`abort`,l)}}async#u(e){if(this.#n)return;let t=this.#e.blockedReason;if(t!==void 0){await this.#b(e,new X(t));return}let n=await this.#e.prefetchKey();try{let t=await this.#h(e),r=this.#e.network,i=typeof r==`string`?null:F(async e=>{try{return await r.request(e)}catch(e){throw K(e)}}),a=F((e,t)=>{try{this.#e.logger[e](t)}catch(e){this.#d(`logger`,e)}}),o=F((e,t)=>{try{this.#a.get(e)?.(t)}catch(e){this.#d(`onProgress`,e)}}),s=le(n);await this.#v(e,t.init(P({...this.#e.initPayload,clientOptions:{...this.#e.initPayload.clientOptions,fheEncryptionKey:s.key},rpcUrl:typeof r==`string`?r:void 0},s.transfers),i,a,o),{ms:this.#e.timeouts.init,operation:`init`}),e.api=t,this.#r={...this.#r,last:void 0}}catch(t){if(!(t instanceof X))throw this.#y(e,new X(`Encrypt worker init failed.`)),t;await this.#b(e,t)}}#d(e,t){let n=t instanceof Error?t.message:String(t);try{this.#e.logger.warn(`Encrypt offload ${e} callback threw: ${n}`)}catch{}}async#f(e){this.#s++;try{return await e()}finally{this.#s--,this.#p()}}#p(){!this.#c||this.#s>0||(this.#c=!1,this.#t?.worker?.terminate(),this.#t=void 0,this.#o=void 0,this.#n=!1,this.#r=Q)}#m(){let e=this.#e.workerSource;if(e===void 0)return se();if(typeof e==`function`){let t=e();return Y.has(t)&&this.#e.logger.warnAlways(`The offloadWorker factory returned a worker it already handed out; each call must construct a fresh Worker.`),Y.add(t),t}return new Worker(e,{type:`module`,name:`zama-fhe-encrypt`})}async#h(e){let t;try{t=this.#m()}catch(e){throw new X(e instanceof Error?e.message:String(e),{cause:e})}e.worker=t;let n=await this.#g(e,t);return this.#_(e,t),n}#g(e,t){return new Promise((n,r)=>{let i=()=>{clearTimeout(a),t.removeEventListener(`message`,o),t.removeEventListener(`error`,s)},a=setTimeout(()=>{i(),r(new X(`Encrypt worker did not start within ${this.#e.timeouts.spawn}ms.`))},this.#e.timeouts.spawn),o=e=>{e.data===`zama-encrypt-worker-ready`&&(i(),n(w(t)))},s=t=>{i();let n=t.message||`Encrypt worker error.`;r(new X(n)),this.#y(e,new X(n))};t.addEventListener(`message`,o),t.addEventListener(`error`,s)})}#_(e,t){t.addEventListener(`error`,t=>{if(this.#t!==e)return;let n=new X(t.message||`Encrypt worker error.`,{crashed:!0});this.#r={...this.#r,count:this.#r.count+1,last:n},this.#y(e,n)})}async#v(e,t,n){let r=n===void 0?void 0:setTimeout(()=>{this.#y(e,new X(`Encrypt worker ${n.operation} timed out after ${n.ms}ms.`))},n.ms);try{return await Promise.race([t.catch(e=>{let t=B(e)?q(e):e;throw ce(t)?new X(t.message,{cause:t}):t}),e.doomed])}finally{r!==void 0&&clearTimeout(r)}}#y(e,t){e!==void 0&&(this.#t===e&&(this.#t=void 0),e.worker?.terminate(),e.worker=void 0,e.api=void 0,e.initPromise=void 0,e.doom(t))}async#b(e,t){let n=t instanceof Error?t.message:String(t);if(this.#e.strict)throw this.#y(e,new X(`Encrypt worker unavailable.`)),new r(`Encrypt offload required (offloadEncrypt: true) but unavailable: ${n}`,{cause:t});let{transient:i,pinning:a}=this.#x(t);if(this.#n||=!i,this.#y(e,new X(`Encrypt worker degraded to inline.`)),this.#S(n,i,a),this.#o===void 0){let e=(async()=>{let e=this.#e.createInlineClient();return await e.init(),e})().catch(t=>{throw this.#o===e&&(this.#o=void 0),this.#e.logger.warnAlways(`Encrypt inline fallback failed to initialize: ${t instanceof Error?t.message:String(t)}`),t});this.#o=e}return this.#o}#x(e){let t=e instanceof X&&e.crashed&&this.#r.count<2;return{transient:t,pinning:!t&&!this.#n}}#S(e,t,n){if(!n&&this.#r.warnedFor===this.#r.count)return;this.#r={...this.#r,warnedFor:this.#r.count};let r=t?`in-flight encryption falls back`:`encryption falls back`;this.#e.logger.warnAlways(`Encrypt offload unavailable, ${r} to the calling thread: ${e}`)}},fe=class{#e;#t;#n;#r;#i;#a;#o;constructor(e){this.#e=e.chain;let{timeout:t,debug:n,batchRpcCalls:r,moduleVersions:i,fheEncryptionKey:a}=e.options??{},o=this.#e.auth?$(this.#e.auth):void 0,u={publicClient:s({transport:typeof this.#e.network==`string`?l(this.#e.network):c(this.#e.network)}),chain:m(this.#e),options:{batchRpcCalls:r,moduleVersions:i,fheEncryptionKey:a}};this.#i={...o!==void 0&&{auth:o},...t!==void 0&&{timeout:t},...n!==void 0&&{debug:n}},this.#a=e.telemetry;let f=()=>this.#t.fetchFheEncryptionKeyBytes({options:this.#c(void 0)}),h=e=>({init:async()=>{await f(),await e.init()},encryptValue:t=>e.encryptValue(t),encryptValues:t=>e.encryptValues(t),fetchFheEncryptionKeyBytes:t=>e.fetchFheEncryptionKeyBytes(t)});e.cleartext?(this.#t=ne(u),this.#n=re(u),this.#r=h(p(u))):(this.#t=ee(u),this.#n=te(u),this.#r=this.#s(e,u,{prefetchKey:f,createInlineClient:()=>h(d(u))}))}#s(e,t,n){let r=e.offloadEncrypt??!1,i=r===!0,o=typeof Worker==`function`&&(e.offloadWorker!==void 0||!0);if(r===!1||!(i||o))return n.createInlineClient();let s=a(),c=me(s);if(c!==void 0&&!i)return e.logger.warnAlways(`Encryption runs on the calling thread: ${c}.`),n.createInlineClient();let l=new de({initPayload:{chain:t.chain,clientOptions:t.options,runtime:s??{}},network:this.#e.network,prefetchKey:n.prefetchKey,createInlineClient:n.createInlineClient,logger:e.logger,timeouts:e.offloadTimeouts??J,workerSource:e.offloadWorker,blockedReason:c,strict:i});return{init:()=>l.init(),encryptValue:e=>l.encryptValue(e),encryptValues:e=>l.encryptValues(e),fetchFheEncryptionKeyBytes:e=>this.#t.fetchFheEncryptionKeyBytes(e),dispose:()=>l.dispose()}}get chain(){return this.#e}#c(e){let{operation:t,...n}={...this.#i,...e};return this.#a===void 0?n:{...n,headers:{...n.headers,...o(this.#a,t)}}}#l=()=>(this.#o??=this.#r.init().catch(e=>{throw this.#o=void 0,e}),this.#o);dispose=()=>{this.#o=void 0,this.#r.dispose?.()};decryptPublicValue=async e=>(await this.#t.init(),this.#t.decryptPublicValue({...e,options:this.#c(e.options)}));decryptPublicValues=async e=>(await this.#t.init(),this.#t.decryptPublicValues({...e,options:this.#c(e.options)}));decryptPublicValuesWithSignatures=async e=>(await this.#t.init(),this.#t.decryptPublicValuesWithSignatures({...e,options:this.#c(e.options)}));encryptValue=async e=>(await this.#l(),this.#r.encryptValue({...e,options:this.#c(e.options)}));encryptValues=async e=>(await this.#l(),this.#r.encryptValues({...e,options:this.#c(e.options)}));decryptValue=async e=>(await this.#n.init(),this.#n.decryptValue({...e,options:this.#c(e.options)}));decryptValues=async e=>(await this.#n.init(),this.#n.decryptValues({...e,options:this.#c(e.options)}));decryptValuesFromPairs=async e=>(await this.#n.init(),this.#n.decryptValuesFromPairs({...e,options:this.#c(e.options)}));fetchFheEncryptionKeyBytes=async e=>(await this.#t.init(),this.#t.fetchFheEncryptionKeyBytes({...e,options:this.#c(e?.options)}));signDecryptionPermit=async e=>(await this.#t.init(),this.#t.signDecryptionPermit(e));createUnsignedLegacyDecryptionPermitEip712=e=>u(this.#t,e);serializeTransportKeyPair=e=>this.#n.serializeTransportKeyPair(e);serializeSignedDecryptionPermit=e=>this.#t.serializeSignedDecryptionPermit(e);parseTransportKeyPair=async e=>(await this.#n.init(),this.#n.parseTransportKeyPair(e));parseSignedDecryptionPermit=async e=>{await this.#t.init();let{serializedPermit:t}=e;return this.#t.parseSignedDecryptionPermit({...e,serializedPermit:{...t,signature:pe(t.signature)}})};generateTransportKeyPair=async()=>(await this.#n.init(),this.#n.generateTransportKeyPair())};function pe(e){if(e.length!==132)return e;let t=parseInt(e.slice(130),16);return t!==0&&t!==1?e:`${e.slice(0,130)}${t===0?`1b`:`1c`}`}function me(e){if(i())return`a runtime locateFile cannot cross the encrypt worker boundary`;if(e===void 0&&f())return`a runtime config set outside createConfig cannot be replicated in the encrypt worker realm`}function $(t){let n=t.__type;switch(n){case`ApiKeyHeader`:return{type:n,value:t.value,header:t.header};case`ApiKeyCookie`:return{type:n,value:t.value,cookie:t.cookie};case`BearerToken`:return{type:n,token:t.token};default:throw new e(`Unknown auth type: ${String(n)}`)}}export{$ as n,J as r,fe as t};
|
|
8
|
-
//# sourceMappingURL=fhevm-relayer-
|
|
8
|
+
//# sourceMappingURL=fhevm-relayer-Y3tLFeGo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fhevm-relayer-BWhXU1WB.js","names":["#config","#progressListeners","#generation","#withActive","#initOnce","#dispatch","#releaseRequested","#releaseIfIdle","#degradePromise","#pinnedInline","#degrade","#crashes","#sequence","#overBoundary","#spawn","#warnCallbackThrew","#teardown","#active","#createWorker","#raceReady","#armCrashHandler","#classifyDegrade","#warnDegraded","#chain","#base","#decrypt","#encrypt","#defaultOptions","#telemetry","#requestOptions","#buildEncryptBackend","#encryptInitPromise","#initEncrypt","createUnsignedLegacyDecryptionPermitEip712Action"],"sources":["../../src/chains/to-fhevm-chain.ts","../../../../node_modules/.pnpm/comlink@4.4.2/node_modules/comlink/dist/esm/comlink.mjs","../../src/worker/protocol.ts","../../src/worker/spawn.ts","../../src/worker/encrypt-worker-client.ts","../../src/relayer/fhevm-relayer.ts"],"sourcesContent":["import type { FhevmChain } from \"@fhevm/sdk/chains\";\nimport type { FheChain } from \"./types\";\n\n/**\n * Derive an `@fhevm/sdk` {@link FhevmChain} from zama-sdk's richer\n * {@link FheChain}.\n *\n * `FheChain` carries fields `@fhevm/sdk` does not model (RPC `network`,\n * `registryAddress`, `executorAddress`, cleartext signer keys); those stay on\n * `FheChain` for the token layer. This adapter projects only the subset the\n * FHE runtime needs: contract addresses, relayer URL, and gateway.\n */\nexport function toFhevmChain(chain: FheChain): FhevmChain {\n return {\n id: chain.id,\n fhevm: {\n contracts: {\n acl: { address: chain.aclContractAddress },\n inputVerifier: { address: chain.inputVerifierContractAddress },\n kmsVerifier: { address: chain.kmsContractAddress },\n protocolConfig: undefined,\n },\n relayerUrl: chain.relayerUrl,\n gateway: {\n id: chain.gatewayChainId,\n contracts: {\n decryption: { address: chain.verifyingContractAddressDecryption },\n inputVerification: { address: chain.verifyingContractAddressInputVerification },\n },\n },\n },\n } satisfies FhevmChain;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\nconst proxyMarker = Symbol(\"Comlink.proxy\");\nconst createEndpoint = Symbol(\"Comlink.endpoint\");\nconst releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst finalizer = Symbol(\"Comlink.finalizer\");\nconst throwMarker = Symbol(\"Comlink.thrown\");\nconst isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n/**\n * Internal transfer handle to handle objects marked to proxy.\n */\nconst proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n};\n/**\n * Internal transfer handler to handle thrown exceptions.\n */\nconst throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n};\n/**\n * Allows customizing the serialization of certain values.\n */\nconst transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n]);\nfunction isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n}\nfunction expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n}\nfunction isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n}\nfunction closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n}\nfunction wrap(ep, target) {\n const pendingListeners = new Map();\n ep.addEventListener(\"message\", function handleMessage(ev) {\n const { data } = ev;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n try {\n resolver(data);\n }\n finally {\n pendingListeners.delete(data.id);\n }\n });\n return createProxy(ep, pendingListeners, [], target);\n}\nfunction throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\nfunction releaseEndpoint(ep) {\n return requestResponseMessage(ep, new Map(), {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n}\nconst proxyCounter = new WeakMap();\nconst proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\nfunction registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n}\nfunction unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n}\nfunction createProxy(ep, pendingListeners, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n pendingListeners.clear();\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, pendingListeners, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, pendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, pendingListeners, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, pendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n}\nfunction myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n}\nfunction processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\nconst transferCache = new WeakMap();\nfunction transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n}\nfunction proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n}\nfunction windowEndpoint(w, context = globalThis, targetOrigin = \"*\") {\n return {\n postMessage: (msg, transferables) => w.postMessage(msg, targetOrigin, transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context),\n };\n}\nfunction toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n}\nfunction fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n}\nfunction requestResponseMessage(ep, pendingListeners, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n}\nfunction generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n\nexport { createEndpoint, expose, finalizer, proxy, proxyMarker, releaseProxy, transfer, transferHandlers, windowEndpoint, wrap };\n//# sourceMappingURL=comlink.mjs.map\n","/**\n * Shared contract between the main-thread encrypt client and the encrypt\n * worker, spoken over Comlink. Every payload must survive `structuredClone`:\n * no `AbortSignal`, no class instances; callbacks cross as Comlink proxies.\n */\n\nimport type { FhevmChain } from \"@fhevm/sdk/chains\";\nimport type {\n FhevmClientOptions,\n FhevmEncryptBackend,\n FhevmRelayerOptions,\n WireRuntimeConfig,\n} from \"../relayer/types\";\nimport { isValidRetryAfterSeconds, readRetryAfterHeader } from \"../utils/error\";\n\ntype EncryptParameters = Parameters<FhevmEncryptBackend[\"encryptValue\"]>[0];\ntype EncryptsParameters = Parameters<FhevmEncryptBackend[\"encryptValues\"]>[0];\n\n/**\n * What the worker offloads, and all the encrypt client's surface the worker\n * client implements. Key fetches stay on the calling thread, where the chain's\n * auth applies and the key never crosses back out.\n */\nexport type EncryptOffloadBackend = Pick<\n FhevmEncryptBackend,\n \"init\" | \"encryptValue\" | \"encryptValues\"\n>;\n\n/** Per-request options minus `signal`, the one non-cloneable member of the set. */\nexport type WireRequestOptions = Omit<FhevmRelayerOptions, \"signal\">;\n\nexport type WireProgressEvent = Parameters<\n NonNullable<NonNullable<EncryptParameters[\"options\"]>[\"onProgress\"]>\n>[0];\n\nexport type WireInitPayload = {\n readonly chain: FhevmChain;\n /** RPC URL for host-chain reads; absent when reads proxy through `rpcRequest`. */\n readonly rpcUrl: string | undefined;\n /** Carries `fheEncryptionKey`, prefetched on the main thread so the worker skips the download. */\n readonly clientOptions: FhevmClientOptions;\n readonly runtime: WireRuntimeConfig;\n};\n\n/** Main-thread callback the worker uses for host-chain reads when the chain's network is an injected provider. */\nexport type WireRpcRequest = (args: { method: string; params?: unknown }) => Promise<unknown>;\n\n/**\n * Main-thread callback receiving every operation's progress events, routed on\n * `id`. One channel per worker avoids minting a `MessageChannel` per call, whose\n * local port and listener would linger until garbage collection after terminate.\n * Returns `unknown`: a Comlink proxy call answers with a promise.\n */\nexport type WireProgressCallback = (id: number, event: WireProgressEvent) => unknown;\n\nexport type WireLogCallback = (level: \"debug\" | \"warn\" | \"error\", message: string) => unknown;\n\n/**\n * The API the worker exposes over Comlink. `id` correlates an in-flight\n * operation with `abort` and with its progress events, since neither an\n * `AbortSignal` nor a per-call callback can cross the boundary cheaply. The\n * `init` callback parameters must be passed as Comlink proxies (or `null`).\n */\nexport type EncryptWorkerApi = {\n init(\n payload: WireInitPayload,\n rpcRequest: WireRpcRequest | null,\n log: WireLogCallback,\n onProgress: WireProgressCallback,\n ): Promise<void>;\n encryptValue(\n id: number,\n parameters: {\n readonly value: EncryptParameters[\"value\"];\n readonly contractAddress: string;\n readonly userAddress: string;\n readonly options: WireRequestOptions | undefined;\n },\n ): ReturnType<FhevmEncryptBackend[\"encryptValue\"]>;\n encryptValues(\n id: number,\n parameters: {\n readonly values: EncryptsParameters[\"values\"];\n readonly contractAddress: string;\n readonly userAddress: string;\n readonly options: WireRequestOptions | undefined;\n },\n ): ReturnType<FhevmEncryptBackend[\"encryptValues\"]>;\n abort(id: number): void;\n};\n\n/** Raw message the worker posts once its module graph has loaded, before Comlink traffic. */\nexport const WORKER_READY_MESSAGE = \"zama-encrypt-worker-ready\";\n\n/**\n * An `Error` flattened for the boundary crossing, thrown by the worker as a\n * plain object so it survives structured clone intact. `props` carries the\n * fields the SDK's duck-typed classifiers read (`statusCode`, `retryAfter`,\n * `code`, …); a cloned `Error` instance would drop them with the prototype.\n * Reading them through the prototype chain is deliberate: upstream's `status`\n * and `relayerApiError` are prototype getters, not own fields.\n */\nexport type WireError = {\n readonly wireError: true;\n readonly name: string;\n readonly message: string;\n readonly stack: string | undefined;\n readonly props: Record<string, unknown>;\n readonly cause: WireError | undefined;\n};\n\nexport function isWireError(value: unknown): value is WireError {\n // Exact `true`, not presence: an `Error` subclass carrying the key must not be\n // rehydrated as a flattened one.\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { wireError?: unknown }).wireError === true\n );\n}\n\n/**\n * Fields preserved across the boundary: what the error classifiers read off\n * `@fhevm/sdk`, relayer, and JSON-RPC errors, plus the `error`/`info` nesting\n * keys those classifiers walk alongside `cause`.\n */\nconst WIRE_ERROR_PROPS = [\n \"statusCode\",\n \"status\",\n \"retryAfter\",\n \"timeoutMs\",\n \"relayerApiError\",\n \"code\",\n \"data\",\n \"shortMessage\",\n \"details\",\n \"error\",\n \"info\",\n] as const;\n\nconst MAX_CAUSE_DEPTH = 6;\n\n/** A probe is exact where a structural walk only approximates. */\nfunction isCloneSafe(value: unknown): boolean {\n try {\n structuredClone(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * The `Retry-After` header survives as a plain number of seconds; the\n * `Response` object it lives on cannot cross the boundary.\n */\nfunction retryAfterFromResponse(error: object): number | undefined {\n const response = (error as { response?: { headers?: unknown } }).response;\n return readRetryAfterHeader(response?.headers);\n}\n\n/**\n * `JSON.stringify` throws instead of returning `undefined` on a bigint or a\n * circular value; a non-Error thrown value must never fail error handling itself.\n */\nfunction stringifyNonError(error: unknown): string {\n try {\n return JSON.stringify(error) ?? String(error);\n } catch {\n return String(error);\n }\n}\n\n/** The classifier fields readable off one thrown value, `Error` or plain object alike. */\nfunction extractWireProps(source: object): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n for (const key of WIRE_ERROR_PROPS) {\n const value = (source as Record<string, unknown>)[key];\n if (value !== undefined && isCloneSafe(value)) {\n props[key] = value;\n }\n }\n // The header wins over a malformed own delay (`0`, negative, `NaN`), as the\n // inline extractor in `utils/error.ts` decides it.\n if (!isValidRetryAfterSeconds(props[\"retryAfter\"])) {\n const fromHeader = retryAfterFromResponse(source);\n if (fromHeader !== undefined) {\n props[\"retryAfter\"] = fromHeader;\n }\n }\n return props;\n}\n\nexport function toWireError(error: unknown, depth: number = MAX_CAUSE_DEPTH): WireError {\n if (isWireError(error)) {\n return error;\n }\n const nest = (cause: unknown): WireError | undefined =>\n depth > 0 && cause !== undefined ? toWireError(cause, depth - 1) : undefined;\n if (error instanceof Error) {\n return {\n wireError: true,\n name: error.name,\n message: error.message,\n stack: error.stack,\n props: extractWireProps(error),\n cause: nest(error.cause),\n };\n }\n if (typeof error === \"object\" && error !== null) {\n // Wallets reject with a plain `{ code, message, data }`; dropping `code`\n // would break viem's classification inside the worker.\n const { message, cause } = error as { message?: unknown; cause?: unknown };\n return {\n wireError: true,\n name: \"Error\",\n message: typeof message === \"string\" ? message : stringifyNonError(error),\n stack: undefined,\n props: extractWireProps(error),\n cause: nest(cause),\n };\n }\n return {\n wireError: true,\n name: \"Error\",\n message: typeof error === \"string\" ? error : stringifyNonError(error),\n stack: undefined,\n props: {},\n cause: undefined,\n };\n}\n\n/**\n * Rebuilds a plain `Error` carrying the original `name`, own fields, and cause\n * chain, so name-based classification and status/retry-after extraction behave\n * as if the error had been thrown on this thread.\n */\nexport function fromWireError(wire: WireError): Error {\n const error = new Error(wire.message, wire.cause ? { cause: fromWireError(wire.cause) } : {});\n error.name = wire.name;\n if (wire.stack !== undefined) {\n error.stack = wire.stack;\n }\n Object.assign(error, wire.props);\n return error;\n}\n","/** Isolated so the CJS build can replace worker construction with an inert stub. */\n\n/** False in the CJS stub, which ships no worker chunk; a caller-supplied `offloadWorker` source works in either build. */\nexport const BUNDLED_ENCRYPT_WORKER = true;\n\nexport function createEncryptWorker(): Worker {\n // Keep the `new Worker(new URL(...))` expression exactly in this inline\n // form: bundlers detect it statically to emit and rewrite the worker chunk,\n // and lose it if the URL is hoisted into a variable.\n return new Worker(new URL(\"./encrypt.worker.js\", import.meta.url), {\n type: \"module\",\n name: \"zama-fhe-encrypt\",\n });\n}\n","import { proxy, transfer, wrap, type Remote } from \"comlink\";\nimport type { EIP1193Provider } from \"viem\";\nimport { EncryptOffloadUnavailableError } from \"../errors/encryption\";\nimport type { FhevmClientOptions } from \"../relayer/types\";\nimport type { LoggerService } from \"../services/logger-service\";\nimport type {\n EncryptOffloadBackend,\n EncryptWorkerApi,\n WireInitPayload,\n WireProgressEvent,\n WireRequestOptions,\n} from \"./protocol\";\nimport { WORKER_READY_MESSAGE, fromWireError, isWireError, toWireError } from \"./protocol\";\nimport { createEncryptWorker } from \"./spawn\";\n\n/**\n * Watchdog deadlines, in milliseconds, for worker lifecycle steps: each is a\n * ceiling on \"the worker never answered\", not on legitimate slow work. Encrypt\n * operations themselves are not watched: nothing bounds local WASM compute, so\n * a proof may run for as long as it needs.\n */\nexport type EncryptWorkerTimeouts = {\n /** Worker startup + module-graph load; a bundler that mishandled the worker URL fails here. */\n readonly spawn: number;\n /** Client init inside the worker realm: chain reads and WASM compilation. */\n readonly init: number;\n};\n\nexport const DEFAULT_ENCRYPT_WORKER_TIMEOUTS: EncryptWorkerTimeouts = {\n spawn: 10_000,\n init: 300_000,\n};\n\n/** Second crash pins the client to the calling thread. */\nconst CRASH_PIN_THRESHOLD = 2;\n\n/** Stable prefix of every degrade warning. */\nexport const ENCRYPT_OFFLOAD_WARN_PREFIX = \"Encrypt offload unavailable\";\n\n/** Workers already returned by an `offloadWorker` factory, to catch a factory that hands out one worker forever. */\nconst handedOutWorkers = new WeakSet<Worker>();\n\n/** Internal signal: the worker infrastructure failed; the operation itself was not rejected. */\nclass WorkerUnavailableError extends Error {\n /** True when a worker that had already signalled ready died under us, so a respawn is worth trying. */\n readonly crashed: boolean;\n\n constructor(message: string, options?: ErrorOptions & { readonly crashed?: boolean }) {\n super(message, options);\n this.name = \"WorkerUnavailableError\";\n this.crashed = options?.crashed ?? false;\n }\n}\n\n/**\n * A payload Comlink could not clone into the worker (`DataCloneError`) or could\n * not return out of it (its own `TypeError`): a boundary failure, so it degrades\n * rather than reaching the caller as an application error.\n */\nfunction isCloneFailure(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n const { name, message } = error as { name?: unknown; message?: unknown };\n return (\n name === \"DataCloneError\" ||\n (name === \"TypeError\" &&\n typeof message === \"string\" &&\n message.includes(\"Unserializable return value\"))\n );\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n}\n\n/** What the client remembers about worker crashes, dropped whole by a worker answer and by a release. */\ntype CrashHistory = {\n readonly count: number;\n /** The crash that killed the current worker, so a call landing after it degrades as a crash too. */\n readonly last: WorkerUnavailableError | undefined;\n /** Crash count the degrade warning was last emitted for, so one failure warns once. */\n readonly warnedFor: number;\n};\n\nconst NO_CRASHES: CrashHistory = { count: 0, last: undefined, warnedFor: -1 };\n\n/**\n * The key copied for the crossing plus the buffers to transfer, so the wire copy\n * is moved instead of cloned. Anything but the known binary shape crosses\n * unchanged.\n */\nfunction keyForTransfer(key: FhevmClientOptions[\"fheEncryptionKey\"]): {\n readonly key: FhevmClientOptions[\"fheEncryptionKey\"];\n readonly transfers: Transferable[];\n} {\n if (key === undefined) {\n return { key, transfers: [] };\n }\n const publicKeyBytes = key.publicKeyBytes.bytes;\n const crsBytes = key.crsBytes.bytes;\n if (!(publicKeyBytes instanceof Uint8Array) || !(crsBytes instanceof Uint8Array)) {\n return { key, transfers: [] };\n }\n // `slice` yields a fresh exactly-sized buffer, so transferring it leaves this\n // thread's cached key intact.\n const publicKeyCopy = publicKeyBytes.slice();\n const crsCopy = crsBytes.slice();\n return {\n key: {\n ...key,\n publicKeyBytes: { ...key.publicKeyBytes, bytes: publicKeyCopy },\n crsBytes: { ...key.crsBytes, bytes: crsCopy },\n },\n transfers: [publicKeyCopy.buffer as ArrayBuffer, crsCopy.buffer as ArrayBuffer],\n };\n}\n\n/**\n * Per-call options: `signal` is forwarded as an `abort` call, `onProgress` is\n * served from the worker's shared progress channel, and `never` keeps the\n * callback contravariantly compatible with each operation's own event type.\n */\ntype CallOptions = WireRequestOptions & {\n readonly signal?: AbortSignal;\n readonly onProgress?: (args: never) => void;\n};\n\n/**\n * Everything scoped to one spawned worker, created by the init that spawns it\n * and dropped whole by a teardown. A late event carrying its own generation can\n * therefore only settle that generation, never the worker running in its place.\n */\ntype WorkerGeneration = {\n /** Memoized bring-up for this worker; it dies with the generation, so the next call re-runs it. */\n initPromise: Promise<void> | undefined;\n worker: Worker | undefined;\n api: Remote<EncryptWorkerApi> | undefined;\n /** Never resolves; teardown rejects it, and every boundary crossing races it so all of them settle together. */\n readonly doomed: Promise<never>;\n /** Rejects `doomed` with the teardown's `WorkerUnavailableError`. */\n readonly doom: (error: WorkerUnavailableError) => void;\n};\n\nfunction createWorkerGeneration(): WorkerGeneration {\n let doom!: (error: WorkerUnavailableError) => void;\n const doomed = new Promise<never>((_resolve, reject) => {\n doom = reject;\n });\n // An idle teardown dooms a generation with no crossing racing it; this\n // handler keeps that from surfacing as an unhandled rejection.\n doomed.catch(() => {});\n return { initPromise: undefined, worker: undefined, api: undefined, doomed, doom };\n}\n\nexport type EncryptWorkerClientConfig = {\n readonly initPayload: Omit<WireInitPayload, \"rpcUrl\">;\n /** The chain's RPC endpoint: a URL crosses into the worker; a provider is proxied per request. */\n readonly network: EIP1193Provider | string;\n /** Fetches the FHE key on the calling thread, where the chain's auth applies; the worker realm never downloads it itself. */\n readonly prefetchKey: () => Promise<FhevmClientOptions[\"fheEncryptionKey\"]>;\n readonly createInlineClient: () => EncryptOffloadBackend;\n readonly logger: LoggerService;\n readonly timeouts: EncryptWorkerTimeouts;\n /** A string or `URL` is spawned with the SDK's worker options; a factory is called for the worker itself. */\n readonly workerSource?: string | URL | (() => Worker);\n /**\n * A pre-known reason offload cannot work in this session: init degrades with\n * it immediately, so strict rejects at call time rather than at config time.\n */\n readonly blockedReason?: string;\n /**\n * Strict offload (`offloadEncrypt: true`): never run encryption on the\n * calling thread. Every path that would degrade rejects with\n * {@link EncryptOffloadUnavailableError} instead.\n */\n readonly strict: boolean;\n};\n\n/**\n * Encrypt backend that runs `@fhevm/sdk` in a dedicated module worker so proof\n * generation never blocks the main thread. Only infrastructure failure degrades\n * to inline (or rejects under `strict`); worker-reported errors are rethrown,\n * since inline would fail the same way.\n */\nexport class EncryptWorkerClient implements EncryptOffloadBackend {\n readonly #config: EncryptWorkerClientConfig;\n /** Resources of the worker currently being brought up or served; undefined while none runs. */\n #generation: WorkerGeneration | undefined;\n /** True once the client runs inline for the rest of its life, with no further spawn attempts. */\n #pinnedInline = false;\n #crashes: CrashHistory = NO_CRASHES;\n /** Wire ids, allocated across generations so a late reply can never be read as a live operation. */\n #sequence = 0;\n /** Per-operation `onProgress`, keyed by wire id and routed over one channel registered at init: one channel per worker avoids minting a `MessageChannel` per call, whose local port and listener would linger until garbage collection after terminate. */\n readonly #progressListeners = new Map<number, (event: WireProgressEvent) => void>();\n /** Memoized inline backend. Kept, with its key copy, across a worker recovery so a later degrade skips the refetch. */\n #degradePromise: Promise<EncryptOffloadBackend> | undefined;\n /** Operations that must drain before a requested release terminates the worker. */\n #active = 0;\n #releaseRequested = false;\n\n constructor(config: EncryptWorkerClientConfig) {\n this.#config = config;\n }\n\n init = (): Promise<void> => {\n // A call landing mid-drain rides the worker being released rather than\n // canceling the release: the drain still completes, and the call after it\n // spawns a fresh worker.\n const generation = (this.#generation ??= createWorkerGeneration());\n if (generation.initPromise === undefined) {\n // Only a successful cycle is memoized: a failure a retry could clear must\n // not be replayed to every later call.\n const attempt: Promise<void> = this.#withActive(() => this.#initOnce(generation)).catch(\n (error: unknown) => {\n if (generation.initPromise === attempt) {\n generation.initPromise = undefined;\n }\n throw error;\n },\n );\n generation.initPromise = attempt;\n }\n return generation.initPromise;\n };\n\n encryptValue: EncryptOffloadBackend[\"encryptValue\"] = (parameters) =>\n this.#withActive(() =>\n this.#dispatch(\n (backend) => backend.encryptValue(parameters),\n // Spread, so a field upstream adds to the parameters still crosses; the\n // stripped `options` replaces the caller's, which carries `signal`.\n (api, id, options) => api.encryptValue(id, { ...parameters, options }),\n parameters.options,\n ),\n );\n\n encryptValues: EncryptOffloadBackend[\"encryptValues\"] = (parameters) =>\n this.#withActive(() =>\n this.#dispatch(\n (backend) => backend.encryptValues(parameters),\n (api, id, options) => api.encryptValues(id, { ...parameters, options }),\n parameters.options,\n ),\n );\n\n /**\n * Releases the worker without changing what callers observe: in-flight\n * operations (an init included) run to completion over the worker, and the\n * worker is terminated as soon as the last one settles, immediately if the\n * client is idle. The client is not spent: the release resets it whole, so a\n * later call re-fetches the key and spawns a fresh worker exactly like the\n * first one, even if the client had degraded to the calling thread. The drain\n * is not bounded: a worker wedged inside an operation is only terminated once\n * that operation settles.\n */\n dispose(): void {\n this.#releaseRequested = true;\n this.#releaseIfIdle();\n }\n\n /**\n * The one place that decides between the worker and the calling thread:\n * inline once pinned or while no worker is running; otherwise the worker,\n * falling back to inline on infrastructure failure while application errors\n * pass through.\n */\n async #dispatch<T>(\n invoke: (backend: EncryptOffloadBackend) => Promise<T>,\n overWorker: (\n api: Remote<EncryptWorkerApi>,\n id: number,\n options: WireRequestOptions,\n ) => Promise<T>,\n callOptions: CallOptions | undefined,\n ): Promise<T> {\n const { signal, onProgress, ...options } = callOptions ?? {};\n // The worker dequeues an abort only after the proof, so a dispatched call always runs whole.\n throwIfAborted(signal);\n await this.init();\n // A listener added after the abort never fires, so an abort during init needs this recheck.\n throwIfAborted(signal);\n const generation = this.#generation;\n const api = generation?.api;\n // An existing degrade attempt already carries the decision that created it,\n // and its inline backend caches the key, so reuse it rather than degrading again.\n if (this.#degradePromise !== undefined && (this.#pinnedInline || api === undefined)) {\n return invoke(await this.#degradePromise);\n }\n if (generation === undefined || api === undefined) {\n return invoke(\n await this.#degrade(\n generation,\n this.#crashes.last ?? new WorkerUnavailableError(\"Encrypt worker not running.\"),\n ),\n );\n }\n const id = this.#sequence++;\n const onAbort = () => void api.abort(id).catch(() => {});\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (onProgress) {\n this.#progressListeners.set(id, onProgress as (event: WireProgressEvent) => void);\n }\n try {\n const result = await this.#overBoundary(generation, overWorker(api, id, options));\n // A worker operation that answered clears the crash history: two unrelated\n // crashes far apart must not add up to a permanent degrade.\n this.#crashes = NO_CRASHES;\n return result;\n } catch (error) {\n if (error instanceof WorkerUnavailableError) {\n return invoke(await this.#degrade(generation, error));\n }\n throw error;\n } finally {\n this.#progressListeners.delete(id);\n signal?.removeEventListener(\"abort\", onAbort);\n }\n }\n\n async #initOnce(generation: WorkerGeneration): Promise<void> {\n if (this.#pinnedInline) {\n // The degrade that pinned the client already initialized the backend every call now runs on.\n return;\n }\n const blockedReason = this.#config.blockedReason;\n if (blockedReason !== undefined) {\n // Handled before any resource is spent: non-strict callers never get here\n // (the relayer inlines directly), and strict throws out of the degrade.\n await this.#degrade(generation, new WorkerUnavailableError(blockedReason));\n return;\n }\n // Outside the degrade guard: a failed key fetch is an application/network\n // error, and the inline backend would refetch the same key from the same\n // relayer. It rejects out of init exactly as the inline arm's would.\n const fheEncryptionKey = await this.#config.prefetchKey();\n try {\n const api = await this.#spawn(generation);\n const network = this.#config.network;\n const rpcRequest =\n typeof network === \"string\"\n ? null\n : proxy(async (args: { method: string; params?: unknown }) => {\n try {\n return await network.request(args as Parameters<EIP1193Provider[\"request\"]>[0]);\n } catch (error) {\n // Comlink keeps only name/message/stack on a thrown error, which\n // would strip the provider's `code` (4001, -32005) the worker's\n // classifiers read; flatten it so those fields cross.\n throw toWireError(error);\n }\n });\n // A callback that throws would reject the Comlink proxy call back in the\n // worker realm, where nothing can report it, so it is contained here.\n const log = proxy((level: \"debug\" | \"warn\" | \"error\", message: string) => {\n try {\n this.#config.logger[level](message);\n } catch (error) {\n this.#warnCallbackThrew(\"logger\", error);\n }\n });\n const onProgress = proxy((id: number, event: WireProgressEvent) => {\n try {\n this.#progressListeners.get(id)?.(event);\n } catch (error) {\n this.#warnCallbackThrew(\"onProgress\", error);\n }\n });\n // The copy stays on this thread so a later degrade to inline reuses the\n // key instead of refetching; transferring the wire copy avoids a third\n // in-transit copy of it.\n const wireKey = keyForTransfer(fheEncryptionKey);\n await this.#overBoundary(\n generation,\n api.init(\n transfer(\n {\n ...this.#config.initPayload,\n clientOptions: {\n ...this.#config.initPayload.clientOptions,\n fheEncryptionKey: wireKey.key,\n },\n rpcUrl: typeof network === \"string\" ? network : undefined,\n },\n wireKey.transfers,\n ),\n rpcRequest,\n log,\n onProgress,\n ),\n { ms: this.#config.timeouts.init, operation: \"init\" },\n );\n generation.api = api;\n this.#crashes = { ...this.#crashes, last: undefined };\n } catch (error) {\n // Only \"the worker never answered or crashed\" is infrastructure. An error\n // the worker itself reported (a chain read, bad key material) would fail\n // the same way inline, so it reaches the caller unchanged.\n if (!(error instanceof WorkerUnavailableError)) {\n this.#teardown(generation, new WorkerUnavailableError(\"Encrypt worker init failed.\"));\n throw error;\n }\n await this.#degrade(generation, error);\n }\n }\n\n /** Reports a caller callback that threw; the reporting itself must not throw back into the worker. */\n #warnCallbackThrew(callback: string, error: unknown): void {\n const reason = error instanceof Error ? error.message : String(error);\n try {\n this.#config.logger.warn(`Encrypt offload ${callback} callback threw: ${reason}`);\n } catch {\n // A logger that throws on its own warning leaves nowhere left to report.\n }\n }\n\n /**\n * The count spans a whole public entry, its init included, so a release\n * requested mid-call cannot terminate the worker between the init and the\n * operation.\n */\n async #withActive<T>(work: () => Promise<T>): Promise<T> {\n this.#active++;\n try {\n return await work();\n } finally {\n this.#active--;\n this.#releaseIfIdle();\n }\n }\n\n #releaseIfIdle(): void {\n if (!this.#releaseRequested || this.#active > 0) {\n return;\n }\n this.#releaseRequested = false;\n this.#generation?.worker?.terminate();\n // A full reset, so a release is the recovery lever for a degraded client:\n // the next call re-fetches the key and spawns a fresh worker either way.\n this.#generation = undefined;\n this.#degradePromise = undefined;\n this.#pinnedInline = false;\n this.#crashes = NO_CRASHES;\n }\n\n #createWorker(): Worker {\n const source = this.#config.workerSource;\n if (source === undefined) {\n return createEncryptWorker();\n }\n if (typeof source === \"function\") {\n const worker = source();\n // A memoized factory would hand the client a worker it already terminated,\n // so the contract is one fresh Worker per call.\n if (handedOutWorkers.has(worker)) {\n this.#config.logger.warnAlways(\n \"The offloadWorker factory returned a worker it already handed out; each call must construct a fresh Worker.\",\n );\n }\n handedOutWorkers.add(worker);\n return worker;\n }\n return new Worker(source, { type: \"module\", name: \"zama-fhe-encrypt\" });\n }\n\n /** Resolves once the worker's module graph has loaded. */\n async #spawn(generation: WorkerGeneration): Promise<Remote<EncryptWorkerApi>> {\n let worker: Worker;\n try {\n worker = this.#createWorker();\n } catch (error) {\n // A blocked construction is infrastructure, so it must reach the\n // degrade path as such rather than as the raw thrown error.\n throw new WorkerUnavailableError(error instanceof Error ? error.message : String(error), {\n cause: error,\n });\n }\n generation.worker = worker;\n const api = await this.#raceReady(generation, worker);\n this.#armCrashHandler(generation, worker);\n return api;\n }\n\n /** Resolves with the Comlink API on the worker's ready message; rejects on the spawn deadline or a pre-ready error. */\n #raceReady(generation: WorkerGeneration, worker: Worker): Promise<Remote<EncryptWorkerApi>> {\n return new Promise<Remote<EncryptWorkerApi>>((resolve, reject) => {\n const settle = () => {\n clearTimeout(timer);\n worker.removeEventListener(\"message\", onReady);\n worker.removeEventListener(\"error\", onError);\n };\n const timer = setTimeout(() => {\n settle();\n reject(\n new WorkerUnavailableError(\n `Encrypt worker did not start within ${this.#config.timeouts.spawn}ms.`,\n ),\n );\n }, this.#config.timeouts.spawn);\n const onReady = (event: MessageEvent) => {\n if (event.data === WORKER_READY_MESSAGE) {\n settle();\n resolve(wrap<EncryptWorkerApi>(worker));\n }\n };\n const onError = (event: ErrorEvent) => {\n settle();\n const message = event.message || \"Encrypt worker error.\";\n // A worker that never came up is not worth respawning per call, so\n // this failure is not flagged as a crash.\n reject(new WorkerUnavailableError(message));\n this.#teardown(generation, new WorkerUnavailableError(message));\n };\n worker.addEventListener(\"message\", onReady);\n worker.addEventListener(\"error\", onError);\n });\n }\n\n /** Permanent crash detector, armed only after ready so a pre-ready failure never counts as a crash. */\n #armCrashHandler(generation: WorkerGeneration, worker: Worker): void {\n worker.addEventListener(\"error\", (event: ErrorEvent) => {\n // A generation already torn down cannot crash the client again: nothing\n // is waiting on it, and the worker running in its place is unaffected.\n if (this.#generation !== generation) {\n return;\n }\n // A ready worker died under us: the teardown drops the memoized init so\n // the next call spawns a fresh one, and the operations it took down\n // finish inline.\n const crash = new WorkerUnavailableError(event.message || \"Encrypt worker error.\", {\n crashed: true,\n });\n this.#crashes = { ...this.#crashes, count: this.#crashes.count + 1, last: crash };\n this.#teardown(generation, crash);\n });\n }\n\n /**\n * Awaits one promise crossing the worker boundary, racing the generation's\n * `doomed` promise so a teardown settles it with the teardown's\n * `WorkerUnavailableError`, which degrades it inline. Without a `deadline` it\n * settles whenever the worker answers; a `deadline` bounds a lifecycle step,\n * and missing it means the worker is presumed stuck, so the generation is\n * torn down whole.\n */\n async #overBoundary<T>(\n generation: WorkerGeneration,\n work: Promise<T>,\n deadline?: { readonly ms: number; readonly operation: string },\n ): Promise<T> {\n const timer =\n deadline === undefined\n ? undefined\n : setTimeout(() => {\n this.#teardown(\n generation,\n new WorkerUnavailableError(\n `Encrypt worker ${deadline.operation} timed out after ${deadline.ms}ms.`,\n ),\n );\n }, deadline.ms);\n try {\n return await Promise.race([\n work.catch((error: unknown) => {\n const failure = isWireError(error) ? fromWireError(error) : (error as Error);\n // A payload Comlink could not carry is infrastructure, so it degrades\n // instead of reaching the caller as the operation's own failure.\n throw isCloneFailure(failure)\n ? new WorkerUnavailableError(failure.message, { cause: failure })\n : failure;\n }),\n generation.doomed,\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n }\n\n /**\n * Rejects and drops one generation whole: its worker, its memoized init, and\n * every crossing racing its `doomed` promise. The next call therefore re-runs\n * the cycle on a fresh generation, so a spurious teardown costs a respawn\n * rather than a permanent degrade.\n */\n #teardown(generation: WorkerGeneration | undefined, error: WorkerUnavailableError): void {\n if (generation === undefined) {\n return;\n }\n if (this.#generation === generation) {\n this.#generation = undefined;\n }\n generation.worker?.terminate();\n generation.worker = undefined;\n generation.api = undefined;\n generation.initPromise = undefined;\n generation.doom(error);\n }\n\n async #degrade(\n generation: WorkerGeneration | undefined,\n cause: unknown,\n ): Promise<EncryptOffloadBackend> {\n const reason = cause instanceof Error ? cause.message : String(cause);\n if (this.#config.strict) {\n this.#teardown(generation, new WorkerUnavailableError(\"Encrypt worker unavailable.\"));\n throw new EncryptOffloadUnavailableError(\n `Encrypt offload required (offloadEncrypt: true) but unavailable: ${reason}`,\n { cause },\n );\n }\n const { transient, pinning } = this.#classifyDegrade(cause);\n this.#pinnedInline ||= !transient;\n this.#teardown(generation, new WorkerUnavailableError(\"Encrypt worker degraded to inline.\"));\n this.#warnDegraded(reason, transient, pinning);\n if (this.#degradePromise === undefined) {\n // Only a live backend is memoized: an inline init is a key refetch, and a\n // transient failure there must not close the degrade path for the session.\n const attempt: Promise<EncryptOffloadBackend> = (async () => {\n const inline = this.#config.createInlineClient();\n await inline.init();\n return inline;\n })().catch((error: unknown) => {\n if (this.#degradePromise === attempt) {\n this.#degradePromise = undefined;\n }\n this.#config.logger.warnAlways(\n `Encrypt inline fallback failed to initialize: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n });\n this.#degradePromise = attempt;\n }\n return this.#degradePromise;\n }\n\n /**\n * How one failure degrades, read off the state before the degrade mutates it:\n * `transient` diverts only this call, `pinning` settles the client inline now.\n * One crash is treated as transient; a repeat crash, or a worker that never\n * came up, settles the client inline rather than spawning a replacement per call.\n */\n #classifyDegrade(cause: unknown): { readonly transient: boolean; readonly pinning: boolean } {\n const transient =\n cause instanceof WorkerUnavailableError &&\n cause.crashed &&\n this.#crashes.count < CRASH_PIN_THRESHOLD;\n return { transient, pinning: !transient && !this.#pinnedInline };\n }\n\n /** One warning per failure, whether it pins the client inline or only diverts this call. */\n #warnDegraded(reason: string, transient: boolean, pinning: boolean): void {\n if (!pinning && this.#crashes.warnedFor === this.#crashes.count) {\n return;\n }\n this.#crashes = { ...this.#crashes, warnedFor: this.#crashes.count };\n const scope = transient ? \"in-flight encryption falls back\" : \"encryption falls back\";\n // Always on the console: a silent return to main-thread encryption is the\n // freeze this offload prevents.\n this.#config.logger.warnAlways(\n `${ENCRYPT_OFFLOAD_WARN_PREFIX}, ${scope} to the calling thread: ${reason}`,\n );\n }\n}\n","import { createUnsignedLegacyDecryptionPermitEip712 as createUnsignedLegacyDecryptionPermitEip712Action } from \"@fhevm/sdk/actions/base\";\nimport {\n createFhevmBaseClient,\n createFhevmDecryptClient,\n createFhevmEncryptClient,\n hasFhevmRuntimeConfig,\n} from \"@fhevm/sdk/viem\";\nimport {\n createFhevmCleartextBaseClient,\n createFhevmCleartextDecryptClient,\n createFhevmCleartextEncryptClient,\n} from \"@fhevm/sdk/viem/cleartext\";\nimport { createPublicClient, custom, http } from \"viem\";\nimport { toFhevmChain } from \"../chains/to-fhevm-chain\";\nimport type { FheChain } from \"../chains/types\";\nimport { ConfigurationError } from \"../errors\";\nimport { getAppliedWireRuntime, hasAppliedLocateFile } from \"./applied-runtime\";\nimport type { LoggerService } from \"../services/logger-service\";\nimport { type RelayerTelemetry, telemetryHeaders } from \"../telemetry\";\nimport {\n DEFAULT_ENCRYPT_WORKER_TIMEOUTS,\n EncryptWorkerClient,\n type EncryptWorkerClientConfig,\n type EncryptWorkerTimeouts,\n} from \"../worker/encrypt-worker-client\";\nimport { BUNDLED_ENCRYPT_WORKER } from \"../worker/spawn\";\nimport type {\n FhevmBaseClient,\n FhevmClient,\n FhevmDecryptClient,\n FhevmEncryptBackend,\n FhevmRelayerOptions,\n RelayerRequestOptions,\n RelayerSDK,\n RelayerOptions,\n WireRuntimeConfig,\n} from \"./types\";\n\n/** The `@fhevm/sdk` client inputs the worker realm rebuilds its own client from. */\ntype EncryptInitPayload = EncryptWorkerClientConfig[\"initPayload\"];\n\n/** Construction config for {@link FhevmRelayer}. */\nexport interface FhevmRelayerConfig {\n /** FHE chain configuration. */\n chain: FheChain;\n /**\n * Cleartext mode for local dev/test chains without FHE infrastructure — reads\n * mock cleartexts from the on-chain executor (discovered automatically)\n * instead of calling the relayer.\n */\n cleartext?: boolean;\n /**\n * Per-transport {@link RelayerOptions}: `@fhevm/sdk` client options plus a\n * default request `timeout` applied to every relayer round-trip on the chain.\n */\n options?: RelayerOptions;\n /** Encrypt-worker offload mode; see `web()`'s `offloadEncrypt` option. */\n offloadEncrypt?: \"auto\" | boolean;\n /** Watchdog deadlines for the encrypt worker; `web()` defaults every field before it gets here. */\n offloadTimeouts?: EncryptWorkerTimeouts;\n /** Custom source for the encrypt worker; see `web()`'s `offloadWorker` option. */\n offloadWorker?: string | URL | (() => Worker);\n /** Receives worker log lines and offload-fallback warnings. */\n logger: LoggerService;\n telemetry?: RelayerTelemetry;\n}\n\n/**\n * Single-chain FHE backend that drives `@fhevm/sdk` on the calling thread with\n * capability-scoped lazy initialization.\n * EIP-712 signing is done by the signer layer; this backend builds the typed\n * data and, on decrypt, reassembles the new SDK's signed permit from the\n * interface's params + the previously returned signature.\n *\n * @remarks\n * Each method delegates to the narrowest base, decrypt, or encrypt client,\n * adding two cross-cutting behaviors that the delegated signatures don't\n * express:\n *\n * - **Lazy init.** Each operation initializes only the capability it requires.\n * Public decrypt avoids WASM, private decrypt loads TKMS only, and encryption\n * alone loads TFHE and the FHE encryption key.\n * - **Option merging.** The chain's default options (`auth`, `timeout`, `debug`)\n * are spread in first, then the per-call `options`, so a per-call value always\n * wins over the chain default. Serialization helpers make no relayer\n * round-trip, so they inject no options.\n *\n * @internal\n */\nexport class FhevmRelayer implements RelayerSDK {\n readonly #chain: FheChain;\n readonly #base: FhevmBaseClient;\n readonly #decrypt: FhevmDecryptClient;\n readonly #encrypt: FhevmEncryptBackend;\n readonly #defaultOptions: Partial<FhevmRelayerOptions>;\n readonly #telemetry: RelayerTelemetry | undefined;\n #encryptInitPromise: Promise<void> | undefined;\n\n /**\n * Builds capability-scoped `@fhevm/sdk` clients for the chain and captures\n * the chain's `auth`/`timeout`/`debug` as request defaults. Construction is\n * cheap; each client's one-time init is deferred to its first operation.\n */\n constructor(config: FhevmRelayerConfig) {\n this.#chain = config.chain;\n const { timeout, debug, batchRpcCalls, moduleVersions, fheEncryptionKey } =\n config.options ?? {};\n const auth = this.#chain.auth ? toFhevmAuth(this.#chain.auth) : undefined;\n const transport =\n typeof this.#chain.network === \"string\"\n ? http(this.#chain.network)\n : custom(this.#chain.network);\n const params = {\n publicClient: createPublicClient({ transport }),\n chain: toFhevmChain(this.#chain),\n options: { batchRpcCalls, moduleVersions, fheEncryptionKey },\n };\n this.#defaultOptions = {\n ...(auth !== undefined && { auth }),\n ...(timeout !== undefined && { timeout }),\n ...(debug !== undefined && { debug }),\n };\n this.#telemetry = config.telemetry;\n // The FHE key is always fetched here, on the calling thread, so the chain's\n // default request options (auth in particular) apply; a worker realm has no\n // access to them.\n const prefetchKey = () =>\n this.#base.fetchFheEncryptionKeyBytes({ options: this.#requestOptions(undefined) });\n // Re-listed rather than spread: the upstream client exposes an enumerable\n // `ready` getter, and a spread would call it, starting init at construction.\n const withInlineInit = (client: FhevmEncryptBackend): FhevmEncryptBackend => ({\n init: async () => {\n await prefetchKey();\n await client.init();\n },\n encryptValue: (parameters) => client.encryptValue(parameters),\n encryptValues: (parameters) => client.encryptValues(parameters),\n fetchFheEncryptionKeyBytes: (parameters) => client.fetchFheEncryptionKeyBytes(parameters),\n });\n if (config.cleartext) {\n this.#base = createFhevmCleartextBaseClient(params);\n this.#decrypt = createFhevmCleartextDecryptClient(params);\n this.#encrypt = withInlineInit(createFhevmCleartextEncryptClient(params));\n } else {\n this.#base = createFhevmBaseClient(params);\n this.#decrypt = createFhevmDecryptClient(params);\n this.#encrypt = this.#buildEncryptBackend(config, params, {\n prefetchKey,\n createInlineClient: () => withInlineInit(createFhevmEncryptClient(params)),\n });\n }\n }\n\n /**\n * Picks the encrypt backend for a non-cleartext chain: the worker client when\n * offload is on and reachable, the inline calling-thread client otherwise.\n */\n #buildEncryptBackend(\n config: FhevmRelayerConfig,\n params: { chain: EncryptInitPayload[\"chain\"]; options: EncryptInitPayload[\"clientOptions\"] },\n inline: {\n prefetchKey: EncryptWorkerClientConfig[\"prefetchKey\"];\n createInlineClient: () => FhevmEncryptBackend;\n },\n ): FhevmEncryptBackend {\n const offload = config.offloadEncrypt ?? false;\n const strict = offload === true;\n const workerAvailable =\n typeof Worker === \"function\" &&\n (config.offloadWorker !== undefined || BUNDLED_ENCRYPT_WORKER);\n // Silent both ways: offload off is what the caller asked for, and a realm\n // with no Worker is an environment fact that would warn on every SSR\n // render. Strict skips the capability check, since construction runs during\n // that render and the failure must surface at call time instead.\n if (offload === false || !(strict || workerAvailable)) {\n return inline.createInlineClient();\n }\n const runtime = getAppliedWireRuntime();\n const blocker = encryptOffloadBlocker(runtime);\n if (blocker !== undefined && !strict) {\n // Always on the console: the alternative is an opaque rejection at\n // encrypt time, or WASM assets silently resolved from the default URLs.\n config.logger.warnAlways(`Encryption runs on the calling thread: ${blocker}.`);\n return inline.createInlineClient();\n }\n const workerClient = new EncryptWorkerClient({\n initPayload: { chain: params.chain, clientOptions: params.options, runtime: runtime ?? {} },\n network: this.#chain.network,\n prefetchKey: inline.prefetchKey,\n createInlineClient: inline.createInlineClient,\n logger: config.logger,\n timeouts: config.offloadTimeouts ?? DEFAULT_ENCRYPT_WORKER_TIMEOUTS,\n workerSource: config.offloadWorker,\n // Strict with a blocker: the client degrades at init, which rejects at\n // call time rather than at config time.\n blockedReason: blocker,\n strict,\n });\n return {\n init: () => workerClient.init(),\n encryptValue: (parameters) => workerClient.encryptValue(parameters),\n encryptValues: (parameters) => workerClient.encryptValues(parameters),\n // Served from the calling thread: routing it through the worker would\n // structured-clone the ~50 MB key back out on every call. `ignoreCache`\n // therefore refreshes this thread's cache, not the worker's seeded key.\n fetchFheEncryptionKeyBytes: (parameters) => this.#base.fetchFheEncryptionKeyBytes(parameters),\n dispose: () => workerClient.dispose(),\n };\n }\n\n /** The FHE chain this backend is bound to. */\n get chain() {\n return this.#chain;\n }\n\n // `operation` becomes a header here and must never reach `@fhevm/sdk`.\n #requestOptions<T extends Partial<FhevmRelayerOptions> | undefined>(\n options: T,\n ): Omit<Partial<FhevmRelayerOptions> & NonNullable<T>, \"operation\"> {\n const { operation, ...merged } = {\n ...this.#defaultOptions,\n ...options,\n } as Partial<FhevmRelayerOptions> & NonNullable<T> & RelayerRequestOptions;\n if (this.#telemetry === undefined) {\n return merged;\n }\n return {\n ...merged,\n headers: { ...merged.headers, ...telemetryHeaders(this.#telemetry, operation) },\n };\n }\n\n // Only a fulfilled init is memoized: a rejection clears the memo so the next\n // encryption retries instead of inheriting a transient key-fetch failure.\n #initEncrypt = (): Promise<void> => {\n this.#encryptInitPromise ??= this.#encrypt.init().catch((error: unknown) => {\n this.#encryptInitPromise = undefined;\n throw error;\n });\n return this.#encryptInitPromise;\n };\n\n /**\n * Releases the encrypt worker once in-flight encryptions settle and drops the\n * memoized init; the next encryption spawns a fresh worker and re-initializes.\n */\n dispose = (): void => {\n this.#encryptInitPromise = undefined;\n this.#encrypt.dispose?.();\n };\n\n /**\n * Decrypts a single publicly-decryptable value — one whose contract granted\n * public access, so no permit or key pair is needed — into its typed clear\n * value.\n *\n * @example\n * ```ts\n * const { type, value } = await relayer.decryptPublicValue({\n * encryptedValue: handle, // a bytes32 ciphertext reference\n * });\n * ```\n */\n decryptPublicValue: FhevmClient[\"decryptPublicValue\"] = async (parameters) => {\n await this.#base.init();\n return this.#base.decryptPublicValue({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Batch form of {@link decryptPublicValue}: decrypts many publicly-decryptable\n * values in one relayer round-trip, returning their typed clear values in\n * order.\n *\n * @example\n * ```ts\n * const values = await relayer.decryptPublicValues({\n * encryptedValues: [handleA, handleB],\n * });\n * ```\n */\n decryptPublicValues: FhevmClient[\"decryptPublicValues\"] = async (parameters) => {\n await this.#base.init();\n return this.#base.decryptPublicValues({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Like {@link decryptPublicValues}, but also returns the KMS signature bundle —\n * the handles list, ABI-encoded cleartexts, and decryption proof — needed to\n * verify or replay the result on-chain.\n *\n * @example\n * ```ts\n * const { clearValues, checkSignaturesArgs } =\n * await relayer.decryptPublicValuesWithSignatures({ encryptedValues: [handle] });\n * // checkSignaturesArgs: { handlesList, abiEncodedCleartexts, decryptionProof }\n * ```\n */\n decryptPublicValuesWithSignatures: FhevmClient[\"decryptPublicValuesWithSignatures\"] = async (\n parameters,\n ) => {\n await this.#base.init();\n return this.#base.decryptPublicValuesWithSignatures({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Encrypts one typed input under the chain's FHE key, bound to the contract it\n * targets and the user submitting it, and returns the ciphertext handle plus\n * the input proof the contract verifies on-chain. `type` is the FHE type\n * with the `e` prefix (`\"euint64\"`, `\"ebool\"`, `\"eaddress\"`).\n *\n * @example\n * ```ts\n * const { encryptedValue, inputProof } = await relayer.encryptValue({\n * value: { type: \"euint64\", value: 1000n },\n * contractAddress: \"0xToken…\",\n * userAddress: \"0xUser…\",\n * });\n * ```\n */\n encryptValue: FhevmClient[\"encryptValue\"] = async (parameters) => {\n await this.#initEncrypt();\n return this.#encrypt.encryptValue({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Batch form of {@link encryptValue}: encrypts several inputs for the same\n * contract and user in one call, returning all ciphertext handles under a\n * single shared input proof.\n *\n * @example\n * ```ts\n * const { encryptedValues, inputProof } = await relayer.encryptValues({\n * values: [\n * { type: \"euint64\", value: 1000n },\n * { type: \"ebool\", value: true },\n * ],\n * contractAddress: \"0xToken…\",\n * userAddress: \"0xUser…\",\n * });\n * ```\n */\n encryptValues: FhevmClient[\"encryptValues\"] = async (parameters) => {\n await this.#initEncrypt();\n return this.#encrypt.encryptValues({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * User-decrypts a single access-controlled value: the relayer re-encrypts it\n * to the ephemeral transport key pair, gated by the signed permit, and this\n * returns the typed clear value. Build the key pair with\n * {@link generateTransportKeyPair} and the permit with\n * {@link signDecryptionPermit}.\n *\n * @example\n * ```ts\n * const { type, value } = await relayer.decryptValue({\n * encryptedValue: handle,\n * contractAddress: \"0xToken…\",\n * transportKeyPair,\n * signedPermit,\n * });\n * ```\n */\n decryptValue: FhevmClient[\"decryptValue\"] = async (parameters) => {\n await this.#decrypt.init();\n return this.#decrypt.decryptValue({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Batch form of {@link decryptValue} for values that all belong to the same\n * contract; returns the typed clear values positionally. For values spanning\n * multiple contracts, use {@link decryptValuesFromPairs}.\n *\n * @example\n * ```ts\n * const values = await relayer.decryptValues({\n * encryptedValues: [handleA, handleB],\n * contractAddress: \"0xToken…\",\n * transportKeyPair,\n * signedPermit,\n * });\n * ```\n */\n decryptValues: FhevmClient[\"decryptValues\"] = async (parameters) => {\n await this.#decrypt.init();\n return this.#decrypt.decryptValues({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * User-decrypts values that span multiple contracts: each pair carries its own\n * `contractAddress`, so one permit covering those contracts decrypts them all\n * in a single round-trip. Returns the typed clear values positionally.\n *\n * @example\n * ```ts\n * const values = await relayer.decryptValuesFromPairs({\n * pairs: [\n * { encryptedValue: handleA, contractAddress: \"0xTokenA…\" },\n * { encryptedValue: handleB, contractAddress: \"0xTokenB…\" },\n * ],\n * transportKeyPair,\n * signedPermit,\n * });\n * ```\n */\n decryptValuesFromPairs: FhevmClient[\"decryptValuesFromPairs\"] = async (parameters) => {\n await this.#decrypt.init();\n return this.#decrypt.decryptValuesFromPairs({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Fetches the chain's raw FHE public-key bytes — the key encryption uses —\n * served from cache unless `ignoreCache` forces a refetch. Rarely called\n * directly: {@link encryptValue}/{@link encryptValues} fetch the key for you.\n *\n * @example\n * ```ts\n * const keyBytes = await relayer.fetchFheEncryptionKeyBytes();\n * const fresh = await relayer.fetchFheEncryptionKeyBytes({ ignoreCache: true });\n * ```\n */\n fetchFheEncryptionKeyBytes: FhevmClient[\"fetchFheEncryptionKeyBytes\"] = async (parameters) => {\n // Served from the base client, which shares the key cache with the encrypt\n // client: initializing encryption here would spawn the encrypt worker and\n // wait out its bring-up for a key this thread fetches itself.\n await this.#base.init();\n return this.#base.fetchFheEncryptionKeyBytes({\n ...parameters,\n options: this.#requestOptions(parameters?.options),\n });\n };\n\n /**\n * Builds the EIP-712 user-decrypt permit and signs it with the given signer,\n * authorizing the transport key pair to decrypt the listed contracts' values\n * for `durationSeconds` starting at `startTimestamp`. Pass `delegatorAddress`\n * to sign a delegated permit — decrypting values owned by that account instead\n * of the signer's own. Persist the result via\n * {@link serializeSignedDecryptionPermit}.\n *\n * @example\n * ```ts\n * const signedPermit = await relayer.signDecryptionPermit({\n * transportKeyPair,\n * contractAddresses: [\"0xToken…\"],\n * startTimestamp: Math.floor(Date.now() / 1000),\n * durationSeconds: 60 * 60 * 24,\n * signerAddress: \"0xUser…\",\n * signer,\n * // delegatorAddress: \"0xOwner…\", // omit for a self permit\n * });\n * ```\n */\n signDecryptionPermit: FhevmClient[\"signDecryptionPermit\"] = async (parameters) => {\n await this.#base.init();\n return this.#base.signDecryptionPermit(parameters);\n };\n\n /**\n * Builds the unsigned EIP-712 typed data for a V1 decryption permit, without\n * signing it — the signer-less counterpart to {@link signDecryptionPermit}.\n * Hand the result to an out-of-process signer for `eth_signTypedData_v4`,\n * then verify the returned signature via {@link parseSignedDecryptionPermit}.\n *\n * Not on `@fhevm/sdk`'s client decorator, so it's called directly against\n * the base client rather than through a decorated method.\n *\n * @example\n * ```ts\n * const eip712 = await relayer.createUnsignedLegacyDecryptionPermitEip712({\n * transportKeyPair,\n * contractAddresses: [\"0xToken…\"],\n * startTimestamp: Math.floor(Date.now() / 1000),\n * durationSeconds: 60 * 60 * 24,\n * // delegatorAddress: \"0xOwner…\", // omit for a self permit\n * });\n * ```\n */\n createUnsignedLegacyDecryptionPermitEip712: RelayerSDK[\"createUnsignedLegacyDecryptionPermitEip712\"] =\n (parameters) => createUnsignedLegacyDecryptionPermitEip712Action(this.#base, parameters);\n\n // Permit/key-pair helpers carry no request options. Parsing explicitly\n // initializes the capability that validates the restored value; serialization\n // resolves the frozen context internally (via initPublicAction), which reads\n // on-chain state.\n\n /**\n * Serializes a transport key pair to a hex `{ publicKey, privateKey }` pair for\n * storage or transport, so a decryption session can resume without regenerating\n * keys. Reverse of {@link parseTransportKeyPair}.\n *\n * @example\n * ```ts\n * const stored = await relayer.serializeTransportKeyPair({ transportKeyPair });\n * // { publicKey: \"0x…\", privateKey: \"0x…\" }\n * ```\n */\n serializeTransportKeyPair: FhevmClient[\"serializeTransportKeyPair\"] = (parameters) =>\n this.#decrypt.serializeTransportKeyPair(parameters);\n\n /**\n * Serializes a signed permit to a plain, JSON-stringifiable object (version,\n * EIP-712 payload, signature, signer) for caching or transport. Reverse of\n * {@link parseSignedDecryptionPermit}.\n *\n * @example\n * ```ts\n * const serialized = await relayer.serializeSignedDecryptionPermit({ signedPermit });\n * localStorage.setItem(\"permit\", JSON.stringify(serialized));\n * ```\n */\n serializeSignedDecryptionPermit: FhevmClient[\"serializeSignedDecryptionPermit\"] = (parameters) =>\n this.#base.serializeSignedDecryptionPermit(parameters);\n\n /**\n * Rebuilds a transport key pair from its serialized hex\n * `{ publicKey, privateKey }` form. Reverse of {@link serializeTransportKeyPair}.\n *\n * @example\n * ```ts\n * const transportKeyPair = await relayer.parseTransportKeyPair({\n * publicKey: stored.publicKey,\n * privateKey: stored.privateKey,\n * });\n * ```\n */\n parseTransportKeyPair: FhevmClient[\"parseTransportKeyPair\"] = async (parameters) => {\n await this.#decrypt.init();\n return this.#decrypt.parseTransportKeyPair(parameters);\n };\n\n /**\n * Rebuilds a signed permit from its serialized form and validates it: checks\n * the EIP-712 structure, verifies the signature against the on-chain verifier,\n * and confirms the permit's public key matches `transportKeyPair`. Reverse of\n * {@link serializeSignedDecryptionPermit}.\n *\n * @throws if the permit is malformed, expired, or its signature is invalid.\n *\n * @example\n * ```ts\n * const signedPermit = await relayer.parseSignedDecryptionPermit({\n * serializedPermit,\n * transportKeyPair,\n * });\n * ```\n */\n parseSignedDecryptionPermit: FhevmClient[\"parseSignedDecryptionPermit\"] = async (parameters) => {\n await this.#base.init();\n const { serializedPermit } = parameters;\n return this.#base.parseSignedDecryptionPermit({\n ...parameters,\n serializedPermit: {\n ...serializedPermit,\n signature: normalizeSignatureV(serializedPermit.signature),\n },\n });\n };\n\n /**\n * Generates a fresh ephemeral transport key pair for a user-decrypt session.\n * The relayer re-encrypts decrypted values to this pair's public key, so only\n * the holder of the private key can read them; bind it to a permit via\n * {@link signDecryptionPermit}.\n *\n * @example\n * ```ts\n * const transportKeyPair = await relayer.generateTransportKeyPair();\n * ```\n */\n generateTransportKeyPair: FhevmClient[\"generateTransportKeyPair\"] = async () => {\n await this.#decrypt.init();\n return this.#decrypt.generateTransportKeyPair();\n };\n}\n\n/**\n * Rewrites a 65-byte signature's recovery byte from 0/1 to 27/28. The gateway\n * verifies V1 permits on-chain with OpenZeppelin `ECDSA.recover`, which rejects\n * 0/1. Longer signatures (ERC-1271, concatenated) pass through untouched.\n */\nfunction normalizeSignatureV(signature: string): string {\n if (signature.length !== 132) {\n return signature;\n }\n const v = parseInt(signature.slice(130), 16);\n if (v !== 0 && v !== 1) {\n return signature;\n }\n return `${signature.slice(0, 130)}${v === 0 ? \"1b\" : \"1c\"}`;\n}\n\n/**\n * The one reason, if any, this thread's configuration cannot be reproduced in\n * the worker realm, so offload is worse than inline there.\n */\nfunction encryptOffloadBlocker(runtime: WireRuntimeConfig | undefined): string | undefined {\n // A runtime `locateFile` is a function: it cannot be cloned into the worker\n // realm, which would silently resolve WASM assets from the default URLs.\n if (hasAppliedLocateFile()) {\n return \"a runtime locateFile cannot cross the encrypt worker boundary\";\n }\n // Unreadable here, so the worker would run on fhevm defaults: an auth it\n // carries would 401 inside the worker as an application error, which never degrades.\n if (runtime === undefined && hasFhevmRuntimeConfig()) {\n return \"a runtime config set outside createConfig cannot be replicated in the encrypt worker realm\";\n }\n return undefined;\n}\n\n/**\n * Translates the SDK's public {@link FheChain.auth} shape (discriminated by\n * `__type`) into the `type`-discriminated `auth` that `@fhevm/sdk` expects.\n *\n * @throws if the auth discriminator is not one of the supported kinds.\n */\nexport function toFhevmAuth(\n auth: NonNullable<FheChain[\"auth\"]>,\n): NonNullable<FhevmRelayerOptions[\"auth\"]> {\n const type = auth[\"__type\"];\n switch (type) {\n case \"ApiKeyHeader\":\n return { type, value: auth.value, header: auth.header };\n case \"ApiKeyCookie\":\n return { type, value: auth.value, cookie: auth.cookie };\n case \"BearerToken\":\n return { type, token: auth.token };\n default:\n throw new ConfigurationError(`Unknown auth type: ${String(type)}`);\n }\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fhevm-relayer-Y3tLFeGo.js","names":["#config","#progressListeners","#generation","#withActive","#initOnce","#dispatch","#releaseRequested","#releaseIfIdle","#degradePromise","#pinnedInline","#degrade","#crashes","#sequence","#overBoundary","#spawn","#warnCallbackThrew","#teardown","#active","#createWorker","#raceReady","#armCrashHandler","#classifyDegrade","#warnDegraded","#chain","#base","#decrypt","#encrypt","#defaultOptions","#telemetry","#requestOptions","#buildEncryptBackend","#encryptInitPromise","#initEncrypt","createUnsignedLegacyDecryptionPermitEip712Action"],"sources":["../../src/chains/to-fhevm-chain.ts","../../../../node_modules/.pnpm/comlink@4.4.2/node_modules/comlink/dist/esm/comlink.mjs","../../src/worker/protocol.ts","../../src/worker/spawn.ts","../../src/worker/encrypt-worker-client.ts","../../src/relayer/fhevm-relayer.ts"],"sourcesContent":["import type { FhevmChain } from \"@fhevm/sdk/chains\";\nimport type { FheChain } from \"./types\";\n\n/**\n * Derive an `@fhevm/sdk` {@link FhevmChain} from zama-sdk's richer\n * {@link FheChain}.\n *\n * `FheChain` carries fields `@fhevm/sdk` does not model (RPC `network`,\n * `registryAddress`, `executorAddress`, cleartext signer keys); those stay on\n * `FheChain` for the token layer. This adapter projects only the subset the\n * FHE runtime needs: contract addresses, relayer URL, and gateway.\n */\nexport function toFhevmChain(chain: FheChain): FhevmChain {\n return {\n id: chain.id,\n fhevm: {\n contracts: {\n acl: { address: chain.aclContractAddress },\n inputVerifier: { address: chain.inputVerifierContractAddress },\n kmsVerifier: { address: chain.kmsContractAddress },\n protocolConfig: undefined,\n },\n relayerUrl: chain.relayerUrl,\n gateway: {\n id: chain.gatewayChainId,\n contracts: {\n decryption: { address: chain.verifyingContractAddressDecryption },\n inputVerification: { address: chain.verifyingContractAddressInputVerification },\n },\n },\n },\n } satisfies FhevmChain;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\nconst proxyMarker = Symbol(\"Comlink.proxy\");\nconst createEndpoint = Symbol(\"Comlink.endpoint\");\nconst releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst finalizer = Symbol(\"Comlink.finalizer\");\nconst throwMarker = Symbol(\"Comlink.thrown\");\nconst isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n/**\n * Internal transfer handle to handle objects marked to proxy.\n */\nconst proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n};\n/**\n * Internal transfer handler to handle thrown exceptions.\n */\nconst throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n};\n/**\n * Allows customizing the serialization of certain values.\n */\nconst transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n]);\nfunction isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n}\nfunction expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n}\nfunction isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n}\nfunction closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n}\nfunction wrap(ep, target) {\n const pendingListeners = new Map();\n ep.addEventListener(\"message\", function handleMessage(ev) {\n const { data } = ev;\n if (!data || !data.id) {\n return;\n }\n const resolver = pendingListeners.get(data.id);\n if (!resolver) {\n return;\n }\n try {\n resolver(data);\n }\n finally {\n pendingListeners.delete(data.id);\n }\n });\n return createProxy(ep, pendingListeners, [], target);\n}\nfunction throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n}\nfunction releaseEndpoint(ep) {\n return requestResponseMessage(ep, new Map(), {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n}\nconst proxyCounter = new WeakMap();\nconst proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\nfunction registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n}\nfunction unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n}\nfunction createProxy(ep, pendingListeners, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n pendingListeners.clear();\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, pendingListeners, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, pendingListeners, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, pendingListeners, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, pendingListeners, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, pendingListeners, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n}\nfunction myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n}\nfunction processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\nconst transferCache = new WeakMap();\nfunction transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n}\nfunction proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n}\nfunction windowEndpoint(w, context = globalThis, targetOrigin = \"*\") {\n return {\n postMessage: (msg, transferables) => w.postMessage(msg, targetOrigin, transferables),\n addEventListener: context.addEventListener.bind(context),\n removeEventListener: context.removeEventListener.bind(context),\n };\n}\nfunction toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n}\nfunction fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n}\nfunction requestResponseMessage(ep, pendingListeners, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n pendingListeners.set(id, resolve);\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n}\nfunction generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n}\n\nexport { createEndpoint, expose, finalizer, proxy, proxyMarker, releaseProxy, transfer, transferHandlers, windowEndpoint, wrap };\n//# sourceMappingURL=comlink.mjs.map\n","/**\n * Shared contract between the main-thread encrypt client and the encrypt\n * worker, spoken over Comlink. Every payload must survive `structuredClone`:\n * no `AbortSignal`, no class instances; callbacks cross as Comlink proxies.\n */\n\nimport type { FhevmChain } from \"@fhevm/sdk/chains\";\nimport type {\n FhevmClientOptions,\n FhevmEncryptBackend,\n FhevmRelayerOptions,\n WireRuntimeConfig,\n} from \"../relayer/types\";\nimport { isValidRetryAfterSeconds, readRetryAfterHeader } from \"../utils/error\";\n\ntype EncryptParameters = Parameters<FhevmEncryptBackend[\"encryptValue\"]>[0];\ntype EncryptsParameters = Parameters<FhevmEncryptBackend[\"encryptValues\"]>[0];\n\n/**\n * What the worker offloads, and all the encrypt client's surface the worker\n * client implements. Key fetches stay on the calling thread, where the chain's\n * auth applies and the key never crosses back out.\n */\nexport type EncryptOffloadBackend = Pick<\n FhevmEncryptBackend,\n \"init\" | \"encryptValue\" | \"encryptValues\"\n>;\n\n/** Per-request options minus `signal`, the one non-cloneable member of the set. */\nexport type WireRequestOptions = Omit<FhevmRelayerOptions, \"signal\">;\n\nexport type WireProgressEvent = Parameters<\n NonNullable<NonNullable<EncryptParameters[\"options\"]>[\"onProgress\"]>\n>[0];\n\nexport type WireInitPayload = {\n readonly chain: FhevmChain;\n /** RPC URL for host-chain reads; absent when reads proxy through `rpcRequest`. */\n readonly rpcUrl: string | undefined;\n /** Carries `fheEncryptionKey`, prefetched on the main thread so the worker skips the download. */\n readonly clientOptions: FhevmClientOptions;\n readonly runtime: WireRuntimeConfig;\n};\n\n/** Main-thread callback the worker uses for host-chain reads when the chain's network is an injected provider. */\nexport type WireRpcRequest = (args: { method: string; params?: unknown }) => Promise<unknown>;\n\n/**\n * Main-thread callback receiving every operation's progress events, routed on\n * `id`. One channel per worker avoids minting a `MessageChannel` per call, whose\n * local port and listener would linger until garbage collection after terminate.\n * Returns `unknown`: a Comlink proxy call answers with a promise.\n */\nexport type WireProgressCallback = (id: number, event: WireProgressEvent) => unknown;\n\nexport type WireLogCallback = (level: \"debug\" | \"warn\" | \"error\", message: string) => unknown;\n\n/**\n * The API the worker exposes over Comlink. `id` correlates an in-flight\n * operation with `abort` and with its progress events, since neither an\n * `AbortSignal` nor a per-call callback can cross the boundary cheaply. The\n * `init` callback parameters must be passed as Comlink proxies (or `null`).\n */\nexport type EncryptWorkerApi = {\n init(\n payload: WireInitPayload,\n rpcRequest: WireRpcRequest | null,\n log: WireLogCallback,\n onProgress: WireProgressCallback,\n ): Promise<void>;\n encryptValue(\n id: number,\n parameters: {\n readonly value: EncryptParameters[\"value\"];\n readonly contractAddress: string;\n readonly userAddress: string;\n readonly options: WireRequestOptions | undefined;\n },\n ): ReturnType<FhevmEncryptBackend[\"encryptValue\"]>;\n encryptValues(\n id: number,\n parameters: {\n readonly values: EncryptsParameters[\"values\"];\n readonly contractAddress: string;\n readonly userAddress: string;\n readonly options: WireRequestOptions | undefined;\n },\n ): ReturnType<FhevmEncryptBackend[\"encryptValues\"]>;\n abort(id: number): void;\n};\n\n/** Raw message the worker posts once its module graph has loaded, before Comlink traffic. */\nexport const WORKER_READY_MESSAGE = \"zama-encrypt-worker-ready\";\n\n/**\n * An `Error` flattened for the boundary crossing, thrown by the worker as a\n * plain object so it survives structured clone intact. `props` carries the\n * fields the SDK's duck-typed classifiers read (`statusCode`, `retryAfter`,\n * `code`, …); a cloned `Error` instance would drop them with the prototype.\n * Reading them through the prototype chain is deliberate: upstream's `status`\n * and `relayerApiError` are prototype getters, not own fields.\n */\nexport type WireError = {\n readonly wireError: true;\n readonly name: string;\n readonly message: string;\n readonly stack: string | undefined;\n readonly props: Record<string, unknown>;\n readonly cause: WireError | undefined;\n};\n\nexport function isWireError(value: unknown): value is WireError {\n // Exact `true`, not presence: an `Error` subclass carrying the key must not be\n // rehydrated as a flattened one.\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { wireError?: unknown }).wireError === true\n );\n}\n\n/**\n * Fields preserved across the boundary: what the error classifiers read off\n * `@fhevm/sdk`, relayer, and JSON-RPC errors, plus the `error`/`info` nesting\n * keys those classifiers walk alongside `cause`.\n */\nconst WIRE_ERROR_PROPS = [\n \"statusCode\",\n \"status\",\n \"retryAfter\",\n \"timeoutMs\",\n \"relayerApiError\",\n \"code\",\n \"data\",\n \"shortMessage\",\n \"details\",\n \"error\",\n \"info\",\n] as const;\n\nconst MAX_CAUSE_DEPTH = 6;\n\n/** A probe is exact where a structural walk only approximates. */\nfunction isCloneSafe(value: unknown): boolean {\n try {\n structuredClone(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * The `Retry-After` header survives as a plain number of seconds; the\n * `Response` object it lives on cannot cross the boundary.\n */\nfunction retryAfterFromResponse(error: object): number | undefined {\n const response = (error as { response?: { headers?: unknown } }).response;\n return readRetryAfterHeader(response?.headers);\n}\n\n/**\n * `JSON.stringify` throws instead of returning `undefined` on a bigint or a\n * circular value; a non-Error thrown value must never fail error handling itself.\n */\nfunction stringifyNonError(error: unknown): string {\n try {\n return JSON.stringify(error) ?? String(error);\n } catch {\n return String(error);\n }\n}\n\n/** The classifier fields readable off one thrown value, `Error` or plain object alike. */\nfunction extractWireProps(source: object): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n for (const key of WIRE_ERROR_PROPS) {\n const value = (source as Record<string, unknown>)[key];\n if (value !== undefined && isCloneSafe(value)) {\n props[key] = value;\n }\n }\n // The header wins over a malformed own delay (`0`, negative, `NaN`), as the\n // inline extractor in `utils/error.ts` decides it.\n if (!isValidRetryAfterSeconds(props[\"retryAfter\"])) {\n const fromHeader = retryAfterFromResponse(source);\n if (fromHeader !== undefined) {\n props[\"retryAfter\"] = fromHeader;\n }\n }\n return props;\n}\n\nexport function toWireError(error: unknown, depth: number = MAX_CAUSE_DEPTH): WireError {\n if (isWireError(error)) {\n return error;\n }\n const nest = (cause: unknown): WireError | undefined =>\n depth > 0 && cause !== undefined ? toWireError(cause, depth - 1) : undefined;\n if (error instanceof Error) {\n return {\n wireError: true,\n name: error.name,\n message: error.message,\n stack: error.stack,\n props: extractWireProps(error),\n cause: nest(error.cause),\n };\n }\n if (typeof error === \"object\" && error !== null) {\n // Wallets reject with a plain `{ code, message, data }`; dropping `code`\n // would break viem's classification inside the worker.\n const { message, cause } = error as { message?: unknown; cause?: unknown };\n return {\n wireError: true,\n name: \"Error\",\n message: typeof message === \"string\" ? message : stringifyNonError(error),\n stack: undefined,\n props: extractWireProps(error),\n cause: nest(cause),\n };\n }\n return {\n wireError: true,\n name: \"Error\",\n message: typeof error === \"string\" ? error : stringifyNonError(error),\n stack: undefined,\n props: {},\n cause: undefined,\n };\n}\n\n/**\n * Rebuilds a plain `Error` carrying the original `name`, own fields, and cause\n * chain, so name-based classification and status/retry-after extraction behave\n * as if the error had been thrown on this thread.\n */\nexport function fromWireError(wire: WireError): Error {\n const error = new Error(wire.message, wire.cause ? { cause: fromWireError(wire.cause) } : {});\n error.name = wire.name;\n if (wire.stack !== undefined) {\n error.stack = wire.stack;\n }\n Object.assign(error, wire.props);\n return error;\n}\n","/** Isolated so the CJS build can replace worker construction with an inert stub. */\n\n/** False in the CJS stub, which ships no worker chunk; a caller-supplied `offloadWorker` source works in either build. */\nexport const BUNDLED_ENCRYPT_WORKER = true;\n\nexport function createEncryptWorker(): Worker {\n // Keep the `new Worker(new URL(...))` expression exactly in this inline\n // form: bundlers detect it statically to emit and rewrite the worker chunk,\n // and lose it if the URL is hoisted into a variable.\n return new Worker(new URL(\"./encrypt.worker.js\", import.meta.url), {\n type: \"module\",\n name: \"zama-fhe-encrypt\",\n });\n}\n","import { proxy, transfer, wrap, type Remote } from \"comlink\";\nimport type { EIP1193Provider } from \"viem\";\nimport { EncryptOffloadUnavailableError } from \"../errors/encryption\";\nimport type { FhevmClientOptions } from \"../relayer/types\";\nimport type { LoggerService } from \"../services/logger-service\";\nimport type {\n EncryptOffloadBackend,\n EncryptWorkerApi,\n WireInitPayload,\n WireProgressEvent,\n WireRequestOptions,\n} from \"./protocol\";\nimport { WORKER_READY_MESSAGE, fromWireError, isWireError, toWireError } from \"./protocol\";\nimport { createEncryptWorker } from \"./spawn\";\n\n/**\n * Watchdog deadlines, in milliseconds, for worker lifecycle steps: each is a\n * ceiling on \"the worker never answered\", not on legitimate slow work. Encrypt\n * operations themselves are not watched: nothing bounds local WASM compute, so\n * a proof may run for as long as it needs.\n */\nexport type EncryptWorkerTimeouts = {\n /** Worker startup + module-graph load; a bundler that mishandled the worker URL fails here. */\n readonly spawn: number;\n /** Client init inside the worker realm: chain reads and WASM compilation. */\n readonly init: number;\n};\n\nexport const DEFAULT_ENCRYPT_WORKER_TIMEOUTS: EncryptWorkerTimeouts = {\n spawn: 10_000,\n init: 300_000,\n};\n\n/** Second crash pins the client to the calling thread. */\nconst CRASH_PIN_THRESHOLD = 2;\n\n/** Stable prefix of every degrade warning. */\nexport const ENCRYPT_OFFLOAD_WARN_PREFIX = \"Encrypt offload unavailable\";\n\n/** Workers already returned by an `offloadWorker` factory, to catch a factory that hands out one worker forever. */\nconst handedOutWorkers = new WeakSet<Worker>();\n\n/** Internal signal: the worker infrastructure failed; the operation itself was not rejected. */\nclass WorkerUnavailableError extends Error {\n /** True when a worker that had already signalled ready died under us, so a respawn is worth trying. */\n readonly crashed: boolean;\n\n constructor(message: string, options?: ErrorOptions & { readonly crashed?: boolean }) {\n super(message, options);\n this.name = \"WorkerUnavailableError\";\n this.crashed = options?.crashed ?? false;\n }\n}\n\n/**\n * A payload Comlink could not clone into the worker (`DataCloneError`) or could\n * not return out of it (its own `TypeError`): a boundary failure, so it degrades\n * rather than reaching the caller as an application error.\n */\nfunction isCloneFailure(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n const { name, message } = error as { name?: unknown; message?: unknown };\n return (\n name === \"DataCloneError\" ||\n (name === \"TypeError\" &&\n typeof message === \"string\" &&\n message.includes(\"Unserializable return value\"))\n );\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n}\n\n/** What the client remembers about worker crashes, dropped whole by a worker answer and by a release. */\ntype CrashHistory = {\n readonly count: number;\n /** The crash that killed the current worker, so a call landing after it degrades as a crash too. */\n readonly last: WorkerUnavailableError | undefined;\n /** Crash count the degrade warning was last emitted for, so one failure warns once. */\n readonly warnedFor: number;\n};\n\nconst NO_CRASHES: CrashHistory = { count: 0, last: undefined, warnedFor: -1 };\n\n/**\n * The key copied for the crossing plus the buffers to transfer, so the wire copy\n * is moved instead of cloned. Anything but the known binary shape crosses\n * unchanged.\n */\nfunction keyForTransfer(key: FhevmClientOptions[\"fheEncryptionKey\"]): {\n readonly key: FhevmClientOptions[\"fheEncryptionKey\"];\n readonly transfers: Transferable[];\n} {\n if (key === undefined) {\n return { key, transfers: [] };\n }\n const publicKeyBytes = key.publicKeyBytes.bytes;\n const crsBytes = key.crsBytes.bytes;\n if (!(publicKeyBytes instanceof Uint8Array) || !(crsBytes instanceof Uint8Array)) {\n return { key, transfers: [] };\n }\n // `slice` yields a fresh exactly-sized buffer, so transferring it leaves this\n // thread's cached key intact.\n const publicKeyCopy = publicKeyBytes.slice();\n const crsCopy = crsBytes.slice();\n return {\n key: {\n ...key,\n publicKeyBytes: { ...key.publicKeyBytes, bytes: publicKeyCopy },\n crsBytes: { ...key.crsBytes, bytes: crsCopy },\n },\n transfers: [publicKeyCopy.buffer as ArrayBuffer, crsCopy.buffer as ArrayBuffer],\n };\n}\n\n/**\n * Per-call options: `signal` is forwarded as an `abort` call, `onProgress` is\n * served from the worker's shared progress channel, and `never` keeps the\n * callback contravariantly compatible with each operation's own event type.\n */\ntype CallOptions = WireRequestOptions & {\n readonly signal?: AbortSignal;\n readonly onProgress?: (args: never) => void;\n};\n\n/**\n * Everything scoped to one spawned worker, created by the init that spawns it\n * and dropped whole by a teardown. A late event carrying its own generation can\n * therefore only settle that generation, never the worker running in its place.\n */\ntype WorkerGeneration = {\n /** Memoized bring-up for this worker; it dies with the generation, so the next call re-runs it. */\n initPromise: Promise<void> | undefined;\n worker: Worker | undefined;\n api: Remote<EncryptWorkerApi> | undefined;\n /** Never resolves; teardown rejects it, and every boundary crossing races it so all of them settle together. */\n readonly doomed: Promise<never>;\n /** Rejects `doomed` with the teardown's `WorkerUnavailableError`. */\n readonly doom: (error: WorkerUnavailableError) => void;\n};\n\nfunction createWorkerGeneration(): WorkerGeneration {\n let doom!: (error: WorkerUnavailableError) => void;\n const doomed = new Promise<never>((_resolve, reject) => {\n doom = reject;\n });\n // An idle teardown dooms a generation with no crossing racing it; this\n // handler keeps that from surfacing as an unhandled rejection.\n doomed.catch(() => {});\n return { initPromise: undefined, worker: undefined, api: undefined, doomed, doom };\n}\n\nexport type EncryptWorkerClientConfig = {\n readonly initPayload: Omit<WireInitPayload, \"rpcUrl\">;\n /** The chain's RPC endpoint: a URL crosses into the worker; a provider is proxied per request. */\n readonly network: EIP1193Provider | string;\n /** Fetches the FHE key on the calling thread, where the chain's auth applies; the worker realm never downloads it itself. */\n readonly prefetchKey: () => Promise<FhevmClientOptions[\"fheEncryptionKey\"]>;\n readonly createInlineClient: () => EncryptOffloadBackend;\n readonly logger: LoggerService;\n readonly timeouts: EncryptWorkerTimeouts;\n /** A string or `URL` is spawned with the SDK's worker options; a factory is called for the worker itself. */\n readonly workerSource?: string | URL | (() => Worker);\n /**\n * A pre-known reason offload cannot work in this session: init degrades with\n * it immediately, so strict rejects at call time rather than at config time.\n */\n readonly blockedReason?: string;\n /**\n * Strict offload (`offloadEncrypt: true`): never run encryption on the\n * calling thread. Every path that would degrade rejects with\n * {@link EncryptOffloadUnavailableError} instead.\n */\n readonly strict: boolean;\n};\n\n/**\n * Encrypt backend that runs `@fhevm/sdk` in a dedicated module worker so proof\n * generation never blocks the main thread. Only infrastructure failure degrades\n * to inline (or rejects under `strict`); worker-reported errors are rethrown,\n * since inline would fail the same way.\n */\nexport class EncryptWorkerClient implements EncryptOffloadBackend {\n readonly #config: EncryptWorkerClientConfig;\n /** Resources of the worker currently being brought up or served; undefined while none runs. */\n #generation: WorkerGeneration | undefined;\n /** True once the client runs inline for the rest of its life, with no further spawn attempts. */\n #pinnedInline = false;\n #crashes: CrashHistory = NO_CRASHES;\n /** Wire ids, allocated across generations so a late reply can never be read as a live operation. */\n #sequence = 0;\n /** Per-operation `onProgress`, keyed by wire id and routed over one channel registered at init: one channel per worker avoids minting a `MessageChannel` per call, whose local port and listener would linger until garbage collection after terminate. */\n readonly #progressListeners = new Map<number, (event: WireProgressEvent) => void>();\n /** Memoized inline backend. Kept, with its key copy, across a worker recovery so a later degrade skips the refetch. */\n #degradePromise: Promise<EncryptOffloadBackend> | undefined;\n /** Operations that must drain before a requested release terminates the worker. */\n #active = 0;\n #releaseRequested = false;\n\n constructor(config: EncryptWorkerClientConfig) {\n this.#config = config;\n }\n\n init = (): Promise<void> => {\n // A call landing mid-drain rides the worker being released rather than\n // canceling the release: the drain still completes, and the call after it\n // spawns a fresh worker.\n const generation = (this.#generation ??= createWorkerGeneration());\n if (generation.initPromise === undefined) {\n // Only a successful cycle is memoized: a failure a retry could clear must\n // not be replayed to every later call.\n const attempt: Promise<void> = this.#withActive(() => this.#initOnce(generation)).catch(\n (error: unknown) => {\n if (generation.initPromise === attempt) {\n generation.initPromise = undefined;\n }\n throw error;\n },\n );\n generation.initPromise = attempt;\n }\n return generation.initPromise;\n };\n\n encryptValue: EncryptOffloadBackend[\"encryptValue\"] = (parameters) =>\n this.#withActive(() =>\n this.#dispatch(\n (backend) => backend.encryptValue(parameters),\n // Spread, so a field upstream adds to the parameters still crosses; the\n // stripped `options` replaces the caller's, which carries `signal`.\n (api, id, options) => api.encryptValue(id, { ...parameters, options }),\n parameters.options,\n ),\n );\n\n encryptValues: EncryptOffloadBackend[\"encryptValues\"] = (parameters) =>\n this.#withActive(() =>\n this.#dispatch(\n (backend) => backend.encryptValues(parameters),\n (api, id, options) => api.encryptValues(id, { ...parameters, options }),\n parameters.options,\n ),\n );\n\n /**\n * Releases the worker without changing what callers observe: in-flight\n * operations (an init included) run to completion over the worker, and the\n * worker is terminated as soon as the last one settles, immediately if the\n * client is idle. The client is not spent: the release resets it whole, so a\n * later call re-fetches the key and spawns a fresh worker exactly like the\n * first one, even if the client had degraded to the calling thread. The drain\n * is not bounded: a worker wedged inside an operation is only terminated once\n * that operation settles.\n */\n dispose(): void {\n this.#releaseRequested = true;\n this.#releaseIfIdle();\n }\n\n /**\n * The one place that decides between the worker and the calling thread:\n * inline once pinned or while no worker is running; otherwise the worker,\n * falling back to inline on infrastructure failure while application errors\n * pass through.\n */\n async #dispatch<T>(\n invoke: (backend: EncryptOffloadBackend) => Promise<T>,\n overWorker: (\n api: Remote<EncryptWorkerApi>,\n id: number,\n options: WireRequestOptions,\n ) => Promise<T>,\n callOptions: CallOptions | undefined,\n ): Promise<T> {\n const { signal, onProgress, ...options } = callOptions ?? {};\n // The worker dequeues an abort only after the proof, so a dispatched call always runs whole.\n throwIfAborted(signal);\n await this.init();\n // A listener added after the abort never fires, so an abort during init needs this recheck.\n throwIfAborted(signal);\n const generation = this.#generation;\n const api = generation?.api;\n // An existing degrade attempt already carries the decision that created it,\n // and its inline backend caches the key, so reuse it rather than degrading again.\n if (this.#degradePromise !== undefined && (this.#pinnedInline || api === undefined)) {\n return invoke(await this.#degradePromise);\n }\n if (generation === undefined || api === undefined) {\n return invoke(\n await this.#degrade(\n generation,\n this.#crashes.last ?? new WorkerUnavailableError(\"Encrypt worker not running.\"),\n ),\n );\n }\n const id = this.#sequence++;\n const onAbort = () => void api.abort(id).catch(() => {});\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (onProgress) {\n this.#progressListeners.set(id, onProgress as (event: WireProgressEvent) => void);\n }\n try {\n const result = await this.#overBoundary(generation, overWorker(api, id, options));\n // A worker operation that answered clears the crash history: two unrelated\n // crashes far apart must not add up to a permanent degrade.\n this.#crashes = NO_CRASHES;\n return result;\n } catch (error) {\n if (error instanceof WorkerUnavailableError) {\n return invoke(await this.#degrade(generation, error));\n }\n throw error;\n } finally {\n this.#progressListeners.delete(id);\n signal?.removeEventListener(\"abort\", onAbort);\n }\n }\n\n async #initOnce(generation: WorkerGeneration): Promise<void> {\n if (this.#pinnedInline) {\n // The degrade that pinned the client already initialized the backend every call now runs on.\n return;\n }\n const blockedReason = this.#config.blockedReason;\n if (blockedReason !== undefined) {\n // Handled before any resource is spent: non-strict callers never get here\n // (the relayer inlines directly), and strict throws out of the degrade.\n await this.#degrade(generation, new WorkerUnavailableError(blockedReason));\n return;\n }\n // Outside the degrade guard: a failed key fetch is an application/network\n // error, and the inline backend would refetch the same key from the same\n // relayer. It rejects out of init exactly as the inline arm's would.\n const fheEncryptionKey = await this.#config.prefetchKey();\n try {\n const api = await this.#spawn(generation);\n const network = this.#config.network;\n const rpcRequest =\n typeof network === \"string\"\n ? null\n : proxy(async (args: { method: string; params?: unknown }) => {\n try {\n return await network.request(args as Parameters<EIP1193Provider[\"request\"]>[0]);\n } catch (error) {\n // Comlink keeps only name/message/stack on a thrown error, which\n // would strip the provider's `code` (4001, -32005) the worker's\n // classifiers read; flatten it so those fields cross.\n throw toWireError(error);\n }\n });\n // A callback that throws would reject the Comlink proxy call back in the\n // worker realm, where nothing can report it, so it is contained here.\n const log = proxy((level: \"debug\" | \"warn\" | \"error\", message: string) => {\n try {\n this.#config.logger[level](message);\n } catch (error) {\n this.#warnCallbackThrew(\"logger\", error);\n }\n });\n const onProgress = proxy((id: number, event: WireProgressEvent) => {\n try {\n this.#progressListeners.get(id)?.(event);\n } catch (error) {\n this.#warnCallbackThrew(\"onProgress\", error);\n }\n });\n // The copy stays on this thread so a later degrade to inline reuses the\n // key instead of refetching; transferring the wire copy avoids a third\n // in-transit copy of it.\n const wireKey = keyForTransfer(fheEncryptionKey);\n await this.#overBoundary(\n generation,\n api.init(\n transfer(\n {\n ...this.#config.initPayload,\n clientOptions: {\n ...this.#config.initPayload.clientOptions,\n fheEncryptionKey: wireKey.key,\n },\n rpcUrl: typeof network === \"string\" ? network : undefined,\n },\n wireKey.transfers,\n ),\n rpcRequest,\n log,\n onProgress,\n ),\n { ms: this.#config.timeouts.init, operation: \"init\" },\n );\n generation.api = api;\n this.#crashes = { ...this.#crashes, last: undefined };\n } catch (error) {\n // Only \"the worker never answered or crashed\" is infrastructure. An error\n // the worker itself reported (a chain read, bad key material) would fail\n // the same way inline, so it reaches the caller unchanged.\n if (!(error instanceof WorkerUnavailableError)) {\n this.#teardown(generation, new WorkerUnavailableError(\"Encrypt worker init failed.\"));\n throw error;\n }\n await this.#degrade(generation, error);\n }\n }\n\n /** Reports a caller callback that threw; the reporting itself must not throw back into the worker. */\n #warnCallbackThrew(callback: string, error: unknown): void {\n const reason = error instanceof Error ? error.message : String(error);\n try {\n this.#config.logger.warn(`Encrypt offload ${callback} callback threw: ${reason}`);\n } catch {\n // A logger that throws on its own warning leaves nowhere left to report.\n }\n }\n\n /**\n * The count spans a whole public entry, its init included, so a release\n * requested mid-call cannot terminate the worker between the init and the\n * operation.\n */\n async #withActive<T>(work: () => Promise<T>): Promise<T> {\n this.#active++;\n try {\n return await work();\n } finally {\n this.#active--;\n this.#releaseIfIdle();\n }\n }\n\n #releaseIfIdle(): void {\n if (!this.#releaseRequested || this.#active > 0) {\n return;\n }\n this.#releaseRequested = false;\n this.#generation?.worker?.terminate();\n // A full reset, so a release is the recovery lever for a degraded client:\n // the next call re-fetches the key and spawns a fresh worker either way.\n this.#generation = undefined;\n this.#degradePromise = undefined;\n this.#pinnedInline = false;\n this.#crashes = NO_CRASHES;\n }\n\n #createWorker(): Worker {\n const source = this.#config.workerSource;\n if (source === undefined) {\n return createEncryptWorker();\n }\n if (typeof source === \"function\") {\n const worker = source();\n // A memoized factory would hand the client a worker it already terminated,\n // so the contract is one fresh Worker per call.\n if (handedOutWorkers.has(worker)) {\n this.#config.logger.warnAlways(\n \"The offloadWorker factory returned a worker it already handed out; each call must construct a fresh Worker.\",\n );\n }\n handedOutWorkers.add(worker);\n return worker;\n }\n return new Worker(source, { type: \"module\", name: \"zama-fhe-encrypt\" });\n }\n\n /** Resolves once the worker's module graph has loaded. */\n async #spawn(generation: WorkerGeneration): Promise<Remote<EncryptWorkerApi>> {\n let worker: Worker;\n try {\n worker = this.#createWorker();\n } catch (error) {\n // A blocked construction is infrastructure, so it must reach the\n // degrade path as such rather than as the raw thrown error.\n throw new WorkerUnavailableError(error instanceof Error ? error.message : String(error), {\n cause: error,\n });\n }\n generation.worker = worker;\n const api = await this.#raceReady(generation, worker);\n this.#armCrashHandler(generation, worker);\n return api;\n }\n\n /** Resolves with the Comlink API on the worker's ready message; rejects on the spawn deadline or a pre-ready error. */\n #raceReady(generation: WorkerGeneration, worker: Worker): Promise<Remote<EncryptWorkerApi>> {\n return new Promise<Remote<EncryptWorkerApi>>((resolve, reject) => {\n const settle = () => {\n clearTimeout(timer);\n worker.removeEventListener(\"message\", onReady);\n worker.removeEventListener(\"error\", onError);\n };\n const timer = setTimeout(() => {\n settle();\n reject(\n new WorkerUnavailableError(\n `Encrypt worker did not start within ${this.#config.timeouts.spawn}ms.`,\n ),\n );\n }, this.#config.timeouts.spawn);\n const onReady = (event: MessageEvent) => {\n if (event.data === WORKER_READY_MESSAGE) {\n settle();\n resolve(wrap<EncryptWorkerApi>(worker));\n }\n };\n const onError = (event: ErrorEvent) => {\n settle();\n const message = event.message || \"Encrypt worker error.\";\n // A worker that never came up is not worth respawning per call, so\n // this failure is not flagged as a crash.\n reject(new WorkerUnavailableError(message));\n this.#teardown(generation, new WorkerUnavailableError(message));\n };\n worker.addEventListener(\"message\", onReady);\n worker.addEventListener(\"error\", onError);\n });\n }\n\n /** Permanent crash detector, armed only after ready so a pre-ready failure never counts as a crash. */\n #armCrashHandler(generation: WorkerGeneration, worker: Worker): void {\n worker.addEventListener(\"error\", (event: ErrorEvent) => {\n // A generation already torn down cannot crash the client again: nothing\n // is waiting on it, and the worker running in its place is unaffected.\n if (this.#generation !== generation) {\n return;\n }\n // A ready worker died under us: the teardown drops the memoized init so\n // the next call spawns a fresh one, and the operations it took down\n // finish inline.\n const crash = new WorkerUnavailableError(event.message || \"Encrypt worker error.\", {\n crashed: true,\n });\n this.#crashes = { ...this.#crashes, count: this.#crashes.count + 1, last: crash };\n this.#teardown(generation, crash);\n });\n }\n\n /**\n * Awaits one promise crossing the worker boundary, racing the generation's\n * `doomed` promise so a teardown settles it with the teardown's\n * `WorkerUnavailableError`, which degrades it inline. Without a `deadline` it\n * settles whenever the worker answers; a `deadline` bounds a lifecycle step,\n * and missing it means the worker is presumed stuck, so the generation is\n * torn down whole.\n */\n async #overBoundary<T>(\n generation: WorkerGeneration,\n work: Promise<T>,\n deadline?: { readonly ms: number; readonly operation: string },\n ): Promise<T> {\n const timer =\n deadline === undefined\n ? undefined\n : setTimeout(() => {\n this.#teardown(\n generation,\n new WorkerUnavailableError(\n `Encrypt worker ${deadline.operation} timed out after ${deadline.ms}ms.`,\n ),\n );\n }, deadline.ms);\n try {\n return await Promise.race([\n work.catch((error: unknown) => {\n const failure = isWireError(error) ? fromWireError(error) : (error as Error);\n // A payload Comlink could not carry is infrastructure, so it degrades\n // instead of reaching the caller as the operation's own failure.\n throw isCloneFailure(failure)\n ? new WorkerUnavailableError(failure.message, { cause: failure })\n : failure;\n }),\n generation.doomed,\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n }\n\n /**\n * Rejects and drops one generation whole: its worker, its memoized init, and\n * every crossing racing its `doomed` promise. The next call therefore re-runs\n * the cycle on a fresh generation, so a spurious teardown costs a respawn\n * rather than a permanent degrade.\n */\n #teardown(generation: WorkerGeneration | undefined, error: WorkerUnavailableError): void {\n if (generation === undefined) {\n return;\n }\n if (this.#generation === generation) {\n this.#generation = undefined;\n }\n generation.worker?.terminate();\n generation.worker = undefined;\n generation.api = undefined;\n generation.initPromise = undefined;\n generation.doom(error);\n }\n\n async #degrade(\n generation: WorkerGeneration | undefined,\n cause: unknown,\n ): Promise<EncryptOffloadBackend> {\n const reason = cause instanceof Error ? cause.message : String(cause);\n if (this.#config.strict) {\n this.#teardown(generation, new WorkerUnavailableError(\"Encrypt worker unavailable.\"));\n throw new EncryptOffloadUnavailableError(\n `Encrypt offload required (offloadEncrypt: true) but unavailable: ${reason}`,\n { cause },\n );\n }\n const { transient, pinning } = this.#classifyDegrade(cause);\n this.#pinnedInline ||= !transient;\n this.#teardown(generation, new WorkerUnavailableError(\"Encrypt worker degraded to inline.\"));\n this.#warnDegraded(reason, transient, pinning);\n if (this.#degradePromise === undefined) {\n // Only a live backend is memoized: an inline init is a key refetch, and a\n // transient failure there must not close the degrade path for the session.\n const attempt: Promise<EncryptOffloadBackend> = (async () => {\n const inline = this.#config.createInlineClient();\n await inline.init();\n return inline;\n })().catch((error: unknown) => {\n if (this.#degradePromise === attempt) {\n this.#degradePromise = undefined;\n }\n this.#config.logger.warnAlways(\n `Encrypt inline fallback failed to initialize: ${error instanceof Error ? error.message : String(error)}`,\n );\n throw error;\n });\n this.#degradePromise = attempt;\n }\n return this.#degradePromise;\n }\n\n /**\n * How one failure degrades, read off the state before the degrade mutates it:\n * `transient` diverts only this call, `pinning` settles the client inline now.\n * One crash is treated as transient; a repeat crash, or a worker that never\n * came up, settles the client inline rather than spawning a replacement per call.\n */\n #classifyDegrade(cause: unknown): { readonly transient: boolean; readonly pinning: boolean } {\n const transient =\n cause instanceof WorkerUnavailableError &&\n cause.crashed &&\n this.#crashes.count < CRASH_PIN_THRESHOLD;\n return { transient, pinning: !transient && !this.#pinnedInline };\n }\n\n /** One warning per failure, whether it pins the client inline or only diverts this call. */\n #warnDegraded(reason: string, transient: boolean, pinning: boolean): void {\n if (!pinning && this.#crashes.warnedFor === this.#crashes.count) {\n return;\n }\n this.#crashes = { ...this.#crashes, warnedFor: this.#crashes.count };\n const scope = transient ? \"in-flight encryption falls back\" : \"encryption falls back\";\n // Always on the console: a silent return to main-thread encryption is the\n // freeze this offload prevents.\n this.#config.logger.warnAlways(\n `${ENCRYPT_OFFLOAD_WARN_PREFIX}, ${scope} to the calling thread: ${reason}`,\n );\n }\n}\n","import { createUnsignedLegacyDecryptionPermitEip712 as createUnsignedLegacyDecryptionPermitEip712Action } from \"@fhevm/sdk/actions/base\";\nimport {\n createFhevmBaseClient,\n createFhevmDecryptClient,\n createFhevmEncryptClient,\n hasFhevmRuntimeConfig,\n} from \"@fhevm/sdk/viem\";\nimport {\n createFhevmCleartextBaseClient,\n createFhevmCleartextDecryptClient,\n createFhevmCleartextEncryptClient,\n} from \"@fhevm/sdk/viem/cleartext\";\nimport { createPublicClient, custom, http } from \"viem\";\nimport { toFhevmChain } from \"../chains/to-fhevm-chain\";\nimport type { FheChain } from \"../chains/types\";\nimport { ConfigurationError } from \"../errors\";\nimport { getAppliedWireRuntime, hasAppliedLocateFile } from \"./applied-runtime\";\nimport type { LoggerService } from \"../services/logger-service\";\nimport { type RelayerTelemetry, telemetryHeaders } from \"../telemetry\";\nimport {\n DEFAULT_ENCRYPT_WORKER_TIMEOUTS,\n EncryptWorkerClient,\n type EncryptWorkerClientConfig,\n type EncryptWorkerTimeouts,\n} from \"../worker/encrypt-worker-client\";\nimport { BUNDLED_ENCRYPT_WORKER } from \"../worker/spawn\";\nimport type {\n FhevmBaseClient,\n FhevmClient,\n FhevmDecryptClient,\n FhevmEncryptBackend,\n FhevmRelayerOptions,\n RelayerRequestOptions,\n RelayerSDK,\n RelayerOptions,\n WireRuntimeConfig,\n} from \"./types\";\n\n/** The `@fhevm/sdk` client inputs the worker realm rebuilds its own client from. */\ntype EncryptInitPayload = EncryptWorkerClientConfig[\"initPayload\"];\n\n/** Construction config for {@link FhevmRelayer}. */\nexport interface FhevmRelayerConfig {\n /** FHE chain configuration. */\n chain: FheChain;\n /**\n * Cleartext mode for local dev/test chains without FHE infrastructure — reads\n * mock cleartexts from the on-chain executor (discovered automatically)\n * instead of calling the relayer.\n */\n cleartext?: boolean;\n /**\n * Per-transport {@link RelayerOptions}: `@fhevm/sdk` client options plus a\n * default request `timeout` applied to every relayer round-trip on the chain.\n */\n options?: RelayerOptions;\n /** Encrypt-worker offload mode; see `web()`'s `offloadEncrypt` option. */\n offloadEncrypt?: \"auto\" | boolean;\n /** Watchdog deadlines for the encrypt worker; `web()` defaults every field before it gets here. */\n offloadTimeouts?: EncryptWorkerTimeouts;\n /** Custom source for the encrypt worker; see `web()`'s `offloadWorker` option. */\n offloadWorker?: string | URL | (() => Worker);\n /** Receives worker log lines and offload-fallback warnings. */\n logger: LoggerService;\n telemetry?: RelayerTelemetry;\n}\n\n/**\n * Single-chain FHE backend that drives `@fhevm/sdk` on the calling thread with\n * capability-scoped lazy initialization.\n * EIP-712 signing is done by the signer layer; this backend builds the typed\n * data and, on decrypt, reassembles the new SDK's signed permit from the\n * interface's params + the previously returned signature.\n *\n * @remarks\n * Each method delegates to the narrowest base, decrypt, or encrypt client,\n * adding two cross-cutting behaviors that the delegated signatures don't\n * express:\n *\n * - **Lazy init.** Each operation initializes only the capability it requires.\n * Public decrypt avoids WASM, private decrypt loads TKMS only, and encryption\n * alone loads TFHE and the FHE encryption key.\n * - **Option merging.** The chain's default options (`auth`, `timeout`, `debug`)\n * are spread in first, then the per-call `options`, so a per-call value always\n * wins over the chain default. Serialization helpers make no relayer\n * round-trip, so they inject no options.\n *\n * @internal\n */\nexport class FhevmRelayer implements RelayerSDK {\n readonly #chain: FheChain;\n readonly #base: FhevmBaseClient;\n readonly #decrypt: FhevmDecryptClient;\n readonly #encrypt: FhevmEncryptBackend;\n readonly #defaultOptions: Partial<FhevmRelayerOptions>;\n readonly #telemetry: RelayerTelemetry | undefined;\n #encryptInitPromise: Promise<void> | undefined;\n\n /**\n * Builds capability-scoped `@fhevm/sdk` clients for the chain and captures\n * the chain's `auth`/`timeout`/`debug` as request defaults. Construction is\n * cheap; each client's one-time init is deferred to its first operation.\n */\n constructor(config: FhevmRelayerConfig) {\n this.#chain = config.chain;\n const { timeout, debug, batchRpcCalls, moduleVersions, fheEncryptionKey } =\n config.options ?? {};\n const auth = this.#chain.auth ? toFhevmAuth(this.#chain.auth) : undefined;\n const transport =\n typeof this.#chain.network === \"string\"\n ? http(this.#chain.network)\n : custom(this.#chain.network);\n const params = {\n publicClient: createPublicClient({ transport }),\n chain: toFhevmChain(this.#chain),\n options: { batchRpcCalls, moduleVersions, fheEncryptionKey },\n };\n this.#defaultOptions = {\n ...(auth !== undefined && { auth }),\n ...(timeout !== undefined && { timeout }),\n ...(debug !== undefined && { debug }),\n };\n this.#telemetry = config.telemetry;\n // The FHE key is always fetched here, on the calling thread, so the chain's\n // default request options (auth in particular) apply; a worker realm has no\n // access to them.\n const prefetchKey = () =>\n this.#base.fetchFheEncryptionKeyBytes({ options: this.#requestOptions(undefined) });\n // Re-listed rather than spread: the upstream client exposes an enumerable\n // `ready` getter, and a spread would call it, starting init at construction.\n const withInlineInit = (client: FhevmEncryptBackend): FhevmEncryptBackend => ({\n init: async () => {\n await prefetchKey();\n await client.init();\n },\n encryptValue: (parameters) => client.encryptValue(parameters),\n encryptValues: (parameters) => client.encryptValues(parameters),\n fetchFheEncryptionKeyBytes: (parameters) => client.fetchFheEncryptionKeyBytes(parameters),\n });\n if (config.cleartext) {\n this.#base = createFhevmCleartextBaseClient(params);\n this.#decrypt = createFhevmCleartextDecryptClient(params);\n this.#encrypt = withInlineInit(createFhevmCleartextEncryptClient(params));\n } else {\n this.#base = createFhevmBaseClient(params);\n this.#decrypt = createFhevmDecryptClient(params);\n this.#encrypt = this.#buildEncryptBackend(config, params, {\n prefetchKey,\n createInlineClient: () => withInlineInit(createFhevmEncryptClient(params)),\n });\n }\n }\n\n /**\n * Picks the encrypt backend for a non-cleartext chain: the worker client when\n * offload is on and reachable, the inline calling-thread client otherwise.\n */\n #buildEncryptBackend(\n config: FhevmRelayerConfig,\n params: { chain: EncryptInitPayload[\"chain\"]; options: EncryptInitPayload[\"clientOptions\"] },\n inline: {\n prefetchKey: EncryptWorkerClientConfig[\"prefetchKey\"];\n createInlineClient: () => FhevmEncryptBackend;\n },\n ): FhevmEncryptBackend {\n const offload = config.offloadEncrypt ?? false;\n const strict = offload === true;\n const workerAvailable =\n typeof Worker === \"function\" &&\n (config.offloadWorker !== undefined || BUNDLED_ENCRYPT_WORKER);\n // Silent both ways: offload off is what the caller asked for, and a realm\n // with no Worker is an environment fact that would warn on every SSR\n // render. Strict skips the capability check, since construction runs during\n // that render and the failure must surface at call time instead.\n if (offload === false || !(strict || workerAvailable)) {\n return inline.createInlineClient();\n }\n const runtime = getAppliedWireRuntime();\n const blocker = encryptOffloadBlocker(runtime);\n if (blocker !== undefined && !strict) {\n // Always on the console: the alternative is an opaque rejection at\n // encrypt time, or WASM assets silently resolved from the default URLs.\n config.logger.warnAlways(`Encryption runs on the calling thread: ${blocker}.`);\n return inline.createInlineClient();\n }\n const workerClient = new EncryptWorkerClient({\n initPayload: { chain: params.chain, clientOptions: params.options, runtime: runtime ?? {} },\n network: this.#chain.network,\n prefetchKey: inline.prefetchKey,\n createInlineClient: inline.createInlineClient,\n logger: config.logger,\n timeouts: config.offloadTimeouts ?? DEFAULT_ENCRYPT_WORKER_TIMEOUTS,\n workerSource: config.offloadWorker,\n // Strict with a blocker: the client degrades at init, which rejects at\n // call time rather than at config time.\n blockedReason: blocker,\n strict,\n });\n return {\n init: () => workerClient.init(),\n encryptValue: (parameters) => workerClient.encryptValue(parameters),\n encryptValues: (parameters) => workerClient.encryptValues(parameters),\n // Served from the calling thread: routing it through the worker would\n // structured-clone the ~50 MB key back out on every call. `ignoreCache`\n // therefore refreshes this thread's cache, not the worker's seeded key.\n fetchFheEncryptionKeyBytes: (parameters) => this.#base.fetchFheEncryptionKeyBytes(parameters),\n dispose: () => workerClient.dispose(),\n };\n }\n\n /** The FHE chain this backend is bound to. */\n get chain() {\n return this.#chain;\n }\n\n // `operation` becomes a header here and must never reach `@fhevm/sdk`.\n #requestOptions<T extends Partial<FhevmRelayerOptions> | undefined>(\n options: T,\n ): Omit<Partial<FhevmRelayerOptions> & NonNullable<T>, \"operation\"> {\n const { operation, ...merged } = {\n ...this.#defaultOptions,\n ...options,\n } as Partial<FhevmRelayerOptions> & NonNullable<T> & RelayerRequestOptions;\n if (this.#telemetry === undefined) {\n return merged;\n }\n return {\n ...merged,\n headers: { ...merged.headers, ...telemetryHeaders(this.#telemetry, operation) },\n };\n }\n\n // Only a fulfilled init is memoized: a rejection clears the memo so the next\n // encryption retries instead of inheriting a transient key-fetch failure.\n #initEncrypt = (): Promise<void> => {\n this.#encryptInitPromise ??= this.#encrypt.init().catch((error: unknown) => {\n this.#encryptInitPromise = undefined;\n throw error;\n });\n return this.#encryptInitPromise;\n };\n\n /**\n * Releases the encrypt worker once in-flight encryptions settle and drops the\n * memoized init; the next encryption spawns a fresh worker and re-initializes.\n */\n dispose = (): void => {\n this.#encryptInitPromise = undefined;\n this.#encrypt.dispose?.();\n };\n\n /**\n * Decrypts a single publicly-decryptable value — one whose contract granted\n * public access, so no permit or key pair is needed — into its typed clear\n * value.\n *\n * @example\n * ```ts\n * const { type, value } = await relayer.decryptPublicValue({\n * encryptedValue: handle, // a bytes32 ciphertext reference\n * });\n * ```\n */\n decryptPublicValue: FhevmClient[\"decryptPublicValue\"] = async (parameters) => {\n await this.#base.init();\n return this.#base.decryptPublicValue({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Batch form of {@link decryptPublicValue}: decrypts many publicly-decryptable\n * values in one relayer round-trip, returning their typed clear values in\n * order.\n *\n * @example\n * ```ts\n * const values = await relayer.decryptPublicValues({\n * encryptedValues: [handleA, handleB],\n * });\n * ```\n */\n decryptPublicValues: FhevmClient[\"decryptPublicValues\"] = async (parameters) => {\n await this.#base.init();\n return this.#base.decryptPublicValues({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Like {@link decryptPublicValues}, but also returns the KMS signature bundle —\n * the handles list, ABI-encoded cleartexts, and decryption proof — needed to\n * verify or replay the result on-chain.\n *\n * @example\n * ```ts\n * const { clearValues, checkSignaturesArgs } =\n * await relayer.decryptPublicValuesWithSignatures({ encryptedValues: [handle] });\n * // checkSignaturesArgs: { handlesList, abiEncodedCleartexts, decryptionProof }\n * ```\n */\n decryptPublicValuesWithSignatures: FhevmClient[\"decryptPublicValuesWithSignatures\"] = async (\n parameters,\n ) => {\n await this.#base.init();\n return this.#base.decryptPublicValuesWithSignatures({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Encrypts one typed input under the chain's FHE key, bound to the contract it\n * targets and the user submitting it, and returns the ciphertext handle plus\n * the input proof the contract verifies on-chain. `type` is the FHE type\n * with the `e` prefix (`\"euint64\"`, `\"ebool\"`, `\"eaddress\"`).\n *\n * @example\n * ```ts\n * const { encryptedValue, inputProof } = await relayer.encryptValue({\n * value: { type: \"euint64\", value: 1000n },\n * contractAddress: \"0xToken…\",\n * userAddress: \"0xUser…\",\n * });\n * ```\n */\n encryptValue: FhevmClient[\"encryptValue\"] = async (parameters) => {\n await this.#initEncrypt();\n return this.#encrypt.encryptValue({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Batch form of {@link encryptValue}: encrypts several inputs for the same\n * contract and user in one call, returning all ciphertext handles under a\n * single shared input proof.\n *\n * @example\n * ```ts\n * const { encryptedValues, inputProof } = await relayer.encryptValues({\n * values: [\n * { type: \"euint64\", value: 1000n },\n * { type: \"ebool\", value: true },\n * ],\n * contractAddress: \"0xToken…\",\n * userAddress: \"0xUser…\",\n * });\n * ```\n */\n encryptValues: FhevmClient[\"encryptValues\"] = async (parameters) => {\n await this.#initEncrypt();\n return this.#encrypt.encryptValues({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * User-decrypts a single access-controlled value: the relayer re-encrypts it\n * to the ephemeral transport key pair, gated by the signed permit, and this\n * returns the typed clear value. Build the key pair with\n * {@link generateTransportKeyPair} and the permit with\n * {@link signDecryptionPermit}.\n *\n * @example\n * ```ts\n * const { type, value } = await relayer.decryptValue({\n * encryptedValue: handle,\n * contractAddress: \"0xToken…\",\n * transportKeyPair,\n * signedPermit,\n * });\n * ```\n */\n decryptValue: FhevmClient[\"decryptValue\"] = async (parameters) => {\n await this.#decrypt.init();\n return this.#decrypt.decryptValue({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Batch form of {@link decryptValue} for values that all belong to the same\n * contract; returns the typed clear values positionally. For values spanning\n * multiple contracts, use {@link decryptValuesFromPairs}.\n *\n * @example\n * ```ts\n * const values = await relayer.decryptValues({\n * encryptedValues: [handleA, handleB],\n * contractAddress: \"0xToken…\",\n * transportKeyPair,\n * signedPermit,\n * });\n * ```\n */\n decryptValues: FhevmClient[\"decryptValues\"] = async (parameters) => {\n await this.#decrypt.init();\n return this.#decrypt.decryptValues({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * User-decrypts values that span multiple contracts: each pair carries its own\n * `contractAddress`, so one permit covering those contracts decrypts them all\n * in a single round-trip. Returns the typed clear values positionally.\n *\n * @example\n * ```ts\n * const values = await relayer.decryptValuesFromPairs({\n * pairs: [\n * { encryptedValue: handleA, contractAddress: \"0xTokenA…\" },\n * { encryptedValue: handleB, contractAddress: \"0xTokenB…\" },\n * ],\n * transportKeyPair,\n * signedPermit,\n * });\n * ```\n */\n decryptValuesFromPairs: FhevmClient[\"decryptValuesFromPairs\"] = async (parameters) => {\n await this.#decrypt.init();\n return this.#decrypt.decryptValuesFromPairs({\n ...parameters,\n options: this.#requestOptions(parameters.options),\n });\n };\n\n /**\n * Fetches the chain's raw FHE public-key bytes — the key encryption uses —\n * served from cache unless `ignoreCache` forces a refetch. Rarely called\n * directly: {@link encryptValue}/{@link encryptValues} fetch the key for you.\n *\n * @example\n * ```ts\n * const keyBytes = await relayer.fetchFheEncryptionKeyBytes();\n * const fresh = await relayer.fetchFheEncryptionKeyBytes({ ignoreCache: true });\n * ```\n */\n fetchFheEncryptionKeyBytes: FhevmClient[\"fetchFheEncryptionKeyBytes\"] = async (parameters) => {\n // Served from the base client, which shares the key cache with the encrypt\n // client: initializing encryption here would spawn the encrypt worker and\n // wait out its bring-up for a key this thread fetches itself.\n await this.#base.init();\n return this.#base.fetchFheEncryptionKeyBytes({\n ...parameters,\n options: this.#requestOptions(parameters?.options),\n });\n };\n\n /**\n * Builds the EIP-712 user-decrypt permit and signs it with the given signer,\n * authorizing the transport key pair to decrypt the listed contracts' values\n * for `durationSeconds` starting at `startTimestamp`. Pass `delegatorAddress`\n * to sign a delegated permit — decrypting values owned by that account instead\n * of the signer's own. Persist the result via\n * {@link serializeSignedDecryptionPermit}.\n *\n * @example\n * ```ts\n * const signedPermit = await relayer.signDecryptionPermit({\n * transportKeyPair,\n * contractAddresses: [\"0xToken…\"],\n * startTimestamp: Math.floor(Date.now() / 1000),\n * durationSeconds: 60 * 60 * 24,\n * signerAddress: \"0xUser…\",\n * signer,\n * // delegatorAddress: \"0xOwner…\", // omit for a self permit\n * });\n * ```\n */\n signDecryptionPermit: FhevmClient[\"signDecryptionPermit\"] = async (parameters) => {\n await this.#base.init();\n return this.#base.signDecryptionPermit(parameters);\n };\n\n /**\n * Builds the unsigned EIP-712 typed data for a V1 decryption permit, without\n * signing it — the signer-less counterpart to {@link signDecryptionPermit}.\n * Hand the result to an out-of-process signer for `eth_signTypedData_v4`,\n * then verify the returned signature via {@link parseSignedDecryptionPermit}.\n *\n * Not on `@fhevm/sdk`'s client decorator, so it's called directly against\n * the base client rather than through a decorated method.\n *\n * @example\n * ```ts\n * const eip712 = await relayer.createUnsignedLegacyDecryptionPermitEip712({\n * transportKeyPair,\n * contractAddresses: [\"0xToken…\"],\n * startTimestamp: Math.floor(Date.now() / 1000),\n * durationSeconds: 60 * 60 * 24,\n * // delegatorAddress: \"0xOwner…\", // omit for a self permit\n * });\n * ```\n */\n createUnsignedLegacyDecryptionPermitEip712: RelayerSDK[\"createUnsignedLegacyDecryptionPermitEip712\"] =\n (parameters) => createUnsignedLegacyDecryptionPermitEip712Action(this.#base, parameters);\n\n // Permit/key-pair helpers carry no request options. Parsing explicitly\n // initializes the capability that validates the restored value; serialization\n // resolves the frozen context internally (via initPublicAction), which reads\n // on-chain state.\n\n /**\n * Serializes a transport key pair to a hex `{ publicKey, privateKey }` pair for\n * storage or transport, so a decryption session can resume without regenerating\n * keys. Reverse of {@link parseTransportKeyPair}.\n *\n * @example\n * ```ts\n * const stored = await relayer.serializeTransportKeyPair({ transportKeyPair });\n * // { publicKey: \"0x…\", privateKey: \"0x…\" }\n * ```\n */\n serializeTransportKeyPair: FhevmClient[\"serializeTransportKeyPair\"] = (parameters) =>\n this.#decrypt.serializeTransportKeyPair(parameters);\n\n /**\n * Serializes a signed permit to a plain, JSON-stringifiable object (version,\n * EIP-712 payload, signature, signer) for caching or transport. Reverse of\n * {@link parseSignedDecryptionPermit}.\n *\n * @example\n * ```ts\n * const serialized = await relayer.serializeSignedDecryptionPermit({ signedPermit });\n * localStorage.setItem(\"permit\", JSON.stringify(serialized));\n * ```\n */\n serializeSignedDecryptionPermit: FhevmClient[\"serializeSignedDecryptionPermit\"] = (parameters) =>\n this.#base.serializeSignedDecryptionPermit(parameters);\n\n /**\n * Rebuilds a transport key pair from its serialized hex\n * `{ publicKey, privateKey }` form. Reverse of {@link serializeTransportKeyPair}.\n *\n * @example\n * ```ts\n * const transportKeyPair = await relayer.parseTransportKeyPair({\n * publicKey: stored.publicKey,\n * privateKey: stored.privateKey,\n * });\n * ```\n */\n parseTransportKeyPair: FhevmClient[\"parseTransportKeyPair\"] = async (parameters) => {\n await this.#decrypt.init();\n return this.#decrypt.parseTransportKeyPair(parameters);\n };\n\n /**\n * Rebuilds a signed permit from its serialized form and validates it: checks\n * the EIP-712 structure, verifies the signature against the on-chain verifier,\n * and confirms the permit's public key matches `transportKeyPair`. Reverse of\n * {@link serializeSignedDecryptionPermit}.\n *\n * @throws if the permit is malformed, expired, or its signature is invalid.\n *\n * @example\n * ```ts\n * const signedPermit = await relayer.parseSignedDecryptionPermit({\n * serializedPermit,\n * transportKeyPair,\n * });\n * ```\n */\n parseSignedDecryptionPermit: FhevmClient[\"parseSignedDecryptionPermit\"] = async (parameters) => {\n await this.#base.init();\n const { serializedPermit } = parameters;\n return this.#base.parseSignedDecryptionPermit({\n ...parameters,\n serializedPermit: {\n ...serializedPermit,\n signature: normalizeSignatureV(serializedPermit.signature),\n },\n });\n };\n\n /**\n * Generates a fresh ephemeral transport key pair for a user-decrypt session.\n * The relayer re-encrypts decrypted values to this pair's public key, so only\n * the holder of the private key can read them; bind it to a permit via\n * {@link signDecryptionPermit}.\n *\n * @example\n * ```ts\n * const transportKeyPair = await relayer.generateTransportKeyPair();\n * ```\n */\n generateTransportKeyPair: FhevmClient[\"generateTransportKeyPair\"] = async () => {\n await this.#decrypt.init();\n return this.#decrypt.generateTransportKeyPair();\n };\n}\n\n/**\n * Rewrites a 65-byte signature's recovery byte from 0/1 to 27/28. The gateway\n * verifies V1 permits on-chain with OpenZeppelin `ECDSA.recover`, which rejects\n * 0/1. Longer signatures (ERC-1271, concatenated) pass through untouched.\n */\nfunction normalizeSignatureV(signature: string): string {\n if (signature.length !== 132) {\n return signature;\n }\n const v = parseInt(signature.slice(130), 16);\n if (v !== 0 && v !== 1) {\n return signature;\n }\n return `${signature.slice(0, 130)}${v === 0 ? \"1b\" : \"1c\"}`;\n}\n\n/**\n * The one reason, if any, this thread's configuration cannot be reproduced in\n * the worker realm, so offload is worse than inline there.\n */\nfunction encryptOffloadBlocker(runtime: WireRuntimeConfig | undefined): string | undefined {\n // A runtime `locateFile` is a function: it cannot be cloned into the worker\n // realm, which would silently resolve WASM assets from the default URLs.\n if (hasAppliedLocateFile()) {\n return \"a runtime locateFile cannot cross the encrypt worker boundary\";\n }\n // Unreadable here, so the worker would run on fhevm defaults: an auth it\n // carries would 401 inside the worker as an application error, which never degrades.\n if (runtime === undefined && hasFhevmRuntimeConfig()) {\n return \"a runtime config set outside createConfig cannot be replicated in the encrypt worker realm\";\n }\n return undefined;\n}\n\n/**\n * Translates the SDK's public {@link FheChain.auth} shape (discriminated by\n * `__type`) into the `type`-discriminated `auth` that `@fhevm/sdk` expects.\n *\n * @throws if the auth discriminator is not one of the supported kinds.\n */\nexport function toFhevmAuth(\n auth: NonNullable<FheChain[\"auth\"]>,\n): NonNullable<FhevmRelayerOptions[\"auth\"]> {\n const type = auth[\"__type\"];\n switch (type) {\n case \"ApiKeyHeader\":\n return { type, value: auth.value, header: auth.header };\n case \"ApiKeyCookie\":\n return { type, value: auth.value, cookie: auth.cookie };\n case \"BearerToken\":\n return { type, token: auth.token };\n default:\n throw new ConfigurationError(`Unknown auth type: ${String(type)}`);\n }\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{S as e,_ as t,a as n,b as r,c as i,d as a,g as o,h as s,i as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,v as ee}from"./relayer-C3jVhqSK.js";import{a as g,c as te,d as ne,i as _,l as v,n as re,o as y,s as ie,t as b,u as ae}from"./signing-C6nbPCyd.js";import{n as oe,r as x,t as S}from"./encryption-6AVd-82z.js";import{A as se,B as ce,C as le,D as ue,E as de,F as C,H as w,L as fe,M as pe,O as T,P as me,R as he,S as ge,T as E,V as D,a as _e,b as ve,c as ye,d as be,g as xe,h as Se,i as Ce,j as O,k as we,l as Te,m as Ee,n as De,p as Oe,r as ke,s as Ae,t as je,u as Me,v as Ne,w as Pe,x as Fe,z as Ie}from"./erc165-B8gx2luK.js";import{n as Le,r as k}from"./fatal-batch-BiiS7KdS.js";import{a as A,c as Re,d as ze,f as Be,h as Ve,l as He,m as Ue,n as We,o as Ge,p as Ke,r as qe,s as Je,t as Ye,u as Xe}from"./token-g6sinwTx.js";import{C as Ze,T as Qe,_ as $e,a as et,c as tt,d as nt,f as rt,g as it,h as at,i as ot,l as st,m as ct,n as lt,o as ut,p as dt,r as ft,s as pt,t as mt,u as ht,v as gt,w as _t,y as vt}from"./wrapped-token-3usJd0oi.js";import{r as j}from"./telemetry-DvJV3oBk.js";import{t as yt}from"./cleartext-C0ba9z6Z.js";import{a as bt,c as xt,d as St,f as Ct,i as wt,l as Tt,m as Et,n as Dt,o as M,p as Ot,r as kt,s as At,t as jt,u as Mt}from"./base-signer-CNHZZnr2.js";import{n as N,r as Nt,s as Pt,t as Ft}from"./primitives-Cym-3HKa.js";import{t as P}from"./validation-ClSvPh6P.js";import{a as It,i as Lt,n as Rt,o as zt,r as Bt,s as Vt,t as Ht}from"./wrappers-registry-Cm3JJeqx.js";import{a as Ut,c as Wt,d as Gt,i as Kt,l as qt,n as Jt,o as Yt,r as Xt,s as Zt,t as Qt,u as $t}from"./chains-iPpnjXql.js";import{getAddress as F,size as en}from"viem";import{z as I}from"zod/mini";function tn(e,t){if(e instanceof p){let n=t[e.code];if(n)return n(e)}return t._?.(e)}var L=class extends p{encryptedValue;contractAddress;account;constructor(e,t){super(c.NotEntitled,`Account ${e.account} is not entitled to decrypt encrypted value ${e.encryptedValue} on contract ${e.contractAddress}. This is not a transient failure — the account needs an on-chain ACL grant before it can decrypt this encrypted value.`,t),this.name=`NotEntitledError`,this.encryptedValue=e.encryptedValue,this.contractAddress=e.contractAddress,this.account=e.account}},R=class extends p{constructor(e,t){super(c.DelegationSelfNotAllowed,e,t),this.name=`DelegationSelfNotAllowedError`}},nn=class extends p{constructor(e,t){super(c.DelegationCooldown,e,t),this.name=`DelegationCooldownError`}},z=class extends p{constructor(e,t){super(c.DelegationNotFound,e,t),this.name=`DelegationNotFoundError`}},B=class extends p{constructor(e,t){super(c.DelegationExpired,e,t),this.name=`DelegationExpiredError`}},V=class extends p{constructor(e,t){super(c.DelegationExpiryUnchanged,e,t),this.name=`DelegationExpiryUnchangedError`}},H=class extends p{constructor(e,t){super(c.DelegationDelegateEqualsContract,e,t),this.name=`DelegationDelegateEqualsContractError`}},U=class extends p{constructor(e,t){super(c.DelegationDelegateCannotBeWildcard,e,t),this.name=`DelegationDelegateCannotBeWildcardError`}},rn=class extends p{constructor(e,t){super(c.DelegationContractIsSelf,e,t),this.name=`DelegationContractIsSelfError`}},an=class extends p{constructor(e,t){super(c.AclPaused,e,t),this.name=`AclPausedError`}},W=class extends p{constructor(e,t){super(c.DelegationExpirationTooSoon,e,t),this.name=`DelegationExpirationTooSoonError`}},G=class extends p{constructor(e,t){super(c.DelegationNotPropagated,e,t),this.name=`DelegationNotPropagatedError`}};const on=[S,y,u,G,re,b,L,k,_,v];function K(e,n,c={}){if(on.some(t=>e instanceof t))return e;let d=e instanceof Error?e.message:n;if(e instanceof Error&&f(e.message))return new _(e.message,{cause:e});if(t(e))return new v(`The permit's KMS context has been revoked on-chain, so the permit is no longer usable. The SDK evicts the permit and re-grants automatically; if this error surfaced, the retry failed the same way. The on-chain validity check is cached for up to 15 minutes, so a just-revoked context can keep failing across that window. Retry after the window; the SDK re-runs the recovery on the next decrypt, no manual cleanup is needed.`,{cause:e});if(e instanceof Error&&l(e.message))return c.isDelegated?new G(`Delegated decryption was denied by the on-chain ACL check. This is most commonly caused by the delegation not having propagated yet, or by the RPC node serving a stale block. Propagation usually completes within ~10 blocks (a few seconds) and the SDK retries across that window; seeing this means it did not sync in time. Retry shortly (and prefer a fresh, low-lag RPC endpoint). If it persists, the delegator may genuinely lack the on-chain ACL grant.`,{cause:e}):new L({encryptedValue:r(e.message)??``,contractAddress:c.contractAddress??``,account:c.account??``},{cause:e});if(a(e))return new k(d,{cause:e,retryAfter:i(e)});let p=m(e);return p===void 0&&ee(e)?new k(d,{cause:e,retryAfter:i(e)}):p===400?new y(e instanceof Error?e.message:`No ciphertext for this account`,{cause:e}):c.isDelegated&&p===500?new G(`Delegated decryption failed with a server error. This is most commonly caused by the delegation not having propagated to the gateway yet. Cross-chain sync usually completes within ~10 blocks (a few seconds) and the SDK retries across that window; seeing this means it did not sync in time — retry shortly. If the error persists, the gateway or relayer may be experiencing an unrelated issue.`,{cause:e}):s(e)||p!==void 0?new u(d,p,{cause:e,retryAfter:i(e),retryable:o(e)||void 0}):new S(n,{cause:e})}function sn(e,t){if(e instanceof p)return e;let n=m(e),r=o(e);return n!==void 0||s(e)?new u(e instanceof Error?e.message:t,n,{cause:e,retryAfter:i(e),retryable:r||void 0}):new x(t,{cause:e})}const q=[{type:`function`,name:`allow`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`allowForDecryption`,inputs:[{name:`handlesList`,type:`bytes32[]`,internalType:`bytes32[]`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`allowTransient`,inputs:[{name:`ciphertext`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`cleanTransientStorage`,inputs:[],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`delegateForUserDecryption`,inputs:[{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`},{name:`expirationDate`,type:`uint64`,internalType:`uint64`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`getUserDecryptionDelegationExpirationDate`,inputs:[{name:`delegator`,type:`address`,internalType:`address`},{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`uint64`,internalType:`uint64`}],stateMutability:`view`},{type:`function`,name:`isAccountDenied`,inputs:[{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isAllowed`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isAllowedForDecryption`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isHandleDelegatedForUserDecryption`,inputs:[{name:`delegator`,type:`address`,internalType:`address`},{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`},{name:`handle`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`multicall`,inputs:[{name:`data`,type:`bytes[]`,internalType:`bytes[]`}],outputs:[{name:`results`,type:`bytes[]`,internalType:`bytes[]`}],stateMutability:`payable`},{type:`function`,name:`persistAllowed`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`revokeDelegationForUserDecryption`,inputs:[{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`}];function J(e,t,n,r){return{address:e,abi:q,functionName:`delegateForUserDecryption`,args:[t,n,r]}}function Y(e,t,n){return{address:e,abi:q,functionName:`revokeDelegationForUserDecryption`,args:[t,n]}}function cn(e,t,n,r){return{address:e,abi:q,functionName:`getUserDecryptionDelegationExpirationDate`,args:[t,n,r]}}function ln(e,t,n,r,i){return{address:e,abi:q,functionName:`isHandleDelegatedForUserDecryption`,args:[t,n,r,i]}}const X=2n**64n-1n,Z=`0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF`;function un(e){return wt(e.signer,e.provider,e)}var dn=class{#e;#t;#n;#r;#i;#a;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.cachingService,this.#r=e.credentialService,this.#i=e.logger,this.#a=e.emitEvent}#o(e){return D(this.#r,e)}#s(e,t){throw this.#a({type:C.PermitError,operation:e,error:t instanceof Error?t:Error(String(t))}),t}async grantPermit(e){if(e.length===0)return;let t;try{t=this.#o(`grantPermit`),await Ge(`grantPermit`,this.#e,this.#t)}catch(e){this.#s(`grantPermit`,e)}await t.grantPermit(e)}async grantDelegationPermit(e,t){if(t.length===0)return;let n;try{n=this.#o(`grantDelegationPermit`),await Ge(`grantDelegationPermit`,this.#e,this.#t)}catch(e){this.#s(`grantDelegationPermit`,e)}await n.grantPermit(t,e)}async hasPermit(e){return this.#r?this.#r.hasPermit(e):!1}async hasDelegationPermit(e,t){return this.#r?this.#r.hasPermit(t,e):!1}async warmTransportKeyPair(){let e=this.#r;if(!e)return;let t=this.#e?.walletAccount.getSnapshot();t&&await e.warmTransportKeyPair(t.address)}registerPermit(e,t){return this.batchRegisterPermits([{prepared:e,signature:t}])}async batchRegisterPermits(e){let t;try{t=this.#o(`registerPermit`)}catch(e){this.#s(`registerPermit`,e)}await t.batchRegisterPermits(e),await Promise.all([...new Set(e.map(e=>e.prepared.signerAddress))].map(e=>this.#c(e)))}async revokePermits(e){let t=this.#o(`revokePermits`),n=F((await A(`revokePermits`,this.#e,this.#t)).address);try{await t.revokePermits(e)}finally{await this.#c(n)}}async clear(){let e=this.#o(`clear`),t=F((await A(`clear`,this.#e,this.#t)).address);try{await e.clearCredentials()}finally{await this.#c(t)}}async#c(e){await O(`clear decrypt cache`,()=>this.#n.clearForRequester(e),this.#i)}async revokeTransportKeyPair(e){await this.#o(`revokeTransportKeyPair`).revokeTransportKeyPair(e)}async warmTransportKeyPairScope(e){await this.#o(`warmTransportKeyPairScope`).warmTransportKeyPairScope(e)}},fn=class{#e;#t;#n;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.delegationService}#r(e){return D(this.#e,e)}async delegateDecryption({contractAddress:e,delegateAddress:t,expirationDate:n}){let r=this.#r(`delegateDecryption`),i=await A(`delegateDecryption`,this.#e,this.#t);return this.#n.delegateDecryption(r,{contractAddress:e,delegateAddress:t,delegatorAddress:i.address,expirationDate:n})}async revokeDelegation({contractAddress:e,delegateAddress:t}){let n=this.#r(`revokeDelegation`),r=await A(`revokeDelegation`,this.#e,this.#t);return this.#n.revokeDelegation(n,{contractAddress:e,delegateAddress:t,delegatorAddress:r.address})}async isActive(e){return this.#n.isDelegated(e)}async getExpiry(e){return this.#n.getDelegationExpiry(e)}async getStatus(e){return this.#n.getStatus(e)}},pn=class{#e;#t;#n;#r;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.router,this.#r=e.decryptionService}#i(e){return D(this.#r,e)}async decryptValues(e,t){let n=this.#i(`decryptValues`),r=await A(`decryptValues`,this.#e,this.#t);return n.decryptValues(e,r.address,j(t,`decrypt-values`))}async delegatedDecryptValues(e,t,n=t,r){let i=this.#i(`delegatedDecryptValues`),a=await A(`delegatedDecryptValues`,this.#e,this.#t);return i.delegatedDecryptValues(e,t,a.address,n,j(r,`delegated-decrypt-values`))}async decryptPublicValues(e,t){if(e.length===0)return{clearValues:{},decryptionProof:`0x`,abiEncodedClearValues:`0x`};let n=j(t,`decrypt-public-values`);try{let t=await this.#n.relayer.decryptPublicValuesWithSignatures({encryptedValues:e,options:n}),r={};return t.checkSignaturesArgs.handlesList.forEach((e,n)=>{me(t.clearValues[n],`result.clearValues[${n}]`),r[e]=t.clearValues[n].value}),{clearValues:r,abiEncodedClearValues:t.checkSignaturesArgs.abiEncodedCleartexts,decryptionProof:t.checkSignaturesArgs.decryptionProof}}catch(e){throw K(e,`Public decryption failed`)}}async delegatedBatchDecryptValues({encryptedInputs:e,delegatorAddress:t,accountAddress:n=t,maxConcurrency:r,waitForPropagation:i,operation:a}){let o=this.#i(`delegatedBatchDecryptValues`),s=await A(`delegatedBatchDecryptValues`,this.#e,this.#t);return o.delegatedBatchDecryptHandlesAs({encryptedInputs:e,delegatorAddress:t,delegateAddress:s.address,accountAddress:n,maxConcurrency:r,waitForPropagation:i,operation:a??`delegated-batch-decrypt-values`})}},mn=class{#e;#t;constructor(e,t){this.#e=e,this.#t=t}prepare(e,t){return this.#e.prepare(e,t)}preparePermit(e){return this.#t.preparePermit(e)}batchPreparePermits(e){return this.#t.batchPreparePermits(e)}},hn=class{async get(e){return(await chrome.storage.session.get(e))[e]??null}async set(e,t){await chrome.storage.session.set({[e]:t})}async delete(e){await chrome.storage.session.remove(e)}};const gn=new hn,_n=I.union([I.bigint(),I.boolean(),N]),vn=I.array(I.string());var yn=class{#e;#t;#n=`zama:decrypt`;#r=`${this.#n}:keys`;#i=Promise.resolve();constructor(e,t){this.#e=e,this.#t=t}async get(e,t,n){try{let r=this.#c(e,t,n),i=await this.#e.get(r);if(i===null)return null;let a=_n.safeParse(i);return a.success?a.data:(await this.delete(e,t,n),null)}catch(e){return this.#t.warn(`CachingService.get failed`,{error:e}),null}}async set(e,t,n,r){try{let i=this.#c(e,t,n);await this.#e.set(i,r),this.#i=this.#i.then(()=>this.#u(i).catch(e=>{this.#t.warn(`CachingService index write failed`,{error:e})})),await this.#i}catch(e){this.#t.warn(`CachingService.set failed`,{error:e})}}async delete(e,t,n){let r=this.#c(e,t,n);this.#i=this.#i.then(()=>this.#a(r).catch(e=>{this.#t.warn(`CachingService.delete failed`,{error:e})})),await this.#i}async clearForRequester(e){this.#i=this.#i.then(()=>this.#o(e).catch(e=>{this.#t.warn(`CachingService.clearForRequester failed`,{error:e})})),await this.#i}async clearAll(){this.#i=this.#i.then(()=>this.#s().catch(e=>{this.#t.warn(`CachingService.clearAll failed`,{error:e})})),await this.#i}async#a(e){await this.#e.delete(e).catch(()=>{});let t=await this.#l(),n=t.filter(t=>t!==e);n.length!==t.length&&await this.#e.set(this.#r,n)}async#o(e){let t=F(e),n=`${this.#n}:${t}:`,r=await this.#l(),i=[],a=[];for(let e of r)e.startsWith(n)?i.push(e):a.push(e);await Promise.all(i.map(e=>this.#e.delete(e).catch(()=>{}))),await this.#e.set(this.#r,a)}async#s(){let e=await this.#l();await Promise.all(e.map(e=>this.#e.delete(e).catch(()=>{}))),await this.#e.delete(this.#r)}#c(e,t,n){return`${this.#n}:${F(e)}:${F(t)}:${n.toLowerCase()}`}async#l(){let e=await this.#e.get(this.#r);if(e===null)return[];let t=vn.safeParse(e);return t.success?t.data:(await this.#e.delete(this.#r).catch(()=>{}),[])}async#u(e){let t=await this.#l();t.includes(e)||(t.push(e),await this.#e.set(this.#r,t))}};function bn(e,t){let n=xn(e,t);if(!n)throw new S(`No permit covers contract ${t} after allow()`);return{privateKey:e.keypair.privateKey,publicKey:e.keypair.publicKey,serializedPermit:n.serializedPermit}}function xn(e,t){let n=Ft(t);return e.permissions.find(e=>e.contractAddresses.includes(n))}const Sn=e=>new Promise(t=>setTimeout(t,e));var Cn=class{#e;#t;#n;#r;#i;constructor({cache:e,credentialService:t,delegationService:n,router:r,emitEvent:i}){this.#e=e,this.#t=t,this.#n=n,this.#r=r,this.#i=i}async decryptValues(e,t,n){let r=F(t);return this.#s(e,{requesterAddress:r,errorMessage:`Failed to decrypt encrypted values`},n)}async delegatedDecryptValues(e,t,n,r,i){let a=F(t),o=F(n),s={spent:!1};return this.#a(i?.waitForPropagation??!0,()=>this.#s(e,{requesterAddress:F(r),delegator:a,validate:e=>this.#m(e,{delegatorAddress:a,delegateAddress:o}),errorMessage:`Failed to decrypt delegated encrypted values`},{operation:i?.operation},s))}async#a(e,t){let n;for(let r=0;r<16;r++)try{return await t()}catch(t){if(n=t,!(r<15&&e&&t instanceof G))throw t;await Sn(2e3)}throw n}async delegatedBatchDecryptHandlesAs({encryptedInputs:e,delegatorAddress:t,delegateAddress:n,accountAddress:r,maxConcurrency:i=5,waitForPropagation:a=!0,operation:o}){let s=e.map(e=>({encryptedValue:e.encryptedValue,contractAddress:F(e.contractAddress)}));if(s.length===0)return{items:s};let c=F(r);try{let e=await this.delegatedDecryptValues(s.map(({encryptedValue:e,contractAddress:t})=>({encryptedValue:e,contractAddress:t})),t,n,c,{waitForPropagation:a,operation:o});for(let t of s)this.#d(t,e);return{items:s}}catch(e){if(Le(e))throw e;if(s.length===1){let[n=this.#p()]=s;return n.error=this.#f(e,`Failed to decrypt delegated encrypted values`,{isDelegated:!0,contractAddress:n.contractAddress,account:F(t)}),{items:s}}}let l=!1,u;if(await qe(s.map(e=>async()=>{if(!l)try{let r=await this.delegatedDecryptValues([{encryptedValue:e.encryptedValue,contractAddress:e.contractAddress}],t,n,c,{waitForPropagation:!1,operation:o});this.#d(e,r)}catch(n){if(Le(n)){l=!0,u??=n;return}e.error=this.#f(n,`Failed to decrypt delegated encrypted values`,{isDelegated:!0,contractAddress:e.contractAddress,account:F(t)})}}),i),u!==void 0)throw u;return{items:s}}async#o(e,t,n,r){let i=bn(e,t),a;try{a=await this.#r.relayer.parseTransportKeyPair({publicKey:i.publicKey,privateKey:i.privateKey,tkmsVersion:e.keypair.tkmsVersion})}catch(e){throw e instanceof Error&&f(e.message)&&await this.#t.evictTransportKeyPair(),e}let o=await this.#r.relayer.parseSignedDecryptionPermit({transportKeyPair:a,serializedPermit:i.serializedPermit});return this.#r.relayer.decryptValues({transportKeyPair:a,signedPermit:o,encryptedValues:n,contractAddress:t,options:r})}async#s(t,n,r,i={spent:!1}){if(t.length===0)return{};let a=t.map(e=>({encryptedValue:e.encryptedValue,contractAddress:F(e.contractAddress)})),o={},s=[];for(let e of a)He(e.encryptedValue)?o[e.encryptedValue]=0n:s.push(e);if(s.length===0)return o;let c=Array.from(new Set(a.map(e=>e.contractAddress))),l=Array.from(new Set(s.map(e=>e.contractAddress)));if(n.validate)try{await n.validate(l)}catch(e){throw ee(e)?this.#u(e,`the delegation pre-check`):e}let u=[];for(let e of s){let t=await this.#e.get(n.requesterAddress,e.contractAddress,e.encryptedValue);t===null?u.push(e):o[e.encryptedValue]=t}if(u.length===0)return o;let d=await this.#t.grantPermit(c,n.delegator),f=new Map;for(let e of u){let t=f.get(e.contractAddress);t?t.push(e.encryptedValue):f.set(e.contractAddress,[e.encryptedValue])}let m=[];for(let[e,t]of f)for(let n of Re(t))m.push({contractAddress:e,encryptedValues:n});let h=Date.now(),g=u.map(e=>e.encryptedValue);try{this.#i({type:C.DecryptStart,encryptedValues:g});try{await this.#c(n,d,m,o,r)}catch(e){if(!(e instanceof v)||i.spent)throw e;let t=d.permissions.map(e=>e.serializedPermit.signature);i.spent=!0;try{d=await this.#t.recoverPermits(c,n.delegator,t)}catch(e){throw e instanceof b?new v(`The permit's KMS context has been revoked on-chain and the automatic re-grant failed, so the decrypt cannot proceed. Establish a new permit for this scope and retry.`,{cause:e}):e}await this.#c(n,d,m.filter(({encryptedValues:e})=>e.some(e=>o[e]===void 0)),o,r)}let e={};for(let t of g){let n=o[t];n!==void 0&&(e[t]=n)}return this.#i({type:C.DecryptEnd,durationMs:Date.now()-h,encryptedValues:g,result:e}),o}catch(t){let r=t instanceof p&&t.cause instanceof Error?t.cause:t;throw this.#i({type:C.DecryptError,error:e(r),durationMs:Date.now()-h,encryptedValues:g}),K(t,n.errorMessage,{isDelegated:n.delegator!==void 0})}}async#c(e,t,n,r,i){let a=(await qe(n.map(({contractAddress:n,encryptedValues:a})=>async()=>{try{await this.#l(e,t,n,a,r,i);return}catch(e){return e}}),5)).filter(e=>e!==void 0);if(a.length>0)throw a.find(e=>e instanceof v)??a[0]}async#l(e,t,n,r,i,a){let o;try{o=await this.#o(t,n,r,a)}catch(t){throw K(t,e.errorMessage,{isDelegated:e.delegator!==void 0,contractAddress:n,account:e.delegator??e.requesterAddress})}for(let t=0;t<r.length;t++){let a=r[t],s=o[t]?.value;a!==void 0&&s!==void 0&&(i[a]=s,await this.#e.set(e.requesterAddress,n,a,s))}let s=r.filter(e=>i[e]===void 0);if(s.length>0)throw new S(`${e.errorMessage}: relayer returned no clear value for ${s.length} of ${r.length} handle(s) on ${n}`,{cause:AggregateError(s.map(e=>new S(`No clear value for handle ${e} on ${n}`)),`${s.length} handle(s) missing a clear value on ${n}`)})}#u(e,t){return new k(`RPC provider rate-limited ${t}; retry with backoff.`,{cause:e,retryAfter:i(e)})}#d(e,t){let n=t[e.encryptedValue];if(n===void 0){e.error=new S(`Batch delegated decryption returned no value for encrypted value ${e.encryptedValue} on contract ${e.contractAddress}`);return}e.value=n}#f(e,t,n){return e instanceof p?e:K(e,t,n)}#p(){throw new S(`Batch delegated decryption invariant failed: missing item`)}async#m(e,{delegatorAddress:t,delegateAddress:n}){let r=await this.#n.findInactiveDelegations(e,t,n);if(r.size!==0)for(let e of r.values())throw e}};const Q={AlreadyDelegatedOrRevokedInSameBlock:e=>new nn(`Only one delegate/revoke per (delegator, delegate, contract) per block. Wait for the next block before retrying.`,{cause:e}),SenderCannotBeContractAddress:e=>new rn(`The contract address cannot be the caller address.`,{cause:e}),EnforcedPause:e=>new an(`The ACL contract is paused. Delegation operations are temporarily disabled.`,{cause:e}),SenderCannotBeDelegate:e=>new R(`Cannot delegate to yourself (delegate === msg.sender).`,{cause:e}),DelegateCannotBeContractAddress:e=>new H(`Delegate address cannot be the same as the contract address.`,{cause:e}),DelegateCannotBeWildcard:e=>new U(`Delegate address cannot be the wildcard address; it can only be used as the contract address.`,{cause:e}),ExpirationDateBeforeOneHour:e=>new W(`Expiration date must be at least 1 hour in the future.`,{cause:e}),ExpirationDateAlreadySetToSameValue:e=>new V(`The new expiration date is the same as the current one.`,{cause:e}),NotDelegatedYet:e=>new z(`Cannot revoke: no active delegation exists.`,{cause:e})};function wn(e){return Object.hasOwn(Q,e)}function Tn(e,t){let n=Qe(e);if(n&&wn(n))return Q[n](t);let r=e instanceof Error?e.message:String(e);for(let[e,n]of Object.entries(Q))if(r.includes(e))return n(t);return null}var En=class{#e;#t;#n;#r;constructor({provider:e,router:t,emitEvent:n=()=>{},logger:r}){this.#t=e,this.#e=t,this.#r=r,this.#n=n}async delegateDecryption(e,{contractAddress:t,delegateAddress:n,delegatorAddress:r,expirationDate:i}){if(i&&i.getTime()<Date.now()+36e5)throw new W(`Expiration date must be at least 1 hour in the future`);let a=F(t),o=F(n),s=F(r);if(o===s)throw new R(`Cannot delegate to yourself (delegate === msg.sender).`);if(o===F(`0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF`))throw new U(`Delegate address cannot be the wildcard address; it can only be used as the contract address.`);if(o===a)throw new H(`Delegate address cannot be the same as the contract address (${a}).`);let c=this.#e.relayer.chain.aclContractAddress,l=i?BigInt(Math.floor(i.getTime()/1e3)):X,u;try{u=await this.getDelegationExpiry({contractAddress:a,delegatorAddress:s,delegateAddress:o})}catch(e){this.#r.warn(`delegateDecryption: pre-flight expiry check failed`,{error:e}),u=-1n}if(u===l)throw new V(`The new expiration date (${l}) is the same as the current one. No on-chain change needed.`);return a!==F(`0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF`)&&await this.#i({contractAddress:a,delegatorAddress:s,delegateAddress:o}),this.#s({operation:`delegateDecryption`,signer:e,contractAddress:a,config:J(c,o,a,l)})}async revokeDelegation(e,{contractAddress:t,delegateAddress:n,delegatorAddress:r}){let i=F(t),a=F(n),o=F(r),s=this.#e.relayer.chain.aclContractAddress,c;try{c=await this.getDelegationExpiry({contractAddress:i,delegatorAddress:o,delegateAddress:a})}catch(e){this.#r.warn(`revokeDelegation: pre-flight expiry check failed`,{error:e}),c=1n}if(c===0n)throw new z(`No active delegation found for delegate ${a} on contract ${i}.`);return this.#s({operation:`revokeDelegation`,signer:e,contractAddress:i,config:Y(s,a,i)})}async isDelegated(e){return(await this.getStatus(e)).isActive}async getStatus(e){let t=F(e.contractAddress)===Z,[n,r]=await Promise.all([this.getDelegationExpiry(e),t?Promise.resolve(0n):this.getDelegationExpiry({...e,contractAddress:Z})]),i=this.#a(n)||this.#a(r)?await this.#t.getBlockTimestamp():void 0,a=this.#o(n,i);if(a.isActive)return a;let o=this.#o(r,i);return o.isActive?o:n>=r?a:o}async#i(e){try{let{isActive:t}=await this.getStatus({...e,contractAddress:Z});t&&this.#r.warn(`delegateDecryption: ${e.delegateAddress} already holds an active wildcard delegation from ${e.delegatorAddress}; this grant for ${e.contractAddress} is redundant.`)}catch(e){this.#r.warn(`delegateDecryption: wildcard redundancy check failed`,{error:e})}}#a(e){return e!==0n&&e!==X}#o(e,t){return e===0n?{isActive:!1,expiryTimestamp:e}:e===X?{isActive:!0,expiryTimestamp:e}:{isActive:t!==void 0&&e>t,expiryTimestamp:e}}async getDelegationExpiry({contractAddress:e,delegatorAddress:t,delegateAddress:n}){let r=this.#e.relayer.chain.aclContractAddress;return this.#t.readContract(cn(r,F(t),F(n),F(e)))}async#s({operation:e,signer:t,contractAddress:n,config:r}){try{return await We({operation:e,signer:t,provider:this.#t,config:r,emit:e=>this.#n(e,n),logger:this.#r})}catch(e){throw this.#c(e),e}}#c(e){if(!(e instanceof w))return;let t=Tn(e.cause??e,e);if(t)throw t}async findInactiveDelegations(e,t,n){let r=new Map;return await Promise.all(e.map(async e=>{try{await this.assertDelegationActive(e,t,n)}catch(t){if(t instanceof z||t instanceof B){let n=F(e);r.set(n,t);return}throw t}})),r}async assertDelegationActive(e,t,n){let r=F(e),i=F(t),a=F(n),{isActive:o,expiryTimestamp:s}=await this.getStatus({contractAddress:r,delegatorAddress:i,delegateAddress:a});if(!o)throw s===0n?new z(`No active delegation from ${i} to ${a} for ${r}`):new B(`Delegation from ${i} to ${a} for ${r} has expired`)}},Dn=class{#e;#t;constructor({router:e,emitEvent:t}){this.#e=e,this.#t=t}async encryptValues(t,n){let r=Date.now(),i=F(t.contractAddress);try{this.#t({type:C.EncryptStart},i);let e=await this.#e.relayer.encryptValues({...t,options:n});return this.#t({type:C.EncryptEnd,durationMs:Date.now()-r},i),e}catch(t){throw this.#t({type:C.EncryptError,error:e(t),durationMs:Date.now()-r},i),sn(t,`Encryption failed`)}}},On=class{#e;#t;#n;#r;#i;#a=new Set;#o;constructor(e){this.#e=e.signer,this.#t=e.router,this.#n=e.cachingService,this.#r=e.credentialService,this.#i=e.logger,this.#e&&(this.#o=this.#e.walletAccount.subscribe(e=>{this.#s(e).catch(e=>{this.#i.warn(`wallet account handler failed`,{error:e})})}))}onWalletAccountChange(e){return this.#a.add(e),()=>{this.#a.delete(e)}}dispose(){this.#o?.(),this.#o=void 0,this.#a.clear()}async#s(e){let t=e.previous,n=e.next,r=n?.chainId;r!==void 0&&await O(`switch relayer chain`,()=>this.#t.switchChain(r),this.#i);let i=this.#r;i&&await O(`credential wallet account change`,()=>i.handleWalletAccountChange(t,n),this.#i),t&&await O(`clear decrypt cache`,()=>this.#n.clearForRequester(t.address),this.#i),await Promise.all(Array.from(this.#a,t=>O(`wallet account listener`,()=>t(e),this.#i)))}};const kn=I.object({kind:I.literal(`ConfidentialTransfer`),from:N,token:N,to:N,amount:I.bigint()}),An=I.object({kind:I.literal(`ConfidentialTransferFrom`),from:N,token:N,owner:N,to:N,amount:I.bigint()}),jn=I.object({kind:I.literal(`SetOperator`),from:N,token:N,operator:N,until:Pt}),$=I.object({kind:I.literal(`Unwrap`),from:N,token:N,to:N,amount:I.bigint()}),Mn=I.object({kind:I.literal(`UnwrapAll`),from:N,token:N,to:N}),Nn=I.object({kind:I.literal(`FinalizeUnwrap`),from:N,wrapper:N,unwrapRequestIdOrAmount:Nt}),Pn=I.object({kind:I.literal(`ApproveUnderlying`),from:N,underlying:N,spender:N,amount:I.bigint()}),Fn=I.object({kind:I.literal(`Wrap`),from:N,wrapper:N,to:N,amount:I.bigint()}),In=Nt.check(I.refine(e=>e===`0x`||en(e)===20,`TransferAndCall.recipientData must be "0x" (self-shield to the sender) or a raw 20-byte address, not a 32-byte ABI-encoded value the wrapper would truncate to a garbage address`)),Ln=I.object({kind:I.literal(`TransferAndCall`),from:N,underlying:N,wrapper:N,amount:I.bigint(),recipientData:I.optional(In)}),Rn=I.object({kind:I.literal(`DelegateDecryption`),from:N,contractAddress:N,delegateAddress:N,expirationDate:I.optional(I.date())}),zn=I.object({kind:I.literal(`RevokeDelegation`),from:N,contractAddress:N,delegateAddress:N});I.discriminatedUnion(`kind`,[kn,An,jn,$,Mn,Nn,Pn,Fn,Ln,Rn,zn]);const Bn=I.strictObject({maxFeePerGas:I.bigint(),maxPriorityFeePerGas:I.bigint()}),Vn=I.object({nonce:I.optional(I.int().check(I.nonnegative())),gasLimit:I.optional(I.bigint()),fees:I.optional(Bn)}),Hn=I.object({address:N,abi:I.array(I.unknown()),functionName:I.string(),args:I.array(I.unknown()),value:I.optional(I.bigint()),gas:I.optional(I.bigint())}),Un=I.extend(Vn,{from:N,calldata:Hn});var Wn=class{#e;#t;#n;constructor(e){this.#e=e.provider,this.#t=e.router,this.#n=e.encryption}async prepare(e,t){t&&=P(Vn,t);let n=await this.#e.getChainId(),r=this.#t.chain.id;if(n!==r)throw new h(`Offline.prepare: provider is on chain ${n} but the SDK is configured for chain ${r}. The prepared transaction's contract addresses and encrypted inputs are bound to chain ${r} — point the provider at the same chain.`);let i=P(Un,{calldata:await this.#r(e),from:e.from,nonce:t?.nonce,gasLimit:t?.gasLimit,fees:t?.fees}),a=await this.#e.prepareTransaction(i);return{kind:e.kind,unsignedTx:a,from:i.from}}async#r(e){switch(e.kind){case`ConfidentialTransfer`:return this.#i(e);case`ConfidentialTransferFrom`:return this.#a(e);case`SetOperator`:return this.#o(e);case`Unwrap`:return this.#s(e);case`UnwrapAll`:return this.#c(e);case`FinalizeUnwrap`:return this.#l(e);case`ApproveUnderlying`:return this.#u(e);case`Wrap`:return this.#d(e);case`TransferAndCall`:return this.#f(e);case`DelegateDecryption`:return this.#p(e);case`RevokeDelegation`:return this.#m(e);default:throw new h(`OfflineService.prepare: unsupported transaction kind '${e.kind}'.`)}}async#i(e){e=P(kn,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from},{operation:`offline-confidential-transfer`}),r=t[0];if(!r)throw new x(`Encryption returned no handles for ConfidentialTransfer`);return Ne(e.token,e.to,r,n)}async#a(e){e=P(An,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from},{operation:`offline-confidential-transfer-from`}),r=t[0];if(!r)throw new x(`Encryption returned no handles for ConfidentialTransferFrom`);return ve(e.token,e.owner,e.to,r,n)}#o(e){return e=P(jn,e),E(e.token,e.operator,e.until)}async#s(e){e=P($,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from},{operation:`offline-unwrap`}),r=t[0];if(!r)throw new x(`Encryption returned no handles for Unwrap`);return ue(e.token,e.from,e.to,r,n)}async#c(e){e=P(Mn,e);let t=await this.#e.readContract(Se(e.token,e.from));return T(e.token,e.from,e.to,t)}async#l(e){e=P(Nn,e);let t=await this.#t.relayer.decryptPublicValuesWithSignatures({encryptedValues:[e.unwrapRequestIdOrAmount],options:{operation:`offline-finalize-unwrap`}}).catch(e=>{throw K(e,`Public decryption failed during FinalizeUnwrap`)}),n=t.clearValues[0]?.value;return pe(n,`FinalizeUnwrap: decryptPublicValuesWithSignatures(handle).clearValue`),Fe(e.wrapper,e.unwrapRequestIdOrAmount,n,t.checkSignaturesArgs.decryptionProof)}#u(e){return e=P(Pn,e),Te(e.underlying,e.spender,e.amount)}#d(e){return e=P(Fn,e),se(e.wrapper,e.to,e.amount)}#f(e){return e=P(Ln,e),Ze(e.underlying,e.wrapper,e.amount,e.recipientData)}#p(e){if(e=P(Rn,e),e.expirationDate&&e.expirationDate.getTime()<Date.now()+36e5)throw new W(`Expiration date must be at least 1 hour in the future`);if(e.delegateAddress===e.from)throw new R(`Cannot delegate to yourself (delegate === msg.sender).`);if(e.delegateAddress===e.contractAddress)throw new H(`Delegate address cannot be the same as the contract address (${e.contractAddress}).`);let t=e.expirationDate?BigInt(Math.floor(e.expirationDate.getTime()/1e3)):X;return J(this.#t.chain.aclContractAddress,e.delegateAddress,e.contractAddress,t)}#m(e){return e=P(zn,e),Y(this.#t.chain.aclContractAddress,e.delegateAddress,e.contractAddress)}};function Gn(e){if(!(!Object.hasOwn(e,`transportKeyPairDerivationSecret`)||e.transportKeyPairDerivationSecret!==void 0))throw new h(`transportKeyPairDerivationSecret was passed as undefined, which usually means the environment variable it reads is unset (e.g. process.env.ZAMA_DERIVATION_SECRET). Supply the secret, or omit the option entirely to persist transport key pairs in cleartext on purpose.`)}function Kn(e){if(e===void 0)return;let{importScripts:t}=globalThis;if(!(typeof window>`u`&&typeof document>`u`&&typeof t!=`function`))throw new h(`transportKeyPairDerivationSecret is supported in headless environments only (CLI tools, servers, agents). Remove the option: an environment with a platform keystore, or one that ships a bundle, must delegate at-rest security of the transport key pair to the storage backend.`)}function qn(e){if(e===void 0)return;let t=P(Tt,e);return new Mt(typeof t==`string`?t:new Uint8Array(t))}var Jn=class{#e;provider;signer;storage;registry;permits;delegations;decryption;offline;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;constructor(e,t={}){Gn(t),Kn(t.transportKeyPairDerivationSecret);let n=qn(t.transportKeyPairDerivationSecret);this.#e=e.router,this.provider=e.provider,this.signer=e.signer,this.storage=e.storage,this.#r=e.onEvent??function(){},this.#i=e.logger,this.#a=new yn(e.storage,this.#i),this.#u=new En({provider:this.provider,router:e.router,emitEvent:this.emitEvent.bind(this),logger:this.#i});let r={};for(let t of e.chains)t.registryAddress&&(r[t.id]=t.registryAddress);this.registry=new M({provider:this.provider,registryAddresses:r,registryTTL:e.registryTTL}),this.#n=r,this.#t=e.registryTTL,this.#l=new At({router:e.router,signer:e.signer,transportKeyPairTTL:e.transportKeyPairTTL,permitTTL:e.permitTTL,scope:e.transportKeyPairScope,derivationSecret:n,storage:this.storage,permitStorage:e.permitStorage,logger:this.#i,emitEvent:this.emitEvent.bind(this)}),e.signer&&(this.#c=new Cn({cache:this.#a,credentialService:this.#l,delegationService:this.#u,router:e.router,emitEvent:this.emitEvent.bind(this)})),this.#s=new Dn({router:e.router,emitEvent:this.emitEvent.bind(this)}),this.#o=new On({signer:e.signer,router:e.router,cachingService:this.#a,credentialService:this.#l,logger:this.#i}),this.#d=new Wn({provider:this.provider,router:e.router,encryption:this.#s,emitEvent:(e,t)=>this.emitEvent(e,t)}),this.permits=new dn({signer:this.signer,provider:this.provider,cachingService:this.#a,credentialService:this.#l,logger:this.#i,emitEvent:this.emitEvent.bind(this)}),this.delegations=new fn({signer:this.signer,provider:this.provider,delegationService:this.#u}),this.decryption=new pn({signer:this.signer,provider:this.provider,router:e.router,decryptionService:this.#c}),this.offline=new mn(this.#d,this.#l)}onWalletAccountChange(e){return this.#o.onWalletAccountChange(e)}get logger(){return this.#i}get relayer(){return this.#e.relayer}emitEvent(e,t){try{this.#r({...e,tokenAddress:t,timestamp:Date.now()})}catch(t){this.#i.warn(`${e.type} event listener silently failed`,{error:t})}}createWrappersRegistry(e){return new M({provider:this.provider,registryAddresses:{...this.#n,...e},registryTTL:this.#t})}async encrypt(e,t){return this.#s.encryptValues(e,j(t,`encrypt`))}createToken(e){return new Ye(this,e)}createWrappedToken(e){return new mt(this,e)}dispose(){this.#o.dispose(),this.#e.dispose()}terminate(){this.dispose(),this.signer?.dispose?.()}[Symbol.dispose](){this.terminate()}};export{lt as ACL_TOPICS,an as AclPausedError,ft as AclTopics,Xe as BalanceCheckUnavailableError,jt as BaseSigner,Ve as ChainMismatchError,hn as ChromeSessionStorage,h as ConfigurationError,pn as Decryption,S as DecryptionFailedError,bt as DefaultRegistryAddresses,rn as DelegationContractIsSelfError,nn as DelegationCooldownError,U as DelegationDelegateCannotBeWildcardError,H as DelegationDelegateEqualsContractError,W as DelegationExpirationTooSoonError,B as DelegationExpiredError,V as DelegationExpiryUnchangedError,z as DelegationNotFoundError,G as DelegationNotPropagatedError,R as DelegationSelfNotAllowedError,fn as Delegations,je as ERC1363_INTERFACE_ID,ze as ERC20ReadFailedError,De as ERC7984_INTERFACE_ID,ke as ERC7984_WRAPPER_INTERFACE_ID,oe as EncryptOffloadUnavailableError,x as EncryptionFailedError,Ot as IndexedDBStorage,Be as InsufficientAllowanceError,Ke as InsufficientConfidentialBalanceError,Ue as InsufficientERC20BalanceError,_ as InvalidTransportKeyPairError,g as KeyWrappingError,X as MAX_UINT64,St as MemoryStorage,Dt as MutableWalletAccountStore,y as NoCiphertextError,L as NotEntitledError,mn as Offline,dn as Permits,ie as PreparedPermitChainMismatchError,te as PreparedPermitExpiredError,u as RelayerRequestFailedError,v as RevokedKmsContextError,k as RpcRateLimitError,fe as SignerNotConfiguredError,he as SignerRequiredError,b as SigningFailedError,re as SigningRejectedError,ot as TOKEN_TOPICS,Ye as Token,et as Topics,w as TransactionRevertedError,ae as TransportKeyPairChangedError,ne as TransportKeyPairExpiredError,_t as UnshieldAlreadyFinalizedError,Z as WILDCARD_CONTRACT,Ie as WalletAccountNotReadyError,ce as WalletNotConnectedError,mt as WrappedToken,M as WrappersRegistry,Je as ZERO_ENCRYPTED_VALUE,p as ZamaError,c as ZamaErrorCode,Jn as ZamaSDK,C as ZamaSDKEvents,ye as allowanceContract,Qt as anvil,Te as approveContract,Me as balanceOfContract,Jt as bscTestnet,Xt as chains,gn as chromeSessionStorage,yt as cleartext,Se as confidentialBalanceOfContract,xe as confidentialTotalSupplyContract,Ne as confidentialTransferContract,ve as confidentialTransferFromContract,un as createConfig,kt as createWalletAccountStore,be as decimalsContract,ut as decodeAclEvent,pt as decodeAclEvents,tt as decodeConfidentialTransfer,st as decodeDelegatedForUserDecryption,ht as decodeOnChainEvent,nt as decodeOnChainEvents,rt as decodeRevokedDelegationForUserDecryption,dt as decodeUnwrapFinalized,ct as decodeUnwrapRequested,at as decodeWrap,J as delegateForUserDecryptionContract,Fe as finalizeUnwrapContract,it as findDelegatedForUserDecryption,$e as findRevokedDelegationForUserDecryption,gt as findUnwrapRequested,vt as findWrap,Ht as getConfidentialTokenAddressContract,cn as getDelegationExpiryContract,Rt as getTokenAddressContract,Bt as getTokenPairContract,Lt as getTokenPairsContract,It as getTokenPairsLengthContract,zt as getTokenPairsSliceContract,Kt as hardhat,Ut as hoodi,Et as indexedDBStorage,ge as inferredTotalSupplyContract,Yt as ingenTestnet,Ce as isConfidentialTokenContract,Vt as isConfidentialTokenValidContract,_e as isConfidentialWrapperContract,He as isEncryptedValueZero,ln as isHandleDelegatedContract,le as isOperatorContract,n as isRetryable,Zt as mainnet,tn as matchZamaError,Ct as memoryStorage,Oe as nameContract,xt as parsePreparedPermit,Wt as polygon,qt as polygonAmoy,Pe as rateContract,d as retryAfterSeconds,Y as revokeDelegationContract,$t as sepolia,E as setOperatorContract,Ae as supportsInterfaceContract,Ee as symbolContract,Ze as transferAndCallContract,de as underlyingContract,ue as unwrapContract,T as unwrapFromBalanceContract,we as unwrapRequesterContract,se as wrapContract,Gt as zenithTrexTestnet};
|
|
1
|
+
import{S as e,_ as t,a as n,b as r,c as i,d as a,g as o,h as s,i as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h,v as ee}from"./relayer-C3jVhqSK.js";import{a as g,c as te,d as ne,i as _,l as v,n as re,o as y,s as ie,t as b,u as ae}from"./signing-C6nbPCyd.js";import{n as oe,r as x,t as S}from"./encryption-6AVd-82z.js";import{A as se,B as ce,C as le,D as ue,E as de,F as C,H as w,L as fe,M as pe,O as T,P as me,R as he,S as ge,T as E,V as D,a as _e,b as ve,c as ye,d as be,g as xe,h as Se,i as Ce,j as O,k as we,l as Te,m as Ee,n as De,p as Oe,r as ke,s as Ae,t as je,u as Me,v as Ne,w as Pe,x as Fe,z as Ie}from"./erc165-B8gx2luK.js";import{n as Le,r as k}from"./fatal-batch-BiiS7KdS.js";import{a as A,c as Re,d as ze,f as Be,h as Ve,l as He,m as Ue,n as We,o as Ge,p as Ke,r as qe,s as Je,t as Ye,u as Xe}from"./token-g6sinwTx.js";import{C as Ze,T as Qe,_ as $e,a as et,c as tt,d as nt,f as rt,g as it,h as at,i as ot,l as st,m as ct,n as lt,o as ut,p as dt,r as ft,s as pt,t as mt,u as ht,v as gt,w as _t,y as vt}from"./wrapped-token-3usJd0oi.js";import{r as j}from"./telemetry-DGsqUbRG.js";import{t as yt}from"./cleartext-CJ4JSBH-.js";import{a as bt,c as xt,d as St,f as Ct,i as wt,l as Tt,m as Et,n as Dt,o as M,p as Ot,r as kt,s as At,t as jt,u as Mt}from"./base-signer-CNHZZnr2.js";import{n as N,r as Nt,s as Pt,t as Ft}from"./primitives-Cym-3HKa.js";import{t as P}from"./validation-ClSvPh6P.js";import{a as It,i as Lt,n as Rt,o as zt,r as Bt,s as Vt,t as Ht}from"./wrappers-registry-Cm3JJeqx.js";import{a as Ut,c as Wt,d as Gt,i as Kt,l as qt,n as Jt,o as Yt,r as Xt,s as Zt,t as Qt,u as $t}from"./chains-iPpnjXql.js";import{getAddress as F,size as en}from"viem";import{z as I}from"zod/mini";function tn(e,t){if(e instanceof p){let n=t[e.code];if(n)return n(e)}return t._?.(e)}var L=class extends p{encryptedValue;contractAddress;account;constructor(e,t){super(c.NotEntitled,`Account ${e.account} is not entitled to decrypt encrypted value ${e.encryptedValue} on contract ${e.contractAddress}. This is not a transient failure — the account needs an on-chain ACL grant before it can decrypt this encrypted value.`,t),this.name=`NotEntitledError`,this.encryptedValue=e.encryptedValue,this.contractAddress=e.contractAddress,this.account=e.account}},R=class extends p{constructor(e,t){super(c.DelegationSelfNotAllowed,e,t),this.name=`DelegationSelfNotAllowedError`}},nn=class extends p{constructor(e,t){super(c.DelegationCooldown,e,t),this.name=`DelegationCooldownError`}},z=class extends p{constructor(e,t){super(c.DelegationNotFound,e,t),this.name=`DelegationNotFoundError`}},B=class extends p{constructor(e,t){super(c.DelegationExpired,e,t),this.name=`DelegationExpiredError`}},V=class extends p{constructor(e,t){super(c.DelegationExpiryUnchanged,e,t),this.name=`DelegationExpiryUnchangedError`}},H=class extends p{constructor(e,t){super(c.DelegationDelegateEqualsContract,e,t),this.name=`DelegationDelegateEqualsContractError`}},U=class extends p{constructor(e,t){super(c.DelegationDelegateCannotBeWildcard,e,t),this.name=`DelegationDelegateCannotBeWildcardError`}},rn=class extends p{constructor(e,t){super(c.DelegationContractIsSelf,e,t),this.name=`DelegationContractIsSelfError`}},an=class extends p{constructor(e,t){super(c.AclPaused,e,t),this.name=`AclPausedError`}},W=class extends p{constructor(e,t){super(c.DelegationExpirationTooSoon,e,t),this.name=`DelegationExpirationTooSoonError`}},G=class extends p{constructor(e,t){super(c.DelegationNotPropagated,e,t),this.name=`DelegationNotPropagatedError`}};const on=[S,y,u,G,re,b,L,k,_,v];function K(e,n,c={}){if(on.some(t=>e instanceof t))return e;let d=e instanceof Error?e.message:n;if(e instanceof Error&&f(e.message))return new _(e.message,{cause:e});if(t(e))return new v(`The permit's KMS context has been revoked on-chain, so the permit is no longer usable. The SDK evicts the permit and re-grants automatically; if this error surfaced, the retry failed the same way. The on-chain validity check is cached for up to 15 minutes, so a just-revoked context can keep failing across that window. Retry after the window; the SDK re-runs the recovery on the next decrypt, no manual cleanup is needed.`,{cause:e});if(e instanceof Error&&l(e.message))return c.isDelegated?new G(`Delegated decryption was denied by the on-chain ACL check. This is most commonly caused by the delegation not having propagated yet, or by the RPC node serving a stale block. Propagation usually completes within ~10 blocks (a few seconds) and the SDK retries across that window; seeing this means it did not sync in time. Retry shortly (and prefer a fresh, low-lag RPC endpoint). If it persists, the delegator may genuinely lack the on-chain ACL grant.`,{cause:e}):new L({encryptedValue:r(e.message)??``,contractAddress:c.contractAddress??``,account:c.account??``},{cause:e});if(a(e))return new k(d,{cause:e,retryAfter:i(e)});let p=m(e);return p===void 0&&ee(e)?new k(d,{cause:e,retryAfter:i(e)}):p===400?new y(e instanceof Error?e.message:`No ciphertext for this account`,{cause:e}):c.isDelegated&&p===500?new G(`Delegated decryption failed with a server error. This is most commonly caused by the delegation not having propagated to the gateway yet. Cross-chain sync usually completes within ~10 blocks (a few seconds) and the SDK retries across that window; seeing this means it did not sync in time — retry shortly. If the error persists, the gateway or relayer may be experiencing an unrelated issue.`,{cause:e}):s(e)||p!==void 0?new u(d,p,{cause:e,retryAfter:i(e),retryable:o(e)||void 0}):new S(n,{cause:e})}function sn(e,t){if(e instanceof p)return e;let n=m(e),r=o(e);return n!==void 0||s(e)?new u(e instanceof Error?e.message:t,n,{cause:e,retryAfter:i(e),retryable:r||void 0}):new x(t,{cause:e})}const q=[{type:`function`,name:`allow`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`allowForDecryption`,inputs:[{name:`handlesList`,type:`bytes32[]`,internalType:`bytes32[]`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`allowTransient`,inputs:[{name:`ciphertext`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`cleanTransientStorage`,inputs:[],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`delegateForUserDecryption`,inputs:[{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`},{name:`expirationDate`,type:`uint64`,internalType:`uint64`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`getUserDecryptionDelegationExpirationDate`,inputs:[{name:`delegator`,type:`address`,internalType:`address`},{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`uint64`,internalType:`uint64`}],stateMutability:`view`},{type:`function`,name:`isAccountDenied`,inputs:[{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isAllowed`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isAllowedForDecryption`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isHandleDelegatedForUserDecryption`,inputs:[{name:`delegator`,type:`address`,internalType:`address`},{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`},{name:`handle`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`multicall`,inputs:[{name:`data`,type:`bytes[]`,internalType:`bytes[]`}],outputs:[{name:`results`,type:`bytes[]`,internalType:`bytes[]`}],stateMutability:`payable`},{type:`function`,name:`persistAllowed`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`revokeDelegationForUserDecryption`,inputs:[{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`}];function J(e,t,n,r){return{address:e,abi:q,functionName:`delegateForUserDecryption`,args:[t,n,r]}}function Y(e,t,n){return{address:e,abi:q,functionName:`revokeDelegationForUserDecryption`,args:[t,n]}}function cn(e,t,n,r){return{address:e,abi:q,functionName:`getUserDecryptionDelegationExpirationDate`,args:[t,n,r]}}function ln(e,t,n,r,i){return{address:e,abi:q,functionName:`isHandleDelegatedForUserDecryption`,args:[t,n,r,i]}}const X=2n**64n-1n,Z=`0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF`;function un(e){return wt(e.signer,e.provider,e)}var dn=class{#e;#t;#n;#r;#i;#a;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.cachingService,this.#r=e.credentialService,this.#i=e.logger,this.#a=e.emitEvent}#o(e){return D(this.#r,e)}#s(e,t){throw this.#a({type:C.PermitError,operation:e,error:t instanceof Error?t:Error(String(t))}),t}async grantPermit(e){if(e.length===0)return;let t;try{t=this.#o(`grantPermit`),await Ge(`grantPermit`,this.#e,this.#t)}catch(e){this.#s(`grantPermit`,e)}await t.grantPermit(e)}async grantDelegationPermit(e,t){if(t.length===0)return;let n;try{n=this.#o(`grantDelegationPermit`),await Ge(`grantDelegationPermit`,this.#e,this.#t)}catch(e){this.#s(`grantDelegationPermit`,e)}await n.grantPermit(t,e)}async hasPermit(e){return this.#r?this.#r.hasPermit(e):!1}async hasDelegationPermit(e,t){return this.#r?this.#r.hasPermit(t,e):!1}async warmTransportKeyPair(){let e=this.#r;if(!e)return;let t=this.#e?.walletAccount.getSnapshot();t&&await e.warmTransportKeyPair(t.address)}registerPermit(e,t){return this.batchRegisterPermits([{prepared:e,signature:t}])}async batchRegisterPermits(e){let t;try{t=this.#o(`registerPermit`)}catch(e){this.#s(`registerPermit`,e)}await t.batchRegisterPermits(e),await Promise.all([...new Set(e.map(e=>e.prepared.signerAddress))].map(e=>this.#c(e)))}async revokePermits(e){let t=this.#o(`revokePermits`),n=F((await A(`revokePermits`,this.#e,this.#t)).address);try{await t.revokePermits(e)}finally{await this.#c(n)}}async clear(){let e=this.#o(`clear`),t=F((await A(`clear`,this.#e,this.#t)).address);try{await e.clearCredentials()}finally{await this.#c(t)}}async#c(e){await O(`clear decrypt cache`,()=>this.#n.clearForRequester(e),this.#i)}async revokeTransportKeyPair(e){await this.#o(`revokeTransportKeyPair`).revokeTransportKeyPair(e)}async warmTransportKeyPairScope(e){await this.#o(`warmTransportKeyPairScope`).warmTransportKeyPairScope(e)}},fn=class{#e;#t;#n;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.delegationService}#r(e){return D(this.#e,e)}async delegateDecryption({contractAddress:e,delegateAddress:t,expirationDate:n}){let r=this.#r(`delegateDecryption`),i=await A(`delegateDecryption`,this.#e,this.#t);return this.#n.delegateDecryption(r,{contractAddress:e,delegateAddress:t,delegatorAddress:i.address,expirationDate:n})}async revokeDelegation({contractAddress:e,delegateAddress:t}){let n=this.#r(`revokeDelegation`),r=await A(`revokeDelegation`,this.#e,this.#t);return this.#n.revokeDelegation(n,{contractAddress:e,delegateAddress:t,delegatorAddress:r.address})}async isActive(e){return this.#n.isDelegated(e)}async getExpiry(e){return this.#n.getDelegationExpiry(e)}async getStatus(e){return this.#n.getStatus(e)}},pn=class{#e;#t;#n;#r;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.router,this.#r=e.decryptionService}#i(e){return D(this.#r,e)}async decryptValues(e,t){let n=this.#i(`decryptValues`),r=await A(`decryptValues`,this.#e,this.#t);return n.decryptValues(e,r.address,j(t,`decrypt-values`))}async delegatedDecryptValues(e,t,n=t,r){let i=this.#i(`delegatedDecryptValues`),a=await A(`delegatedDecryptValues`,this.#e,this.#t);return i.delegatedDecryptValues(e,t,a.address,n,j(r,`delegated-decrypt-values`))}async decryptPublicValues(e,t){if(e.length===0)return{clearValues:{},decryptionProof:`0x`,abiEncodedClearValues:`0x`};let n=j(t,`decrypt-public-values`);try{let t=await this.#n.relayer.decryptPublicValuesWithSignatures({encryptedValues:e,options:n}),r={};return t.checkSignaturesArgs.handlesList.forEach((e,n)=>{me(t.clearValues[n],`result.clearValues[${n}]`),r[e]=t.clearValues[n].value}),{clearValues:r,abiEncodedClearValues:t.checkSignaturesArgs.abiEncodedCleartexts,decryptionProof:t.checkSignaturesArgs.decryptionProof}}catch(e){throw K(e,`Public decryption failed`)}}async delegatedBatchDecryptValues({encryptedInputs:e,delegatorAddress:t,accountAddress:n=t,maxConcurrency:r,waitForPropagation:i,operation:a}){let o=this.#i(`delegatedBatchDecryptValues`),s=await A(`delegatedBatchDecryptValues`,this.#e,this.#t);return o.delegatedBatchDecryptHandlesAs({encryptedInputs:e,delegatorAddress:t,delegateAddress:s.address,accountAddress:n,maxConcurrency:r,waitForPropagation:i,operation:a??`delegated-batch-decrypt-values`})}},mn=class{#e;#t;constructor(e,t){this.#e=e,this.#t=t}prepare(e,t){return this.#e.prepare(e,t)}preparePermit(e){return this.#t.preparePermit(e)}batchPreparePermits(e){return this.#t.batchPreparePermits(e)}},hn=class{async get(e){return(await chrome.storage.session.get(e))[e]??null}async set(e,t){await chrome.storage.session.set({[e]:t})}async delete(e){await chrome.storage.session.remove(e)}};const gn=new hn,_n=I.union([I.bigint(),I.boolean(),N]),vn=I.array(I.string());var yn=class{#e;#t;#n=`zama:decrypt`;#r=`${this.#n}:keys`;#i=Promise.resolve();constructor(e,t){this.#e=e,this.#t=t}async get(e,t,n){try{let r=this.#c(e,t,n),i=await this.#e.get(r);if(i===null)return null;let a=_n.safeParse(i);return a.success?a.data:(await this.delete(e,t,n),null)}catch(e){return this.#t.warn(`CachingService.get failed`,{error:e}),null}}async set(e,t,n,r){try{let i=this.#c(e,t,n);await this.#e.set(i,r),this.#i=this.#i.then(()=>this.#u(i).catch(e=>{this.#t.warn(`CachingService index write failed`,{error:e})})),await this.#i}catch(e){this.#t.warn(`CachingService.set failed`,{error:e})}}async delete(e,t,n){let r=this.#c(e,t,n);this.#i=this.#i.then(()=>this.#a(r).catch(e=>{this.#t.warn(`CachingService.delete failed`,{error:e})})),await this.#i}async clearForRequester(e){this.#i=this.#i.then(()=>this.#o(e).catch(e=>{this.#t.warn(`CachingService.clearForRequester failed`,{error:e})})),await this.#i}async clearAll(){this.#i=this.#i.then(()=>this.#s().catch(e=>{this.#t.warn(`CachingService.clearAll failed`,{error:e})})),await this.#i}async#a(e){await this.#e.delete(e).catch(()=>{});let t=await this.#l(),n=t.filter(t=>t!==e);n.length!==t.length&&await this.#e.set(this.#r,n)}async#o(e){let t=F(e),n=`${this.#n}:${t}:`,r=await this.#l(),i=[],a=[];for(let e of r)e.startsWith(n)?i.push(e):a.push(e);await Promise.all(i.map(e=>this.#e.delete(e).catch(()=>{}))),await this.#e.set(this.#r,a)}async#s(){let e=await this.#l();await Promise.all(e.map(e=>this.#e.delete(e).catch(()=>{}))),await this.#e.delete(this.#r)}#c(e,t,n){return`${this.#n}:${F(e)}:${F(t)}:${n.toLowerCase()}`}async#l(){let e=await this.#e.get(this.#r);if(e===null)return[];let t=vn.safeParse(e);return t.success?t.data:(await this.#e.delete(this.#r).catch(()=>{}),[])}async#u(e){let t=await this.#l();t.includes(e)||(t.push(e),await this.#e.set(this.#r,t))}};function bn(e,t){let n=xn(e,t);if(!n)throw new S(`No permit covers contract ${t} after allow()`);return{privateKey:e.keypair.privateKey,publicKey:e.keypair.publicKey,serializedPermit:n.serializedPermit}}function xn(e,t){let n=Ft(t);return e.permissions.find(e=>e.contractAddresses.includes(n))}const Sn=e=>new Promise(t=>setTimeout(t,e));var Cn=class{#e;#t;#n;#r;#i;constructor({cache:e,credentialService:t,delegationService:n,router:r,emitEvent:i}){this.#e=e,this.#t=t,this.#n=n,this.#r=r,this.#i=i}async decryptValues(e,t,n){let r=F(t);return this.#s(e,{requesterAddress:r,errorMessage:`Failed to decrypt encrypted values`},n)}async delegatedDecryptValues(e,t,n,r,i){let a=F(t),o=F(n),s={spent:!1};return this.#a(i?.waitForPropagation??!0,()=>this.#s(e,{requesterAddress:F(r),delegator:a,validate:e=>this.#m(e,{delegatorAddress:a,delegateAddress:o}),errorMessage:`Failed to decrypt delegated encrypted values`},{operation:i?.operation},s))}async#a(e,t){let n;for(let r=0;r<16;r++)try{return await t()}catch(t){if(n=t,!(r<15&&e&&t instanceof G))throw t;await Sn(2e3)}throw n}async delegatedBatchDecryptHandlesAs({encryptedInputs:e,delegatorAddress:t,delegateAddress:n,accountAddress:r,maxConcurrency:i=5,waitForPropagation:a=!0,operation:o}){let s=e.map(e=>({encryptedValue:e.encryptedValue,contractAddress:F(e.contractAddress)}));if(s.length===0)return{items:s};let c=F(r);try{let e=await this.delegatedDecryptValues(s.map(({encryptedValue:e,contractAddress:t})=>({encryptedValue:e,contractAddress:t})),t,n,c,{waitForPropagation:a,operation:o});for(let t of s)this.#d(t,e);return{items:s}}catch(e){if(Le(e))throw e;if(s.length===1){let[n=this.#p()]=s;return n.error=this.#f(e,`Failed to decrypt delegated encrypted values`,{isDelegated:!0,contractAddress:n.contractAddress,account:F(t)}),{items:s}}}let l=!1,u;if(await qe(s.map(e=>async()=>{if(!l)try{let r=await this.delegatedDecryptValues([{encryptedValue:e.encryptedValue,contractAddress:e.contractAddress}],t,n,c,{waitForPropagation:!1,operation:o});this.#d(e,r)}catch(n){if(Le(n)){l=!0,u??=n;return}e.error=this.#f(n,`Failed to decrypt delegated encrypted values`,{isDelegated:!0,contractAddress:e.contractAddress,account:F(t)})}}),i),u!==void 0)throw u;return{items:s}}async#o(e,t,n,r){let i=bn(e,t),a;try{a=await this.#r.relayer.parseTransportKeyPair({publicKey:i.publicKey,privateKey:i.privateKey,tkmsVersion:e.keypair.tkmsVersion})}catch(e){throw e instanceof Error&&f(e.message)&&await this.#t.evictTransportKeyPair(),e}let o=await this.#r.relayer.parseSignedDecryptionPermit({transportKeyPair:a,serializedPermit:i.serializedPermit});return this.#r.relayer.decryptValues({transportKeyPair:a,signedPermit:o,encryptedValues:n,contractAddress:t,options:r})}async#s(t,n,r,i={spent:!1}){if(t.length===0)return{};let a=t.map(e=>({encryptedValue:e.encryptedValue,contractAddress:F(e.contractAddress)})),o={},s=[];for(let e of a)He(e.encryptedValue)?o[e.encryptedValue]=0n:s.push(e);if(s.length===0)return o;let c=Array.from(new Set(a.map(e=>e.contractAddress))),l=Array.from(new Set(s.map(e=>e.contractAddress)));if(n.validate)try{await n.validate(l)}catch(e){throw ee(e)?this.#u(e,`the delegation pre-check`):e}let u=[];for(let e of s){let t=await this.#e.get(n.requesterAddress,e.contractAddress,e.encryptedValue);t===null?u.push(e):o[e.encryptedValue]=t}if(u.length===0)return o;let d=await this.#t.grantPermit(c,n.delegator),f=new Map;for(let e of u){let t=f.get(e.contractAddress);t?t.push(e.encryptedValue):f.set(e.contractAddress,[e.encryptedValue])}let m=[];for(let[e,t]of f)for(let n of Re(t))m.push({contractAddress:e,encryptedValues:n});let h=Date.now(),g=u.map(e=>e.encryptedValue);try{this.#i({type:C.DecryptStart,encryptedValues:g});try{await this.#c(n,d,m,o,r)}catch(e){if(!(e instanceof v)||i.spent)throw e;let t=d.permissions.map(e=>e.serializedPermit.signature);i.spent=!0;try{d=await this.#t.recoverPermits(c,n.delegator,t)}catch(e){throw e instanceof b?new v(`The permit's KMS context has been revoked on-chain and the automatic re-grant failed, so the decrypt cannot proceed. Establish a new permit for this scope and retry.`,{cause:e}):e}await this.#c(n,d,m.filter(({encryptedValues:e})=>e.some(e=>o[e]===void 0)),o,r)}let e={};for(let t of g){let n=o[t];n!==void 0&&(e[t]=n)}return this.#i({type:C.DecryptEnd,durationMs:Date.now()-h,encryptedValues:g,result:e}),o}catch(t){let r=t instanceof p&&t.cause instanceof Error?t.cause:t;throw this.#i({type:C.DecryptError,error:e(r),durationMs:Date.now()-h,encryptedValues:g}),K(t,n.errorMessage,{isDelegated:n.delegator!==void 0})}}async#c(e,t,n,r,i){let a=(await qe(n.map(({contractAddress:n,encryptedValues:a})=>async()=>{try{await this.#l(e,t,n,a,r,i);return}catch(e){return e}}),5)).filter(e=>e!==void 0);if(a.length>0)throw a.find(e=>e instanceof v)??a[0]}async#l(e,t,n,r,i,a){let o;try{o=await this.#o(t,n,r,a)}catch(t){throw K(t,e.errorMessage,{isDelegated:e.delegator!==void 0,contractAddress:n,account:e.delegator??e.requesterAddress})}for(let t=0;t<r.length;t++){let a=r[t],s=o[t]?.value;a!==void 0&&s!==void 0&&(i[a]=s,await this.#e.set(e.requesterAddress,n,a,s))}let s=r.filter(e=>i[e]===void 0);if(s.length>0)throw new S(`${e.errorMessage}: relayer returned no clear value for ${s.length} of ${r.length} handle(s) on ${n}`,{cause:AggregateError(s.map(e=>new S(`No clear value for handle ${e} on ${n}`)),`${s.length} handle(s) missing a clear value on ${n}`)})}#u(e,t){return new k(`RPC provider rate-limited ${t}; retry with backoff.`,{cause:e,retryAfter:i(e)})}#d(e,t){let n=t[e.encryptedValue];if(n===void 0){e.error=new S(`Batch delegated decryption returned no value for encrypted value ${e.encryptedValue} on contract ${e.contractAddress}`);return}e.value=n}#f(e,t,n){return e instanceof p?e:K(e,t,n)}#p(){throw new S(`Batch delegated decryption invariant failed: missing item`)}async#m(e,{delegatorAddress:t,delegateAddress:n}){let r=await this.#n.findInactiveDelegations(e,t,n);if(r.size!==0)for(let e of r.values())throw e}};const Q={AlreadyDelegatedOrRevokedInSameBlock:e=>new nn(`Only one delegate/revoke per (delegator, delegate, contract) per block. Wait for the next block before retrying.`,{cause:e}),SenderCannotBeContractAddress:e=>new rn(`The contract address cannot be the caller address.`,{cause:e}),EnforcedPause:e=>new an(`The ACL contract is paused. Delegation operations are temporarily disabled.`,{cause:e}),SenderCannotBeDelegate:e=>new R(`Cannot delegate to yourself (delegate === msg.sender).`,{cause:e}),DelegateCannotBeContractAddress:e=>new H(`Delegate address cannot be the same as the contract address.`,{cause:e}),DelegateCannotBeWildcard:e=>new U(`Delegate address cannot be the wildcard address; it can only be used as the contract address.`,{cause:e}),ExpirationDateBeforeOneHour:e=>new W(`Expiration date must be at least 1 hour in the future.`,{cause:e}),ExpirationDateAlreadySetToSameValue:e=>new V(`The new expiration date is the same as the current one.`,{cause:e}),NotDelegatedYet:e=>new z(`Cannot revoke: no active delegation exists.`,{cause:e})};function wn(e){return Object.hasOwn(Q,e)}function Tn(e,t){let n=Qe(e);if(n&&wn(n))return Q[n](t);let r=e instanceof Error?e.message:String(e);for(let[e,n]of Object.entries(Q))if(r.includes(e))return n(t);return null}var En=class{#e;#t;#n;#r;constructor({provider:e,router:t,emitEvent:n=()=>{},logger:r}){this.#t=e,this.#e=t,this.#r=r,this.#n=n}async delegateDecryption(e,{contractAddress:t,delegateAddress:n,delegatorAddress:r,expirationDate:i}){if(i&&i.getTime()<Date.now()+36e5)throw new W(`Expiration date must be at least 1 hour in the future`);let a=F(t),o=F(n),s=F(r);if(o===s)throw new R(`Cannot delegate to yourself (delegate === msg.sender).`);if(o===F(`0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF`))throw new U(`Delegate address cannot be the wildcard address; it can only be used as the contract address.`);if(o===a)throw new H(`Delegate address cannot be the same as the contract address (${a}).`);let c=this.#e.relayer.chain.aclContractAddress,l=i?BigInt(Math.floor(i.getTime()/1e3)):X,u;try{u=await this.getDelegationExpiry({contractAddress:a,delegatorAddress:s,delegateAddress:o})}catch(e){this.#r.warn(`delegateDecryption: pre-flight expiry check failed`,{error:e}),u=-1n}if(u===l)throw new V(`The new expiration date (${l}) is the same as the current one. No on-chain change needed.`);return a!==F(`0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF`)&&await this.#i({contractAddress:a,delegatorAddress:s,delegateAddress:o}),this.#s({operation:`delegateDecryption`,signer:e,contractAddress:a,config:J(c,o,a,l)})}async revokeDelegation(e,{contractAddress:t,delegateAddress:n,delegatorAddress:r}){let i=F(t),a=F(n),o=F(r),s=this.#e.relayer.chain.aclContractAddress,c;try{c=await this.getDelegationExpiry({contractAddress:i,delegatorAddress:o,delegateAddress:a})}catch(e){this.#r.warn(`revokeDelegation: pre-flight expiry check failed`,{error:e}),c=1n}if(c===0n)throw new z(`No active delegation found for delegate ${a} on contract ${i}.`);return this.#s({operation:`revokeDelegation`,signer:e,contractAddress:i,config:Y(s,a,i)})}async isDelegated(e){return(await this.getStatus(e)).isActive}async getStatus(e){let t=F(e.contractAddress)===Z,[n,r]=await Promise.all([this.getDelegationExpiry(e),t?Promise.resolve(0n):this.getDelegationExpiry({...e,contractAddress:Z})]),i=this.#a(n)||this.#a(r)?await this.#t.getBlockTimestamp():void 0,a=this.#o(n,i);if(a.isActive)return a;let o=this.#o(r,i);return o.isActive?o:n>=r?a:o}async#i(e){try{let{isActive:t}=await this.getStatus({...e,contractAddress:Z});t&&this.#r.warn(`delegateDecryption: ${e.delegateAddress} already holds an active wildcard delegation from ${e.delegatorAddress}; this grant for ${e.contractAddress} is redundant.`)}catch(e){this.#r.warn(`delegateDecryption: wildcard redundancy check failed`,{error:e})}}#a(e){return e!==0n&&e!==X}#o(e,t){return e===0n?{isActive:!1,expiryTimestamp:e}:e===X?{isActive:!0,expiryTimestamp:e}:{isActive:t!==void 0&&e>t,expiryTimestamp:e}}async getDelegationExpiry({contractAddress:e,delegatorAddress:t,delegateAddress:n}){let r=this.#e.relayer.chain.aclContractAddress;return this.#t.readContract(cn(r,F(t),F(n),F(e)))}async#s({operation:e,signer:t,contractAddress:n,config:r}){try{return await We({operation:e,signer:t,provider:this.#t,config:r,emit:e=>this.#n(e,n),logger:this.#r})}catch(e){throw this.#c(e),e}}#c(e){if(!(e instanceof w))return;let t=Tn(e.cause??e,e);if(t)throw t}async findInactiveDelegations(e,t,n){let r=new Map;return await Promise.all(e.map(async e=>{try{await this.assertDelegationActive(e,t,n)}catch(t){if(t instanceof z||t instanceof B){let n=F(e);r.set(n,t);return}throw t}})),r}async assertDelegationActive(e,t,n){let r=F(e),i=F(t),a=F(n),{isActive:o,expiryTimestamp:s}=await this.getStatus({contractAddress:r,delegatorAddress:i,delegateAddress:a});if(!o)throw s===0n?new z(`No active delegation from ${i} to ${a} for ${r}`):new B(`Delegation from ${i} to ${a} for ${r} has expired`)}},Dn=class{#e;#t;constructor({router:e,emitEvent:t}){this.#e=e,this.#t=t}async encryptValues(t,n){let r=Date.now(),i=F(t.contractAddress);try{this.#t({type:C.EncryptStart},i);let e=await this.#e.relayer.encryptValues({...t,options:n});return this.#t({type:C.EncryptEnd,durationMs:Date.now()-r},i),e}catch(t){throw this.#t({type:C.EncryptError,error:e(t),durationMs:Date.now()-r},i),sn(t,`Encryption failed`)}}},On=class{#e;#t;#n;#r;#i;#a=new Set;#o;constructor(e){this.#e=e.signer,this.#t=e.router,this.#n=e.cachingService,this.#r=e.credentialService,this.#i=e.logger,this.#e&&(this.#o=this.#e.walletAccount.subscribe(e=>{this.#s(e).catch(e=>{this.#i.warn(`wallet account handler failed`,{error:e})})}))}onWalletAccountChange(e){return this.#a.add(e),()=>{this.#a.delete(e)}}dispose(){this.#o?.(),this.#o=void 0,this.#a.clear()}async#s(e){let t=e.previous,n=e.next,r=n?.chainId;r!==void 0&&await O(`switch relayer chain`,()=>this.#t.switchChain(r),this.#i);let i=this.#r;i&&await O(`credential wallet account change`,()=>i.handleWalletAccountChange(t,n),this.#i),t&&await O(`clear decrypt cache`,()=>this.#n.clearForRequester(t.address),this.#i),await Promise.all(Array.from(this.#a,t=>O(`wallet account listener`,()=>t(e),this.#i)))}};const kn=I.object({kind:I.literal(`ConfidentialTransfer`),from:N,token:N,to:N,amount:I.bigint()}),An=I.object({kind:I.literal(`ConfidentialTransferFrom`),from:N,token:N,owner:N,to:N,amount:I.bigint()}),jn=I.object({kind:I.literal(`SetOperator`),from:N,token:N,operator:N,until:Pt}),$=I.object({kind:I.literal(`Unwrap`),from:N,token:N,to:N,amount:I.bigint()}),Mn=I.object({kind:I.literal(`UnwrapAll`),from:N,token:N,to:N}),Nn=I.object({kind:I.literal(`FinalizeUnwrap`),from:N,wrapper:N,unwrapRequestIdOrAmount:Nt}),Pn=I.object({kind:I.literal(`ApproveUnderlying`),from:N,underlying:N,spender:N,amount:I.bigint()}),Fn=I.object({kind:I.literal(`Wrap`),from:N,wrapper:N,to:N,amount:I.bigint()}),In=Nt.check(I.refine(e=>e===`0x`||en(e)===20,`TransferAndCall.recipientData must be "0x" (self-shield to the sender) or a raw 20-byte address, not a 32-byte ABI-encoded value the wrapper would truncate to a garbage address`)),Ln=I.object({kind:I.literal(`TransferAndCall`),from:N,underlying:N,wrapper:N,amount:I.bigint(),recipientData:I.optional(In)}),Rn=I.object({kind:I.literal(`DelegateDecryption`),from:N,contractAddress:N,delegateAddress:N,expirationDate:I.optional(I.date())}),zn=I.object({kind:I.literal(`RevokeDelegation`),from:N,contractAddress:N,delegateAddress:N});I.discriminatedUnion(`kind`,[kn,An,jn,$,Mn,Nn,Pn,Fn,Ln,Rn,zn]);const Bn=I.strictObject({maxFeePerGas:I.bigint(),maxPriorityFeePerGas:I.bigint()}),Vn=I.object({nonce:I.optional(I.int().check(I.nonnegative())),gasLimit:I.optional(I.bigint()),fees:I.optional(Bn)}),Hn=I.object({address:N,abi:I.array(I.unknown()),functionName:I.string(),args:I.array(I.unknown()),value:I.optional(I.bigint()),gas:I.optional(I.bigint())}),Un=I.extend(Vn,{from:N,calldata:Hn});var Wn=class{#e;#t;#n;constructor(e){this.#e=e.provider,this.#t=e.router,this.#n=e.encryption}async prepare(e,t){t&&=P(Vn,t);let n=await this.#e.getChainId(),r=this.#t.chain.id;if(n!==r)throw new h(`Offline.prepare: provider is on chain ${n} but the SDK is configured for chain ${r}. The prepared transaction's contract addresses and encrypted inputs are bound to chain ${r} — point the provider at the same chain.`);let i=P(Un,{calldata:await this.#r(e),from:e.from,nonce:t?.nonce,gasLimit:t?.gasLimit,fees:t?.fees}),a=await this.#e.prepareTransaction(i);return{kind:e.kind,unsignedTx:a,from:i.from}}async#r(e){switch(e.kind){case`ConfidentialTransfer`:return this.#i(e);case`ConfidentialTransferFrom`:return this.#a(e);case`SetOperator`:return this.#o(e);case`Unwrap`:return this.#s(e);case`UnwrapAll`:return this.#c(e);case`FinalizeUnwrap`:return this.#l(e);case`ApproveUnderlying`:return this.#u(e);case`Wrap`:return this.#d(e);case`TransferAndCall`:return this.#f(e);case`DelegateDecryption`:return this.#p(e);case`RevokeDelegation`:return this.#m(e);default:throw new h(`OfflineService.prepare: unsupported transaction kind '${e.kind}'.`)}}async#i(e){e=P(kn,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from},{operation:`offline-confidential-transfer`}),r=t[0];if(!r)throw new x(`Encryption returned no handles for ConfidentialTransfer`);return Ne(e.token,e.to,r,n)}async#a(e){e=P(An,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from},{operation:`offline-confidential-transfer-from`}),r=t[0];if(!r)throw new x(`Encryption returned no handles for ConfidentialTransferFrom`);return ve(e.token,e.owner,e.to,r,n)}#o(e){return e=P(jn,e),E(e.token,e.operator,e.until)}async#s(e){e=P($,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from},{operation:`offline-unwrap`}),r=t[0];if(!r)throw new x(`Encryption returned no handles for Unwrap`);return ue(e.token,e.from,e.to,r,n)}async#c(e){e=P(Mn,e);let t=await this.#e.readContract(Se(e.token,e.from));return T(e.token,e.from,e.to,t)}async#l(e){e=P(Nn,e);let t=await this.#t.relayer.decryptPublicValuesWithSignatures({encryptedValues:[e.unwrapRequestIdOrAmount],options:{operation:`offline-finalize-unwrap`}}).catch(e=>{throw K(e,`Public decryption failed during FinalizeUnwrap`)}),n=t.clearValues[0]?.value;return pe(n,`FinalizeUnwrap: decryptPublicValuesWithSignatures(handle).clearValue`),Fe(e.wrapper,e.unwrapRequestIdOrAmount,n,t.checkSignaturesArgs.decryptionProof)}#u(e){return e=P(Pn,e),Te(e.underlying,e.spender,e.amount)}#d(e){return e=P(Fn,e),se(e.wrapper,e.to,e.amount)}#f(e){return e=P(Ln,e),Ze(e.underlying,e.wrapper,e.amount,e.recipientData)}#p(e){if(e=P(Rn,e),e.expirationDate&&e.expirationDate.getTime()<Date.now()+36e5)throw new W(`Expiration date must be at least 1 hour in the future`);if(e.delegateAddress===e.from)throw new R(`Cannot delegate to yourself (delegate === msg.sender).`);if(e.delegateAddress===e.contractAddress)throw new H(`Delegate address cannot be the same as the contract address (${e.contractAddress}).`);let t=e.expirationDate?BigInt(Math.floor(e.expirationDate.getTime()/1e3)):X;return J(this.#t.chain.aclContractAddress,e.delegateAddress,e.contractAddress,t)}#m(e){return e=P(zn,e),Y(this.#t.chain.aclContractAddress,e.delegateAddress,e.contractAddress)}};function Gn(e){if(!(!Object.hasOwn(e,`transportKeyPairDerivationSecret`)||e.transportKeyPairDerivationSecret!==void 0))throw new h(`transportKeyPairDerivationSecret was passed as undefined, which usually means the environment variable it reads is unset (e.g. process.env.ZAMA_DERIVATION_SECRET). Supply the secret, or omit the option entirely to persist transport key pairs in cleartext on purpose.`)}function Kn(e){if(e===void 0)return;let{importScripts:t}=globalThis;if(!(typeof window>`u`&&typeof document>`u`&&typeof t!=`function`))throw new h(`transportKeyPairDerivationSecret is supported in headless environments only (CLI tools, servers, agents). Remove the option: an environment with a platform keystore, or one that ships a bundle, must delegate at-rest security of the transport key pair to the storage backend.`)}function qn(e){if(e===void 0)return;let t=P(Tt,e);return new Mt(typeof t==`string`?t:new Uint8Array(t))}var Jn=class{#e;provider;signer;storage;registry;permits;delegations;decryption;offline;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;constructor(e,t={}){Gn(t),Kn(t.transportKeyPairDerivationSecret);let n=qn(t.transportKeyPairDerivationSecret);this.#e=e.router,this.provider=e.provider,this.signer=e.signer,this.storage=e.storage,this.#r=e.onEvent??function(){},this.#i=e.logger,this.#a=new yn(e.storage,this.#i),this.#u=new En({provider:this.provider,router:e.router,emitEvent:this.emitEvent.bind(this),logger:this.#i});let r={};for(let t of e.chains)t.registryAddress&&(r[t.id]=t.registryAddress);this.registry=new M({provider:this.provider,registryAddresses:r,registryTTL:e.registryTTL}),this.#n=r,this.#t=e.registryTTL,this.#l=new At({router:e.router,signer:e.signer,transportKeyPairTTL:e.transportKeyPairTTL,permitTTL:e.permitTTL,scope:e.transportKeyPairScope,derivationSecret:n,storage:this.storage,permitStorage:e.permitStorage,logger:this.#i,emitEvent:this.emitEvent.bind(this)}),e.signer&&(this.#c=new Cn({cache:this.#a,credentialService:this.#l,delegationService:this.#u,router:e.router,emitEvent:this.emitEvent.bind(this)})),this.#s=new Dn({router:e.router,emitEvent:this.emitEvent.bind(this)}),this.#o=new On({signer:e.signer,router:e.router,cachingService:this.#a,credentialService:this.#l,logger:this.#i}),this.#d=new Wn({provider:this.provider,router:e.router,encryption:this.#s,emitEvent:(e,t)=>this.emitEvent(e,t)}),this.permits=new dn({signer:this.signer,provider:this.provider,cachingService:this.#a,credentialService:this.#l,logger:this.#i,emitEvent:this.emitEvent.bind(this)}),this.delegations=new fn({signer:this.signer,provider:this.provider,delegationService:this.#u}),this.decryption=new pn({signer:this.signer,provider:this.provider,router:e.router,decryptionService:this.#c}),this.offline=new mn(this.#d,this.#l)}onWalletAccountChange(e){return this.#o.onWalletAccountChange(e)}get logger(){return this.#i}get relayer(){return this.#e.relayer}emitEvent(e,t){try{this.#r({...e,tokenAddress:t,timestamp:Date.now()})}catch(t){this.#i.warn(`${e.type} event listener silently failed`,{error:t})}}createWrappersRegistry(e){return new M({provider:this.provider,registryAddresses:{...this.#n,...e},registryTTL:this.#t})}async encrypt(e,t){return this.#s.encryptValues(e,j(t,`encrypt`))}createToken(e){return new Ye(this,e)}createWrappedToken(e){return new mt(this,e)}dispose(){this.#o.dispose(),this.#e.dispose()}terminate(){this.dispose(),this.signer?.dispose?.()}[Symbol.dispose](){this.terminate()}};export{lt as ACL_TOPICS,an as AclPausedError,ft as AclTopics,Xe as BalanceCheckUnavailableError,jt as BaseSigner,Ve as ChainMismatchError,hn as ChromeSessionStorage,h as ConfigurationError,pn as Decryption,S as DecryptionFailedError,bt as DefaultRegistryAddresses,rn as DelegationContractIsSelfError,nn as DelegationCooldownError,U as DelegationDelegateCannotBeWildcardError,H as DelegationDelegateEqualsContractError,W as DelegationExpirationTooSoonError,B as DelegationExpiredError,V as DelegationExpiryUnchangedError,z as DelegationNotFoundError,G as DelegationNotPropagatedError,R as DelegationSelfNotAllowedError,fn as Delegations,je as ERC1363_INTERFACE_ID,ze as ERC20ReadFailedError,De as ERC7984_INTERFACE_ID,ke as ERC7984_WRAPPER_INTERFACE_ID,oe as EncryptOffloadUnavailableError,x as EncryptionFailedError,Ot as IndexedDBStorage,Be as InsufficientAllowanceError,Ke as InsufficientConfidentialBalanceError,Ue as InsufficientERC20BalanceError,_ as InvalidTransportKeyPairError,g as KeyWrappingError,X as MAX_UINT64,St as MemoryStorage,Dt as MutableWalletAccountStore,y as NoCiphertextError,L as NotEntitledError,mn as Offline,dn as Permits,ie as PreparedPermitChainMismatchError,te as PreparedPermitExpiredError,u as RelayerRequestFailedError,v as RevokedKmsContextError,k as RpcRateLimitError,fe as SignerNotConfiguredError,he as SignerRequiredError,b as SigningFailedError,re as SigningRejectedError,ot as TOKEN_TOPICS,Ye as Token,et as Topics,w as TransactionRevertedError,ae as TransportKeyPairChangedError,ne as TransportKeyPairExpiredError,_t as UnshieldAlreadyFinalizedError,Z as WILDCARD_CONTRACT,Ie as WalletAccountNotReadyError,ce as WalletNotConnectedError,mt as WrappedToken,M as WrappersRegistry,Je as ZERO_ENCRYPTED_VALUE,p as ZamaError,c as ZamaErrorCode,Jn as ZamaSDK,C as ZamaSDKEvents,ye as allowanceContract,Qt as anvil,Te as approveContract,Me as balanceOfContract,Jt as bscTestnet,Xt as chains,gn as chromeSessionStorage,yt as cleartext,Se as confidentialBalanceOfContract,xe as confidentialTotalSupplyContract,Ne as confidentialTransferContract,ve as confidentialTransferFromContract,un as createConfig,kt as createWalletAccountStore,be as decimalsContract,ut as decodeAclEvent,pt as decodeAclEvents,tt as decodeConfidentialTransfer,st as decodeDelegatedForUserDecryption,ht as decodeOnChainEvent,nt as decodeOnChainEvents,rt as decodeRevokedDelegationForUserDecryption,dt as decodeUnwrapFinalized,ct as decodeUnwrapRequested,at as decodeWrap,J as delegateForUserDecryptionContract,Fe as finalizeUnwrapContract,it as findDelegatedForUserDecryption,$e as findRevokedDelegationForUserDecryption,gt as findUnwrapRequested,vt as findWrap,Ht as getConfidentialTokenAddressContract,cn as getDelegationExpiryContract,Rt as getTokenAddressContract,Bt as getTokenPairContract,Lt as getTokenPairsContract,It as getTokenPairsLengthContract,zt as getTokenPairsSliceContract,Kt as hardhat,Ut as hoodi,Et as indexedDBStorage,ge as inferredTotalSupplyContract,Yt as ingenTestnet,Ce as isConfidentialTokenContract,Vt as isConfidentialTokenValidContract,_e as isConfidentialWrapperContract,He as isEncryptedValueZero,ln as isHandleDelegatedContract,le as isOperatorContract,n as isRetryable,Zt as mainnet,tn as matchZamaError,Ct as memoryStorage,Oe as nameContract,xt as parsePreparedPermit,Wt as polygon,qt as polygonAmoy,Pe as rateContract,d as retryAfterSeconds,Y as revokeDelegationContract,$t as sepolia,E as setOperatorContract,Ae as supportsInterfaceContract,Ee as symbolContract,Ze as transferAndCallContract,de as underlyingContract,ue as unwrapContract,T as unwrapFromBalanceContract,we as unwrapRequesterContract,se as wrapContract,Gt as zenithTrexTestnet};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e,r as t,y as n}from"../relayer-C3jVhqSK.js";import{t as r}from"../fatal-batch-BiiS7KdS.js";import{n as i}from"../fhevm-relayer-
|
|
1
|
+
import{i as e,r as t,y as n}from"../relayer-C3jVhqSK.js";import{t as r}from"../fatal-batch-BiiS7KdS.js";import{n as i}from"../fhevm-relayer-Y3tLFeGo.js";const a=r;function o(r,i,o){let s=a[r],c=s?new s(i):new t(r,i,r===e.RelayerRequestFailed?{retryable:o.retryable}:void 0);return c.retryable&&n(o.retryAfter)?Object.assign(c,{retryAfter:o.retryAfter}):c}function s(e,t){return e.onWalletAccountChange(t)}export{o as reviveZamaError,s as subscribeWalletAccountChanges,i as toFhevmAuth};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/node/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"../fhevm-relayer-
|
|
1
|
+
import{t as e}from"../fhevm-relayer-Y3tLFeGo.js";import{t}from"../telemetry-DGsqUbRG.js";import{t as n}from"../cleartext-CJ4JSBH-.js";import{a as r,c as i,d as a,i as o,l as s,n as c,o as l,r as u,s as d,t as f,u as p}from"../chains-iPpnjXql.js";import{AsyncLocalStorage as m}from"node:async_hooks";function h(n){return{type:`node`,createRelayer:(r,i,a)=>new e({chain:r,options:n,logger:i,telemetry:a&&!t(globalThis.process?.env??{})?{state:a,runtime:`node`}:void 0})}}var g=class{#e=new m;run(e){return this.#e.run(new Map,e)}async get(e){return this.#e.getStore()?.get(e)??null}async set(e,t){this.#e.getStore()?.set(e,t)}async delete(e){this.#e.getStore()?.delete(e)}};const _=new g;export{g as AsyncLocalMapStorage,f as anvil,_ as asyncLocalStorage,c as bscTestnet,u as chains,n as cleartext,o as hardhat,r as hoodi,l as ingenTestnet,d as mainnet,h as node,i as polygon,s as polygonAmoy,p as sepolia,a as zenithTrexTestnet};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function e(e,t){return{"x-zama-sdk-version":`3.
|
|
2
|
-
//# sourceMappingURL=telemetry-
|
|
1
|
+
function e(e,t){return{"x-zama-sdk-version":`3.8.0-beta.1`,"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`}export{e as n,t as r,n as t};
|
|
2
|
+
//# sourceMappingURL=telemetry-DGsqUbRG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry-
|
|
1
|
+
{"version":3,"file":"telemetry-DGsqUbRG.js","names":["packageJson.version"],"sources":["../../package.json","../../src/version.ts","../../src/telemetry.ts"],"sourcesContent":["","import packageJson from \"../package.json\" with { type: \"json\" };\n\nexport const SDK_VERSION: string = packageJson.version;\n","import { SDK_VERSION } from \"./version\";\n\n// Usage telemetry: `x-zama-sdk-*` headers on the relayer calls the SDK already\n// makes. No header may carry a wallet address, encrypted value, amount or identifier.\n\nexport type TelemetryLayer = \"core\" | \"react\";\n\nexport type TelemetryRuntime = \"web\" | \"node\";\n\n/** Values are frozen once shipped, so that dashboards keyed on them survive method renames. */\nexport type TelemetryOperation =\n | \"balance-of\"\n | \"decrypt-balance-as\"\n | \"batch-balances-of\"\n | \"batch-decrypt-balances-as\"\n | \"confidential-transfer\"\n | \"confidential-transfer-from\"\n | \"confidential-transfer-and-call\"\n | \"confidential-transfer-from-and-call\"\n | \"unshield\"\n | \"unshield-all\"\n | \"resume-unshield\"\n | \"unwrap\"\n | \"finalize-unwrap\"\n | \"vault-deposit\"\n | \"vault-redeem\"\n | \"vault-join\"\n | \"vault-deposit-of\"\n | \"encrypt\"\n | \"decrypt-values\"\n | \"delegated-decrypt-values\"\n | \"delegated-batch-decrypt-values\"\n | \"decrypt-public-values\"\n | \"offline-confidential-transfer\"\n | \"offline-confidential-transfer-from\"\n | \"offline-unwrap\"\n | \"offline-finalize-unwrap\";\n\n/**\n * Shared by every relayer of a config. `layer` flips to `react` once\n * `ZamaProvider` marks the config, after the relayers exist.\n *\n * @internal\n */\nexport interface TelemetryState {\n layer: TelemetryLayer;\n}\n\nexport interface RelayerTelemetry {\n readonly state: TelemetryState;\n readonly runtime: TelemetryRuntime;\n}\n\nexport function telemetryHeaders(\n telemetry: RelayerTelemetry,\n operation: TelemetryOperation | undefined,\n): Record<string, string> {\n return {\n \"x-zama-sdk-version\": SDK_VERSION,\n \"x-zama-sdk-layer\": telemetry.state.layer,\n \"x-zama-sdk-runtime\": telemetry.runtime,\n ...(operation !== undefined && { \"x-zama-sdk-operation\": operation }),\n };\n}\n\n/** `options` labelled with `operation`, unless the caller already labelled it. */\nexport function withOperation<T extends { readonly operation?: TelemetryOperation }>(\n options: T | undefined,\n operation: TelemetryOperation,\n): Partial<T> & { readonly operation: TelemetryOperation } {\n return Object.assign({}, options, { operation: options?.operation ?? operation });\n}\n\nexport function isTelemetryDisabledByEnv(env: Record<string, string | undefined>): boolean {\n const value = env.ZAMA_SDK_TELEMETRY?.trim().toLowerCase();\n return value === \"0\" || value === \"false\";\n}\n"],"mappings":"AEqDA,SAAgB,EACd,EACA,EACwB,CACxB,MAAO,CACL,qBAAsB,eACtB,mBAAoB,EAAU,MAAM,MACpC,qBAAsB,EAAU,QAChC,GAAI,IAAc,IAAA,IAAa,CAAE,uBAAwB,CAAU,CACrE,CACF,CAGA,SAAgB,EACd,EACA,EACyD,CACzD,OAAO,OAAO,OAAO,CAAC,EAAG,EAAS,CAAE,UAAW,GAAS,WAAa,CAAU,CAAC,CAClF,CAEA,SAAgB,EAAyB,EAAkD,CACzF,IAAM,EAAQ,EAAI,oBAAoB,KAAK,CAAC,CAAC,YAAY,EACzD,OAAO,IAAU,KAAO,IAAU,OACpC"}
|
package/dist/esm/vaults/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"../relayer-C3jVhqSK.js";import{r as t,t as n}from"../encryption-6AVd-82z.js";import{H as r,L as i,M as a,P as o}from"../erc165-B8gx2luK.js";import{a as s,i as c,l,n as u,o as d,t as f}from"../token-g6sinwTx.js";import{S as p,b as m,t as h,x as g}from"../wrapped-token-3usJd0oi.js";import{r as _}from"../telemetry-DvJV3oBk.js";import{l as v,p as y}from"../invalidation-BgFjmXeQ.js";import{getAddress as b}from"viem";const x=[{type:`function`,name:`batchCallbackDeadline`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`batchCreatedAt`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`batchDispatchedAt`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`batchMaxSlippageBps`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint16`,internalType:`uint16`}],stateMutability:`view`},{type:`function`,name:`batchMinBatchAge`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`batchState`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint8`,internalType:`enum BatcherConfidential.BatchState`}],stateMutability:`view`},{type:`function`,name:`callbackDeadline`,inputs:[],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`claim`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bytes32`,internalType:`euint64`}],stateMutability:`nonpayable`},{type:`function`,name:`currentBatchId`,inputs:[],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`deposits`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bytes32`,internalType:`euint64`}],stateMutability:`view`},{type:`function`,name:`dispatchBatch`,inputs:[],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`exchangeRate`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint64`,internalType:`uint64`}],stateMutability:`view`},{type:`function`,name:`exchangeRateDecimals`,inputs:[],outputs:[{name:``,type:`uint8`,internalType:`uint8`}],stateMutability:`pure`},{type:`function`,name:`fromToken`,inputs:[],outputs:[{name:``,type:`address`,internalType:`contract IERC7984ERC20Wrapper`}],stateMutability:`view`},{type:`function`,name:`join`,inputs:[{name:`beneficiary`,type:`address`,internalType:`address`},{name:`encryptedAmount`,type:`bytes32`,internalType:`externalEuint64`},{name:`inputProof`,type:`bytes`,internalType:`bytes`}],outputs:[{name:`joined`,type:`bytes32`,internalType:`euint64`}],stateMutability:`nonpayable`},{type:`function`,name:`maxSlippageBps`,inputs:[],outputs:[{name:``,type:`uint16`,internalType:`uint16`}],stateMutability:`view`},{type:`function`,name:`minBatchAge`,inputs:[],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`paused`,inputs:[],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`quit`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bytes32`,internalType:`euint64`}],stateMutability:`nonpayable`},{type:`function`,name:`recover`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:`refunded`,type:`bytes32`,internalType:`euint64`}],stateMutability:`nonpayable`},{type:`function`,name:`toToken`,inputs:[],outputs:[{name:``,type:`address`,internalType:`contract IERC7984ERC20Wrapper`}],stateMutability:`view`},{type:`function`,name:`totalDeposits`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bytes32`,internalType:`euint64`}],stateMutability:`view`},{type:`function`,name:`unwrapRequestId`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`vault`,inputs:[],outputs:[{name:``,type:`address`,internalType:`contract IERC4626`}],stateMutability:`view`},{type:`event`,name:`BatchCanceled`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`BatchDispatched`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`BatchFinalized`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`},{name:`exchangeRate`,type:`uint64`,indexed:!1,internalType:`uint64`}],anonymous:!1},{type:`event`,name:`Claimed`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`},{name:`account`,type:`address`,indexed:!0,internalType:`address`},{name:`amount`,type:`bytes32`,indexed:!1,internalType:`euint64`}],anonymous:!1},{type:`event`,name:`Joined`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`},{name:`account`,type:`address`,indexed:!0,internalType:`address`},{name:`amount`,type:`bytes32`,indexed:!1,internalType:`euint64`}],anonymous:!1},{type:`event`,name:`Quit`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`},{name:`account`,type:`address`,indexed:!0,internalType:`address`},{name:`amount`,type:`bytes32`,indexed:!1,internalType:`euint64`}],anonymous:!1},{type:`error`,name:`BatchNonexistent`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`BatchTooYoung`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`elapsed`,type:`uint256`,internalType:`uint256`},{name:`required`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`BatchUnexpectedState`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`current`,type:`uint8`,internalType:`enum BatcherConfidential.BatchState`},{name:`expectedStates`,type:`bytes32`,internalType:`bytes32`}]},{type:`error`,name:`DuplicateUnderlyingTokens`,inputs:[]},{type:`error`,name:`EnforcedPause`,inputs:[]},{type:`error`,name:`ExpectedPause`,inputs:[]},{type:`error`,name:`IntermediateStepToTokenBalanceChanged`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`InvalidBeneficiary`,inputs:[]},{type:`error`,name:`InvalidCallbackDeadline`,inputs:[]},{type:`error`,name:`InvalidExchangeRate`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`totalDeposits`,type:`uint256`,internalType:`uint256`},{name:`exchangeRate`,type:`uint64`,internalType:`uint64`}]},{type:`error`,name:`InvalidKMSSignatures`,inputs:[]},{type:`error`,name:`InvalidMaxSlippageBps`,inputs:[]},{type:`error`,name:`InvalidMinBatchAge`,inputs:[]},{type:`error`,name:`InvalidTokenRate`,inputs:[]},{type:`error`,name:`InvalidWrapperToken`,inputs:[{name:`token`,type:`address`,internalType:`address`}]},{type:`error`,name:`OwnableInvalidOwner`,inputs:[{name:`owner`,type:`address`,internalType:`address`}]},{type:`error`,name:`OwnableUnauthorizedAccount`,inputs:[{name:`account`,type:`address`,internalType:`address`}]},{type:`error`,name:`ReentrancyGuardReentrantCall`,inputs:[]},{type:`error`,name:`RouteAssetMismatch`,inputs:[{name:`actualAsset`,type:`address`,internalType:`address`},{name:`expectedAsset`,type:`address`,internalType:`address`}]},{type:`error`,name:`RouteShareMismatch`,inputs:[{name:`actualShare`,type:`address`,internalType:`address`},{name:`expectedShare`,type:`address`,internalType:`address`}]},{type:`error`,name:`SafeCastOverflowedUintDowncast`,inputs:[{name:`bits`,type:`uint8`,internalType:`uint8`},{name:`value`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`SafeERC20FailedOperation`,inputs:[{name:`token`,type:`address`,internalType:`address`}]},{type:`error`,name:`SenderNotAllowedToUseHandle`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`sender`,type:`address`,internalType:`address`}]},{type:`error`,name:`SlippageExceeded`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`actual`,type:`uint256`,internalType:`uint256`},{name:`minimum`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`Unauthorized`,inputs:[]},{type:`error`,name:`ZamaProtocolUnsupported`,inputs:[]},{type:`error`,name:`ZeroDeposits`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`account`,type:`address`,internalType:`address`}]}];function S(e,t,n,r){return{address:e,abi:x,functionName:`join`,args:[t,n,r]}}function C(e,t,n){return{address:e,abi:x,functionName:`claim`,args:[t,n]}}function w(e,t){return{address:e,abi:x,functionName:`quit`,args:[t]}}function T(e,t,n){return{address:e,abi:x,functionName:`recover`,args:[t,n]}}function E(e){return{address:e,abi:x,functionName:`dispatchBatch`,args:[]}}function D(e){return{address:e,abi:x,functionName:`currentBatchId`,args:[]}}function O(e,t){return{address:e,abi:x,functionName:`batchState`,args:[t]}}function k(e,t){return{address:e,abi:x,functionName:`totalDeposits`,args:[t]}}function A(e,t,n){return{address:e,abi:x,functionName:`deposits`,args:[t,n]}}function j(e){return{address:e,abi:x,functionName:`vault`,args:[]}}function M(e){return{address:e,abi:x,functionName:`fromToken`,args:[]}}function N(e){return{address:e,abi:x,functionName:`toToken`,args:[]}}function P(e){return{address:e,abi:x,functionName:`minBatchAge`,args:[]}}function F(e,t){return{address:e,abi:x,functionName:`batchMinBatchAge`,args:[t]}}function I(e){return{address:e,abi:x,functionName:`callbackDeadline`,args:[]}}function L(e,t){return{address:e,abi:x,functionName:`batchCallbackDeadline`,args:[t]}}function R(e,t){return{address:e,abi:x,functionName:`batchCreatedAt`,args:[t]}}function z(e,t){return{address:e,abi:x,functionName:`batchDispatchedAt`,args:[t]}}function B(e,t){return{address:e,abi:x,functionName:`exchangeRate`,args:[t]}}function V(e){return{address:e,abi:x,functionName:`exchangeRateDecimals`,args:[]}}function H(e){return{address:e,abi:x,functionName:`paused`,args:[]}}const U={Joined:m(`Joined(uint256,address,bytes32)`)};function W(e){let[t,n,r]=e.topics;return t!==U.Joined||n===void 0||r===void 0?null:{batchId:BigInt(n),account:g(r),confidentialAmount:p(e.data,0)}}function G(e,t,n){let r=n?b(n):void 0;for(let n of e){if(n.address!==void 0&&b(n.address)!==t)continue;let e=W(n);if(e&&(r===void 0||e.account===r))return e}return null}const K={Pending:0,Dispatched:1,Finalized:2,Canceled:3};function q(e){let t,n=null;return()=>t===void 0?(n||=e().then(e=>(t=e,n=null,e)).catch(e=>{throw n=null,e}),n):Promise.resolve(t)}var J=class{sdk;address;#e;#t;#n;#r=null;constructor(e,t){this.sdk=e,this.address=b(t),this.#e=q(()=>e.provider.readContract(j(this.address))),this.#t=q(()=>e.provider.readContract(M(this.address))),this.#n=q(()=>e.provider.readContract(N(this.address)))}async vault(){return this.#e()}async fromToken(){return this.#t()}async toToken(){return this.#n()}async currentBatchId(){return this.sdk.provider.readContract(D(this.address))}async batchState(e){return await this.sdk.provider.readContract(O(this.address,e))}async paused(){return this.sdk.provider.readContract(H(this.address))}async minBatchAge(){return this.sdk.provider.readContract(P(this.address))}async batchMinBatchAge(e){return this.sdk.provider.readContract(F(this.address,e))}async callbackDeadline(){return this.sdk.provider.readContract(I(this.address))}async batchCallbackDeadline(e){return this.sdk.provider.readContract(L(this.address,e))}async batchCreatedAt(e){return this.sdk.provider.readContract(R(this.address,e))}async batchDispatchedAt(e){return this.sdk.provider.readContract(z(this.address,e))}async exchangeRate(e){return this.sdk.provider.readContract(B(this.address,e))}async exchangeRateDecimals(){return this.sdk.provider.readContract(V(this.address))}async timeUntilDispatchable(e){let[t,n,r,i]=await Promise.all([this.batchState(e),this.batchCreatedAt(e),this.batchMinBatchAge(e),this.sdk.provider.getBlockTimestamp()]);if(t!==K.Pending)return null;let a=n+r;return a>i?a-i:0n}async confidentialTotalDeposits(e){return this.sdk.provider.readContract(k(this.address,e))}async confidentialDepositOf(e,t){return this.sdk.provider.readContract(A(this.address,e,b(t)))}async depositOf(e,t){let r=b(t),i=await this.confidentialDepositOf(e,r);if(l(i))return 0n;let o=(await this.sdk.decryption.decryptValues([{encryptedValue:i,contractAddress:this.address}],{operation:`vault-deposit-of`}))[i];if(o===void 0)throw new n(`Decryption returned no value for ${i}`);return a(o,`depositOf: result[encryptedValue]`),o}async join(e,n,i){let{operation:a}=_(i,`vault-join`);this.#i(`join`);let o=b((await s(`join`,this.sdk.signer,this.sdk.provider)).address),c=n?b(n):o;i?.skipBalanceCheck||await this.#o(e,a);let{encryptedValues:l,inputProof:u}=await this.sdk.encrypt({values:[{value:e,type:`euint64`}],contractAddress:this.address,userAddress:o},{operation:a}),d=l[0];if(!d)throw new t(`Encryption returned no encrypted values`);let f=await this.#c(`vault:join`,S(this.address,c,d,u)),p=G(f.receipt.logs,this.address,c);if(!p)throw new r(`No Joined event for ${c} from batcher ${this.address} found in the join receipt`);return{...f,batchId:p.batchId,beneficiary:p.account,confidentialJoinedAmount:p.confidentialAmount}}async quit(e){return this.#i(`quit`),await d(`quit`,this.sdk.signer,this.sdk.provider),this.#c(`vault:quit`,w(this.address,e))}async recover(e,t){let n=await this.#s(`recover`,t);return this.#c(`vault:recover`,T(this.address,e,n))}async claim(e,t){let n=await this.#s(`claim`,t);return this.#c(`vault:claim`,C(this.address,e,n))}async dispatchBatch(){return this.#i(`dispatchBatch`),await d(`dispatchBatch`,this.sdk.signer,this.sdk.provider),this.#c(`vault:dispatchBatch`,E(this.address))}#i(e){if(!this.sdk.signer)throw new i(e);return this.sdk.signer}async#a(){return this.#r??=this.fromToken().then(e=>new f(this.sdk,e)).catch(e=>{throw this.#r=null,e}),this.#r}async#o(e,t){let n=await this.#a();return c({operation:`join`,tokenAddress:n.address,amount:e,signer:this.sdk.signer,provider:this.sdk.provider,readBalance:e=>n.decryptBalance(e,t)})}async#s(e,t){return this.#i(e),t?(await d(e,this.sdk.signer,this.sdk.provider),b(t)):b((await s(e,this.sdk.signer,this.sdk.provider)).address)}async#c(e,t){return u({operation:e,signer:this.#i(e),provider:this.sdk.provider,config:t,emit:e=>this.sdk.emitEvent(e,this.address),logger:this.sdk.logger})}};function Y(e,t){return new J(e,t)}var X=class{sdk;depositBatcher;redeemBatcher;#e=null;#t=null;#n=null;#r;constructor(e,t){this.sdk=e,this.#r=t.vault?b(t.vault):void 0,this.depositBatcher=new J(e,t.depositBatcher),this.redeemBatcher=new J(e,t.redeemBatcher)}async vaultAddress(){return this.#e??=this.#i().catch(e=>{throw this.#e=null,e}),this.#e}async cAsset(){return this.#t??=this.depositBatcher.fromToken().then(e=>new h(this.sdk,e)).catch(e=>{throw this.#t=null,e}),this.#t}async cShare(){return this.#n??=this.redeemBatcher.fromToken().then(e=>new h(this.sdk,e)).catch(e=>{throw this.#n=null,e}),this.#n}async deposit(e,t){let[,n]=await Promise.all([this.vaultAddress(),this.cAsset()]);return await this.#a(`deposit`,n,this.depositBatcher.address,t?.operatorUntil),this.depositBatcher.join(e,t?.beneficiary,{skipBalanceCheck:t?.skipBalanceCheck,operation:`vault-deposit`})}async redeem(e,t){let[,n]=await Promise.all([this.vaultAddress(),this.cShare()]);return await this.#a(`redeem`,n,this.redeemBatcher.address,t?.operatorUntil),this.redeemBatcher.join(e,t?.beneficiary,{skipBalanceCheck:t?.skipBalanceCheck,operation:`vault-redeem`})}async#i(){let[t,n]=await Promise.all([this.depositBatcher.vault(),this.redeemBatcher.vault()]);if(b(t)!==b(n))throw new e(`Vault batchers point at different ERC-4626 vaults: deposit batcher ${this.depositBatcher.address} reports ${t}, redeem batcher ${this.redeemBatcher.address} reports ${n}`);let r=b(t);if(this.#r!==void 0&&this.#r!==r)throw new e(`Configured vault address ${this.#r} does not match the ${r} both batchers report`);return r}async#a(e,t,n,r){if(!this.sdk.signer)throw new i(e);let a=this.sdk.signer.requireWalletAccount(e);await t.isOperator(a.address,n)||await t.setOperator(n,r)}};function Z(e,t){return new X(e,t)}const Q={currentBatchId:{batcher:e=>[`zama.vault.currentBatchId`,{batcherAddress:b(e)}]},batchState:{batcher:e=>[`zama.vault.batchState`,{batcherAddress:b(e)}],batch:(e,t)=>[`zama.vault.batchState`,{batcherAddress:b(e),batchId:t}]},timeUntilDispatchable:{batcher:e=>[`zama.vault.timeUntilDispatchable`,{batcherAddress:b(e)}],batch:(e,t)=>[`zama.vault.timeUntilDispatchable`,{batcherAddress:b(e),batchId:t}]}};function $(e,t){e.invalidateQueries({queryKey:Q.currentBatchId.batcher(t)}),e.invalidateQueries({queryKey:Q.batchState.batcher(t)}),e.invalidateQueries({queryKey:Q.timeUntilDispatchable.batcher(t)})}function ee(e,t){v(e,t.fromToken),$(e,t.batcherAddress)}function te(e,t){v(e,t.fromToken),$(e,t.batcherAddress)}function ne(e,t){v(e,t.toToken)}function re(e,t){$(e,t)}function ie(e,t={}){let n=t.query??{};return{...y(n),queryKey:Q.currentBatchId.batcher(e.address),queryFn:async()=>e.currentBatchId(),enabled:n.enabled!==!1}}function ae(e,t={}){let n=t.query??{};return{...y(n),queryKey:Q.batchState.batch(e.address,t.batchId),queryFn:async t=>{let[,{batchId:n}]=t.queryKey;return o(n,`batchStateQueryOptions: batchId`),e.batchState(n)},enabled:t.batchId!==void 0&&n.enabled!==!1}}function oe(e,t={}){let n=t.query??{};return{...y(n),queryKey:Q.timeUntilDispatchable.batch(e.address,t.batchId),queryFn:async t=>{let[,{batchId:n}]=t.queryKey;return o(n,`timeUntilDispatchableQueryOptions: batchId`),e.timeUntilDispatchable(n)},enabled:t.batchId!==void 0&&n.enabled!==!1}}function se(e){return{mutationKey:[`zama.vault.deposit`,e.depositBatcher.address],mutationFn:async({amount:t,...n})=>e.deposit(t,n)}}function ce(e){return{mutationKey:[`zama.vault.redeem`,e.redeemBatcher.address],mutationFn:async({amount:t,...n})=>e.redeem(t,n)}}function le(e){return{mutationKey:[`zama.vault.join`,e.address],mutationFn:async({amount:t,beneficiary:n,...r})=>e.join(t,n,r)}}function ue(e){return{mutationKey:[`zama.vault.claim`,e.address],mutationFn:async({batchId:t,account:n})=>e.claim(t,n)}}function de(e){return{mutationKey:[`zama.vault.quit`,e.address],mutationFn:async({batchId:t})=>e.quit(t)}}function fe(e){return{mutationKey:[`zama.vault.recover`,e.address],mutationFn:async({batchId:t,account:n})=>e.recover(t,n)}}function pe(e){return{mutationKey:[`zama.vault.dispatchBatch`,e.address],mutationFn:async()=>e.dispatchBatch()}}export{K as BatchState,X as Vault,J as VaultBatcher,U as VaultTopics,L as batchCallbackDeadlineContract,R as batchCreatedAtContract,z as batchDispatchedAtContract,F as batchMinBatchAgeContract,O as batchStateContract,ae as batchStateQueryOptions,I as callbackDeadlineContract,C as claimContract,ue as claimMutationOptions,Z as createVault,Y as createVaultBatcher,D as currentBatchIdContract,ie as currentBatchIdQueryOptions,W as decodeJoined,se as depositMutationOptions,A as depositsContract,E as dispatchBatchContract,pe as dispatchBatchMutationOptions,B as exchangeRateContract,V as exchangeRateDecimalsContract,G as findJoined,M as fromTokenContract,ne as invalidateAfterClaim,re as invalidateAfterDispatchBatch,ee as invalidateAfterJoin,te as invalidateAfterQuit,$ as invalidateBatchQueries,S as joinContract,le as joinMutationOptions,P as minBatchAgeContract,H as pausedContract,w as quitContract,de as quitMutationOptions,T as recoverContract,fe as recoverMutationOptions,ce as redeemMutationOptions,oe as timeUntilDispatchableQueryOptions,N as toTokenContract,k as totalDepositsContract,j as vaultContract,Q as vaultQueryKeys};
|
|
1
|
+
import{t as e}from"../relayer-C3jVhqSK.js";import{r as t,t as n}from"../encryption-6AVd-82z.js";import{H as r,L as i,M as a,P as o}from"../erc165-B8gx2luK.js";import{a as s,i as c,l,n as u,o as d,t as f}from"../token-g6sinwTx.js";import{S as p,b as m,t as h,x as g}from"../wrapped-token-3usJd0oi.js";import{r as _}from"../telemetry-DGsqUbRG.js";import{l as v,p as y}from"../invalidation-BgFjmXeQ.js";import{getAddress as b}from"viem";const x=[{type:`function`,name:`batchCallbackDeadline`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`batchCreatedAt`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`batchDispatchedAt`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`batchMaxSlippageBps`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint16`,internalType:`uint16`}],stateMutability:`view`},{type:`function`,name:`batchMinBatchAge`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`batchState`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint8`,internalType:`enum BatcherConfidential.BatchState`}],stateMutability:`view`},{type:`function`,name:`callbackDeadline`,inputs:[],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`claim`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bytes32`,internalType:`euint64`}],stateMutability:`nonpayable`},{type:`function`,name:`currentBatchId`,inputs:[],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`deposits`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bytes32`,internalType:`euint64`}],stateMutability:`view`},{type:`function`,name:`dispatchBatch`,inputs:[],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`exchangeRate`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`uint64`,internalType:`uint64`}],stateMutability:`view`},{type:`function`,name:`exchangeRateDecimals`,inputs:[],outputs:[{name:``,type:`uint8`,internalType:`uint8`}],stateMutability:`pure`},{type:`function`,name:`fromToken`,inputs:[],outputs:[{name:``,type:`address`,internalType:`contract IERC7984ERC20Wrapper`}],stateMutability:`view`},{type:`function`,name:`join`,inputs:[{name:`beneficiary`,type:`address`,internalType:`address`},{name:`encryptedAmount`,type:`bytes32`,internalType:`externalEuint64`},{name:`inputProof`,type:`bytes`,internalType:`bytes`}],outputs:[{name:`joined`,type:`bytes32`,internalType:`euint64`}],stateMutability:`nonpayable`},{type:`function`,name:`maxSlippageBps`,inputs:[],outputs:[{name:``,type:`uint16`,internalType:`uint16`}],stateMutability:`view`},{type:`function`,name:`minBatchAge`,inputs:[],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`paused`,inputs:[],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`quit`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bytes32`,internalType:`euint64`}],stateMutability:`nonpayable`},{type:`function`,name:`recover`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:`refunded`,type:`bytes32`,internalType:`euint64`}],stateMutability:`nonpayable`},{type:`function`,name:`toToken`,inputs:[],outputs:[{name:``,type:`address`,internalType:`contract IERC7984ERC20Wrapper`}],stateMutability:`view`},{type:`function`,name:`totalDeposits`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bytes32`,internalType:`euint64`}],stateMutability:`view`},{type:`function`,name:`unwrapRequestId`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`vault`,inputs:[],outputs:[{name:``,type:`address`,internalType:`contract IERC4626`}],stateMutability:`view`},{type:`event`,name:`BatchCanceled`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`BatchDispatched`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`BatchFinalized`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`},{name:`exchangeRate`,type:`uint64`,indexed:!1,internalType:`uint64`}],anonymous:!1},{type:`event`,name:`Claimed`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`},{name:`account`,type:`address`,indexed:!0,internalType:`address`},{name:`amount`,type:`bytes32`,indexed:!1,internalType:`euint64`}],anonymous:!1},{type:`event`,name:`Joined`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`},{name:`account`,type:`address`,indexed:!0,internalType:`address`},{name:`amount`,type:`bytes32`,indexed:!1,internalType:`euint64`}],anonymous:!1},{type:`event`,name:`Quit`,inputs:[{name:`batchId`,type:`uint256`,indexed:!0,internalType:`uint256`},{name:`account`,type:`address`,indexed:!0,internalType:`address`},{name:`amount`,type:`bytes32`,indexed:!1,internalType:`euint64`}],anonymous:!1},{type:`error`,name:`BatchNonexistent`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`BatchTooYoung`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`elapsed`,type:`uint256`,internalType:`uint256`},{name:`required`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`BatchUnexpectedState`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`current`,type:`uint8`,internalType:`enum BatcherConfidential.BatchState`},{name:`expectedStates`,type:`bytes32`,internalType:`bytes32`}]},{type:`error`,name:`DuplicateUnderlyingTokens`,inputs:[]},{type:`error`,name:`EnforcedPause`,inputs:[]},{type:`error`,name:`ExpectedPause`,inputs:[]},{type:`error`,name:`IntermediateStepToTokenBalanceChanged`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`InvalidBeneficiary`,inputs:[]},{type:`error`,name:`InvalidCallbackDeadline`,inputs:[]},{type:`error`,name:`InvalidExchangeRate`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`totalDeposits`,type:`uint256`,internalType:`uint256`},{name:`exchangeRate`,type:`uint64`,internalType:`uint64`}]},{type:`error`,name:`InvalidKMSSignatures`,inputs:[]},{type:`error`,name:`InvalidMaxSlippageBps`,inputs:[]},{type:`error`,name:`InvalidMinBatchAge`,inputs:[]},{type:`error`,name:`InvalidTokenRate`,inputs:[]},{type:`error`,name:`InvalidWrapperToken`,inputs:[{name:`token`,type:`address`,internalType:`address`}]},{type:`error`,name:`OwnableInvalidOwner`,inputs:[{name:`owner`,type:`address`,internalType:`address`}]},{type:`error`,name:`OwnableUnauthorizedAccount`,inputs:[{name:`account`,type:`address`,internalType:`address`}]},{type:`error`,name:`ReentrancyGuardReentrantCall`,inputs:[]},{type:`error`,name:`RouteAssetMismatch`,inputs:[{name:`actualAsset`,type:`address`,internalType:`address`},{name:`expectedAsset`,type:`address`,internalType:`address`}]},{type:`error`,name:`RouteShareMismatch`,inputs:[{name:`actualShare`,type:`address`,internalType:`address`},{name:`expectedShare`,type:`address`,internalType:`address`}]},{type:`error`,name:`SafeCastOverflowedUintDowncast`,inputs:[{name:`bits`,type:`uint8`,internalType:`uint8`},{name:`value`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`SafeERC20FailedOperation`,inputs:[{name:`token`,type:`address`,internalType:`address`}]},{type:`error`,name:`SenderNotAllowedToUseHandle`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`sender`,type:`address`,internalType:`address`}]},{type:`error`,name:`SlippageExceeded`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`actual`,type:`uint256`,internalType:`uint256`},{name:`minimum`,type:`uint256`,internalType:`uint256`}]},{type:`error`,name:`Unauthorized`,inputs:[]},{type:`error`,name:`ZamaProtocolUnsupported`,inputs:[]},{type:`error`,name:`ZeroDeposits`,inputs:[{name:`batchId`,type:`uint256`,internalType:`uint256`},{name:`account`,type:`address`,internalType:`address`}]}];function S(e,t,n,r){return{address:e,abi:x,functionName:`join`,args:[t,n,r]}}function C(e,t,n){return{address:e,abi:x,functionName:`claim`,args:[t,n]}}function w(e,t){return{address:e,abi:x,functionName:`quit`,args:[t]}}function T(e,t,n){return{address:e,abi:x,functionName:`recover`,args:[t,n]}}function E(e){return{address:e,abi:x,functionName:`dispatchBatch`,args:[]}}function D(e){return{address:e,abi:x,functionName:`currentBatchId`,args:[]}}function O(e,t){return{address:e,abi:x,functionName:`batchState`,args:[t]}}function k(e,t){return{address:e,abi:x,functionName:`totalDeposits`,args:[t]}}function A(e,t,n){return{address:e,abi:x,functionName:`deposits`,args:[t,n]}}function j(e){return{address:e,abi:x,functionName:`vault`,args:[]}}function M(e){return{address:e,abi:x,functionName:`fromToken`,args:[]}}function N(e){return{address:e,abi:x,functionName:`toToken`,args:[]}}function P(e){return{address:e,abi:x,functionName:`minBatchAge`,args:[]}}function F(e,t){return{address:e,abi:x,functionName:`batchMinBatchAge`,args:[t]}}function I(e){return{address:e,abi:x,functionName:`callbackDeadline`,args:[]}}function L(e,t){return{address:e,abi:x,functionName:`batchCallbackDeadline`,args:[t]}}function R(e,t){return{address:e,abi:x,functionName:`batchCreatedAt`,args:[t]}}function z(e,t){return{address:e,abi:x,functionName:`batchDispatchedAt`,args:[t]}}function B(e,t){return{address:e,abi:x,functionName:`exchangeRate`,args:[t]}}function V(e){return{address:e,abi:x,functionName:`exchangeRateDecimals`,args:[]}}function H(e){return{address:e,abi:x,functionName:`paused`,args:[]}}const U={Joined:m(`Joined(uint256,address,bytes32)`)};function W(e){let[t,n,r]=e.topics;return t!==U.Joined||n===void 0||r===void 0?null:{batchId:BigInt(n),account:g(r),confidentialAmount:p(e.data,0)}}function G(e,t,n){let r=n?b(n):void 0;for(let n of e){if(n.address!==void 0&&b(n.address)!==t)continue;let e=W(n);if(e&&(r===void 0||e.account===r))return e}return null}const K={Pending:0,Dispatched:1,Finalized:2,Canceled:3};function q(e){let t,n=null;return()=>t===void 0?(n||=e().then(e=>(t=e,n=null,e)).catch(e=>{throw n=null,e}),n):Promise.resolve(t)}var J=class{sdk;address;#e;#t;#n;#r=null;constructor(e,t){this.sdk=e,this.address=b(t),this.#e=q(()=>e.provider.readContract(j(this.address))),this.#t=q(()=>e.provider.readContract(M(this.address))),this.#n=q(()=>e.provider.readContract(N(this.address)))}async vault(){return this.#e()}async fromToken(){return this.#t()}async toToken(){return this.#n()}async currentBatchId(){return this.sdk.provider.readContract(D(this.address))}async batchState(e){return await this.sdk.provider.readContract(O(this.address,e))}async paused(){return this.sdk.provider.readContract(H(this.address))}async minBatchAge(){return this.sdk.provider.readContract(P(this.address))}async batchMinBatchAge(e){return this.sdk.provider.readContract(F(this.address,e))}async callbackDeadline(){return this.sdk.provider.readContract(I(this.address))}async batchCallbackDeadline(e){return this.sdk.provider.readContract(L(this.address,e))}async batchCreatedAt(e){return this.sdk.provider.readContract(R(this.address,e))}async batchDispatchedAt(e){return this.sdk.provider.readContract(z(this.address,e))}async exchangeRate(e){return this.sdk.provider.readContract(B(this.address,e))}async exchangeRateDecimals(){return this.sdk.provider.readContract(V(this.address))}async timeUntilDispatchable(e){let[t,n,r,i]=await Promise.all([this.batchState(e),this.batchCreatedAt(e),this.batchMinBatchAge(e),this.sdk.provider.getBlockTimestamp()]);if(t!==K.Pending)return null;let a=n+r;return a>i?a-i:0n}async confidentialTotalDeposits(e){return this.sdk.provider.readContract(k(this.address,e))}async confidentialDepositOf(e,t){return this.sdk.provider.readContract(A(this.address,e,b(t)))}async depositOf(e,t){let r=b(t),i=await this.confidentialDepositOf(e,r);if(l(i))return 0n;let o=(await this.sdk.decryption.decryptValues([{encryptedValue:i,contractAddress:this.address}],{operation:`vault-deposit-of`}))[i];if(o===void 0)throw new n(`Decryption returned no value for ${i}`);return a(o,`depositOf: result[encryptedValue]`),o}async join(e,n,i){let{operation:a}=_(i,`vault-join`);this.#i(`join`);let o=b((await s(`join`,this.sdk.signer,this.sdk.provider)).address),c=n?b(n):o;i?.skipBalanceCheck||await this.#o(e,a);let{encryptedValues:l,inputProof:u}=await this.sdk.encrypt({values:[{value:e,type:`euint64`}],contractAddress:this.address,userAddress:o},{operation:a}),d=l[0];if(!d)throw new t(`Encryption returned no encrypted values`);let f=await this.#c(`vault:join`,S(this.address,c,d,u)),p=G(f.receipt.logs,this.address,c);if(!p)throw new r(`No Joined event for ${c} from batcher ${this.address} found in the join receipt`);return{...f,batchId:p.batchId,beneficiary:p.account,confidentialJoinedAmount:p.confidentialAmount}}async quit(e){return this.#i(`quit`),await d(`quit`,this.sdk.signer,this.sdk.provider),this.#c(`vault:quit`,w(this.address,e))}async recover(e,t){let n=await this.#s(`recover`,t);return this.#c(`vault:recover`,T(this.address,e,n))}async claim(e,t){let n=await this.#s(`claim`,t);return this.#c(`vault:claim`,C(this.address,e,n))}async dispatchBatch(){return this.#i(`dispatchBatch`),await d(`dispatchBatch`,this.sdk.signer,this.sdk.provider),this.#c(`vault:dispatchBatch`,E(this.address))}#i(e){if(!this.sdk.signer)throw new i(e);return this.sdk.signer}async#a(){return this.#r??=this.fromToken().then(e=>new f(this.sdk,e)).catch(e=>{throw this.#r=null,e}),this.#r}async#o(e,t){let n=await this.#a();return c({operation:`join`,tokenAddress:n.address,amount:e,signer:this.sdk.signer,provider:this.sdk.provider,readBalance:e=>n.decryptBalance(e,t)})}async#s(e,t){return this.#i(e),t?(await d(e,this.sdk.signer,this.sdk.provider),b(t)):b((await s(e,this.sdk.signer,this.sdk.provider)).address)}async#c(e,t){return u({operation:e,signer:this.#i(e),provider:this.sdk.provider,config:t,emit:e=>this.sdk.emitEvent(e,this.address),logger:this.sdk.logger})}};function Y(e,t){return new J(e,t)}var X=class{sdk;depositBatcher;redeemBatcher;#e=null;#t=null;#n=null;#r;constructor(e,t){this.sdk=e,this.#r=t.vault?b(t.vault):void 0,this.depositBatcher=new J(e,t.depositBatcher),this.redeemBatcher=new J(e,t.redeemBatcher)}async vaultAddress(){return this.#e??=this.#i().catch(e=>{throw this.#e=null,e}),this.#e}async cAsset(){return this.#t??=this.depositBatcher.fromToken().then(e=>new h(this.sdk,e)).catch(e=>{throw this.#t=null,e}),this.#t}async cShare(){return this.#n??=this.redeemBatcher.fromToken().then(e=>new h(this.sdk,e)).catch(e=>{throw this.#n=null,e}),this.#n}async deposit(e,t){let[,n]=await Promise.all([this.vaultAddress(),this.cAsset()]);return await this.#a(`deposit`,n,this.depositBatcher.address,t?.operatorUntil),this.depositBatcher.join(e,t?.beneficiary,{skipBalanceCheck:t?.skipBalanceCheck,operation:`vault-deposit`})}async redeem(e,t){let[,n]=await Promise.all([this.vaultAddress(),this.cShare()]);return await this.#a(`redeem`,n,this.redeemBatcher.address,t?.operatorUntil),this.redeemBatcher.join(e,t?.beneficiary,{skipBalanceCheck:t?.skipBalanceCheck,operation:`vault-redeem`})}async#i(){let[t,n]=await Promise.all([this.depositBatcher.vault(),this.redeemBatcher.vault()]);if(b(t)!==b(n))throw new e(`Vault batchers point at different ERC-4626 vaults: deposit batcher ${this.depositBatcher.address} reports ${t}, redeem batcher ${this.redeemBatcher.address} reports ${n}`);let r=b(t);if(this.#r!==void 0&&this.#r!==r)throw new e(`Configured vault address ${this.#r} does not match the ${r} both batchers report`);return r}async#a(e,t,n,r){if(!this.sdk.signer)throw new i(e);let a=this.sdk.signer.requireWalletAccount(e);await t.isOperator(a.address,n)||await t.setOperator(n,r)}};function Z(e,t){return new X(e,t)}const Q={currentBatchId:{batcher:e=>[`zama.vault.currentBatchId`,{batcherAddress:b(e)}]},batchState:{batcher:e=>[`zama.vault.batchState`,{batcherAddress:b(e)}],batch:(e,t)=>[`zama.vault.batchState`,{batcherAddress:b(e),batchId:t}]},timeUntilDispatchable:{batcher:e=>[`zama.vault.timeUntilDispatchable`,{batcherAddress:b(e)}],batch:(e,t)=>[`zama.vault.timeUntilDispatchable`,{batcherAddress:b(e),batchId:t}]}};function $(e,t){e.invalidateQueries({queryKey:Q.currentBatchId.batcher(t)}),e.invalidateQueries({queryKey:Q.batchState.batcher(t)}),e.invalidateQueries({queryKey:Q.timeUntilDispatchable.batcher(t)})}function ee(e,t){v(e,t.fromToken),$(e,t.batcherAddress)}function te(e,t){v(e,t.fromToken),$(e,t.batcherAddress)}function ne(e,t){v(e,t.toToken)}function re(e,t){$(e,t)}function ie(e,t={}){let n=t.query??{};return{...y(n),queryKey:Q.currentBatchId.batcher(e.address),queryFn:async()=>e.currentBatchId(),enabled:n.enabled!==!1}}function ae(e,t={}){let n=t.query??{};return{...y(n),queryKey:Q.batchState.batch(e.address,t.batchId),queryFn:async t=>{let[,{batchId:n}]=t.queryKey;return o(n,`batchStateQueryOptions: batchId`),e.batchState(n)},enabled:t.batchId!==void 0&&n.enabled!==!1}}function oe(e,t={}){let n=t.query??{};return{...y(n),queryKey:Q.timeUntilDispatchable.batch(e.address,t.batchId),queryFn:async t=>{let[,{batchId:n}]=t.queryKey;return o(n,`timeUntilDispatchableQueryOptions: batchId`),e.timeUntilDispatchable(n)},enabled:t.batchId!==void 0&&n.enabled!==!1}}function se(e){return{mutationKey:[`zama.vault.deposit`,e.depositBatcher.address],mutationFn:async({amount:t,...n})=>e.deposit(t,n)}}function ce(e){return{mutationKey:[`zama.vault.redeem`,e.redeemBatcher.address],mutationFn:async({amount:t,...n})=>e.redeem(t,n)}}function le(e){return{mutationKey:[`zama.vault.join`,e.address],mutationFn:async({amount:t,beneficiary:n,...r})=>e.join(t,n,r)}}function ue(e){return{mutationKey:[`zama.vault.claim`,e.address],mutationFn:async({batchId:t,account:n})=>e.claim(t,n)}}function de(e){return{mutationKey:[`zama.vault.quit`,e.address],mutationFn:async({batchId:t})=>e.quit(t)}}function fe(e){return{mutationKey:[`zama.vault.recover`,e.address],mutationFn:async({batchId:t,account:n})=>e.recover(t,n)}}function pe(e){return{mutationKey:[`zama.vault.dispatchBatch`,e.address],mutationFn:async()=>e.dispatchBatch()}}export{K as BatchState,X as Vault,J as VaultBatcher,U as VaultTopics,L as batchCallbackDeadlineContract,R as batchCreatedAtContract,z as batchDispatchedAtContract,F as batchMinBatchAgeContract,O as batchStateContract,ae as batchStateQueryOptions,I as callbackDeadlineContract,C as claimContract,ue as claimMutationOptions,Z as createVault,Y as createVaultBatcher,D as currentBatchIdContract,ie as currentBatchIdQueryOptions,W as decodeJoined,se as depositMutationOptions,A as depositsContract,E as dispatchBatchContract,pe as dispatchBatchMutationOptions,B as exchangeRateContract,V as exchangeRateDecimalsContract,G as findJoined,M as fromTokenContract,ne as invalidateAfterClaim,re as invalidateAfterDispatchBatch,ee as invalidateAfterJoin,te as invalidateAfterQuit,$ as invalidateBatchQueries,S as joinContract,le as joinMutationOptions,P as minBatchAgeContract,H as pausedContract,w as quitContract,de as quitMutationOptions,T as recoverContract,fe as recoverMutationOptions,ce as redeemMutationOptions,oe as timeUntilDispatchableQueryOptions,N as toTokenContract,k as totalDepositsContract,j as vaultContract,Q as vaultQueryKeys};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/web/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e,t}from"../fhevm-relayer-
|
|
1
|
+
import{r as e,t}from"../fhevm-relayer-Y3tLFeGo.js";import{t as n}from"../validation-ClSvPh6P.js";import{z as r}from"zod/mini";const i=e=>r._default(r.number().check(r.positive()),e),a=r.custom(e=>typeof e==`function`),o=r.object({offloadEncrypt:r._default(r.union([r.literal(`auto`),r.boolean()]),`auto`),offloadTimeouts:r.optional(r.object({spawn:i(e.spawn),init:i(e.init)})),offloadWorker:r.optional(r.union([r.string().check(r.minLength(1)),r.instanceof(URL),a]))});function s(e){let{offloadEncrypt:r,offloadTimeouts:i,offloadWorker:a,...s}=e??{},c=n(o,{offloadEncrypt:r,offloadTimeouts:i,offloadWorker:a});return{type:`web`,createRelayer:(e,n,r)=>new t({chain:e,options:s,telemetry:r&&{state:r,runtime:`web`},offloadEncrypt:c.offloadEncrypt,offloadTimeouts:c.offloadTimeouts,offloadWorker:c.offloadWorker,logger:n})}}export{s as web};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|