@zama-fhe/sdk 3.4.0-alpha.5 → 3.4.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/base-signer.cjs +1 -1
- package/dist/cjs/base-signer.cjs.map +1 -1
- package/dist/esm/{base-signer-DuD3xQvI.js → base-signer-9CqICeQ8.js} +2 -2
- package/dist/esm/{base-signer-DuD3xQvI.js.map → base-signer-9CqICeQ8.js.map} +1 -1
- package/dist/esm/ethers/index.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/viem/index.js +1 -1
- package/package.json +2 -2
package/dist/cjs/base-signer.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./relayer.cjs"),t=require("./wrappers-registry.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(e){return(0,i.getAddress)(e)}const h=a.z.custom(e=>typeof e==`string`&&(0,i.isHex)(e,{strict:!0}),`expected 0x-prefixed hex string`),g=a.z.custom(e=>typeof e==`string`&&(0,i.isAddress)(e,{strict:!1}),`expected EVM address`),_=a.z.pipe(g,a.z.transform(m)),v=a.z.int().check(a.z.nonnegative()),y=a.z.int().check(a.z.positive()),ee=a.z.int().check(a.z.nonnegative()),b=a.z.int().check(a.z.positive());a.z.int().check(a.z.positive());const x=86400;function S(){return Math.floor(Date.now()/1e3)}function C(e){return[...new Set(e.map(m))].toSorted()}const w=`transportKeyPairTTL must be a positive integer number of seconds`,T=`permitTTL must be a positive integer number of days`,E=`transportKeyPairScope must be a non-empty string`,D=365*x,O=a.z.int({error:w}).check(a.z.positive({error:w}),a.z.maximum(D,`transportKeyPairTTL must not exceed the fhevm ACL maximum of ${D}s (365 days)`)),k=a.z.int({error:T}).check(a.z.positive({error:T})),A=a.z.string({error:E}).check(a.z.minLength(1,E)),j=a.z.object({publicKey:h,privateKey:h,createdAt:v,expiresAt:y}),M=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())}),N=a.z.object({version:a.z.int().check(a.z.positive()),eip712:M,signature:h,signerAddress:_}),P=a.z.object({keypairPublicKey:h,contractAddresses:a.z.array(_).check(a.z.maxLength(10)),serializedPermit:N,startTimestamp:v,durationDays:b}),te=a.z.array(P),ne=a.z.array(a.z.string());function F(e){return`keypair:${e}`}function I(e){return`keypair:scope:${e}`}function L(e){return`permits:${e.signerAddress}:${e.chainId}:${e.delegatorAddress}`}function R(e){return`permits-index:${e}`}var z=class{#e;#t;#n;#r;#i;#a=new Map;#o=new Map;constructor(e){this.#e=e.generator,this.#t=e.storage,this.#n=e.ttl,this.#r=e.logger,this.#i=e.scope}#s(e){return this.#i===void 0?F(e):I(this.#i)}async readStored(e){return this.#c(this.#s(e))}async#c(e){let n=await this.#t.get(e);if(n==null)return null;let r=j.safeParse(n);if(!r.success)return await t.L(`delete transport key pair entry`,()=>this.#t.delete(e),this.#r),null;let i=r.data;return S()>=i.expiresAt?(await t.L(`delete transport key pair entry`,()=>this.#t.delete(e),this.#r),null):i}async getOrCreate(e){return this.#l(this.#s(e))}async#l(e,n){let r=`${e}::${n?.strict??!1}`,i=this.#a.get(r);if(i)return i;let a=this.#o.get(e)??0,o=(async()=>{let r=await this.#c(e);if(r!==null)return r;let i=await this.#e(),o=S(),s={publicKey:i.publicKey,privateKey:i.privateKey,createdAt:o,expiresAt:o+this.#n};return(this.#o.get(e)??0)===a&&(n?.strict?await this.#t.set(e,s):await t.L(`persist transport key pair`,()=>this.#t.set(e,s),this.#r)),s})().finally(()=>{this.#a.delete(r)});return this.#a.set(r,o),o}async clear(e){let n=F(e);await t.L(`delete transport key pair entry`,()=>this.#t.delete(n),this.#r)}async clearScope(){if(this.#i===void 0)return;let e=I(this.#i);this.#o.set(e,(this.#o.get(e)??0)+1),await this.#t.delete(e)}async warmScope(){this.#i!==void 0&&await this.#l(I(this.#i),{strict:!0})}};function B(e,t){let n=new Set(e.flatMap(e=>e.contractAddresses));return t.filter(e=>!n.has(e))}function V(e){let t=[];for(let n=0;n<e.length;n+=10)t.push(e.slice(n,n+10));return t}function H(e,t,n){return e.filter(e=>e.keypairPublicKey===t&&n<e.startTimestamp+e.durationDays*86400)}function U(e,t){let n=new Set(t);return e.filter(e=>!e.contractAddresses.some(e=>n.has(e)))}function W(e,t){return[...new Set([...e,...t])].toSorted()}function G(e,t,n){let r=new Set(n),i=e.filter(e=>new Set([...e.contractAddresses,...t]).size<=10);if(i.length===0)return null;function a(e){return e.contractAddresses.reduce((e,t)=>e+ +!!r.has(t),0)}let o=Math.max(...i.map(a));return i.filter(e=>a(e)===o).reduce((e,t)=>t.startTimestamp>e.startTimestamp?t:e)}var K=class{#e;#t;constructor(e){this.#e=e.storage,this.#t=e.logger}async list(e){let t=L(e),n=await this.#e.get(t);if(n==null)return[];let r=te.safeParse(n);return r.success?r.data:(await this.#a(t),await this.#i(e),[])}async listUsableAndPrune(e,n){let r=await this.list(e),i=H(r,n,Math.floor(Date.now()/1e3));if(i.length!==r.length){let n=L(e);i.length===0?(await this.#a(n),await this.#i(e)):await t.L(`update permit entry`,()=>this.#e.set(n,i),this.#t)}return i}async append(e,t){if(t.length===0)return;let n=t.map(e=>P.parse(e)),r=await this.list(e);await this.#e.set(L(e),[...r,...n]),await this.#r(e)}async replace(e,t,n){let r=P.parse(n),i=(await this.list(e)).filter(e=>e.serializedPermit.signature!==t);await this.#e.set(L(e),[...i,r]),await this.#r(e)}async deletePermitsTouching(e,t){let n=await this.list(e);if(n.length===0)return;let r=L(e),i=U(n,t);i.length===0?(await this.#a(r),await this.#i(e)):await this.#e.set(r,i)}async clearAllForSigner(e){let n=R(e),r=await this.#n(n);await Promise.all(r.map(e=>this.#a(e))),await t.L(`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=ne.safeParse(n);return r.success?r.data:(await t.L(`delete permit index`,()=>this.#e.delete(e),this.#t),[])}async#r(e){let t=R(e.signerAddress),n=L(e),r=await this.#n(t);r.includes(n)||await this.#e.set(t,[...r,n])}async#i(e){let n=R(e.signerAddress),r=L(e),i=await this.#n(n),a=i.filter(e=>e!==r);a.length!==i.length&&(a.length===0?await t.L(`delete permit index`,()=>this.#e.delete(n),this.#t):await t.L(`update permit index`,()=>this.#e.set(n,a),this.#t))}async#a(e){await t.L(`delete permit entry`,()=>this.#e.delete(e),this.#t)}},q=class{#e;#t;#n;#r;#i;#a;#o;constructor(e){this.#e=new z({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}),this.#t=new K({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}async grantPermit(e,n){let r=m(this.#r.requireWalletAccount(`grantPermit`).address),i=C(e),a=await this.#e.getOrCreate(r);if(i.length===0)return{keypair:a,permissions:[]};let o={signerAddress:r,chainId:this.#n.chain.id,delegatorAddress:n?m(n):r},s=await this.#t.listUsableAndPrune(o,a.publicKey),c=B(s,i);if(c.length>0){let e=G(s,c,i);if(e!==null){let n=W(e.contractAddresses,c),r=await this.#s({chunk:n,keypair:a,scope:o});await t.L(`replace permit`,()=>this.#t.replace(o,e.serializedPermit.signature,r),this.#a),s[s.indexOf(e)]=r}else for(let e of V(c)){let n=await this.#s({chunk:e,keypair:a,scope:o});s.push(n),await t.L(`persist permit`,()=>this.#t.append(o,[n]),this.#a)}}let l=new Set(i);return{keypair:a,permissions:s.filter(e=>e.contractAddresses.some(e=>l.has(e)))}}async hasPermit(e,t){if(e.length===0)return!0;let n=this.#r.walletAccount.getSnapshot();if(!n)return!1;let r=m(n.address),i=await this.#e.readStored(r);if(i===null)return!1;let a={signerAddress:r,chainId:this.#n.chain.id,delegatorAddress:t?m(t):r};return B(await this.#t.listUsableAndPrune(a,i.publicKey),C(e)).length===0}async revokePermits(e){let t=m(this.#r.requireWalletAccount(`revokePermits`).address);if(e===void 0){await this.#t.clearAllForSigner(t);return}let n=C(e);if(n.length===0)return;let r=this.#n.chain.id;await this.#t.deletePermitsTouching({signerAddress:t,chainId:r,delegatorAddress:t},n)}async clearCredentials(){let e=m(this.#r.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(m(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,t){let n=e?m(e.address):void 0;n!==(t?m(t.address):void 0)&&n&&(await this.#e.clear(n),await this.#t.clearAllForSigner(n))}async#s(n){let{chunk:r,keypair:i,scope:a}=n,o=S(),s=a.delegatorAddress!==a.signerAddress,c=this.#n.relayer;try{let e={transportKeyPair:await c.parseTransportKeyPair({publicKey:i.publicKey,privateKey:i.privateKey}),contractAddresses:r,startTimestamp:o,durationSeconds:this.#i*x,signerAddress:a.signerAddress,signer:this.#r},t=s?await c.signDecryptionPermit({...e,delegatorAddress:a.delegatorAddress}):await c.signDecryptionPermit(e),n=N.parse(c.serializeSignedDecryptionPermit({signedPermit:t}));return{keypairPublicKey:i.publicKey,contractAddresses:r,serializedPermit:n,startTimestamp:o,durationDays:this.#i}}catch(n){throw n instanceof e.r?n:t.G(n,`Credential signing failed`)}}},J=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)}};function Y(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 X={[n.s.id]:n.s.registryAddress,[n.c.id]:n.c.registryAddress,[n.a.id]:n.a.registryAddress,[n.o.id]:n.o.registryAddress,[n.n.id]:n.n.registryAddress},re=a.z.record(a.z.string().check(a.z.regex(/^\d+$/,`expected numeric chain id key`)),_),Z=ee,Q=300*1e3;var ie=class{provider;#e;#t;#n=new Map;constructor(e){this.provider=e.provider,this.#e=Object.assign({},X,Y(a.z.optional(re),e.registryAddresses)),this.#t=Y(Z,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.a(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.o(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?Q: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.b(e.tokenAddress)),this.provider.readContract(t.x(e.tokenAddress)),this.provider.readContract(t.v(e.tokenAddress)),this.provider.readContract(t.y(e.tokenAddress)),this.provider.readContract(t.b(e.confidentialTokenAddress)),this.provider.readContract(t.x(e.confidentialTokenAddress)),this.provider.readContract(t.v(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.t(n,r));return c===i.zeroAddress?this.#i(a,null,Q):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.n(n,r));return c===i.zeroAddress?this.#i(a,null,Q):this.#i(a,{tokenAddress:c,isValid:s})}async getTokenPairs(){let e=await this.getRegistryAddress();return this.provider.readContract(t.i(e))}async getTokenPairsLength(){let e=await this.getRegistryAddress();return this.provider.readContract(t.a(e))}async getTokenPairsSlice(e,n){let r=await this.getRegistryAddress();return this.provider.readContract(t.o(r,e,n))}async getTokenPair(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.r(n,e))}async getConfidentialTokenAddress(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.t(n,(0,i.getAddress)(e)))}async getTokenAddress(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.n(n,(0,i.getAddress)(e)))}async isConfidentialTokenValid(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.s(n,(0,i.getAddress)(e)))}};function ae(t,n,i){if((0,r.hasFhevmRuntimeConfig)()){if(i.runtime!==void 0)throw new e.t(`FHEVM runtime configuration is already set and cannot be changed.`)}else(0,r.setFhevmRuntimeConfig)({wasmAssetLoadMode:`auto`,moduleVersions:`auto`,logger:{error:(e,t)=>i.logger?.error(e,{cause:t}),warn:e=>i.logger?.warn(e),debug:e=>i.logger?.debug(e)},...i.runtime});let{storage:a,permitStorage:o}=d(i.storage,i.permitStorage),s=new J(i.logger),c=new p(i.chains,i.relayers);return{chains:i.chains,router:c,provider:n,signer:t,storage:a,permitStorage:o,transportKeyPairTTL:Y(O,i.transportKeyPairTTL??2592e3),permitTTL:Y(k,i.permitTTL??30),transportKeyPairScope:i.transportKeyPairScope===void 0?void 0:Y(A,i.transportKeyPairScope),registryTTL:Y(Z,i.registryTTL??86400),logger:s,onEvent:i.onEvent}}function oe(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;oe(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 se(e){return new $(e)}var ce=class{walletAccount;#e=!1;constructor(e){this.walletAccount=new $(e)}requireWalletAccount(e){let n=this.walletAccount.getSnapshot();if(!n)throw new t.V(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 X}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return h}});
|
|
1
|
+
const e=require("./relayer.cjs"),t=require("./wrappers-registry.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(e){return(0,i.getAddress)(e)}const h=a.z.custom(e=>typeof e==`string`&&(0,i.isHex)(e,{strict:!0}),`expected 0x-prefixed hex string`),g=a.z.custom(e=>typeof e==`string`&&(0,i.isAddress)(e,{strict:!1}),`expected EVM address`),_=a.z.pipe(g,a.z.transform(m)),v=a.z.int().check(a.z.nonnegative()),y=a.z.int().check(a.z.positive()),ee=a.z.int().check(a.z.nonnegative()),b=a.z.int().check(a.z.positive());a.z.int().check(a.z.positive());const x=86400;function S(){return Math.floor(Date.now()/1e3)}function C(e){return[...new Set(e.map(m))].toSorted()}const w=`transportKeyPairTTL must be a positive integer number of seconds`,T=`permitTTL must be a positive integer number of days`,E=`transportKeyPairScope must be a non-empty string`,D=365*x,O=a.z.int({error:w}).check(a.z.positive({error:w}),a.z.maximum(D,`transportKeyPairTTL must not exceed the fhevm ACL maximum of ${D}s (365 days)`)),k=a.z.int({error:T}).check(a.z.positive({error:T})),A=a.z.string({error:E}).check(a.z.minLength(1,E)),j=a.z.object({publicKey:h,privateKey:h,createdAt:v,expiresAt:y}),M=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())}),N=a.z.object({version:a.z.int().check(a.z.positive()),eip712:M,signature:h,signerAddress:_}),P=a.z.object({keypairPublicKey:h,contractAddresses:a.z.array(_).check(a.z.maxLength(10)),serializedPermit:N,startTimestamp:v,durationDays:b}),te=a.z.array(P),ne=a.z.array(a.z.string());function F(e){return`keypair:${e}`}function I(e){return`keypair:scope:${e}`}function L(e){return`permits:${e.signerAddress}:${e.chainId}:${e.delegatorAddress}`}function R(e){return`permits-index:${e}`}var z=class{#e;#t;#n;#r;#i;#a=new Map;#o=new Map;constructor(e){this.#e=e.generator,this.#t=e.storage,this.#n=e.ttl,this.#r=e.logger,this.#i=e.scope}#s(e){return this.#i===void 0?F(e):I(this.#i)}async readStored(e){return this.#c(this.#s(e))}async#c(e){let n=await this.#t.get(e);if(n==null)return null;let r=j.safeParse(n);if(!r.success)return await t.L(`delete transport key pair entry`,()=>this.#t.delete(e),this.#r),null;let i=r.data;return S()>=i.expiresAt?(await t.L(`delete transport key pair entry`,()=>this.#t.delete(e),this.#r),null):i}async getOrCreate(e){return this.#l(this.#s(e))}async#l(e,n){let r=`${e}::${n?.strict??!1}`,i=this.#a.get(r);if(i)return i;let a=this.#o.get(e)??0,o=(async()=>{let r=await this.#c(e);if(r!==null)return r;let i=await this.#e(),o=S(),s={publicKey:i.publicKey,privateKey:i.privateKey,createdAt:o,expiresAt:o+this.#n};return(this.#o.get(e)??0)===a&&(n?.strict?await this.#t.set(e,s):await t.L(`persist transport key pair`,()=>this.#t.set(e,s),this.#r)),s})().finally(()=>{this.#a.delete(r)});return this.#a.set(r,o),o}async clear(e){let n=F(e);await t.L(`delete transport key pair entry`,()=>this.#t.delete(n),this.#r)}async clearScope(){if(this.#i===void 0)return;let e=I(this.#i);this.#o.set(e,(this.#o.get(e)??0)+1),await this.#t.delete(e)}async warmScope(){this.#i!==void 0&&await this.#l(I(this.#i),{strict:!0})}};function B(e,t){let n=new Set(e.flatMap(e=>e.contractAddresses));return t.filter(e=>!n.has(e))}function V(e){let t=[];for(let n=0;n<e.length;n+=10)t.push(e.slice(n,n+10));return t}function H(e,t,n){return e.filter(e=>e.keypairPublicKey===t&&n<e.startTimestamp+e.durationDays*86400)}function U(e,t){let n=new Set(t);return e.filter(e=>!e.contractAddresses.some(e=>n.has(e)))}function W(e,t){return[...new Set([...e,...t])].toSorted()}function G(e,t,n){let r=new Set(n),i=e.filter(e=>new Set([...e.contractAddresses,...t]).size<=10);if(i.length===0)return null;function a(e){return e.contractAddresses.reduce((e,t)=>e+ +!!r.has(t),0)}let o=Math.max(...i.map(a));return i.filter(e=>a(e)===o).reduce((e,t)=>t.startTimestamp>e.startTimestamp?t:e)}var K=class{#e;#t;constructor(e){this.#e=e.storage,this.#t=e.logger}async list(e){let t=L(e),n=await this.#e.get(t);if(n==null)return[];let r=te.safeParse(n);return r.success?r.data:(await this.#a(t),await this.#i(e),[])}async listUsableAndPrune(e,n){let r=await this.list(e),i=H(r,n,Math.floor(Date.now()/1e3));if(i.length!==r.length){let n=L(e);i.length===0?(await this.#a(n),await this.#i(e)):await t.L(`update permit entry`,()=>this.#e.set(n,i),this.#t)}return i}async append(e,t){if(t.length===0)return;let n=t.map(e=>P.parse(e)),r=await this.list(e);await this.#e.set(L(e),[...r,...n]),await this.#r(e)}async replace(e,t,n){let r=P.parse(n),i=(await this.list(e)).filter(e=>e.serializedPermit.signature!==t);await this.#e.set(L(e),[...i,r]),await this.#r(e)}async deletePermitsTouching(e,t){let n=await this.list(e);if(n.length===0)return;let r=L(e),i=U(n,t);i.length===0?(await this.#a(r),await this.#i(e)):await this.#e.set(r,i)}async clearAllForSigner(e){let n=R(e),r=await this.#n(n);await Promise.all(r.map(e=>this.#a(e))),await t.L(`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=ne.safeParse(n);return r.success?r.data:(await t.L(`delete permit index`,()=>this.#e.delete(e),this.#t),[])}async#r(e){let t=R(e.signerAddress),n=L(e),r=await this.#n(t);r.includes(n)||await this.#e.set(t,[...r,n])}async#i(e){let n=R(e.signerAddress),r=L(e),i=await this.#n(n),a=i.filter(e=>e!==r);a.length!==i.length&&(a.length===0?await t.L(`delete permit index`,()=>this.#e.delete(n),this.#t):await t.L(`update permit index`,()=>this.#e.set(n,a),this.#t))}async#a(e){await t.L(`delete permit entry`,()=>this.#e.delete(e),this.#t)}},q=class{#e;#t;#n;#r;#i;#a;#o;constructor(e){this.#e=new z({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}),this.#t=new K({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}async grantPermit(e,n){let r=m(this.#r.requireWalletAccount(`grantPermit`).address),i=C(e),a=await this.#e.getOrCreate(r);if(i.length===0)return{keypair:a,permissions:[]};let o={signerAddress:r,chainId:this.#n.chain.id,delegatorAddress:n?m(n):r},s=await this.#t.listUsableAndPrune(o,a.publicKey),c=B(s,i);if(c.length>0){let e=G(s,c,i);if(e!==null){let n=W(e.contractAddresses,c),r=await this.#s({chunk:n,keypair:a,scope:o});await t.L(`replace permit`,()=>this.#t.replace(o,e.serializedPermit.signature,r),this.#a),s[s.indexOf(e)]=r}else for(let e of V(c)){let n=await this.#s({chunk:e,keypair:a,scope:o});s.push(n),await t.L(`persist permit`,()=>this.#t.append(o,[n]),this.#a)}}let l=new Set(i);return{keypair:a,permissions:s.filter(e=>e.contractAddresses.some(e=>l.has(e)))}}async hasPermit(e,t){if(e.length===0)return!0;let n=this.#r.walletAccount.getSnapshot();if(!n)return!1;let r=m(n.address),i=await this.#e.readStored(r);if(i===null)return!1;let a={signerAddress:r,chainId:this.#n.chain.id,delegatorAddress:t?m(t):r};return B(await this.#t.listUsableAndPrune(a,i.publicKey),C(e)).length===0}async revokePermits(e){let t=m(this.#r.requireWalletAccount(`revokePermits`).address);if(e===void 0){await this.#t.clearAllForSigner(t);return}let n=C(e);if(n.length===0)return;let r=this.#n.chain.id;await this.#t.deletePermitsTouching({signerAddress:t,chainId:r,delegatorAddress:t},n)}async clearCredentials(){let e=m(this.#r.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(m(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,t){let n=e?m(e.address):void 0;n!==(t?m(t.address):void 0)&&n&&(await this.#e.clear(n),await this.#t.clearAllForSigner(n))}async#s(n){let{chunk:r,keypair:i,scope:a}=n,o=S(),s=a.delegatorAddress!==a.signerAddress,c=this.#n.relayer;try{let e={transportKeyPair:await c.parseTransportKeyPair({publicKey:i.publicKey,privateKey:i.privateKey}),contractAddresses:r,startTimestamp:o,durationSeconds:this.#i*x,signerAddress:a.signerAddress,signer:this.#r},t=s?await c.signDecryptionPermit({...e,delegatorAddress:a.delegatorAddress}):await c.signDecryptionPermit(e),n=N.parse(c.serializeSignedDecryptionPermit({signedPermit:t}));return{keypairPublicKey:i.publicKey,contractAddresses:r,serializedPermit:n,startTimestamp:o,durationDays:this.#i}}catch(n){throw n instanceof e.r?n:t.G(n,`Credential signing failed`)}}},J=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)}};function Y(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 X={[n.s.id]:n.s.registryAddress,[n.c.id]:n.c.registryAddress,[n.a.id]:n.a.registryAddress,[n.o.id]:n.o.registryAddress,[n.n.id]:n.n.registryAddress},re=a.z.record(a.z.string().check(a.z.regex(/^\d+$/,`expected numeric chain id key`)),_),Z=ee,Q=300*1e3;var ie=class{provider;#e;#t;#n=new Map;constructor(e){this.provider=e.provider,this.#e=Object.assign({},X,Y(a.z.optional(re),e.registryAddresses)),this.#t=Y(Z,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.a(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.o(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?Q: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.b(e.tokenAddress)),this.provider.readContract(t.x(e.tokenAddress)),this.provider.readContract(t.v(e.tokenAddress)),this.provider.readContract(t.y(e.tokenAddress)),this.provider.readContract(t.b(e.confidentialTokenAddress)),this.provider.readContract(t.x(e.confidentialTokenAddress)),this.provider.readContract(t.v(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.t(n,r));return c===i.zeroAddress?this.#i(a,null,Q):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.n(n,r));return c===i.zeroAddress?this.#i(a,null,Q):this.#i(a,{tokenAddress:c,isValid:s})}async getTokenPairs(){let e=await this.getRegistryAddress();return this.provider.readContract(t.i(e))}async getTokenPairsLength(){let e=await this.getRegistryAddress();return this.provider.readContract(t.a(e))}async getTokenPairsSlice(e,n){let r=await this.getRegistryAddress();return this.provider.readContract(t.o(r,e,n))}async getTokenPair(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.r(n,e))}async getConfidentialTokenAddress(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.t(n,(0,i.getAddress)(e)))}async getTokenAddress(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.n(n,(0,i.getAddress)(e)))}async isConfidentialTokenValid(e){let n=await this.getRegistryAddress();return this.provider.readContract(t.s(n,(0,i.getAddress)(e)))}};function ae(e,t,n){let i=new J(n.logger);(0,r.hasFhevmRuntimeConfig)()?i.warn(`runtime configuration is already set and cannot be changed.`):(0,r.setFhevmRuntimeConfig)({wasmAssetLoadMode:`auto`,moduleVersions:`auto`,logger:{error:(e,t)=>n.logger?.error(e,{cause:t}),warn:e=>n.logger?.warn(e),debug:e=>n.logger?.debug(e)},...n.runtime});let{storage:a,permitStorage:o}=d(n.storage,n.permitStorage),s=new p(n.chains,n.relayers);return{chains:n.chains,router:s,provider:t,signer:e,storage:a,permitStorage:o,transportKeyPairTTL:Y(O,n.transportKeyPairTTL??2592e3),permitTTL:Y(k,n.permitTTL??30),transportKeyPairScope:n.transportKeyPairScope===void 0?void 0:Y(A,n.transportKeyPairScope),registryTTL:Y(Z,n.registryTTL??86400),logger:i,onEvent:n.onEvent}}function oe(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;oe(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 se(e){return new $(e)}var ce=class{walletAccount;#e=!1;constructor(e){this.walletAccount=new $(e)}requireWalletAccount(e){let n=this.walletAccount.getSnapshot();if(!n)throw new t.V(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 X}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return h}});
|
|
2
2
|
//# sourceMappingURL=base-signer.cjs.map
|