@zama-fhe/sdk 3.6.0-alpha.1 → 3.6.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/cjs/base-signer.cjs +1 -1
  2. package/dist/cjs/base-signer.cjs.map +1 -1
  3. package/dist/cjs/fhevm-relayer.cjs +1 -1
  4. package/dist/cjs/fhevm-relayer.cjs.map +1 -1
  5. package/dist/cjs/index.cjs +1 -1
  6. package/dist/cjs/index.cjs.map +1 -1
  7. package/dist/cjs/relayer.cjs +1 -1
  8. package/dist/cjs/relayer.cjs.map +1 -1
  9. package/dist/cjs/sdk-events.cjs +1 -1
  10. package/dist/cjs/sdk-events.cjs.map +1 -1
  11. package/dist/cjs/token.cjs +1 -1
  12. package/dist/esm/{base-signer-BwKOAW_G.d.ts → base-signer-BzpJPs0f.d.ts} +2 -2
  13. package/dist/esm/base-signer-CXvLkK3R.js +2 -0
  14. package/dist/esm/base-signer-CXvLkK3R.js.map +1 -0
  15. package/dist/esm/cleartext/index.d.ts +2 -2
  16. package/dist/esm/cleartext/index.js +1 -1
  17. package/dist/esm/{cleartext-B6EMRuQG.d.ts → cleartext-C8sZ2P2V.d.ts} +2 -2
  18. package/dist/esm/{cleartext-H5VqT7B3.js → cleartext-D8A7LXSP.js} +2 -2
  19. package/dist/esm/{cleartext-H5VqT7B3.js.map → cleartext-D8A7LXSP.js.map} +1 -1
  20. package/dist/esm/ethers/index.d.ts +3 -3
  21. package/dist/esm/ethers/index.js +1 -1
  22. package/dist/esm/fhevm-relayer-CKucZJeZ.js +2 -0
  23. package/dist/esm/fhevm-relayer-CKucZJeZ.js.map +1 -0
  24. package/dist/esm/{index-wkXw2pTk.d.ts → index-0FEn0eUO.d.ts} +51 -9
  25. package/dist/esm/{index-D37szpI6.d.ts → index-Cbe6DWuQ.d.ts} +3 -3
  26. package/dist/esm/index.d.ts +7 -7
  27. package/dist/esm/index.js +1 -1
  28. package/dist/esm/index.js.map +1 -1
  29. package/dist/esm/node/index.d.ts +3 -3
  30. package/dist/esm/node/index.js +1 -1
  31. package/dist/esm/query/index.d.ts +3 -3
  32. package/dist/esm/query/index.js +1 -1
  33. package/dist/esm/relayer-gGSbmpjI.js +2 -0
  34. package/dist/esm/relayer-gGSbmpjI.js.map +1 -0
  35. package/dist/esm/sdk-events-ByzD-Gre.js +2 -0
  36. package/dist/esm/sdk-events-ByzD-Gre.js.map +1 -0
  37. package/dist/esm/{token-ZHOauA4a.js → token-ORmGSfIF.js} +2 -2
  38. package/dist/esm/{token-ZHOauA4a.js.map → token-ORmGSfIF.js.map} +1 -1
  39. package/dist/esm/{types-DRo2YKuR.d.ts → types-Au_cA-AO.d.ts} +12 -2
  40. package/dist/esm/{types-DKNHtxgD.d.ts → types-Csv-_JB2.d.ts} +2 -2
  41. package/dist/esm/{types-Bw1HliHZ.d.ts → types-DU-76Gf8.d.ts} +2 -2
  42. package/dist/esm/viem/index.d.ts +3 -3
  43. package/dist/esm/viem/index.js +1 -1
  44. package/dist/esm/web/index.d.ts +1 -1
  45. package/dist/esm/web/index.js +1 -1
  46. package/package.json +2 -2
  47. package/dist/esm/base-signer-0jflqD3a.js +0 -2
  48. package/dist/esm/base-signer-0jflqD3a.js.map +0 -1
  49. package/dist/esm/fhevm-relayer--0QIgQjD.js +0 -2
  50. package/dist/esm/fhevm-relayer--0QIgQjD.js.map +0 -1
  51. package/dist/esm/relayer-iZoLiD6-.js +0 -2
  52. package/dist/esm/relayer-iZoLiD6-.js.map +0 -1
  53. package/dist/esm/sdk-events-CEiiv1m2.js +0 -2
  54. package/dist/esm/sdk-events-CEiiv1m2.js.map +0 -1
@@ -1,2 +1,2 @@
1
- const e=require("./relayer.cjs"),t=require("./sdk-events.cjs"),n=require("./chains.cjs");let r=require("@fhevm/sdk/viem"),i=require("viem"),a=require("zod/mini");var o=class{#e=null;#t=null;#n;#r;#i;constructor(e=`CredentialStore`,t=1,n=`credentials`){this.#n=e,this.#r=t,this.#i=n}#a(){return this.#e?Promise.resolve(this.#e):(this.#t||=new Promise((e,t)=>{let n=indexedDB.open(this.#n,this.#r);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(this.#i)||e.createObjectStore(this.#i,{keyPath:`key`})},n.onsuccess=()=>{this.#e=n.result,this.#t=null,this.#e.onversionchange=()=>{this.#e?.close(),this.#e=null,this.#t=null},this.#e.onclose=()=>{this.#e=null,this.#t=null},e(this.#e)},n.onerror=()=>{this.#e=null,this.#t=null,t(n.error)}}),this.#t)}async#o(e,t){let n=await this.#a();return new Promise((r,i)=>{let a=n.transaction(this.#i,e);a.onabort=()=>i(a.error??Error(`Transaction aborted`));let o=t(a.objectStore(this.#i));e===`readonly`?o.onsuccess=()=>r(o.result):a.oncomplete=()=>r(o.result),o.onerror=()=>i(o.error)})}async get(e){return(await this.#o(`readonly`,t=>t.get(e)))?.value??null}async set(e,t){await this.#o(`readwrite`,n=>n.put({key:e,value:t}))}async delete(e){await this.#o(`readwrite`,t=>t.delete(e))}async clear(){await this.#o(`readwrite`,e=>e.clear())}};const s=new o;var c=class{#e=new Map;async get(e){return this.#e.get(e)??null}async set(e,t){this.#e.set(e,t)}async delete(e){this.#e.delete(e)}};const l=new c;function u(){return typeof window<`u`?new o(`CredentialStore`):new c}function d(e=u(),t=e){return{storage:e,permitStorage:t}}function f(t,n){let r=new Map(t.map(e=>[e.id,e]));if(r.size!==t.length){let n=t.map(e=>e.id);throw new e.t(`Duplicate chain id(s) [${[...new Set(n.filter((e,t)=>n.indexOf(e)!==t))].join(`, `)}] in the chains array. Each chain id must appear only once. Note: hardhat and anvil are aliases (both use 31337).`)}let i=new Map(Object.entries(n)),a=new Map;for(let t of r.keys()){let n=r.get(t),o=i.get(String(t));if(!o)throw new e.t(`Chain ${t} has no relayer configured. Add a relayer entry: relayers: { [${t}]: web() }`);if(!n)throw new e.t(`Chain ${t} has a relayer configured but no entry in the chains array. Add the chain config to the chains array.`);a.set(t,{chain:n,relayerConfig:o})}let o=new Set(Object.keys(n).map(Number)),s=new Set([...o].filter(e=>!r.has(e)));if(s.size>0)throw new e.t(`Relayer entries for chain(s) [${[...s].join(`, `)}] have no matching entry in the chains array. Remove them or add the corresponding chain config.`);return a}var p=class{#e;#t;#n;constructor(t,n){if(t.length===0)throw new e.t(`At least one chain is required.`);this.#e=new Map(t.map(e=>[e.id,e])),this.#n=t[0].id;let r=new Map;for(let[e,{relayerConfig:i,chain:a}]of f(t,n))r.set(e,i.createRelayer(a));this.#t=r}get chains(){return[...this.#e.values()]}get chain(){let t=this.#e.get(this.#n);if(t===void 0)throw new e.t(`Chain ${this.#n} is not configured. Add it to the chains array.`);return t}switchChain(e){this.#n=e}get relayer(){let t=this.#t.get(this.chain.id);if(t===void 0)throw new e.t(`No relayer configured for chain ${this.#n}. Add it to the relayers object.`);return t}};function m(t,n){let r=a.z.safeParse(t,n);if(r.success)return r.data;throw new e.t(a.z.prettifyError(r.error),{cause:r.error})}const h={version:1,info:`zama-sdk-keypair-wrapping-v1`,ivLengthBytes:12,tagLengthBytes:16};function g(e){return new Uint8Array(e)}function _(e){return g(new TextEncoder().encode(JSON.stringify([e.publicKey,e.createdAt,e.expiresAt,e.tkmsVersion??null])))}function v(e){return typeof e==`string`?new TextEncoder().encode(e):g(e)}var y=class{#e;#t;constructor(e){this.#e=e}async baseKey(){return this.#t??=this.#n(this.#e),this.#t}async#n(e){let t=v(e),n=await crypto.subtle.importKey(`raw`,t,`HKDF`,!1,[`deriveKey`]);return t.fill(0),e instanceof Uint8Array&&e.fill(0),this.#e=void 0,n}};async function b(e,t){let n=await e.baseKey();return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:new TextEncoder().encode(t),info:new TextEncoder().encode(h.info)},n,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}async function x(e,t,n,r){let a=await b(t,n),o=crypto.getRandomValues(new Uint8Array(h.ivLengthBytes)),s=await crypto.subtle.encrypt({name:`AES-GCM`,iv:o,additionalData:_(r)},a,g((0,i.toBytes)(e)));return{wrappedPrivateKey:(0,i.toHex)(new Uint8Array(s)),iv:(0,i.toHex)(o)}}async function ee(e,t,n,r){let a=await b(t,n),o=await crypto.subtle.decrypt({name:`AES-GCM`,iv:g((0,i.toBytes)(e.iv)),additionalData:_(r)},a,g((0,i.toBytes)(e.wrappedPrivateKey)));return(0,i.toHex)(new Uint8Array(o))}function te(e){return typeof e==`object`&&!!e&&`name`in e&&e.name===`OperationError`}const S=`transportKeyPairTTL must be a positive integer number of seconds`,C=`permitTTL must be a positive integer number of days`,w=`transportKeyPairScope must be a non-empty string`,T=`transportKeyPairDerivationSecret must be a Uint8Array of at least 32 bytes or a string of at least 64 characters (256 bits of entropy): source it from a CSPRNG or secrets manager, not a human-memorable passphrase`,E=365*t.z,ne=a.z.int({error:S}).check(a.z.positive({error:S}),a.z.maximum(E,`transportKeyPairTTL must not exceed the fhevm ACL maximum of ${E}s (365 days)`)),D=a.z.int({error:C}).check(a.z.positive({error:C}),a.z.maximum(365,`permitTTL must not exceed the V1 permit maximum of 365 days`)),re=a.z.string({error:w}).check(a.z.minLength(1,w)),ie=a.z.union([a.z.string({error:T}).check(a.z.minLength(64,T)),a.z.instanceof(Uint8Array,{error:T}).check(a.z.refine(e=>e.byteLength>=32,{error:T}))],{error:T}),ae=a.z.object({publicKey:t.q,privateKey:t.q,createdAt:t.Z,expiresAt:t.X,tkmsVersion:a.z.optional(a.z.string())}),O=a.z.object({domain:a.z.record(a.z.string(),a.z.unknown()),primaryType:a.z.optional(a.z.string()),types:a.z.record(a.z.string(),a.z.array(a.z.object({name:a.z.string(),type:a.z.string()}))),message:a.z.record(a.z.string(),a.z.unknown())}),k=a.z.object({version:a.z.int().check(a.z.positive()),eip712:O,signature:t.q,signerAddress:t.K}),A={keypairPublicKey:t.q,contractAddresses:a.z.array(t.K).check(a.z.maxLength(10)),serializedPermit:k,startTimestamp:t.Z},oe=a.z.object({...A,version:a.z.literal(1),durationDays:t.Y}),se=a.z.object({...A,version:a.z.literal(2),durationSeconds:t.X}),j=a.z.union([oe,se]),ce=a.z.array(j),le=a.z.array(a.z.string()),ue=a.z.object({version:a.z.literal(1),eip712:O,signerAddress:t.K}),de=`iv must be a ${h.ivLengthBytes}-byte hex string`,fe=`wrappedPrivateKey must be a whole number of bytes and at least ${h.tagLengthBytes} bytes (the AES-GCM authentication tag)`;function M(e){return(e.length-2)/2}const pe=a.z.object({wrappingVersion:a.z.literal(h.version,{error:`wrappingVersion must be a wrapping scheme this SDK can read`}),publicKey:t.q,wrappedPrivateKey:t.q.check(a.z.refine(e=>e.length%2==0&&M(e)>=h.tagLengthBytes,{error:fe})),iv:t.q.check(a.z.refine(e=>M(e)===h.ivLengthBytes,{error:de})),createdAt:t.Z,expiresAt:t.X,tkmsVersion:a.z.optional(a.z.string())});function N(e){let t={publicKey:e.publicKey,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(t.tkmsVersion=e.tkmsVersion),t}const P={version:h.version,schema:pe,async encode(e,t,n){let{wrappedPrivateKey:r,iv:i}=await x(e.privateKey,t,n,N(e)),a={wrappingVersion:h.version,publicKey:e.publicKey,wrappedPrivateKey:r,iv:i,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(a.tkmsVersion=e.tkmsVersion),a},async decode(e,t,n){let r=await ee({wrappedPrivateKey:e.wrappedPrivateKey,iv:e.iv},t,n,N(e)),i={publicKey:e.publicKey,privateKey:r,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(i.tkmsVersion=e.tkmsVersion),i}},F=new Map([[P.version,P]]),I=P;function L(e){let t=e;return t.wrappingVersion!==void 0||t.wrappedPrivateKey!==void 0&&t.iv!==void 0}function R(e){if(typeof e!=`object`||!e||!L(e)){let t=ae.safeParse(e);return t.success?{kind:`plaintext`,keyPair:t.data}:{kind:`unrecognized`}}let t=e.wrappingVersion,n=typeof t==`number`?F.get(t):void 0;if(n===void 0)return{kind:`unsupported-version`,version:t};let r=n.schema.safeParse(e);if(!r.success)return{kind:`corrupt-wrapped`};let i=r.data;return{kind:`wrapped`,expiresAt:i.expiresAt,decode:(e,t)=>n.decode(i,e,t)}}function z(e,t,n){return I.encode(e,t,n)}function B(e){return`keypair:${e}`}function V(e){return`keypair:scope:${e}`}function H(e){return`permits:${e.signerAddress}:${e.chainId}:${e.delegatorAddress}`}function U(e){return`permits-index:${e}`}function W(e){return`scope:${e}`}function me(e,t){return{"wrapped-without-secret":`Transport key pair for scope "${t}" is wrapped, but this instance has no transportKeyPairDerivationSecret configured. Every instance sharing this scope must use the same transportKeyPairDerivationSecret; once they do, call permits.revokeTransportKeyPair() to rotate the entry.`,"unwrapped-under-secret":`Transport key pair for scope "${t}" is stored unwrapped, but this instance is configured with a transportKeyPairDerivationSecret. A peer instance sharing this scope is running without the secret: configure the same transportKeyPairDerivationSecret everywhere, then call permits.revokeTransportKeyPair() to migrate the scope to a wrapped entry.`,"unwrap-failed":`Transport key pair for scope "${t}" failed to unwrap. This usually means another instance created it with a different transportKeyPairDerivationSecret: every instance sharing this scope must use the same secret. It can also mean the stored entry is corrupted.`,"corrupt-wrapped":`Transport key pair for scope "${t}" is wrapped but structurally invalid: the stored iv or ciphertext is not a shape this wrapping scheme can produce. This usually means the stored entry is corrupted, or instances sharing this scope are running mismatched wrapping-scheme versions.`}[e]}const he={"unwrapped-under-secret":`unwrapped transport key pair entry found while a transportKeyPairDerivationSecret is configured`,"unwrap-failed":`transport key pair entry failed to unwrap (wrong transportKeyPairDerivationSecret?)`,"corrupt-wrapped":`structurally invalid wrapped transport key pair entry`};function ge(e,t){let n=typeof e==`number`?`wrappingVersion ${e}`:`no wrappingVersion this build recognizes`;return`Transport key pair ${t===void 0?`for this signer`:`for scope "${t}"`} was written under a wrapping scheme this SDK build cannot read (${n}). The entry is preserved instead of regenerated, since an instance that understands the scheme may still be using it: ${t===void 0?`run a build that supports it, or call permits.clear() to discard the entry deliberately`:`run a build that supports it everywhere, or call permits.revokeTransportKeyPair() to rotate the scope`}.`}var _e=class{#e;#t;#n;#r;#i;#a;#o=new Map;#s=new Map;constructor(e){this.#e=e.generator,this.#t=e.storage,this.#n=e.ttl,this.#r=e.logger,this.#i=e.scope,this.#a=e.derivationSecret}#c(e){return this.#i===void 0?`signer:${e}`:W(this.#i)}#l(e){return this.#i===void 0?B(e):V(this.#i)}async readStored(e){return this.#u(this.#l(e),this.#c(e))}async#u(e,n){let r=await this.#t.get(e);if(r==null)return null;let i=R(r);if(i.kind===`unsupported-version`)throw this.#f(e,ge(i.version,this.#i));if(i.kind===`unrecognized`)return await this.#m(e,`malformed transport key pair entry`),null;let a=this.#a;if(a===void 0)return i.kind===`plaintext`?await this.#p(e,i.keyPair.expiresAt)?null:i.keyPair:this.#d(e,`wrapped-without-secret`);if(i.kind===`plaintext`)return this.#d(e,`unwrapped-under-secret`);if(i.kind===`corrupt-wrapped`)return this.#d(e,`corrupt-wrapped`);if(await this.#p(e,i.expiresAt))return null;try{return await i.decode(a,n)}catch(n){if(!te(n))throw this.#r.error(`transport key pair unwrap failed unexpectedly`,{key:e,error:n}),new t.ct(`Transport key pair unwrap failed unexpectedly.`,{cause:n});return this.#d(e,`unwrap-failed`,n)}}async#d(e,t,n){if(this.#i!==void 0)throw this.#f(e,me(t,this.#i),n);if(t===`wrapped-without-secret`)throw this.#f(e,`Transport key pair for this signer is wrapped, but this instance has no transportKeyPairDerivationSecret configured. Configure the same transportKeyPairDerivationSecret the entry was written with. To downgrade to plaintext at rest on purpose, discard the stored entry first by calling permits.clear(), then run without the secret.`,n);let r=he[t];return this.#r.warn(r,{key:e}),await this.#m(e,r),null}#f(e,n,r){return this.#r.error(n,{key:e}),new t.ct(n,{cause:r})}async#p(e,n){return t.H()<n?!1:(await this.#m(e,`expired transport key pair entry`),!0)}async#m(e,n){this.#r.debug(`discarding transport key pair entry`,{key:e,reason:n}),await t.W(`delete transport key pair entry`,()=>this.#t.delete(e),this.#r)}async getOrCreate(e,t){return this.#h(this.#l(e),this.#c(e),{strict:t?.strict})}async#h(e,n,r){let i=r?.strict??!1,a=`${e}::${i}`,o=this.#o.get(a);if(o)return o;let s=this.#s.get(e)??0,c=(async()=>{let r=await this.#u(e,n);if(r!==null)return r;let a=await this.#e(),o=t.H(),c=o+this.#n,l={publicKey:a.publicKey,privateKey:a.privateKey,createdAt:o,expiresAt:c};a.tkmsVersion&&(l.tkmsVersion=a.tkmsVersion);let u=l;if(this.#a!==void 0)try{u=await z(l,this.#a,n)}catch(n){let r=`Failed to wrap the transport private key for at-rest storage.`;throw this.#r.error(r,{key:e,error:n}),new t.ct(r,{cause:n})}if((this.#s.get(e)??0)===s)i?await this.#t.set(e,u):await t.W(`persist transport key pair`,()=>this.#t.set(e,u),this.#r);else if(i)throw new t.pt(`The transport key pair was rotated while it was being generated, so the freshly generated key pair could not be persisted. Retry.`);return l})().finally(()=>{this.#o.delete(a)});return this.#o.set(a,c),c}async clear(e){let n=B(e);await t.W(`delete transport key pair entry`,()=>this.#t.delete(n),this.#r)}async evict(e){let n=this.#l(e);await t.W(`evict transport key pair entry`,()=>this.#t.delete(n),this.#r)}async clearScope(){if(this.#i===void 0)return;let e=V(this.#i);this.#s.set(e,(this.#s.get(e)??0)+1),await this.#t.delete(e)}async warmScope(){this.#i!==void 0&&await this.#h(V(this.#i),W(this.#i),{strict:!0})}};function G(e){return e.version===2&&e.contractAddresses.length===0}function ve(e,t){return G(e)||e.contractAddresses.includes(t)}function K(e,t){return G(e)||e.contractAddresses.some(e=>t.has(e))}function q(e,t){if(e.some(G))return[];let n=new Set(e.flatMap(e=>e.contractAddresses));return t.filter(e=>!n.has(e))}function ye(e){let t=[];for(let n=0;n<e.length;n+=10)t.push(e.slice(n,n+10));return t}function be(e){return e.version===1?e.durationDays*t.z:e.durationSeconds}function xe(e,t,n){return e.filter(e=>e.keypairPublicKey===t&&n<e.startTimestamp+be(e))}function Se(e,t){let n=new Set(t);return e.filter(e=>!K(e,n))}function J(e,t){return[...new Set([...e,...t])].sort()}function Ce(e,t,n){let r=new Set(n),i=e.filter(e=>!G(e)&&new Set([...e.contractAddresses,...t]).size<=10);if(i.length===0)return null;function a(e){return e.contractAddresses.reduce((e,t)=>e+ +!!r.has(t),0)}let o=Math.max(...i.map(a));return i.filter(e=>a(e)===o).reduce((e,t)=>t.startTimestamp>e.startTimestamp?t:e)}function we(e){return typeof e!=`object`||!e||Array.isArray(e)||`version`in e?e:{...e,version:1}}var Te=class{#e;#t;constructor(e){this.#e=e.storage,this.#t=e.logger}async list(e){let t=H(e),n=await this.#e.get(t);if(n==null)return[];let r=Array.isArray(n)?n.map(we):n,i=ce.safeParse(r);return i.success?i.data:(await this.clearScope(e),[])}async listUsableAndPrune(e,n){let r=await this.list(e),i=xe(r,n,Math.floor(Date.now()/1e3));return i.length!==r.length&&(i.length===0?await this.clearScope(e):await t.W(`update permit entry`,()=>this.#e.set(H(e),i),this.#t)),i}async append(e,t){if(t.length===0)return;let n=t.map(e=>j.parse(e)),r=await this.list(e);await this.#e.set(H(e),[...r,...n]),await this.#r(e)}async replace(e,t,n){let r=j.parse(n),i=(await this.list(e)).filter(e=>e.serializedPermit.signature!==t);await this.#e.set(H(e),[...i,r]),await this.#r(e)}async deletePermitsTouching(e,t){let n=await this.list(e);if(n.length===0)return;let r=Se(n,t);r.length===0?await this.clearScope(e):await this.#e.set(H(e),r)}async clearScope(e){await this.#a(H(e)),await this.#i(e)}async clearAllForSigner(e){let n=U(e),r=await this.#n(n);await Promise.all(r.map(e=>this.#a(e))),await t.W(`delete permit index`,()=>this.#e.delete(n),this.#t)}async#n(e){let n=await this.#e.get(e);if(n==null)return[];let r=le.safeParse(n);return r.success?r.data:(await t.W(`delete permit index`,()=>this.#e.delete(e),this.#t),[])}async#r(e){let t=U(e.signerAddress),n=H(e),r=await this.#n(t);r.includes(n)||await this.#e.set(t,[...r,n])}async#i(e){let n=U(e.signerAddress),r=H(e),i=await this.#n(n),a=i.filter(e=>e!==r);a.length!==i.length&&(a.length===0?await t.W(`delete permit index`,()=>this.#e.delete(n),this.#t):await t.W(`update permit index`,()=>this.#e.set(n,a),this.#t))}async#a(e){await t.W(`delete permit entry`,()=>this.#e.delete(e),this.#t)}};const Ee=30*t.z;var De=class{#e;#t;#n;#r;#i;#a;#o;#s=new Map;constructor(e){this.#e=new _e({generator:async()=>{let t=e.router.relayer,n=await t.generateTransportKeyPair();return t.serializeTransportKeyPair({transportKeyPair:n})},storage:e.storage,ttl:e.transportKeyPairTTL,logger:e.logger,scope:e.scope,derivationSecret:e.derivationSecret}),this.#t=new Te({storage:e.permitStorage??e.storage,logger:e.logger}),this.#n=e.router,this.#r=e.signer,this.#i=e.permitTTL,this.#a=e.logger,this.#o=e.scope}#c(e){if(!this.#r)throw new t.Q(e);return this.#r}async grantPermit(e,n){let r=t.G(this.#c(`grantPermit`).requireWalletAccount(`grantPermit`).address);if(e===`wildcard`){let e=await this.#e.getOrCreate(r),i=this.#l(r,n),a=(await this.#t.listUsableAndPrune(i,e.publicKey)).find(G);if(a)return{keypair:e,permissions:[a]};let o=await this.#u({version:2,chunk:[],keypair:e,scope:i});return await t.W(`persist permit`,()=>this.#t.append(i,[o]),this.#a),{keypair:e,permissions:[o]}}let i=t.V(e),a=await this.#e.getOrCreate(r);if(i.length===0)return{keypair:a,permissions:[]};let o=this.#l(r,n),s=await this.#t.listUsableAndPrune(o,a.publicKey),c=q(s,i);if(c.length>0){let e=Ce(s,c,i);if(e!==null){let n=J(e.contractAddresses,c),r=await this.#u({version:1,chunk:n,keypair:a,scope:o});await t.W(`replace permit`,()=>this.#t.replace(o,e.serializedPermit.signature,r),this.#a),s[s.indexOf(e)]=r}else for(let e of ye(c)){let n=await this.#u({version:1,chunk:e,keypair:a,scope:o});s.push(n),await t.W(`persist permit`,()=>this.#t.append(o,[n]),this.#a)}}let l=new Set(i);return{keypair:a,permissions:s.filter(e=>K(e,l))}}async preparePermit(n){let r=t.G(n.signer),i=t.V(n.contracts);if(i.length===0)throw new e.t(`preparePermit: request.contracts must not be empty.`);if(i.length>10)throw new e.t(`preparePermit: request.contracts must not exceed 10 addresses per call (got ${i.length}) — grantPermit chunks automatically, preparePermit does not.`);let a=n.delegator?t.G(n.delegator):void 0;if(a!==void 0&&a===r)throw new e.t(`preparePermit: request.delegator must differ from request.signer — self-delegation is not allowed.`);let o=n.durationDays===void 0?this.#i:m(D,n.durationDays),s=this.#n.relayer,c=await this.#e.getOrCreate(r,{strict:!0}),l=await s.parseTransportKeyPair(c),u=t.H();return{version:1,eip712:t.U(O.parse(await s.createUnsignedLegacyDecryptionPermitEip712({transportKeyPair:l,contractAddresses:i,startTimestamp:u,durationSeconds:o*t.z,...a&&{delegatorAddress:a}}))),signerAddress:r}}async registerPermit(n,r){let i=m(ue,n),a=this.#n.relayer,o=this.#n.chain.id,{domain:s,message:c}=i.eip712,l=Number(s.chainId);if(l!==o)throw new t.ut({preparedChainId:l,activeChainId:o});let u=Number(c.startTimestamp),d=Number(c.durationDays);if(t.H()>=u+d*86400)throw new t.dt(`registerPermit: the prepared permit's validity window (starting ${u}, ${d}d) has already elapsed — call preparePermit again.`);let f=i.signerAddress,p=await this.#e.readStored(f);if(p===null||p.publicKey!==c.publicKey)throw new t.pt(`registerPermit: the transport key pair changed since preparePermit ran — call preparePermit again to rebind the signature request to the current key pair.`);let h=await a.parseTransportKeyPair(p),g;try{g=await a.parseSignedDecryptionPermit({serializedPermit:{version:i.version,eip712:i.eip712,signature:r,signerAddress:f},transportKeyPair:h})}catch(n){throw n instanceof e.r?n:t.ot(n,`registerPermit: signature verification failed`)}if(g.version!==1)throw new e.t(`registerPermit: expected a V1 signed permit, got version ${g.version}.`);let _=k.parse(await a.serializeSignedDecryptionPermit({signedPermit:g})),v={version:1,keypairPublicKey:p.publicKey,contractAddresses:t.V(g.eip712.message.contractAddresses),serializedPermit:_,startTimestamp:Number(g.eip712.message.startTimestamp),durationDays:Number(g.eip712.message.durationDays)},y={signerAddress:f,chainId:o,delegatorAddress:t.G(g.encryptedDataOwnerAddress)};await this.#t.replace(y,_.signature,v)}async hasPermit(e,n){if(e.length===0)return!0;let r=this.#r?.walletAccount.getSnapshot();if(!r)return!1;let i=t.G(r.address),a;try{a=await this.#e.readStored(i)}catch(e){if(!(e instanceof t.ct))throw e;return!1}if(a===null)return!1;let o=this.#l(i,n);return q(await this.#t.listUsableAndPrune(o,a.publicKey),t.V(e)).length===0}async revokePermits(e){let n=t.G(this.#c(`revokePermits`).requireWalletAccount(`revokePermits`).address);if(e===void 0){await this.#t.clearAllForSigner(n);return}let r=t.V(e);r.length!==0&&await this.#t.deletePermitsTouching(this.#l(n),r)}#l(e,n){return{signerAddress:e,chainId:this.#n.chain.id,delegatorAddress:n?t.G(n):e}}async clearCredentials(){let e=t.G(this.#c(`clearCredentials`).requireWalletAccount(`clearCredentials`).address);await this.#e.clear(e),await this.#t.clearAllForSigner(e)}async revokeTransportKeyPair(t){if(this.#o===void 0)throw new e.t(`revokeTransportKeyPair() requires a transportKeyPairScope to be configured on this SDK instance — there is no shared key pair to revoke.`);if(t!==this.#o)throw new e.t(`revokeTransportKeyPair("${t}") does not match the configured scope ("${this.#o}").`);await this.#e.clearScope()}async warmTransportKeyPair(e){await this.#e.getOrCreate(t.G(e))}async warmTransportKeyPairScope(t){if(this.#o===void 0)throw new e.t(`warmTransportKeyPairScope() requires a transportKeyPairScope to be configured on this SDK instance — there is no shared key pair to warm.`);if(t!==this.#o)throw new e.t(`warmTransportKeyPairScope("${t}") does not match the configured scope ("${this.#o}").`);await this.#e.warmScope()}async handleWalletAccountChange(e,n){let r=e?t.G(e.address):void 0;r!==(n?t.G(n.address):void 0)&&r&&(await this.#e.clear(r),await this.#t.clearAllForSigner(r))}async#u(n){let{version:r,chunk:i,keypair:a,scope:o}=n,s=t.H(),c=o.delegatorAddress!==o.signerAddress,l=this.#n.relayer;try{let e=await l.parseTransportKeyPair(a),n=this.#i*t.z,u={transportKeyPair:e,contractAddresses:i,startTimestamp:s,durationSeconds:n,signerAddress:o.signerAddress,signer:this.#c(`signPermit`)},d=await(r===2?l.signUnifiedDecryptionPermit:l.signDecryptionPermit)(c?{...u,delegatorAddress:o.delegatorAddress}:u),f=k.parse(await l.serializeSignedDecryptionPermit({signedPermit:d}));return r===2?{version:2,keypairPublicKey:a.publicKey,contractAddresses:i,serializedPermit:f,startTimestamp:s,durationSeconds:n}:{version:1,keypairPublicKey:a.publicKey,contractAddresses:i,serializedPermit:f,startTimestamp:s,durationDays:this.#i}}catch(n){throw n instanceof e.r?n:n instanceof Error&&e._(n.message)?new t.ht(`grantPermit: V2 (unified) decryption permits — including wildcard permits — require protocol v0.14 or later on this network. The connected chain hasn't upgraded yet (or its ProtocolConfig contract address isn't configured on this FheChain). Grant a V1 permit with an explicit contract list instead, or retry once the network upgrades.`,{cause:n}):(n instanceof Error&&e.d(n.message)&&await this.#e.evict(o.signerAddress),t.ot(n,`Credential signing failed`))}}async evictTransportKeyPair(){let e=this.#r?.walletAccount.getSnapshot();e&&await this.#e.evict(t.G(e.address))}async recoverPermits(e,n,r){let i=this.#c(`recoverPermits`).requireWalletAccount(`recoverPermits`),a=this.#l(t.G(i.address),n),o=H(a),s=this.#s.get(o);if(s)return await s,this.grantPermit(e,n);let c=await this.#d(a),l=this.#s.get(o);if(l)return await l,this.grantPermit(e,n);if(c===null)return this.grantPermit(e,n);let u=new Set(r??[]);if(u.size>0&&!c.some(e=>u.has(e.serializedPermit.signature)))return this.grantPermit(e,n);let d=c.filter(e=>!u.has(e.serializedPermit.signature)),f=c.flatMap(e=>e.contractAddresses),p=this.#f(a,f,e,d,n).finally(()=>{this.#s.delete(o)});return this.#s.set(o,p),await p,this.grantPermit(e,n)}async#d(e){try{return await this.#t.list(e)}catch(e){return this.#a.warn(`read permits for recovery failed`,{error:e}),null}}async#f(e,n,r,i,a){await t.W(`evict revoked permits`,()=>this.#t.clearScope(e),this.#a);try{await this.grantPermit(J(n,t.V(r)),a)}catch(n){throw i.length>0&&await t.W(`restore surviving permits`,async()=>{let t=await this.#t.list(e),n=new Set(t.map(e=>e.serializedPermit.signature)),r=i.filter(e=>!n.has(e.serializedPermit.signature));r.length>0&&await this.#t.append(e,r)},this.#a),n}}},Oe=class{#e;#t=`[zama-sdk]`;constructor(e){this.#e=e}error(e,t){this.#e?.error(`${this.#t} ${e}`,t)}warn(e,t){this.#e?.warn(`${this.#t} ${e}`,t)}info(e,t){this.#e?.info(`${this.#t} ${e}`,t)}debug(e,t){this.#e?.debug(`${this.#t} ${e}`,t)}};const Y={[n.s.id]:n.s.registryAddress,[n.c.id]:n.c.registryAddress,[n.u.id]:n.u.registryAddress,[n.l.id]:n.l.registryAddress,[n.a.id]:n.a.registryAddress,[n.o.id]:n.o.registryAddress,[n.n.id]:n.n.registryAddress},ke=a.z.record(a.z.string().check(a.z.regex(/^\d+$/,`expected numeric chain id key`)),t.K),X=t.J,Z=300*1e3;var Ae=class{provider;#e;#t;#n=new Map;constructor(e){this.provider=e.provider,this.#e=Object.assign({},Y,m(a.z.optional(ke),e.registryAddresses)),this.#t=m(X,e.registryTTL??86400)*1e3}getAddress(e){return this.#e[e]}#r(e){let t=this.#n.get(e);if(t){if(Date.now()>=t.expiresAt){this.#n.delete(e);return}return t.data}}#i(e,t,n=this.#t){return this.#n.set(e,{data:t,expiresAt:Date.now()+n}),t}refresh(){this.#n.clear()}get ttlMs(){return this.#t}async getRegistryAddress(){let t=await this.provider.getChainId(),n=this.#e[t];if(!n)throw new e.t(`No wrappers registry address configured for chain ${t}.\nPass a registryAddresses entry for this chain.`);return(0,i.getAddress)(n)}async listPairs(n={}){let r=n.page??1,i=n.pageSize??100,a=n.metadata??!1;if(r<1)throw new e.t(`page must be >= 1, got ${r}`);if(i<1)throw new e.t(`pageSize must be >= 1, got ${i}`);let o=await this.getRegistryAddress(),s=`total:${o}`,c=this.#r(s);if(c===void 0){let e=await this.provider.readContract(t.s(o));c=this.#i(s,Number(e))}let l=BigInt((r-1)*i),u=l+BigInt(i)>BigInt(c)?BigInt(c):l+BigInt(i);if(l>=BigInt(c))return{items:[],total:c,page:r,pageSize:i};let d=`slice:${o}:${l}:${u}`,f=this.#r(d);if(f===void 0){let e=await this.provider.readContract(t.c(o,l,u));f=this.#i(d,[...e])}if(!a)return{items:f,total:c,page:r,pageSize:i};let p=`metadata:${o}:${l}:${u}`,m=this.#r(p);if(m===void 0){let e=await Promise.allSettled(f.map(e=>this.#a(e))),t=e.some(e=>e.status===`rejected`),n=e.map((e,t)=>e.status===`fulfilled`?e.value:Object.assign({},f[t],{metadataFailed:!0,underlying:{name:`Unknown`,symbol:`???`,decimals:0,totalSupply:0n},confidential:{name:`Unknown`,symbol:`???`,decimals:0}}));m=this.#i(p,n,t?Z:void 0)}return{items:m,total:c,page:r,pageSize:i}}async#a(e){let[n,r,i,a,o,s,c]=await Promise.all([this.provider.readContract(t.S(e.tokenAddress)),this.provider.readContract(t.C(e.tokenAddress)),this.provider.readContract(t.b(e.tokenAddress)),this.provider.readContract(t.x(e.tokenAddress)),this.provider.readContract(t.S(e.confidentialTokenAddress)),this.provider.readContract(t.C(e.confidentialTokenAddress)),this.provider.readContract(t.b(e.confidentialTokenAddress))]);return{...e,underlying:{name:n,symbol:r,decimals:i,totalSupply:a},confidential:{name:o,symbol:s,decimals:c}}}async getConfidentialToken(e){let n=await this.getRegistryAddress(),r=(0,i.getAddress)(e),a=`ct:${n}:${r}`,o=this.#r(a);if(o!==void 0)return o;let[s,c]=await this.provider.readContract(t.r(n,r));return c===i.zeroAddress?this.#i(a,null,Z):this.#i(a,{confidentialTokenAddress:c,isValid:s})}async getUnderlyingToken(e){let n=await this.getRegistryAddress(),r=(0,i.getAddress)(e),a=`ut:${n}:${r}`,o=this.#r(a);if(o!==void 0)return o;let[s,c]=await this.provider.readContract(t.i(n,r));return c===i.zeroAddress?this.#i(a,null,Z):this.#i(a,{tokenAddress:c,isValid:s})}async getTokenPairs(){let e=await this.getRegistryAddress();return this.provider.readContract(t.o(e))}async getTokenPairsLength(){let e=await this.getRegistryAddress();return this.provider.readContract(t.s(e))}async getTokenPairsSlice(e,n){let r=await this.getRegistryAddress();return this.provider.readContract(t.c(r,e,n))}async getTokenPair(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.a(n,e))}async getConfidentialTokenAddress(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.r(n,(0,i.getAddress)(e)))}async getTokenAddress(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.i(n,(0,i.getAddress)(e)))}async isConfidentialTokenValid(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.l(n,(0,i.getAddress)(e)))}};function je(e,t,n){let i=new Oe(n.logger),a=n.logger;if((0,r.hasFhevmRuntimeConfig)()){let e=`runtime configuration is already set and cannot be changed.`;n.runtime===void 0?i.debug(e):i.warn(e)}else(0,r.setFhevmRuntimeConfig)({wasmAssetLoadMode:`auto`,moduleVersions:`auto`,logger:{error:(e,t)=>a?.error(e,{cause:t}),warn:e=>a?.warn(e),debug:e=>a?.debug(e)},...n.runtime});let{storage:o,permitStorage:s}=d(n.storage,n.permitStorage),c=new p(n.chains,n.relayers);return{chains:n.chains,router:c,provider:t,signer:e,storage:o,permitStorage:s,transportKeyPairTTL:m(ne,n.transportKeyPairTTL??Ee),permitTTL:m(D,n.permitTTL??30),transportKeyPairScope:n.transportKeyPairScope===void 0?void 0:m(re,n.transportKeyPairScope),registryTTL:m(X,n.registryTTL??86400),logger:i,onEvent:n.onEvent}}function Q(e,t){return e?.address===t?.address&&e?.chainId===t?.chainId}var $=class{#e=new Set;#t;#n;constructor(e){this.#t=e,this.#n=e!==void 0}getSnapshot(){return this.#t}isReady(){return this.#n}setSnapshot(e){this.#n=!0;let t=this.#t;Q(t,e)||(this.#t=e,this.#r({previous:t,next:e}))}subscribe(e){this.#e.add(e);let t=this.#t;return t&&e({previous:void 0,next:t}),()=>{this.#e.delete(e)}}#r(e){for(let t of this.#e)t(e)}};function Me(e){return new $(e)}var Ne=class{walletAccount;#e=!1;constructor(e){this.walletAccount=new $(e)}requireWalletAccount(e){let n=this.walletAccount.getSnapshot();if(!n)throw new t.tt(e);return n}dispose(){this.#e||(this.#e=!0,this.onDispose())}[Symbol.dispose](){this.dispose()}onDispose(){}};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return y}});
1
+ const e=require("./relayer.cjs"),t=require("./sdk-events.cjs"),n=require("./chains.cjs");let r=require("@fhevm/sdk/viem"),i=require("viem"),a=require("zod/mini");var o=class{#e=null;#t=null;#n;#r;#i;constructor(e=`CredentialStore`,t=1,n=`credentials`){this.#n=e,this.#r=t,this.#i=n}#a(){return this.#e?Promise.resolve(this.#e):(this.#t||=new Promise((e,t)=>{let n=indexedDB.open(this.#n,this.#r);n.onupgradeneeded=()=>{let e=n.result;e.objectStoreNames.contains(this.#i)||e.createObjectStore(this.#i,{keyPath:`key`})},n.onsuccess=()=>{this.#e=n.result,this.#t=null,this.#e.onversionchange=()=>{this.#e?.close(),this.#e=null,this.#t=null},this.#e.onclose=()=>{this.#e=null,this.#t=null},e(this.#e)},n.onerror=()=>{this.#e=null,this.#t=null,t(n.error)}}),this.#t)}async#o(e,t){let n=await this.#a();return new Promise((r,i)=>{let a=n.transaction(this.#i,e);a.onabort=()=>i(a.error??Error(`Transaction aborted`));let o=t(a.objectStore(this.#i));e===`readonly`?o.onsuccess=()=>r(o.result):a.oncomplete=()=>r(o.result),o.onerror=()=>i(o.error)})}async get(e){return(await this.#o(`readonly`,t=>t.get(e)))?.value??null}async set(e,t){await this.#o(`readwrite`,n=>n.put({key:e,value:t}))}async delete(e){await this.#o(`readwrite`,t=>t.delete(e))}async clear(){await this.#o(`readwrite`,e=>e.clear())}};const s=new o;var c=class{#e=new Map;async get(e){return this.#e.get(e)??null}async set(e,t){this.#e.set(e,t)}async delete(e){this.#e.delete(e)}};const l=new c;function u(){return typeof window<`u`?new o(`CredentialStore`):new c}function d(e=u(),t=e){return{storage:e,permitStorage:t}}function f(t,n){let r=new Map(t.map(e=>[e.id,e]));if(r.size!==t.length){let n=t.map(e=>e.id);throw new e.t(`Duplicate chain id(s) [${[...new Set(n.filter((e,t)=>n.indexOf(e)!==t))].join(`, `)}] in the chains array. Each chain id must appear only once. Note: hardhat and anvil are aliases (both use 31337).`)}let i=new Map(Object.entries(n)),a=new Map;for(let t of r.keys()){let n=r.get(t),o=i.get(String(t));if(!o)throw new e.t(`Chain ${t} has no relayer configured. Add a relayer entry: relayers: { [${t}]: web() }`);if(!n)throw new e.t(`Chain ${t} has a relayer configured but no entry in the chains array. Add the chain config to the chains array.`);a.set(t,{chain:n,relayerConfig:o})}let o=new Set(Object.keys(n).map(Number)),s=new Set([...o].filter(e=>!r.has(e)));if(s.size>0)throw new e.t(`Relayer entries for chain(s) [${[...s].join(`, `)}] have no matching entry in the chains array. Remove them or add the corresponding chain config.`);return a}var p=class{#e;#t;#n;constructor(t,n){if(t.length===0)throw new e.t(`At least one chain is required.`);this.#e=new Map(t.map(e=>[e.id,e])),this.#n=t[0].id;let r=new Map;for(let[e,{relayerConfig:i,chain:a}]of f(t,n))r.set(e,i.createRelayer(a));this.#t=r}get chains(){return[...this.#e.values()]}get chain(){let t=this.#e.get(this.#n);if(t===void 0)throw new e.t(`Chain ${this.#n} is not configured. Add it to the chains array.`);return t}switchChain(e){this.#n=e}get relayer(){let t=this.#t.get(this.chain.id);if(t===void 0)throw new e.t(`No relayer configured for chain ${this.#n}. Add it to the relayers object.`);return t}};function m(t,n){let r=a.z.safeParse(t,n);if(r.success)return r.data;throw new e.t(a.z.prettifyError(r.error),{cause:r.error})}const h={version:1,info:`zama-sdk-keypair-wrapping-v1`,ivLengthBytes:12,tagLengthBytes:16};function g(e){return new Uint8Array(e)}function _(e){return g(new TextEncoder().encode(JSON.stringify([e.publicKey,e.createdAt,e.expiresAt,e.tkmsVersion??null])))}function v(e){return typeof e==`string`?new TextEncoder().encode(e):g(e)}var y=class{#e;#t;constructor(e){this.#e=e}async baseKey(){return this.#t??=this.#n(this.#e),this.#t}async#n(e){let t=v(e),n=await crypto.subtle.importKey(`raw`,t,`HKDF`,!1,[`deriveKey`]);return t.fill(0),e instanceof Uint8Array&&e.fill(0),this.#e=void 0,n}};async function b(e,t){let n=await e.baseKey();return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:new TextEncoder().encode(t),info:new TextEncoder().encode(h.info)},n,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}async function x(e,t,n,r){let a=await b(t,n),o=crypto.getRandomValues(new Uint8Array(h.ivLengthBytes)),s=await crypto.subtle.encrypt({name:`AES-GCM`,iv:o,additionalData:_(r)},a,g((0,i.toBytes)(e)));return{wrappedPrivateKey:(0,i.toHex)(new Uint8Array(s)),iv:(0,i.toHex)(o)}}async function ee(e,t,n,r){let a=await b(t,n),o=await crypto.subtle.decrypt({name:`AES-GCM`,iv:g((0,i.toBytes)(e.iv)),additionalData:_(r)},a,g((0,i.toBytes)(e.wrappedPrivateKey)));return(0,i.toHex)(new Uint8Array(o))}function te(e){return typeof e==`object`&&!!e&&`name`in e&&e.name===`OperationError`}const S=`transportKeyPairTTL must be a positive integer number of seconds`,C=`permitTTL must be a positive integer number of days`,w=`transportKeyPairScope must be a non-empty string`,T=`transportKeyPairDerivationSecret must be a Uint8Array of at least 32 bytes or a string of at least 64 characters (256 bits of entropy): source it from a CSPRNG or secrets manager, not a human-memorable passphrase`,E=365*t.z,ne=a.z.int({error:S}).check(a.z.positive({error:S}),a.z.maximum(E,`transportKeyPairTTL must not exceed the fhevm ACL maximum of ${E}s (365 days)`)),D=a.z.int({error:C}).check(a.z.positive({error:C}),a.z.maximum(365,`permitTTL must not exceed the V1 permit maximum of 365 days`)),re=a.z.string({error:w}).check(a.z.minLength(1,w)),ie=a.z.union([a.z.string({error:T}).check(a.z.minLength(64,T)),a.z.instanceof(Uint8Array,{error:T}).check(a.z.refine(e=>e.byteLength>=32,{error:T}))],{error:T}),ae=a.z.object({publicKey:t.q,privateKey:t.q,createdAt:t.Z,expiresAt:t.X,tkmsVersion:a.z.optional(a.z.string())}),O=a.z.object({domain:a.z.record(a.z.string(),a.z.unknown()),primaryType:a.z.optional(a.z.string()),types:a.z.record(a.z.string(),a.z.array(a.z.object({name:a.z.string(),type:a.z.string()}))),message:a.z.record(a.z.string(),a.z.unknown())}),k=a.z.object({version:a.z.int().check(a.z.positive()),eip712:O,signature:t.q,signerAddress:t.K,delegatorAddress:a.z.optional(t.K)}),A={keypairPublicKey:t.q,contractAddresses:a.z.array(t.K).check(a.z.maxLength(10)),serializedPermit:k,startTimestamp:t.Z},oe=a.z.object({...A,version:a.z.literal(1),durationDays:t.Y}),se=a.z.object({...A,version:a.z.literal(2),durationSeconds:t.X}),j=a.z.union([oe,se]),ce=a.z.array(j),le=a.z.array(a.z.string()),ue=a.z.object({version:a.z.literal(1),eip712:O,signerAddress:t.K}),de=`iv must be a ${h.ivLengthBytes}-byte hex string`,fe=`wrappedPrivateKey must be a whole number of bytes and at least ${h.tagLengthBytes} bytes (the AES-GCM authentication tag)`;function M(e){return(e.length-2)/2}const pe=a.z.object({wrappingVersion:a.z.literal(h.version,{error:`wrappingVersion must be a wrapping scheme this SDK can read`}),publicKey:t.q,wrappedPrivateKey:t.q.check(a.z.refine(e=>e.length%2==0&&M(e)>=h.tagLengthBytes,{error:fe})),iv:t.q.check(a.z.refine(e=>M(e)===h.ivLengthBytes,{error:de})),createdAt:t.Z,expiresAt:t.X,tkmsVersion:a.z.optional(a.z.string())});function N(e){let t={publicKey:e.publicKey,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(t.tkmsVersion=e.tkmsVersion),t}const P={version:h.version,schema:pe,async encode(e,t,n){let{wrappedPrivateKey:r,iv:i}=await x(e.privateKey,t,n,N(e)),a={wrappingVersion:h.version,publicKey:e.publicKey,wrappedPrivateKey:r,iv:i,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(a.tkmsVersion=e.tkmsVersion),a},async decode(e,t,n){let r=await ee({wrappedPrivateKey:e.wrappedPrivateKey,iv:e.iv},t,n,N(e)),i={publicKey:e.publicKey,privateKey:r,createdAt:e.createdAt,expiresAt:e.expiresAt};return e.tkmsVersion&&(i.tkmsVersion=e.tkmsVersion),i}},F=new Map([[P.version,P]]),I=P;function L(e){let t=e;return t.wrappingVersion!==void 0||t.wrappedPrivateKey!==void 0&&t.iv!==void 0}function R(e){if(typeof e!=`object`||!e||!L(e)){let t=ae.safeParse(e);return t.success?{kind:`plaintext`,keyPair:t.data}:{kind:`unrecognized`}}let t=e.wrappingVersion,n=typeof t==`number`?F.get(t):void 0;if(n===void 0)return{kind:`unsupported-version`,version:t};let r=n.schema.safeParse(e);if(!r.success)return{kind:`corrupt-wrapped`};let i=r.data;return{kind:`wrapped`,expiresAt:i.expiresAt,decode:(e,t)=>n.decode(i,e,t)}}function z(e,t,n){return I.encode(e,t,n)}function B(e){return`keypair:${e}`}function V(e){return`keypair:scope:${e}`}function H(e){return`permits:${e.signerAddress}:${e.chainId}:${e.delegatorAddress}`}function U(e){return`permits-index:${e}`}function W(e){return`scope:${e}`}function me(e,t){return{"wrapped-without-secret":`Transport key pair for scope "${t}" is wrapped, but this instance has no transportKeyPairDerivationSecret configured. Every instance sharing this scope must use the same transportKeyPairDerivationSecret; once they do, call permits.revokeTransportKeyPair() to rotate the entry.`,"unwrapped-under-secret":`Transport key pair for scope "${t}" is stored unwrapped, but this instance is configured with a transportKeyPairDerivationSecret. A peer instance sharing this scope is running without the secret: configure the same transportKeyPairDerivationSecret everywhere, then call permits.revokeTransportKeyPair() to migrate the scope to a wrapped entry.`,"unwrap-failed":`Transport key pair for scope "${t}" failed to unwrap. This usually means another instance created it with a different transportKeyPairDerivationSecret: every instance sharing this scope must use the same secret. It can also mean the stored entry is corrupted.`,"corrupt-wrapped":`Transport key pair for scope "${t}" is wrapped but structurally invalid: the stored iv or ciphertext is not a shape this wrapping scheme can produce. This usually means the stored entry is corrupted, or instances sharing this scope are running mismatched wrapping-scheme versions.`}[e]}const he={"unwrapped-under-secret":`unwrapped transport key pair entry found while a transportKeyPairDerivationSecret is configured`,"unwrap-failed":`transport key pair entry failed to unwrap (wrong transportKeyPairDerivationSecret?)`,"corrupt-wrapped":`structurally invalid wrapped transport key pair entry`};function ge(e,t){let n=typeof e==`number`?`wrappingVersion ${e}`:`no wrappingVersion this build recognizes`;return`Transport key pair ${t===void 0?`for this signer`:`for scope "${t}"`} was written under a wrapping scheme this SDK build cannot read (${n}). The entry is preserved instead of regenerated, since an instance that understands the scheme may still be using it: ${t===void 0?`run a build that supports it, or call permits.clear() to discard the entry deliberately`:`run a build that supports it everywhere, or call permits.revokeTransportKeyPair() to rotate the scope`}.`}var _e=class{#e;#t;#n;#r;#i;#a;#o=new Map;#s=new Map;constructor(e){this.#e=e.generator,this.#t=e.storage,this.#n=e.ttl,this.#r=e.logger,this.#i=e.scope,this.#a=e.derivationSecret}#c(e){return this.#i===void 0?`signer:${e}`:W(this.#i)}#l(e){return this.#i===void 0?B(e):V(this.#i)}async readStored(e){return this.#u(this.#l(e),this.#c(e))}async#u(e,n){let r=await this.#t.get(e);if(r==null)return null;let i=R(r);if(i.kind===`unsupported-version`)throw this.#f(e,ge(i.version,this.#i));if(i.kind===`unrecognized`)return await this.#m(e,`malformed transport key pair entry`),null;let a=this.#a;if(a===void 0)return i.kind===`plaintext`?await this.#p(e,i.keyPair.expiresAt)?null:i.keyPair:this.#d(e,`wrapped-without-secret`);if(i.kind===`plaintext`)return this.#d(e,`unwrapped-under-secret`);if(i.kind===`corrupt-wrapped`)return this.#d(e,`corrupt-wrapped`);if(await this.#p(e,i.expiresAt))return null;try{return await i.decode(a,n)}catch(n){if(!te(n))throw this.#r.error(`transport key pair unwrap failed unexpectedly`,{key:e,error:n}),new t.ct(`Transport key pair unwrap failed unexpectedly.`,{cause:n});return this.#d(e,`unwrap-failed`,n)}}async#d(e,t,n){if(this.#i!==void 0)throw this.#f(e,me(t,this.#i),n);if(t===`wrapped-without-secret`)throw this.#f(e,`Transport key pair for this signer is wrapped, but this instance has no transportKeyPairDerivationSecret configured. Configure the same transportKeyPairDerivationSecret the entry was written with. To downgrade to plaintext at rest on purpose, discard the stored entry first by calling permits.clear(), then run without the secret.`,n);let r=he[t];return this.#r.warn(r,{key:e}),await this.#m(e,r),null}#f(e,n,r){return this.#r.error(n,{key:e}),new t.ct(n,{cause:r})}async#p(e,n){return t.H()<n?!1:(await this.#m(e,`expired transport key pair entry`),!0)}async#m(e,n){this.#r.debug(`discarding transport key pair entry`,{key:e,reason:n}),await t.W(`delete transport key pair entry`,()=>this.#t.delete(e),this.#r)}async getOrCreate(e,t){return this.#h(this.#l(e),this.#c(e),{strict:t?.strict})}async#h(e,n,r){let i=r?.strict??!1,a=`${e}::${i}`,o=this.#o.get(a);if(o)return o;let s=this.#s.get(e)??0,c=(async()=>{let r=await this.#u(e,n);if(r!==null)return r;let a=await this.#e(),o=t.H(),c=o+this.#n,l={publicKey:a.publicKey,privateKey:a.privateKey,createdAt:o,expiresAt:c};a.tkmsVersion&&(l.tkmsVersion=a.tkmsVersion);let u=l;if(this.#a!==void 0)try{u=await z(l,this.#a,n)}catch(n){let r=`Failed to wrap the transport private key for at-rest storage.`;throw this.#r.error(r,{key:e,error:n}),new t.ct(r,{cause:n})}if((this.#s.get(e)??0)===s)i?await this.#t.set(e,u):await t.W(`persist transport key pair`,()=>this.#t.set(e,u),this.#r);else if(i)throw new t.pt(`The transport key pair was rotated while it was being generated, so the freshly generated key pair could not be persisted. Retry.`);return l})().finally(()=>{this.#o.delete(a)});return this.#o.set(a,c),c}async clear(e){let n=B(e);await t.W(`delete transport key pair entry`,()=>this.#t.delete(n),this.#r)}async evict(e){let n=this.#l(e);await t.W(`evict transport key pair entry`,()=>this.#t.delete(n),this.#r)}async clearScope(){if(this.#i===void 0)return;let e=V(this.#i);this.#s.set(e,(this.#s.get(e)??0)+1),await this.#t.delete(e)}async warmScope(){this.#i!==void 0&&await this.#h(V(this.#i),W(this.#i),{strict:!0})}};function G(e){return e.version===2&&e.contractAddresses.length===0}function ve(e,t){return G(e)||e.contractAddresses.includes(t)}function K(e,t){return G(e)||e.contractAddresses.some(e=>t.has(e))}function q(e,t){if(e.some(G))return[];let n=new Set(e.flatMap(e=>e.contractAddresses));return t.filter(e=>!n.has(e))}function ye(e){let t=[];for(let n=0;n<e.length;n+=10)t.push(e.slice(n,n+10));return t}function be(e){return e.version===1?e.durationDays*t.z:e.durationSeconds}function xe(e,t,n){return e.filter(e=>e.keypairPublicKey===t&&n<e.startTimestamp+be(e))}function Se(e,t){let n=new Set(t);return e.filter(e=>!K(e,n))}function J(e,t){return[...new Set([...e,...t])].sort()}function Ce(e,t,n){let r=new Set(n),i=e.filter(e=>!G(e)&&new Set([...e.contractAddresses,...t]).size<=10);if(i.length===0)return null;function a(e){return e.contractAddresses.reduce((e,t)=>e+ +!!r.has(t),0)}let o=Math.max(...i.map(a));return i.filter(e=>a(e)===o).reduce((e,t)=>t.startTimestamp>e.startTimestamp?t:e)}function we(e){return typeof e!=`object`||!e||Array.isArray(e)||`version`in e?e:{...e,version:1}}var Te=class{#e;#t;constructor(e){this.#e=e.storage,this.#t=e.logger}async list(e){let t=H(e),n=await this.#e.get(t);if(n==null)return[];let r=Array.isArray(n)?n.map(we):n,i=ce.safeParse(r);return i.success?i.data:(await this.clearScope(e),[])}async listUsableAndPrune(e,n){let r=await this.list(e),i=xe(r,n,Math.floor(Date.now()/1e3));return i.length!==r.length&&(i.length===0?await this.clearScope(e):await t.W(`update permit entry`,()=>this.#e.set(H(e),i),this.#t)),i}async append(e,t){if(t.length===0)return;let n=t.map(e=>j.parse(e)),r=await this.list(e);await this.#e.set(H(e),[...r,...n]),await this.#r(e)}async replace(e,t,n){let r=j.parse(n),i=(await this.list(e)).filter(e=>e.serializedPermit.signature!==t);await this.#e.set(H(e),[...i,r]),await this.#r(e)}async deletePermitsTouching(e,t){let n=await this.list(e);if(n.length===0)return;let r=Se(n,t);r.length===0?await this.clearScope(e):await this.#e.set(H(e),r)}async clearScope(e){await this.#a(H(e)),await this.#i(e)}async clearAllForSigner(e){let n=U(e),r=await this.#n(n);await Promise.all(r.map(e=>this.#a(e))),await t.W(`delete permit index`,()=>this.#e.delete(n),this.#t)}async#n(e){let n=await this.#e.get(e);if(n==null)return[];let r=le.safeParse(n);return r.success?r.data:(await t.W(`delete permit index`,()=>this.#e.delete(e),this.#t),[])}async#r(e){let t=U(e.signerAddress),n=H(e),r=await this.#n(t);r.includes(n)||await this.#e.set(t,[...r,n])}async#i(e){let n=U(e.signerAddress),r=H(e),i=await this.#n(n),a=i.filter(e=>e!==r);a.length!==i.length&&(a.length===0?await t.W(`delete permit index`,()=>this.#e.delete(n),this.#t):await t.W(`update permit index`,()=>this.#e.set(n,a),this.#t))}async#a(e){await t.W(`delete permit entry`,()=>this.#e.delete(e),this.#t)}};const Ee=30*t.z;var De=class{#e;#t;#n;#r;#i;#a;#o;#s=new Map;constructor(e){this.#e=new _e({generator:async()=>{let t=e.router.relayer,n=await t.generateTransportKeyPair();return t.serializeTransportKeyPair({transportKeyPair:n})},storage:e.storage,ttl:e.transportKeyPairTTL,logger:e.logger,scope:e.scope,derivationSecret:e.derivationSecret}),this.#t=new Te({storage:e.permitStorage??e.storage,logger:e.logger}),this.#n=e.router,this.#r=e.signer,this.#i=e.permitTTL,this.#a=e.logger,this.#o=e.scope}#c(e){if(!this.#r)throw new t.Q(e);return this.#r}async#l(){if(this.#n.chain.protocolConfigContractAddress===void 0)return 1;try{return await this.#n.relayer.canUseUnifiedDecryptionPermit()?2:1}catch{return 1}}async grantPermit(e,n){let r=t.G(this.#c(`grantPermit`).requireWalletAccount(`grantPermit`).address);if(e===`wildcard`){let e=this.#u(r,n),i=await this.#e.getOrCreate(r),a=(await this.#t.listUsableAndPrune(e,i.publicKey)).find(G);if(a)return{keypair:i,permissions:[a]};if(await this.#l()===1)throw new t.gt(`grantPermit: WILDCARD_PERMIT requires V2 (unified) decryption permits, which this network's relayer does not yet support. Grant a V1 permit with an explicit contract list instead, or retry once the relayer upgrades.`);let o=await this.#d({version:2,chunk:[],keypair:i,scope:e});return await t.W(`persist permit`,()=>this.#t.append(e,[o]),this.#a),{keypair:i,permissions:[o]}}let i=t.V(e),a=await this.#e.getOrCreate(r);if(i.length===0)return{keypair:a,permissions:[]};let o=this.#u(r,n),s=await this.#t.listUsableAndPrune(o,a.publicKey),c=q(s,i);if(c.length>0){let e=await this.#l(),n=Ce(s,c,i);if(n!==null){let r=J(n.contractAddresses,c),i=await this.#d({version:e,chunk:r,keypair:a,scope:o});await t.W(`replace permit`,()=>this.#t.replace(o,n.serializedPermit.signature,i),this.#a),s[s.indexOf(n)]=i}else for(let n of ye(c)){let r=await this.#d({version:e,chunk:n,keypair:a,scope:o});s.push(r),await t.W(`persist permit`,()=>this.#t.append(o,[r]),this.#a)}}let l=new Set(i);return{keypair:a,permissions:s.filter(e=>K(e,l))}}async preparePermit(n){let r=t.G(n.signer),i=t.V(n.contracts);if(i.length===0)throw new e.t(`preparePermit: request.contracts must not be empty.`);if(i.length>10)throw new e.t(`preparePermit: request.contracts must not exceed 10 addresses per call (got ${i.length}) — grantPermit chunks automatically, preparePermit does not.`);let a=n.delegator?t.G(n.delegator):void 0;if(a!==void 0&&a===r)throw new e.t(`preparePermit: request.delegator must differ from request.signer — self-delegation is not allowed.`);let o=n.durationDays===void 0?this.#i:m(D,n.durationDays),s=this.#n.relayer,c=await this.#e.getOrCreate(r,{strict:!0}),l=await s.parseTransportKeyPair(c),u=t.H();return{version:1,eip712:t.U(O.parse(await s.createUnsignedLegacyDecryptionPermitEip712({transportKeyPair:l,contractAddresses:i,startTimestamp:u,durationSeconds:o*t.z,...a&&{delegatorAddress:a}}))),signerAddress:r}}async registerPermit(n,r){let i=m(ue,n),a=this.#n.relayer,o=this.#n.chain.id,{domain:s,message:c}=i.eip712,l=Number(s.chainId);if(l!==o)throw new t.ut({preparedChainId:l,activeChainId:o});let u=Number(c.startTimestamp),d=Number(c.durationDays);if(t.H()>=u+d*86400)throw new t.dt(`registerPermit: the prepared permit's validity window (starting ${u}, ${d}d) has already elapsed — call preparePermit again.`);let f=i.signerAddress,p=await this.#e.readStored(f);if(p===null||p.publicKey!==c.publicKey)throw new t.pt(`registerPermit: the transport key pair changed since preparePermit ran — call preparePermit again to rebind the signature request to the current key pair.`);let h=await a.parseTransportKeyPair(p),g;try{g=await a.parseSignedDecryptionPermit({serializedPermit:{version:i.version,eip712:i.eip712,signature:r,signerAddress:f},transportKeyPair:h})}catch(n){throw n instanceof e.r?n:t.ot(n,`registerPermit: signature verification failed`)}if(g.version!==1)throw new e.t(`registerPermit: expected a V1 signed permit, got version ${g.version}.`);let _=k.parse(await a.serializeSignedDecryptionPermit({signedPermit:g})),v={version:1,keypairPublicKey:p.publicKey,contractAddresses:t.V(g.eip712.message.contractAddresses),serializedPermit:_,startTimestamp:Number(g.eip712.message.startTimestamp),durationDays:Number(g.eip712.message.durationDays)},y={signerAddress:f,chainId:o,delegatorAddress:t.G(g.encryptedDataOwnerAddress)};await this.#t.replace(y,_.signature,v)}async hasPermit(e,n){if(e.length===0)return!0;let r=this.#r?.walletAccount.getSnapshot();if(!r)return!1;let i=t.G(r.address),a;try{a=await this.#e.readStored(i)}catch(e){if(!(e instanceof t.ct))throw e;return!1}if(a===null)return!1;let o=this.#u(i,n);return q(await this.#t.listUsableAndPrune(o,a.publicKey),t.V(e)).length===0}async revokePermits(e){let n=t.G(this.#c(`revokePermits`).requireWalletAccount(`revokePermits`).address);if(e===void 0){await this.#t.clearAllForSigner(n);return}let r=t.V(e);r.length!==0&&await this.#t.deletePermitsTouching(this.#u(n),r)}#u(e,n){return{signerAddress:e,chainId:this.#n.chain.id,delegatorAddress:n?t.G(n):e}}async clearCredentials(){let e=t.G(this.#c(`clearCredentials`).requireWalletAccount(`clearCredentials`).address);await this.#e.clear(e),await this.#t.clearAllForSigner(e)}async revokeTransportKeyPair(t){if(this.#o===void 0)throw new e.t(`revokeTransportKeyPair() requires a transportKeyPairScope to be configured on this SDK instance — there is no shared key pair to revoke.`);if(t!==this.#o)throw new e.t(`revokeTransportKeyPair("${t}") does not match the configured scope ("${this.#o}").`);await this.#e.clearScope()}async warmTransportKeyPair(e){await this.#e.getOrCreate(t.G(e))}async warmTransportKeyPairScope(t){if(this.#o===void 0)throw new e.t(`warmTransportKeyPairScope() requires a transportKeyPairScope to be configured on this SDK instance — there is no shared key pair to warm.`);if(t!==this.#o)throw new e.t(`warmTransportKeyPairScope("${t}") does not match the configured scope ("${this.#o}").`);await this.#e.warmScope()}async handleWalletAccountChange(e,n){let r=e?t.G(e.address):void 0;r!==(n?t.G(n.address):void 0)&&r&&(await this.#e.clear(r),await this.#t.clearAllForSigner(r))}async#d(n){let{version:r,chunk:i,keypair:a,scope:o}=n,s=t.H(),c=o.delegatorAddress!==o.signerAddress,l=this.#n.relayer;try{let e=await l.parseTransportKeyPair(a),n=this.#i*t.z,u={transportKeyPair:e,contractAddresses:i,startTimestamp:s,durationSeconds:n,signerAddress:o.signerAddress,signer:this.#c(`signPermit`)},d=await(r===2?l.signUnifiedDecryptionPermit:l.signDecryptionPermit)(c?{...u,delegatorAddress:o.delegatorAddress}:u),f=k.parse(await l.serializeSignedDecryptionPermit({signedPermit:d}));return r===2?{version:2,keypairPublicKey:a.publicKey,contractAddresses:i,serializedPermit:f,startTimestamp:s,durationSeconds:n}:{version:1,keypairPublicKey:a.publicKey,contractAddresses:i,serializedPermit:f,startTimestamp:s,durationDays:this.#i}}catch(n){throw n instanceof e.r?n:n instanceof Error&&e.v(n.message)?new t.gt(`grantPermit: V2 (unified) decryption permits — including wildcard permits — require protocol v0.14 or later on this network. The connected chain hasn't upgraded yet (or its ProtocolConfig contract address isn't configured on this FheChain). Grant a V1 permit with an explicit contract list instead, or retry once the network upgrades.`,{cause:n}):(n instanceof Error&&e.d(n.message)&&await this.#e.evict(o.signerAddress),t.ot(n,`Credential signing failed`))}}async evictTransportKeyPair(){let e=this.#r?.walletAccount.getSnapshot();e&&await this.#e.evict(t.G(e.address))}async recoverPermits(e,n,r){let i=this.#c(`recoverPermits`).requireWalletAccount(`recoverPermits`),a=this.#u(t.G(i.address),n),o=H(a),s=this.#s.get(o);if(s)return await s,this.grantPermit(e,n);let c=await this.#f(a),l=this.#s.get(o);if(l)return await l,this.grantPermit(e,n);if(c===null)return this.grantPermit(e,n);let u=new Set(r??[]);if(u.size>0&&!c.some(e=>u.has(e.serializedPermit.signature)))return this.grantPermit(e,n);let d=c.filter(e=>!u.has(e.serializedPermit.signature)),f=c.flatMap(e=>e.contractAddresses),p=this.#p(a,f,e,d,n).finally(()=>{this.#s.delete(o)});return this.#s.set(o,p),await p,this.grantPermit(e,n)}async#f(e){try{return await this.#t.list(e)}catch(e){return this.#a.warn(`read permits for recovery failed`,{error:e}),null}}async#p(e,n,r,i,a){await t.W(`evict revoked permits`,()=>this.#t.clearScope(e),this.#a);try{await this.grantPermit(J(n,t.V(r)),a)}catch(n){throw i.length>0&&await t.W(`restore surviving permits`,async()=>{let t=await this.#t.list(e),n=new Set(t.map(e=>e.serializedPermit.signature)),r=i.filter(e=>!n.has(e.serializedPermit.signature));r.length>0&&await this.#t.append(e,r)},this.#a),n}}},Oe=class{#e;#t=`[zama-sdk]`;constructor(e){this.#e=e}error(e,t){this.#e?.error(`${this.#t} ${e}`,t)}warn(e,t){this.#e?.warn(`${this.#t} ${e}`,t)}info(e,t){this.#e?.info(`${this.#t} ${e}`,t)}debug(e,t){this.#e?.debug(`${this.#t} ${e}`,t)}};const Y={[n.s.id]:n.s.registryAddress,[n.c.id]:n.c.registryAddress,[n.u.id]:n.u.registryAddress,[n.l.id]:n.l.registryAddress,[n.a.id]:n.a.registryAddress,[n.o.id]:n.o.registryAddress,[n.n.id]:n.n.registryAddress},ke=a.z.record(a.z.string().check(a.z.regex(/^\d+$/,`expected numeric chain id key`)),t.K),X=t.J,Z=300*1e3;var Ae=class{provider;#e;#t;#n=new Map;constructor(e){this.provider=e.provider,this.#e=Object.assign({},Y,m(a.z.optional(ke),e.registryAddresses)),this.#t=m(X,e.registryTTL??86400)*1e3}getAddress(e){return this.#e[e]}#r(e){let t=this.#n.get(e);if(t){if(Date.now()>=t.expiresAt){this.#n.delete(e);return}return t.data}}#i(e,t,n=this.#t){return this.#n.set(e,{data:t,expiresAt:Date.now()+n}),t}refresh(){this.#n.clear()}get ttlMs(){return this.#t}async getRegistryAddress(){let t=await this.provider.getChainId(),n=this.#e[t];if(!n)throw new e.t(`No wrappers registry address configured for chain ${t}.\nPass a registryAddresses entry for this chain.`);return(0,i.getAddress)(n)}async listPairs(n={}){let r=n.page??1,i=n.pageSize??100,a=n.metadata??!1;if(r<1)throw new e.t(`page must be >= 1, got ${r}`);if(i<1)throw new e.t(`pageSize must be >= 1, got ${i}`);let o=await this.getRegistryAddress(),s=`total:${o}`,c=this.#r(s);if(c===void 0){let e=await this.provider.readContract(t.s(o));c=this.#i(s,Number(e))}let l=BigInt((r-1)*i),u=l+BigInt(i)>BigInt(c)?BigInt(c):l+BigInt(i);if(l>=BigInt(c))return{items:[],total:c,page:r,pageSize:i};let d=`slice:${o}:${l}:${u}`,f=this.#r(d);if(f===void 0){let e=await this.provider.readContract(t.c(o,l,u));f=this.#i(d,[...e])}if(!a)return{items:f,total:c,page:r,pageSize:i};let p=`metadata:${o}:${l}:${u}`,m=this.#r(p);if(m===void 0){let e=await Promise.allSettled(f.map(e=>this.#a(e))),t=e.some(e=>e.status===`rejected`),n=e.map((e,t)=>e.status===`fulfilled`?e.value:Object.assign({},f[t],{metadataFailed:!0,underlying:{name:`Unknown`,symbol:`???`,decimals:0,totalSupply:0n},confidential:{name:`Unknown`,symbol:`???`,decimals:0}}));m=this.#i(p,n,t?Z:void 0)}return{items:m,total:c,page:r,pageSize:i}}async#a(e){let[n,r,i,a,o,s,c]=await Promise.all([this.provider.readContract(t.S(e.tokenAddress)),this.provider.readContract(t.C(e.tokenAddress)),this.provider.readContract(t.b(e.tokenAddress)),this.provider.readContract(t.x(e.tokenAddress)),this.provider.readContract(t.S(e.confidentialTokenAddress)),this.provider.readContract(t.C(e.confidentialTokenAddress)),this.provider.readContract(t.b(e.confidentialTokenAddress))]);return{...e,underlying:{name:n,symbol:r,decimals:i,totalSupply:a},confidential:{name:o,symbol:s,decimals:c}}}async getConfidentialToken(e){let n=await this.getRegistryAddress(),r=(0,i.getAddress)(e),a=`ct:${n}:${r}`,o=this.#r(a);if(o!==void 0)return o;let[s,c]=await this.provider.readContract(t.r(n,r));return c===i.zeroAddress?this.#i(a,null,Z):this.#i(a,{confidentialTokenAddress:c,isValid:s})}async getUnderlyingToken(e){let n=await this.getRegistryAddress(),r=(0,i.getAddress)(e),a=`ut:${n}:${r}`,o=this.#r(a);if(o!==void 0)return o;let[s,c]=await this.provider.readContract(t.i(n,r));return c===i.zeroAddress?this.#i(a,null,Z):this.#i(a,{tokenAddress:c,isValid:s})}async getTokenPairs(){let e=await this.getRegistryAddress();return this.provider.readContract(t.o(e))}async getTokenPairsLength(){let e=await this.getRegistryAddress();return this.provider.readContract(t.s(e))}async getTokenPairsSlice(e,n){let r=await this.getRegistryAddress();return this.provider.readContract(t.c(r,e,n))}async getTokenPair(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.a(n,e))}async getConfidentialTokenAddress(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.r(n,(0,i.getAddress)(e)))}async getTokenAddress(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.i(n,(0,i.getAddress)(e)))}async isConfidentialTokenValid(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.l(n,(0,i.getAddress)(e)))}};function je(e,t,n){let i=new Oe(n.logger),a=n.logger;if((0,r.hasFhevmRuntimeConfig)()){let e=`runtime configuration is already set and cannot be changed.`;n.runtime===void 0?i.debug(e):i.warn(e)}else(0,r.setFhevmRuntimeConfig)({wasmAssetLoadMode:`auto`,moduleVersions:`auto`,logger:{error:(e,t)=>a?.error(e,{cause:t}),warn:e=>a?.warn(e),debug:e=>a?.debug(e)},...n.runtime});let{storage:o,permitStorage:s}=d(n.storage,n.permitStorage),c=new p(n.chains,n.relayers);return{chains:n.chains,router:c,provider:t,signer:e,storage:o,permitStorage:s,transportKeyPairTTL:m(ne,n.transportKeyPairTTL??Ee),permitTTL:m(D,n.permitTTL??30),transportKeyPairScope:n.transportKeyPairScope===void 0?void 0:m(re,n.transportKeyPairScope),registryTTL:m(X,n.registryTTL??86400),logger:i,onEvent:n.onEvent}}function Q(e,t){return e?.address===t?.address&&e?.chainId===t?.chainId}var $=class{#e=new Set;#t;#n;constructor(e){this.#t=e,this.#n=e!==void 0}getSnapshot(){return this.#t}isReady(){return this.#n}setSnapshot(e){this.#n=!0;let t=this.#t;Q(t,e)||(this.#t=e,this.#r({previous:t,next:e}))}subscribe(e){this.#e.add(e);let t=this.#t;return t&&e({previous:void 0,next:t}),()=>{this.#e.delete(e)}}#r(e){for(let t of this.#e)t(e)}};function Me(e){return new $(e)}var Ne=class{walletAccount;#e=!1;constructor(e){this.walletAccount=new $(e)}requireWalletAccount(e){let n=this.walletAccount.getSnapshot();if(!n)throw new t.tt(e);return n}dispose(){this.#e||(this.#e=!0,this.onDispose())}[Symbol.dispose](){this.dispose()}onDispose(){}};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return y}});
2
2
  //# sourceMappingURL=base-signer.cjs.map