@zama-fhe/sdk 3.5.0-alpha.3 → 3.5.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- const e=require("./relayer.cjs"),t=require("./sdk-events.cjs"),n=require("./assertions.cjs");let r=require("viem");var i=class extends e.r{constructor(t,n){super(e.i.EncryptionFailed,t,n),this.name=`EncryptionFailedError`}},a=class extends e.r{constructor(t,n){super(e.i.DecryptionFailed,t,n),this.name=`DecryptionFailedError`}},o=class extends e.r{retryAfter;constructor(t,n){let{retryAfter:r,...i}=n??{};super(e.i.RpcRateLimited,t,i),this.name=`RpcRateLimitError`,this.retryAfter=r}},s=class extends e.r{operation;signerChainId;providerChainId;constructor({operation:t,signerChainId:n,providerChainId:r},i){super(e.i.ChainMismatch,`Operation "${t}" requires signer and provider to be on the same chain, but signer is on chain ${n} and provider is on chain ${r}.`,i),this.name=`ChainMismatchError`,this.operation=t,this.signerChainId=n,this.providerChainId=r}},c=class extends e.r{requested;available;token;constructor(t,n,r){super(e.i.InsufficientConfidentialBalance,t,r),this.name=`InsufficientConfidentialBalanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},l=class extends e.r{requested;available;token;constructor(t,n,r){super(e.i.InsufficientERC20Balance,t,r),this.name=`InsufficientERC20BalanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},u=class extends e.r{requested;available;token;constructor(t,n,r){super(e.i.InsufficientAllowance,t,r),this.name=`InsufficientAllowanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},d=class extends e.r{constructor(t,n){super(e.i.BalanceCheckUnavailable,t,n),this.name=`BalanceCheckUnavailableError`}},f=class extends e.r{constructor(t,n){super(e.i.ERC20ReadFailed,t,n),this.name=`ERC20ReadFailedError`}};function p(n){return n instanceof t.q||n instanceof t.K||n instanceof e.t||n instanceof o}const m={ebool:0,euint8:2,euint16:3,euint32:4,euint64:5,euint128:6,eaddress:7,euint256:8},h={0:`ebool`,2:`euint8`,3:`euint16`,4:`euint32`,5:`euint64`,6:`euint128`,7:`eaddress`,8:`euint256`},g={0:2,2:8,3:16,4:32,5:64,6:128,7:160,8:256};Object.freeze(m),Object.freeze(h),Object.freeze(g),Object.freeze({2:0,8:2,16:3,32:4,64:5,128:6,160:7,256:8});function _(e){switch(e){case 0:case 2:case 3:case 4:case 5:case 6:case 7:case 8:return!0;default:return!1}}function v(e){if(!_(e))throw Error(`Invalid FheType id '${e}'`);let t=g[e];if(t<2)throw Error(`Invalid FheType encryption bit width: ${t}. Minimum is 2 bits.`);return t}function y(e){return e===`0x0000000000000000000000000000000000000000000000000000000000000000`||e===`0x`}function b(e){let t;try{t=BigInt(e)}catch{return 256}let n=Number(t>>8n&255n);return _(n)?v(n):256}function x(e,t=2048){let n=[],r=[],i=0;for(let a of e){let e=b(a);r.length>0&&i+e>t&&(n.push(r),r=[],i=0),r.push(a),i+=e}return r.length>0&&n.push(r),n}async function S(e,n,r){if(!n)throw new t.B(e);let i;try{i=n.requireWalletAccount(e)}catch(r){if(!(r instanceof t.H)||!n.refreshWalletAccount)throw r;await n.refreshWalletAccount(),i=n.requireWalletAccount(e)}let a=await r.getChainId();if(i.chainId!==a)throw new s({operation:e,signerChainId:i.chainId,providerChainId:a});return i}async function C(e,t,n){return(await S(e,t,n)).chainId}async function w(e,t=1/0){if(Number.isFinite(t)&&t<=0)throw Error(`maxConcurrency must be a positive number`);if(!Number.isFinite(t)||t>=e.length)return Promise.all(e.map(e=>e()));let n=Array.from({length:e.length}),r=0;async function i(){for(;r<e.length;){let t=r++;e[t]&&(n[t]=await e[t]())}}return await Promise.all(Array.from({length:t},i)),n}async function T(n){let{operation:r,signer:i,provider:a,config:o,emit:s,onSubmitted:c,logger:l}=n,u=t.n[r];try{let e=await i.writeContract(o);return s(u.submittedEvent(e)),t.z(`${r}: onSubmitted`,()=>c?.(e),l),{txHash:e,receipt:await a.waitForTransactionReceipt(e)}}catch(n){let i=n instanceof e.r?n:new t.G(`Transaction failed during ${r}`,{cause:n});throw s({type:t.t.TransactionError,operation:r,error:i}),i}}var E=class o{sdk;address;constructor(e,t){this.sdk=e,this.address=(0,r.getAddress)(t)}#e(e){return t.W(this.sdk.signer,e)}async name(){return this.sdk.provider.readContract(t.S(this.address))}async symbol(){return this.sdk.provider.readContract(t.C(this.address))}async decimals(){return this.sdk.provider.readContract(t.b(this.address))}async isConfidential(){return this.sdk.provider.readContract(t.g(this.address,t.d))}async isWrapper(){return this.sdk.provider.readContract(t.g(this.address,t.f))}async balanceOf(e){let t=(0,r.getAddress)(e),i=await this.readConfidentialBalanceOf(t),o=(await this.sdk.decryption.decryptValues([{encryptedValue:i,contractAddress:this.address}]))[i];if(o===void 0)throw new a(`Decryption returned no value for ${i}`);return n.t(o,`balanceOf: result[encryptedValue]`),o}async confidentialBalanceOf(e){return this.readConfidentialBalanceOf((0,r.getAddress)(e))}async decryptBalanceAs({delegatorAddress:e,accountAddress:t}){await C(`decryptBalanceAs`,this.sdk.signer,this.sdk.provider);let i=(0,r.getAddress)(e),o=t?(0,r.getAddress)(t):i,s=await this.readConfidentialBalanceOf(o);if(y(s))return 0n;let c=(await this.sdk.decryption.delegatedDecryptValues([{encryptedValue:s,contractAddress:this.address}],i,o))[s];if(c===void 0)throw new a(`Delegated decryption returned no value for ${s}`);return n.t(c,`decryptBalanceAs: result[encryptedValue]`),c}static async batchBalancesOf(t,n){let r=new Map,i=new Map;if(t.length===0)return{results:r,errors:i};let s=o.assertSameSdk(t);await C(`batchBalancesOf`,s.signer,s.provider),await s.permits.grantPermit(t.map(e=>e.address));let c=await w(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.balanceOf(n)}}catch(e){return{status:`rejected`,reason:e}}}),5);for(let n=0;n<t.length;n++){let o=t[n].address,s=c[n];if(s.status===`fulfilled`)r.set(o,s.value);else{let t=s.reason;if(p(t))throw t;let n=t instanceof e.r?t:new a(e._(t).message,{cause:t});i.set(o,n)}}if(i.size===t.length)throw i.values().next().value??new a(`All token balance decryptions failed`);return{results:r,errors:i}}static async batchDecryptBalancesAs(t,i){if(t.length===0)return new Map;let s=o.assertSameSdk(t),c=new Map,l=new Map,u=i.accountAddress?(0,r.getAddress)(i.accountAddress):(0,r.getAddress)(i.delegatorAddress),d=i.maxConcurrency??10;if(i.encryptedValues&&t.length!==i.encryptedValues.length)throw new a(`tokens.length (${t.length}) must equal encryptedValues.length (${i.encryptedValues.length})`);let f=i.encryptedValues??await o.readBalanceHandlesBatch(t,u,l,d),p=[];for(let[e,n]of t.entries()){let t=f[e];!t||l.has(n.address)||(y(t)?c.set(n.address,0n):p.push({token:n,encryptedValue:t}))}if(p.length>0){let e=await s.decryption.delegatedBatchDecryptValues({encryptedInputs:p.map(({token:e,encryptedValue:t})=>({encryptedValue:t,contractAddress:e.address})),delegatorAddress:i.delegatorAddress,accountAddress:i.accountAddress,maxConcurrency:d});for(let[t,r]of e.items.entries()){let e=p[t];if(!e)continue;if(r.error){l.set(e.token.address,r.error);continue}let i=r.value;if(i===void 0){l.set(e.token.address,new a(`Batch delegated decryption returned no value for ${r.encryptedValue} on token ${e.token.address}`));continue}n.t(i,`batchDecryptBalancesAs: result[encryptedValue]`),c.set(e.token.address,i)}}if(l.size===0)return c;if(i.onError){let t=[];for(let[n,r]of l)try{c.set(n,i.onError(r,n))}catch(r){t.push({address:n,error:e._(r)})}if(t.length>0){let e=t.map(({address:e,error:t})=>`${e}: ${t.message}`).join(`; `);throw new a(`Batch delegated decryption onError callback failed for ${t.length} token(s): ${e}`,{cause:t[0]?.error})}return c}let m=Array.from(l.entries()),h=m.map(([e,t])=>`${e}: ${t.message}`).join(`; `);throw new a(`Batch delegated decryption failed for ${l.size} token(s): ${h}`,{cause:m[0]?.[1]})}static async readBalanceHandlesBatch(t,n,r,i){let o=await w(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.readConfidentialBalanceOf(n)}}catch(e){return{status:`rejected`,reason:e}}}),i),s=[];for(let[n,i]of t.entries()){let t=o[n];if(t){if(t.status===`fulfilled`){s[n]=t.value;continue}if(p(t.reason))throw t.reason;r.set(i.address,t.reason instanceof e.r?t.reason:new a(e._(t.reason).message,{cause:t.reason}))}}return s}async confidentialTransfer(e,n,a){this.#e(`confidentialTransfer`);let o=await S(`confidentialTransfer`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:s=!1,onEncryptComplete:c,onTransferSubmitted:l}=a??{},u=(0,r.getAddress)(e);s||await this.assertConfidentialBalance(n);let{encryptedValues:d,inputProof:f}=await this.sdk.encrypt({values:[{value:n,type:`euint64`}],contractAddress:this.address,userAddress:(0,r.getAddress)(o.address)});if(t.z(`transfer: onEncryptComplete`,()=>c?.(),this.sdk.logger),d.length===0)throw new i(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transfer`,config:t.D(this.address,u,d[0],f),onSubmitted:l})}async confidentialTransferFrom(e,n,a,o){this.#e(`confidentialTransferFrom`),await S(`confidentialTransferFrom`,this.sdk.signer,this.sdk.provider);let s=(0,r.getAddress)(e),c=(0,r.getAddress)(n),{encryptedValues:l,inputProof:u}=await this.sdk.encrypt({values:[{value:a,type:`euint64`}],contractAddress:this.address,userAddress:s});if(t.z(`transferFrom: onEncryptComplete`,()=>o?.onEncryptComplete?.(),this.sdk.logger),l.length===0)throw new i(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFrom`,config:t.k(this.address,s,c,l[0],u),onSubmitted:o?.onTransferSubmitted})}async confidentialTransferAndCall(e,n,a,o){this.#e(`confidentialTransferAndCall`);let s=await S(`confidentialTransferAndCall`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:c=!1,onEncryptComplete:l,onTransferSubmitted:u}=o??{},d=(0,r.getAddress)(e);c||await this.assertConfidentialBalance(n);let{encryptedValues:f,inputProof:p}=await this.sdk.encrypt({values:[{value:n,type:`euint64`}],contractAddress:this.address,userAddress:(0,r.getAddress)(s.address)});if(t.z(`transferAndCall: onEncryptComplete`,()=>l?.(),this.sdk.logger),f.length===0)throw new i(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferAndCall`,config:t.E(this.address,d,f[0],p,a),onSubmitted:u})}async confidentialTransferFromAndCall(e,n,a,o,s){this.#e(`confidentialTransferFromAndCall`),await S(`confidentialTransferFromAndCall`,this.sdk.signer,this.sdk.provider);let c=(0,r.getAddress)(e),l=(0,r.getAddress)(n),{encryptedValues:u,inputProof:d}=await this.sdk.encrypt({values:[{value:a,type:`euint64`}],contractAddress:this.address,userAddress:c});if(t.z(`transferFromAndCall: onEncryptComplete`,()=>s?.onEncryptComplete?.(),this.sdk.logger),u.length===0)throw new i(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFromAndCall`,config:t.O(this.address,c,l,u[0],d,o),onSubmitted:s?.onTransferSubmitted})}async setOperator(e,n){this.#e(`setOperator`),await C(`setOperator`,this.sdk.signer,this.sdk.provider);let i=(0,r.getAddress)(e);return this.submitTransaction({operation:`setOperator`,config:t.P(this.address,i,n)})}async isOperator(e,n){return this.sdk.provider.readContract(t.M(this.address,(0,r.getAddress)(e),(0,r.getAddress)(n)))}async readConfidentialBalanceOf(e){return await this.sdk.provider.readContract(t.w(this.address,e))}async assertConfidentialBalance(t){if(t===0n)return;let n;try{let e=await S(`assertConfidentialBalance`,this.sdk.signer,this.sdk.provider);n=await this.balanceOf((0,r.getAddress)(e.address))}catch(t){throw t instanceof e.r?t:new d(`Balance validation failed (token: ${this.address})`,{cause:t})}if(n<t)throw new c(`Insufficient confidential balance: requested ${t}, available ${n} (token: ${this.address})`,{requested:t,available:n,token:this.address})}emit(e){this.sdk.emitEvent(e,this.address)}async submitTransaction(e){let{operation:t,config:n,onSubmitted:r}=e;return T({operation:t,signer:this.#e(t),provider:this.sdk.provider,config:n,emit:e=>this.emit(e),onSubmitted:r,logger:this.sdk.logger})}static assertSameSdk(t){let n=t[0].sdk;for(let r=1;r<t.length;r++)if(t[r].sdk!==n)throw new e.t(`All tokens in a batch operation must share the same ZamaSDK instance`);return n}};Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return`0x0000000000000000000000000000000000000000000000000000000000000000`}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return i}});
1
+ const e=require("./relayer.cjs"),t=require("./sdk-events.cjs"),n=require("./assertions.cjs");let r=require("viem");var i=class extends e.r{constructor(t,n){super(e.i.EncryptionFailed,t,n),this.name=`EncryptionFailedError`}},a=class extends e.r{constructor(t,n){super(e.i.DecryptionFailed,t,n),this.name=`DecryptionFailedError`}},o=class extends e.r{retryAfter;constructor(t,n){let{retryAfter:r,...i}=n??{};super(e.i.RpcRateLimited,t,i),this.name=`RpcRateLimitError`,this.retryAfter=r}},s=class extends e.r{operation;signerChainId;providerChainId;constructor({operation:t,signerChainId:n,providerChainId:r},i){super(e.i.ChainMismatch,`Operation "${t}" requires signer and provider to be on the same chain, but signer is on chain ${n} and provider is on chain ${r}.`,i),this.name=`ChainMismatchError`,this.operation=t,this.signerChainId=n,this.providerChainId=r}},c=class extends e.r{requested;available;token;constructor(t,n,r){super(e.i.InsufficientConfidentialBalance,t,r),this.name=`InsufficientConfidentialBalanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},l=class extends e.r{requested;available;token;constructor(t,n,r){super(e.i.InsufficientERC20Balance,t,r),this.name=`InsufficientERC20BalanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},u=class extends e.r{requested;available;token;constructor(t,n,r){super(e.i.InsufficientAllowance,t,r),this.name=`InsufficientAllowanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},d=class extends e.r{constructor(t,n){super(e.i.BalanceCheckUnavailable,t,n),this.name=`BalanceCheckUnavailableError`}},f=class extends e.r{constructor(t,n){super(e.i.ERC20ReadFailed,t,n),this.name=`ERC20ReadFailedError`}};function p(n){return n instanceof t.q||n instanceof t.K||n instanceof e.t||n instanceof o}const m={ebool:0,euint8:2,euint16:3,euint32:4,euint64:5,euint128:6,eaddress:7,euint256:8},h={0:`ebool`,2:`euint8`,3:`euint16`,4:`euint32`,5:`euint64`,6:`euint128`,7:`eaddress`,8:`euint256`},g={0:2,2:8,3:16,4:32,5:64,6:128,7:160,8:256};Object.freeze(m),Object.freeze(h),Object.freeze(g),Object.freeze({2:0,8:2,16:3,32:4,64:5,128:6,160:7,256:8});function _(e){switch(e){case 0:case 2:case 3:case 4:case 5:case 6:case 7:case 8:return!0;default:return!1}}function v(e){if(!_(e))throw Error(`Invalid FheType id '${e}'`);let t=g[e];if(t<2)throw Error(`Invalid FheType encryption bit width: ${t}. Minimum is 2 bits.`);return t}function y(e){return e===`0x0000000000000000000000000000000000000000000000000000000000000000`||e===`0x`}function b(e){let t;try{t=BigInt(e)}catch{return 256}let n=Number(t>>8n&255n);return _(n)?v(n):256}function x(e,t=2048){let n=[],r=[],i=0;for(let a of e){let e=b(a);r.length>0&&i+e>t&&(n.push(r),r=[],i=0),r.push(a),i+=e}return r.length>0&&n.push(r),n}async function S(e,n,r){if(!n)throw new t.B(e);let i;try{i=n.requireWalletAccount(e)}catch(r){if(!(r instanceof t.H)||!n.refreshWalletAccount)throw r;await n.refreshWalletAccount(),i=n.requireWalletAccount(e)}let a=await r.getChainId();if(i.chainId!==a)throw new s({operation:e,signerChainId:i.chainId,providerChainId:a});return i}async function C(e,t,n){return(await S(e,t,n)).chainId}async function w(e,t=1/0){if(Number.isFinite(t)&&t<=0)throw Error(`maxConcurrency must be a positive number`);if(!Number.isFinite(t)||t>=e.length)return Promise.all(e.map(e=>e()));let n=Array.from({length:e.length}),r=0;async function i(){for(;r<e.length;){let t=r++;e[t]&&(n[t]=await e[t]())}}return await Promise.all(Array.from({length:t},i)),n}async function T(n){let{operation:r,signer:i,provider:a,config:o,emit:s,onSubmitted:c,logger:l}=n,u=t.n[r];try{let e=await i.writeContract(o);return s(u.submittedEvent(e)),t.z(`${r}: onSubmitted`,()=>c?.(e),l),{txHash:e,receipt:await a.waitForTransactionReceipt(e)}}catch(n){let i=n instanceof e.r?n:new t.G(`Transaction failed during ${r}`,{cause:n});throw s({type:t.t.TransactionError,operation:r,error:i}),i}}var E=class o{sdk;address;constructor(e,t){this.sdk=e,this.address=(0,r.getAddress)(t)}#e(e){return t.W(this.sdk.signer,e)}async name(){return this.sdk.provider.readContract(t.S(this.address))}async symbol(){return this.sdk.provider.readContract(t.C(this.address))}async decimals(){return this.sdk.provider.readContract(t.b(this.address))}async isConfidential(){return this.sdk.provider.readContract(t.g(this.address,t.d))}async isWrapper(){return this.sdk.provider.readContract(t.g(this.address,t.f))}async balanceOf(e){let t=(0,r.getAddress)(e),i=await this.readConfidentialBalanceOf(t),o=(await this.sdk.decryption.decryptValues([{encryptedValue:i,contractAddress:this.address}]))[i];if(o===void 0)throw new a(`Decryption returned no value for ${i}`);return n.t(o,`balanceOf: result[encryptedValue]`),o}async confidentialBalanceOf(e){return this.readConfidentialBalanceOf((0,r.getAddress)(e))}async decryptBalanceAs({delegatorAddress:e,accountAddress:t}){await C(`decryptBalanceAs`,this.sdk.signer,this.sdk.provider);let i=(0,r.getAddress)(e),o=t?(0,r.getAddress)(t):i,s=await this.readConfidentialBalanceOf(o);if(y(s))return 0n;let c=(await this.sdk.decryption.delegatedDecryptValues([{encryptedValue:s,contractAddress:this.address}],i,o))[s];if(c===void 0)throw new a(`Delegated decryption returned no value for ${s}`);return n.t(c,`decryptBalanceAs: result[encryptedValue]`),c}static async batchBalancesOf(t,n){let r=new Map,i=new Map;if(t.length===0)return{results:r,errors:i};let s=o.assertSameSdk(t);await C(`batchBalancesOf`,s.signer,s.provider),await s.permits.grantPermit(t.map(e=>e.address));let c=await w(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.balanceOf(n)}}catch(e){return{status:`rejected`,reason:e}}}),5);for(let n=0;n<t.length;n++){let o=t[n].address,s=c[n];if(s.status===`fulfilled`)r.set(o,s.value);else{let t=s.reason;if(p(t))throw t;let n=t instanceof e.r?t:new a(e._(t).message,{cause:t});i.set(o,n)}}if(i.size===t.length)throw i.values().next().value??new a(`All token balance decryptions failed`);return{results:r,errors:i}}static async batchDecryptBalancesAs(t,i){if(t.length===0)return new Map;let s=o.assertSameSdk(t),c=new Map,l=new Map,u=i.accountAddress?(0,r.getAddress)(i.accountAddress):(0,r.getAddress)(i.delegatorAddress),d=i.maxConcurrency??10;if(i.encryptedValues&&t.length!==i.encryptedValues.length)throw new a(`tokens.length (${t.length}) must equal encryptedValues.length (${i.encryptedValues.length})`);let f=i.encryptedValues??await o.readBalanceHandlesBatch(t,u,l,d),p=[];for(let[e,n]of t.entries()){let t=f[e];!t||l.has(n.address)||(y(t)?c.set(n.address,0n):p.push({token:n,encryptedValue:t}))}if(p.length>0){let e=await s.decryption.delegatedBatchDecryptValues({encryptedInputs:p.map(({token:e,encryptedValue:t})=>({encryptedValue:t,contractAddress:e.address})),delegatorAddress:i.delegatorAddress,accountAddress:i.accountAddress,maxConcurrency:d});for(let[t,r]of e.items.entries()){let e=p[t];if(!e)continue;if(r.error){l.set(e.token.address,r.error);continue}let i=r.value;if(i===void 0){l.set(e.token.address,new a(`Batch delegated decryption returned no value for ${r.encryptedValue} on token ${e.token.address}`));continue}n.t(i,`batchDecryptBalancesAs: result[encryptedValue]`),c.set(e.token.address,i)}}if(l.size===0)return c;if(i.onError){let t=[];for(let[n,r]of l)try{c.set(n,i.onError(r,n))}catch(r){t.push({address:n,error:e._(r)})}if(t.length>0){let e=t.map(({address:e,error:t})=>`${e}: ${t.message}`).join(`; `);throw new a(`Batch delegated decryption onError callback failed for ${t.length} token(s): ${e}`,{cause:t[0]?.error})}return c}let m=Array.from(l.entries()),h=m.map(([e,t])=>`${e}: ${t.message}`).join(`; `);throw new a(`Batch delegated decryption failed for ${l.size} token(s): ${h}`,{cause:m[0]?.[1]})}static async readBalanceHandlesBatch(t,n,r,i){let o=await w(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.readConfidentialBalanceOf(n)}}catch(e){return{status:`rejected`,reason:e}}}),i),s=[];for(let[n,i]of t.entries()){let t=o[n];if(t){if(t.status===`fulfilled`){s[n]=t.value;continue}if(p(t.reason))throw t.reason;r.set(i.address,t.reason instanceof e.r?t.reason:new a(e._(t.reason).message,{cause:t.reason}))}}return s}async confidentialTransfer(e,n,a){this.#e(`confidentialTransfer`);let o=await S(`confidentialTransfer`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:s=!1,onEncryptComplete:c,onTransferSubmitted:l}=a??{},u=(0,r.getAddress)(e);s||await this.assertConfidentialBalance(n);let{encryptedValues:d,inputProof:f}=await this.sdk.encrypt({values:[{value:n,type:`euint64`}],contractAddress:this.address,userAddress:(0,r.getAddress)(o.address)});if(t.z(`transfer: onEncryptComplete`,()=>c?.(),this.sdk.logger),d.length===0)throw new i(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transfer`,config:t.D(this.address,u,d[0],f),onSubmitted:l})}async confidentialTransferFrom(e,n,a,o){this.#e(`confidentialTransferFrom`);let s=await S(`confidentialTransferFrom`,this.sdk.signer,this.sdk.provider),c=(0,r.getAddress)(e),l=(0,r.getAddress)(n),{encryptedValues:u,inputProof:d}=await this.sdk.encrypt({values:[{value:a,type:`euint64`}],contractAddress:this.address,userAddress:(0,r.getAddress)(s.address)});if(t.z(`transferFrom: onEncryptComplete`,()=>o?.onEncryptComplete?.(),this.sdk.logger),u.length===0)throw new i(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFrom`,config:t.k(this.address,c,l,u[0],d),onSubmitted:o?.onTransferSubmitted})}async confidentialTransferAndCall(e,n,a,o){this.#e(`confidentialTransferAndCall`);let s=await S(`confidentialTransferAndCall`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:c=!1,onEncryptComplete:l,onTransferSubmitted:u}=o??{},d=(0,r.getAddress)(e);c||await this.assertConfidentialBalance(n);let{encryptedValues:f,inputProof:p}=await this.sdk.encrypt({values:[{value:n,type:`euint64`}],contractAddress:this.address,userAddress:(0,r.getAddress)(s.address)});if(t.z(`transferAndCall: onEncryptComplete`,()=>l?.(),this.sdk.logger),f.length===0)throw new i(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferAndCall`,config:t.E(this.address,d,f[0],p,a),onSubmitted:u})}async confidentialTransferFromAndCall(e,n,a,o,s){this.#e(`confidentialTransferFromAndCall`);let c=await S(`confidentialTransferFromAndCall`,this.sdk.signer,this.sdk.provider),l=(0,r.getAddress)(e),u=(0,r.getAddress)(n),{encryptedValues:d,inputProof:f}=await this.sdk.encrypt({values:[{value:a,type:`euint64`}],contractAddress:this.address,userAddress:(0,r.getAddress)(c.address)});if(t.z(`transferFromAndCall: onEncryptComplete`,()=>s?.onEncryptComplete?.(),this.sdk.logger),d.length===0)throw new i(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFromAndCall`,config:t.O(this.address,l,u,d[0],f,o),onSubmitted:s?.onTransferSubmitted})}async setOperator(e,n){this.#e(`setOperator`),await C(`setOperator`,this.sdk.signer,this.sdk.provider);let i=(0,r.getAddress)(e);return this.submitTransaction({operation:`setOperator`,config:t.P(this.address,i,n)})}async isOperator(e,n){return this.sdk.provider.readContract(t.M(this.address,(0,r.getAddress)(e),(0,r.getAddress)(n)))}async readConfidentialBalanceOf(e){return await this.sdk.provider.readContract(t.w(this.address,e))}async assertConfidentialBalance(t){if(t===0n)return;let n;try{let e=await S(`assertConfidentialBalance`,this.sdk.signer,this.sdk.provider);n=await this.balanceOf((0,r.getAddress)(e.address))}catch(t){throw t instanceof e.r?t:new d(`Balance validation failed (token: ${this.address})`,{cause:t})}if(n<t)throw new c(`Insufficient confidential balance: requested ${t}, available ${n} (token: ${this.address})`,{requested:t,available:n,token:this.address})}emit(e){this.sdk.emitEvent(e,this.address)}async submitTransaction(e){let{operation:t,config:n,onSubmitted:r}=e;return T({operation:t,signer:this.#e(t),provider:this.sdk.provider,config:n,emit:e=>this.emit(e),onSubmitted:r,logger:this.sdk.logger})}static assertSameSdk(t){let n=t[0].sdk;for(let r=1;r<t.length;r++)if(t[r].sdk!==n)throw new e.t(`All tokens in a batch operation must share the same ZamaSDK instance`);return n}};Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return`0x0000000000000000000000000000000000000000000000000000000000000000`}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return i}});
2
2
  //# sourceMappingURL=token.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"token.cjs","names":["ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","SigningRejectedError","SigningFailedError","ConfigurationError","SignerNotConfiguredError","WalletAccountNotReadyError","transactionOperationMetadata","swallow","ZamaError","TransactionRevertedError","ZamaSDKEvents","requireConfigured","nameContract","symbolContract","decimalsContract","supportsInterfaceContract","ERC7984_INTERFACE_ID","ERC7984_WRAPPER_INTERFACE_ID","ZamaError","toError","#requireSigner","swallow","confidentialTransferContract","confidentialTransferFromContract","confidentialTransferAndCallContract","confidentialTransferFromAndCallContract","setOperatorContract","isOperatorContract","confidentialBalanceOfContract","submitSdkTransaction","ConfigurationError"],"sources":["../../src/errors/encryption.ts","../../src/errors/rpc.ts","../../src/errors/chain.ts","../../src/errors/balance.ts","../../src/errors/fatal-batch.ts","../../src/utils/fhe-type.ts","../../src/utils/handles.ts","../../src/utils/alignment.ts","../../src/utils/concurrency.ts","../../src/utils/submit-transaction.ts","../../src/token/token.ts"],"sourcesContent":["import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** FHE encryption failed. */\nexport class EncryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.EncryptionFailed, message, options);\n this.name = \"EncryptionFailedError\";\n }\n}\n\n/** FHE decryption failed. */\nexport class DecryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.DecryptionFailed, message, options);\n this.name = \"DecryptionFailedError\";\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * The consumer's RPC provider rate-limited an on-chain read the SDK performs\n * during decryption (e.g. the ACL check) — HTTP 429 or JSON-RPC `-32005`. An\n * RPC-endpoint problem, **not** a decryption/entitlement failure, and safe to\n * **retry**. Kept distinct from the relayer's own back-pressure\n * ({@link RelayerRequestFailedError}).\n *\n * Backoff for chain RPC is owned by the consumer's transport: viem/ethers\n * already honor the `Retry-After` header and retry internally before this error\n * surfaces, so it is configured on the transport you pass via `chain.network`\n * (not re-implemented here).\n *\n * @example\n * ```ts\n * try {\n * await sdk.decryption.decryptValues([{ encryptedValue, contractAddress }]);\n * } catch (e) {\n * if (e instanceof RpcRateLimitError) {\n * // back off and retry; consider a higher-throughput RPC endpoint\n * }\n * }\n * ```\n */\nexport class RpcRateLimitError extends ZamaError {\n /**\n * Suggested delay before retrying, in **seconds**, when a numeric `retryAfter`\n * is present on the error. Usually `undefined` for chain RPC: the `Retry-After`\n * header is consumed by the consumer's viem/ethers transport (which owns the\n * backoff), not surfaced here — see the class doc.\n */\n readonly retryAfter: number | undefined;\n\n constructor(message: string, options?: ErrorOptions & { retryAfter?: number }) {\n const { retryAfter, ...errorOptions } = options ?? {};\n super(ZamaErrorCode.RpcRateLimited, message, errorOptions);\n this.name = \"RpcRateLimitError\";\n this.retryAfter = retryAfter;\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * Thrown when the signer and provider are connected to different chains at the\n * start of a write operation.\n *\n * Every write method runs a chain-alignment pre-flight check. If\n * `signer.getChainId()` and `provider.getChainId()` return different values,\n * this error is thrown before any RPC mutation is attempted.\n *\n * @example\n * ```ts\n * try {\n * await token.shield(1000n);\n * } catch (e) {\n * if (e instanceof ChainMismatchError) {\n * console.error(\n * `Signer is on chain ${e.signerChainId} but provider is on chain ${e.providerChainId}`,\n * );\n * }\n * }\n * ```\n */\nexport class ChainMismatchError extends ZamaError {\n /** Name of the operation that triggered the check. */\n readonly operation: string;\n /** Chain ID the signer is connected to. */\n readonly signerChainId: number;\n /** Chain ID the provider is connected to. */\n readonly providerChainId: number;\n\n constructor(\n {\n operation,\n signerChainId,\n providerChainId,\n }: { operation: string; signerChainId: number; providerChainId: number },\n options?: ErrorOptions,\n ) {\n super(\n ZamaErrorCode.ChainMismatch,\n `Operation \"${operation}\" requires signer and provider to be on the same chain, ` +\n `but signer is on chain ${signerChainId} and provider is on chain ${providerChainId}.`,\n options,\n );\n this.name = \"ChainMismatchError\";\n this.operation = operation;\n this.signerChainId = signerChainId;\n this.providerChainId = providerChainId;\n }\n}\n","import type { Address } from \"viem\";\nimport { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** Structured details shared by balance-related errors. */\nexport interface BalanceErrorDetails {\n /** Amount the caller requested, in the token's base units. */\n readonly requested: bigint;\n /** Amount available at the time of the check, in the token's base units. */\n readonly available: bigint;\n /** Address of the token contract involved. */\n readonly token: Address;\n}\n\n/** Confidential (cToken) balance is insufficient for the requested operation. */\nexport class InsufficientConfidentialBalanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The available balance at the time of the check. */\n readonly available: bigint;\n /** The token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientConfidentialBalance, message, options);\n this.name = \"InsufficientConfidentialBalanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** ERC-20 balance is insufficient for the requested shield amount. */\nexport class InsufficientERC20BalanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The available balance at the time of the check. */\n readonly available: bigint;\n /** The ERC-20 token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientERC20Balance, message, options);\n this.name = \"InsufficientERC20BalanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** ERC-20 allowance granted to the wrapper is insufficient for the requested wrap amount. */\nexport class InsufficientAllowanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The allowance available at the time of the check. */\n readonly available: bigint;\n /** The underlying ERC-20 token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientAllowance, message, options);\n this.name = \"InsufficientAllowanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** Balance validation could not be performed (no cached credentials and decryption not possible). */\nexport class BalanceCheckUnavailableError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.BalanceCheckUnavailable, message, options);\n this.name = \"BalanceCheckUnavailableError\";\n }\n}\n\n/** A public ERC-20 read (e.g. balanceOf) failed due to a network or contract error. */\nexport class ERC20ReadFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.ERC20ReadFailed, message, options);\n this.name = \"ERC20ReadFailedError\";\n }\n}\n","import { ConfigurationError } from \"./relayer\";\nimport { RpcRateLimitError } from \"./rpc\";\nimport { SigningRejectedError, SigningFailedError } from \"./signing\";\n\n/**\n * Returns `true` for errors that should abort an entire batch operation\n * rather than be recorded per-item — wallet signature rejected, signing\n * infrastructure broken, SDK misconfigured, or the RPC provider throttling.\n * These are systemic failures that won't recover within the same call; for a\n * rate-limit in particular, the per-item retry loop would only amplify the\n * throttle by re-hitting the already-rate-limited endpoint.\n *\n * Callers iterating over a batch (e.g. per-token decrypt) should rethrow when\n * this predicate is true so the whole batch aborts, and record the error\n * per-item otherwise.\n */\nexport function isFatalBatchError(error: unknown): boolean {\n return (\n error instanceof SigningRejectedError ||\n error instanceof SigningFailedError ||\n error instanceof ConfigurationError ||\n error instanceof RpcRateLimitError\n );\n}\n","// Copied from @zama-fhe/relayer-sdk/src/sdk/FheType.ts\n// Pure utility functions with zero WASM dependency.\n// Adapted to use simple errors instead of RelayerErrorBase hierarchy.\n\n////////////////////////////////////////////////////////////////////////////////\n// Types (from types/primitives.d.ts)\n////////////////////////////////////////////////////////////////////////////////\n\nexport interface FheTypeNameToIdMap {\n ebool: 0;\n //euint4: 1; deprecated\n euint8: 2;\n euint16: 3;\n euint32: 4;\n euint64: 5;\n euint128: 6;\n eaddress: 7;\n euint256: 8;\n}\n\nexport interface FheTypeIdToNameMap {\n 0: \"ebool\";\n //1: 'euint4'; deprecated\n 2: \"euint8\";\n 3: \"euint16\";\n 4: \"euint32\";\n 5: \"euint64\";\n 6: \"euint128\";\n 7: \"eaddress\";\n 8: \"euint256\";\n}\n\nexport interface FheTypeEncryptionBitwidthToIdMap {\n 2: FheTypeNameToIdMap[\"ebool\"];\n 8: FheTypeNameToIdMap[\"euint8\"];\n 16: FheTypeNameToIdMap[\"euint16\"];\n 32: FheTypeNameToIdMap[\"euint32\"];\n 64: FheTypeNameToIdMap[\"euint64\"];\n 128: FheTypeNameToIdMap[\"euint128\"];\n 160: FheTypeNameToIdMap[\"eaddress\"];\n 256: FheTypeNameToIdMap[\"euint256\"];\n}\n\nexport type FheTypeIdToEncryptionBitwidthMap = {\n [K in keyof FheTypeEncryptionBitwidthToIdMap as FheTypeEncryptionBitwidthToIdMap[K]]: K;\n};\n\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type FheTypeName = Prettify<keyof FheTypeNameToIdMap>;\nexport type FheTypeId = Prettify<keyof FheTypeIdToNameMap>;\nexport type EncryptionBits = Prettify<keyof FheTypeEncryptionBitwidthToIdMap>;\n\n////////////////////////////////////////////////////////////////////////////////\n// Lookup Maps\n////////////////////////////////////////////////////////////////////////////////\n\nconst MINIMUM_ENCRYPTION_BIT_WIDTH = 2;\n\nconst FheTypeNameToId: FheTypeNameToIdMap = {\n ebool: 0,\n //euint4: 1, deprecated\n euint8: 2,\n euint16: 3,\n euint32: 4,\n euint64: 5,\n euint128: 6,\n eaddress: 7,\n euint256: 8,\n} as const;\n\nconst FheTypeIdToName: FheTypeIdToNameMap = {\n 0: \"ebool\",\n //1: 'euint4', deprecated\n 2: \"euint8\",\n 3: \"euint16\",\n 4: \"euint32\",\n 5: \"euint64\",\n 6: \"euint128\",\n 7: \"eaddress\",\n 8: \"euint256\",\n} as const;\n\nconst FheTypeIdToEncryptionBitwidth: FheTypeIdToEncryptionBitwidthMap = {\n 0: 2,\n //1:?, euint4 deprecated\n 2: 8,\n 3: 16,\n 4: 32,\n 5: 64,\n 6: 128,\n 7: 160,\n 8: 256,\n} as const;\n\nconst EncryptionBitwidthToFheTypeId: FheTypeEncryptionBitwidthToIdMap = {\n 2: 0,\n 8: 2,\n 16: 3,\n 32: 4,\n 64: 5,\n 128: 6,\n 160: 7,\n 256: 8,\n} as const;\n\nObject.freeze(FheTypeNameToId);\nObject.freeze(FheTypeIdToName);\nObject.freeze(FheTypeIdToEncryptionBitwidth);\nObject.freeze(EncryptionBitwidthToFheTypeId);\n\n////////////////////////////////////////////////////////////////////////////////\n// Type Guards\n////////////////////////////////////////////////////////////////////////////////\n\nexport function isFheTypeId(value: unknown): value is FheTypeId {\n switch (value as FheTypeId) {\n case 0:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n case 8:\n return true;\n default:\n return false;\n }\n}\n\nexport function isFheTypeName(value: unknown): value is FheTypeName {\n if (typeof value !== \"string\") {\n return false;\n }\n return value in FheTypeNameToId;\n}\n\nexport function isEncryptionBits(value: unknown): value is EncryptionBits {\n if (typeof value !== \"number\") {\n return false;\n }\n return value in EncryptionBitwidthToFheTypeId;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Converters\n////////////////////////////////////////////////////////////////////////////////\n\nexport function fheTypeIdFromEncryptionBits(bitwidth: number): FheTypeId {\n if (!isEncryptionBits(bitwidth)) {\n throw new Error(`Invalid encryption bits ${bitwidth}`);\n }\n return EncryptionBitwidthToFheTypeId[bitwidth];\n}\n\nexport function fheTypeIdFromName(name: string): FheTypeId {\n if (!isFheTypeName(name)) {\n throw new Error(`Invalid FheType name '${name}'`);\n }\n return FheTypeNameToId[name];\n}\n\nexport function fheTypeNameFromId(id: number): FheTypeName {\n if (!isFheTypeId(id)) {\n throw new Error(`Invalid FheType id '${id}'`);\n }\n return FheTypeIdToName[id];\n}\n\nexport function encryptionBitsFromFheTypeId(typeId: number): EncryptionBits {\n if (!isFheTypeId(typeId)) {\n throw new Error(`Invalid FheType id '${typeId}'`);\n }\n const bw = FheTypeIdToEncryptionBitwidth[typeId];\n if (bw < MINIMUM_ENCRYPTION_BIT_WIDTH) {\n throw new Error(\n `Invalid FheType encryption bit width: ${bw}. Minimum is ${MINIMUM_ENCRYPTION_BIT_WIDTH} bits.`,\n );\n }\n return bw;\n}\n\nexport function encryptionBitsFromFheTypeName(name: string): EncryptionBits {\n if (!isFheTypeName(name)) {\n throw new Error(`Invalid FheType name '${name}'`);\n }\n const bw = FheTypeIdToEncryptionBitwidth[FheTypeNameToId[name]];\n if (bw < MINIMUM_ENCRYPTION_BIT_WIDTH) {\n throw new Error(\n `Invalid FheType encryption bit width: ${bw}. Minimum is ${MINIMUM_ENCRYPTION_BIT_WIDTH} bits.`,\n );\n }\n return bw;\n}\n","import type { EncryptedValue } from \"../relayer/types\";\nimport { encryptionBitsFromFheTypeId, isFheTypeId } from \"./fhe-type\";\n\n/** All-zero encrypted-value sentinel — a 32-byte zero handle representing the cleartext value `0`. */\nexport const ZERO_ENCRYPTED_VALUE =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\n\n/**\n * Check whether an encrypted value represents the zero value.\n */\nexport function isEncryptedValueZero(encryptedValue: string): boolean {\n return encryptedValue === ZERO_ENCRYPTED_VALUE || encryptedValue === \"0x\";\n}\n\n/**\n * Per-request cleartext-bit budget enforced by the KMS gateway, mirrored from\n * `@fhevm/sdk`'s `MAX_KMS_DECRYPT_DECRYPTION_BIT_LIMIT` (protocol-level constant,\n * not imported — see {@link MAX_CONTRACTS_PER_PERMIT} for why). Internal: decrypt\n * requests are chunked to respect it automatically, so callers never need this value.\n */\nexport const MAX_DECRYPTION_REQUEST_BITS = 2048;\n\n/** Max encryption bit width among all currently-known FHE types (euint256). */\nconst MAX_KNOWN_ENCRYPTION_BITS = 256;\n\n/**\n * Cleartext bit cost of decrypting a single handle, derived from its FHE\n * type (encoded at bits 8-15 of the handle — the same layout `@fhevm/sdk`'s\n * `FhevmHandle` decodes, byte 30 of the 32-byte handle).\n *\n * Falls back to {@link MAX_KNOWN_ENCRYPTION_BITS} for an unrecognized type\n * byte, or for a value that isn't parseable hex at all, instead of throwing.\n * A real on-chain handle is always well-formed with a valid type byte, so\n * this fallback only ever fires for synthetic test/placeholder handles —\n * deliberately more permissive than the relayer's own strict validation so\n * chunking stays safe without requiring every test fixture to encode a real\n * FHE handle. Do not tighten this to match relayer semantics.\n */\nexport function encryptionBitsForHandle(encryptedValue: EncryptedValue): number {\n let handleValue: bigint;\n try {\n handleValue = BigInt(encryptedValue);\n } catch {\n return MAX_KNOWN_ENCRYPTION_BITS;\n }\n const typeByte = Number((handleValue >> 8n) & 0xffn);\n return isFheTypeId(typeByte) ? encryptionBitsFromFheTypeId(typeByte) : MAX_KNOWN_ENCRYPTION_BITS;\n}\n\n/**\n * Split `handles` into groups whose cumulative cleartext-bit cost never\n * exceeds `maxBits`, preserving input order. Unlike {@link chunkContracts}\n * (fixed-size slices), a greedy accumulate-until-exceeded walk is required\n * since per-handle cost varies by FHE type. A handle whose own cost exceeds\n * `maxBits` still gets a solo chunk — always makes forward progress.\n */\nexport function chunkHandlesByBitBudget(\n handles: readonly EncryptedValue[],\n maxBits: number = MAX_DECRYPTION_REQUEST_BITS,\n): EncryptedValue[][] {\n const chunks: EncryptedValue[][] = [];\n let current: EncryptedValue[] = [];\n let currentBits = 0;\n\n for (const handle of handles) {\n const bits = encryptionBitsForHandle(handle);\n if (current.length > 0 && currentBits + bits > maxBits) {\n chunks.push(current);\n current = [];\n currentBits = 0;\n }\n current.push(handle);\n currentBits += bits;\n }\n if (current.length > 0) {\n chunks.push(current);\n }\n return chunks;\n}\n","import {\n ChainMismatchError,\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n} from \"../errors\";\nimport type { GenericProvider, GenericSigner, WalletAccount } from \"../types\";\n\n/**\n * Pre-flight guard for signer-required operations. Resolves the connected\n * wallet account (refreshing once if the signer reports it isn't ready) and\n * verifies the signer's chain matches the provider's.\n *\n * @internal\n */\nexport async function requireAlignedWalletAccount(\n operation: string,\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n): Promise<WalletAccount> {\n if (!signer) {\n throw new SignerNotConfiguredError(operation);\n }\n let account: WalletAccount;\n try {\n account = signer.requireWalletAccount(operation);\n } catch (error) {\n if (!(error instanceof WalletAccountNotReadyError) || !signer.refreshWalletAccount) {\n throw error;\n }\n await signer.refreshWalletAccount();\n account = signer.requireWalletAccount(operation);\n }\n const providerChainId = await provider.getChainId();\n if (account.chainId !== providerChainId) {\n throw new ChainMismatchError({ operation, signerChainId: account.chainId, providerChainId });\n }\n return account;\n}\n\n/**\n * Variant of {@link requireAlignedWalletAccount} that returns only the aligned\n * chain ID. Useful when a write path only needs to ensure signer/provider\n * coherence and doesn't otherwise consume the account.\n *\n * @internal\n */\nexport async function requireChainAlignment(\n operation: string,\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n): Promise<number> {\n return (await requireAlignedWalletAccount(operation, signer, provider)).chainId;\n}\n","/**\n * Execute an array of async thunks with bounded concurrency.\n * Defaults to `Infinity` (equivalent to `Promise.all`).\n */\nexport async function pLimit<T>(\n fns: (() => Promise<T>)[],\n maxConcurrency = Infinity,\n): Promise<T[]> {\n if (Number.isFinite(maxConcurrency) && maxConcurrency <= 0) {\n throw new Error(\"maxConcurrency must be a positive number\");\n }\n if (!Number.isFinite(maxConcurrency) || maxConcurrency >= fns.length) {\n return Promise.all(fns.map((f) => f()));\n }\n\n const results: T[] = Array.from({ length: fns.length });\n let index = 0;\n\n async function worker() {\n while (index < fns.length) {\n const i = index++;\n if (fns[i]) {\n results[i] = await fns[i]();\n }\n }\n }\n\n await Promise.all(Array.from({ length: maxConcurrency }, worker));\n return results;\n}\n","import type { Hex } from \"viem\";\nimport { TransactionRevertedError, ZamaError } from \"../errors\";\nimport type { TransactionOperation, ZamaSDKEventInput } from \"../events/sdk-events\";\nimport { transactionOperationMetadata, ZamaSDKEvents } from \"../events/sdk-events\";\nimport type {\n GenericLogger,\n GenericProvider,\n GenericSigner,\n TransactionResult,\n WriteContractConfig,\n} from \"../types\";\nimport { swallow } from \"./swallow\";\n\n/**\n * Shared write-transaction pipeline for SDK calls that submit a transaction.\n *\n * On success: writes the tx, emits the per-operation submitted event from\n * {@link transactionOperationMetadata}, fires `onSubmitted`, waits for the\n * receipt, and returns `{ txHash, receipt }`.\n *\n * On failure: emits a {@link ZamaSDKEvents.TransactionError} event with the\n * transaction-level error it will throw, then throws it. Existing `ZamaError`\n * instances are rethrown as-is; all other failures are wrapped in\n * `TransactionRevertedError` with the original error as `cause`.\n */\nexport async function submitTransaction(params: {\n operation: TransactionOperation;\n signer: GenericSigner;\n provider: GenericProvider;\n config: WriteContractConfig;\n emit: (input: ZamaSDKEventInput) => void;\n onSubmitted?: (txHash: Hex) => void;\n logger: GenericLogger;\n}): Promise<TransactionResult> {\n const { operation, signer, provider, config, emit, onSubmitted, logger } = params;\n const metadata = transactionOperationMetadata[operation];\n\n try {\n const txHash = await signer.writeContract(config);\n emit(metadata.submittedEvent(txHash));\n void swallow(`${operation}: onSubmitted`, () => onSubmitted?.(txHash), logger);\n const receipt = await provider.waitForTransactionReceipt(txHash);\n return { txHash, receipt };\n } catch (error) {\n const failure =\n error instanceof ZamaError\n ? error\n : new TransactionRevertedError(`Transaction failed during ${operation}`, { cause: error });\n\n emit({ type: ZamaSDKEvents.TransactionError, operation, error: failure });\n throw failure;\n }\n}\n","import { type Address, getAddress, type Hex } from \"viem\";\nimport {\n confidentialBalanceOfContract,\n confidentialTransferAndCallContract,\n confidentialTransferContract,\n confidentialTransferFromAndCallContract,\n confidentialTransferFromContract,\n decimalsContract,\n ERC7984_INTERFACE_ID,\n ERC7984_WRAPPER_INTERFACE_ID,\n isOperatorContract,\n nameContract,\n setOperatorContract,\n supportsInterfaceContract,\n symbolContract,\n} from \"../contracts\";\nimport {\n BalanceCheckUnavailableError,\n ConfigurationError,\n DecryptionFailedError,\n EncryptionFailedError,\n InsufficientConfidentialBalanceError,\n isFatalBatchError,\n requireConfigured,\n ZamaError,\n} from \"../errors\";\nimport type { TransactionOperation, ZamaSDKEventInput } from \"../events/sdk-events\";\nimport type { EncryptedValue } from \"../relayer/types\";\nimport { toError } from \"../utils\";\nimport { requireAlignedWalletAccount, requireChainAlignment } from \"../utils/alignment\";\nimport { assertBigint } from \"../utils/assertions\";\nimport { pLimit } from \"../utils/concurrency\";\nimport { isEncryptedValueZero } from \"../utils/handles\";\nimport { submitTransaction as submitSdkTransaction } from \"../utils/submit-transaction\";\nimport { swallow } from \"../utils/swallow\";\nimport type {\n GenericSigner,\n TransactionResult,\n TransferCallbacks,\n TransferOptions,\n WriteContractConfig,\n} from \"../types\";\nimport type { ZamaSDK } from \"../zama-sdk\";\n\n/** Options for {@link Token.batchDecryptBalancesAs}. */\nexport interface BatchDecryptAsOptions {\n /** The address of the account that delegated decryption rights. */\n delegatorAddress: Address;\n /** Pre-fetched encrypted values. When omitted, they are fetched from the chain. */\n encryptedValues?: EncryptedValue[];\n /**\n * The account whose on-chain balance to read. Defaults to the delegator\n * address, which is the common case (the delegator grants permission to\n * decrypt their own balance). Only set this when the account differs\n * from the delegator.\n *\n * Matches the `account` parameter of `confidentialBalanceOf(account)` on-chain.\n */\n accountAddress?: Address;\n /** Maximum number of concurrent decrypt calls. Default: 10. */\n maxConcurrency?: number;\n /** Called when decryption fails for a single token. Return a fallback bigint. */\n onError?: (error: Error, address: Address) => bigint;\n}\n\n/** Result of {@link Token.batchBalancesOf}. */\nexport interface BatchBalancesResult {\n /** Successfully decrypted balances, keyed by token address. */\n results: Map<Address, bigint>;\n /** Per-token errors for tokens that failed to decrypt. */\n errors: Map<Address, ZamaError>;\n}\n\n/**\n * High-level interface for an ERC-7984 confidential token.\n * Hides FHE complexity (encryption, decryption, EIP-712 signing) behind\n * familiar ERC-20-like methods.\n *\n * For ERC-7984 wrappers (shield/unshield), use {@link WrappedToken} instead —\n * it extends `Token` with wrapper-specific operations.\n *\n * Decryption, credentials, caching, and event emission are handled by the\n * owning {@link ZamaSDK} — this class only exposes token-scoped helpers\n * that delegate to `sdk.decryption.decryptValues` and `sdk.permits.grantPermit`.\n */\nexport class Token {\n /** The SDK instance this token operates through. */\n readonly sdk: ZamaSDK;\n /** Checksummed address of the confidential token contract. */\n readonly address: Address;\n\n constructor(sdk: ZamaSDK, address: Address) {\n this.sdk = sdk;\n this.address = getAddress(address);\n }\n\n /** Resolve `sdk.signer` or throw {@link SignerNotConfiguredError} tagged with `operation`. */\n #requireSigner(operation: string): GenericSigner {\n return requireConfigured(this.sdk.signer, operation);\n }\n\n // METADATA\n\n /** Read the token name from the contract. */\n async name(): Promise<string> {\n return this.sdk.provider.readContract(nameContract(this.address));\n }\n\n /** Read the token symbol from the contract. */\n async symbol(): Promise<string> {\n return this.sdk.provider.readContract(symbolContract(this.address));\n }\n\n /** Read the token decimals from the contract. */\n async decimals(): Promise<number> {\n return this.sdk.provider.readContract(decimalsContract(this.address));\n }\n\n // ERC-165 DISCOVERY\n\n /**\n * ERC-165 check for {@link ERC7984_INTERFACE_ID} support.\n *\n * @returns `true` if the contract implements the ERC-7984 confidential token interface.\n */\n async isConfidential(): Promise<boolean> {\n return this.sdk.provider.readContract(\n supportsInterfaceContract(this.address, ERC7984_INTERFACE_ID),\n );\n }\n\n /**\n * ERC-165 check for IERC7984ERC20Wrapper support.\n *\n * @returns `true` if the contract implements the ERC-7984 wrapper interface\n * ({@link ERC7984_WRAPPER_INTERFACE_ID}, `0x1f1c62b2`).\n */\n async isWrapper(): Promise<boolean> {\n return this.sdk.provider.readContract(\n supportsInterfaceContract(this.address, ERC7984_WRAPPER_INTERFACE_ID),\n );\n }\n\n // BALANCES\n\n /**\n * Decrypt and return the plaintext balance for the given owner.\n * Acquires FHE credentials via a wallet signature if none are cached.\n *\n * @param owner - Balance owner address.\n * @returns The decrypted plaintext balance as a bigint.\n * @throws if FHE decryption fails. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balance = await token.balanceOf(\"0xOwner\");\n * ```\n */\n async balanceOf(owner: Address): Promise<bigint> {\n const ownerAddress = getAddress(owner);\n const encryptedValue = await this.readConfidentialBalanceOf(ownerAddress);\n const result = await this.sdk.decryption.decryptValues([\n { encryptedValue, contractAddress: this.address },\n ]);\n const value = result[encryptedValue];\n if (value === undefined) {\n throw new DecryptionFailedError(`Decryption returned no value for ${encryptedValue}`);\n }\n assertBigint(value, \"balanceOf: result[encryptedValue]\");\n return value;\n }\n\n /**\n * Return the raw encrypted balance without decrypting.\n *\n * @param owner - Balance owner address.\n * @returns The encrypted balance as a hex string.\n *\n * @example\n * ```ts\n * const encryptedValue = await token.confidentialBalanceOf(\"0xOwner\");\n * ```\n */\n async confidentialBalanceOf(owner: Address): Promise<EncryptedValue> {\n return this.readConfidentialBalanceOf(getAddress(owner));\n }\n\n /**\n * Decrypt the balance of a delegator using delegated decryption credentials.\n * The connected signer acts as the delegatee who has been granted permission\n * by the delegator to decrypt their balance.\n *\n * Clear values are cached in storage keyed by `(account, token, encryptedValue)`.\n * Because every on-chain balance change produces a new encrypted value,\n * stale cache entries are never served. Cache write failures are silently\n * ignored — they do not affect the returned value.\n *\n * @param delegatorAddress - The address of the account that delegated decryption rights.\n * @param accountAddress - The account whose on-chain balance to read. Defaults\n * to the delegator address.\n * @returns The decrypted plaintext balance as a bigint.\n * @throws if no active delegation exists. {@link DelegationNotFoundError}\n * @throws if the delegation has expired. {@link DelegationExpiredError}\n * @throws if delegated decryption fails. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balance = await token.decryptBalanceAs({\n * delegatorAddress: \"0xDelegator\",\n * });\n * ```\n */\n async decryptBalanceAs({\n delegatorAddress,\n accountAddress,\n }: {\n delegatorAddress: Address;\n accountAddress?: Address;\n }): Promise<bigint> {\n await requireChainAlignment(\"decryptBalanceAs\", this.sdk.signer, this.sdk.provider);\n const normalizedDelegator = getAddress(delegatorAddress);\n const normalizedAccount = accountAddress ? getAddress(accountAddress) : normalizedDelegator;\n\n const encryptedValue = await this.readConfidentialBalanceOf(normalizedAccount);\n if (isEncryptedValueZero(encryptedValue)) {\n return 0n;\n }\n\n const result = await this.sdk.decryption.delegatedDecryptValues(\n [{ encryptedValue, contractAddress: this.address }],\n normalizedDelegator,\n normalizedAccount,\n );\n\n const value = result[encryptedValue];\n if (value === undefined) {\n throw new DecryptionFailedError(\n `Delegated decryption returned no value for ${encryptedValue}`,\n );\n }\n assertBigint(value, \"decryptBalanceAs: result[encryptedValue]\");\n return value;\n }\n\n // BATCH STATICS\n\n /**\n * Decrypt confidential balances for multiple tokens in parallel, returning\n * successes and per-token errors separately. Pre-authorizes all token\n * addresses in a single wallet signature, then delegates each decrypt to\n * `sdk.decryption.decryptValues`.\n *\n * Tokens that fail to decrypt land in `errors` rather than aborting the\n * whole batch — caller decides how to surface them.\n *\n * @param tokens - Array of {@link Token} instances bound to the same SDK.\n * @param owner - Balance owner address.\n * @returns `{ results, errors }` partitioning the per-token outcomes.\n *\n * @example\n * ```ts\n * const { results, errors } = await Token.batchBalancesOf(tokens, owner);\n * ```\n */\n static async batchBalancesOf(tokens: Token[], owner: Address): Promise<BatchBalancesResult> {\n const results = new Map<Address, bigint>();\n const errors = new Map<Address, ZamaError>();\n if (tokens.length === 0) {\n return { results, errors };\n }\n\n const sdk = Token.assertSameSdk(tokens);\n // Fail fast on chain mismatch before prompting the wallet for a signature.\n await requireChainAlignment(\"batchBalancesOf\", sdk.signer, sdk.provider);\n // Pre-authorize the full token set in one wallet signature so subsequent\n // per-token decryptValues calls reuse the cached credentials.\n await sdk.permits.grantPermit(tokens.map((t) => t.address));\n\n const outcomes = await pLimit(\n tokens.map((t) => async () => {\n try {\n return { status: \"fulfilled\" as const, value: await t.balanceOf(owner) };\n } catch (reason) {\n return { status: \"rejected\" as const, reason };\n }\n }),\n 5,\n );\n\n for (let i = 0; i < tokens.length; i++) {\n const tokenAddress = tokens[i]!.address;\n const outcome = outcomes[i]!;\n if (outcome.status === \"fulfilled\") {\n results.set(tokenAddress, outcome.value);\n } else {\n const reason = outcome.reason;\n // Session-level failures (user rejected signature, SDK misconfigured)\n // apply to every token — surface them instead of collecting per-token.\n if (isFatalBatchError(reason)) {\n throw reason;\n }\n const error =\n reason instanceof ZamaError\n ? reason\n : new DecryptionFailedError(toError(reason).message, { cause: reason });\n errors.set(tokenAddress, error);\n }\n }\n\n // Total failure: surface the first error so callers know nothing decrypted.\n if (errors.size === tokens.length) {\n const firstError = errors.values().next().value;\n throw firstError ?? new DecryptionFailedError(\"All token balance decryptions failed\");\n }\n\n return { results, errors };\n }\n\n /**\n * Batch decrypt confidential balances as a delegate across multiple tokens.\n * Mirrors {@link batchBalancesOf} but uses delegated credentials.\n *\n * **Error handling:** If a per-token decryption fails and no `onError` callback\n * is provided, errors are collected and thrown as an aggregated\n * `DecryptionFailedError`. When the relayer returns no value for an encrypted value,\n * a `DecryptionFailedError` is thrown for that token (never silently returns `0n`).\n * Pass `onError: () => 0n` to opt into the silent zero behavior.\n *\n * @param tokens - Array of Token instances to decrypt balances for.\n * @param options - Delegated decryption configuration.\n * @returns A Map from token address to decrypted balance.\n * @throws if no active delegation exists. {@link DelegationNotFoundError}\n * @throws if the delegation has expired. {@link DelegationExpiredError}\n * @throws if any decryption fails and no `onError` is provided. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balances = await Token.batchDecryptBalancesAs(tokens, {\n * delegatorAddress: \"0xDelegator\",\n * onError: (err, addr) => { console.error(addr, err); return 0n; },\n * });\n * ```\n */\n static async batchDecryptBalancesAs(\n tokens: Token[],\n options: BatchDecryptAsOptions,\n ): Promise<Map<Address, bigint>> {\n if (tokens.length === 0) {\n return new Map();\n }\n\n const sdk = Token.assertSameSdk(tokens);\n const results = new Map<Address, bigint>();\n const errors = new Map<Address, ZamaError>();\n const normalizedAccount = options.accountAddress\n ? getAddress(options.accountAddress)\n : getAddress(options.delegatorAddress);\n const maxConcurrency = options.maxConcurrency ?? 10;\n if (options.encryptedValues && tokens.length !== options.encryptedValues.length) {\n throw new DecryptionFailedError(\n `tokens.length (${tokens.length}) must equal encryptedValues.length (${options.encryptedValues.length})`,\n );\n }\n const resolvedEncryptedValues =\n options.encryptedValues ??\n (await Token.readBalanceHandlesBatch(tokens, normalizedAccount, errors, maxConcurrency));\n\n const decryptRequests: Array<{ token: Token; encryptedValue: EncryptedValue }> = [];\n for (const [index, token] of tokens.entries()) {\n const encryptedValue = resolvedEncryptedValues[index];\n if (!encryptedValue || errors.has(token.address)) {\n continue;\n }\n if (isEncryptedValueZero(encryptedValue)) {\n // Zero balance → skip the relayer; no decryption needed.\n results.set(token.address, 0n);\n } else {\n decryptRequests.push({ token, encryptedValue });\n }\n }\n\n if (decryptRequests.length > 0) {\n const decrypted = await sdk.decryption.delegatedBatchDecryptValues({\n encryptedInputs: decryptRequests.map(({ token, encryptedValue }) => ({\n encryptedValue,\n contractAddress: token.address,\n })),\n delegatorAddress: options.delegatorAddress,\n accountAddress: options.accountAddress,\n maxConcurrency,\n });\n\n for (const [index, item] of decrypted.items.entries()) {\n const request = decryptRequests[index];\n if (!request) {\n continue;\n }\n if (item.error) {\n errors.set(request.token.address, item.error);\n continue;\n }\n const value = item.value;\n if (value === undefined) {\n errors.set(\n request.token.address,\n new DecryptionFailedError(\n `Batch delegated decryption returned no value for ${item.encryptedValue} on token ${request.token.address}`,\n ),\n );\n continue;\n }\n assertBigint(value, \"batchDecryptBalancesAs: result[encryptedValue]\");\n results.set(request.token.address, value);\n }\n }\n\n if (errors.size === 0) {\n return results;\n }\n\n if (options.onError) {\n const callbackErrors: Array<{ address: Address; error: Error }> = [];\n for (const [address, error] of errors) {\n try {\n results.set(address, options.onError(error, address));\n } catch (callbackError) {\n callbackErrors.push({ address, error: toError(callbackError) });\n }\n }\n if (callbackErrors.length > 0) {\n const message = callbackErrors\n .map(({ address, error }) => `${address}: ${error.message}`)\n .join(\"; \");\n throw new DecryptionFailedError(\n `Batch delegated decryption onError callback failed for ${callbackErrors.length} token(s): ${message}`,\n { cause: callbackErrors[0]?.error },\n );\n }\n return results;\n }\n\n const errorEntries = Array.from(errors.entries());\n const message = errorEntries.map(([addr, e]) => `${addr}: ${e.message}`).join(\"; \");\n throw new DecryptionFailedError(\n `Batch delegated decryption failed for ${errors.size} token(s): ${message}`,\n { cause: errorEntries[0]?.[1] },\n );\n }\n\n private static async readBalanceHandlesBatch(\n tokens: Token[],\n accountAddress: Address,\n errors: Map<Address, ZamaError>,\n maxConcurrency: number,\n ): Promise<Array<EncryptedValue | undefined>> {\n const outcomes = await pLimit(\n tokens.map((token) => async () => {\n try {\n return {\n status: \"fulfilled\" as const,\n value: await token.readConfidentialBalanceOf(accountAddress),\n };\n } catch (reason) {\n return { status: \"rejected\" as const, reason };\n }\n }),\n maxConcurrency,\n );\n\n const encryptedValues: Array<EncryptedValue | undefined> = [];\n for (const [index, token] of tokens.entries()) {\n const outcome = outcomes[index];\n if (!outcome) {\n continue;\n }\n if (outcome.status === \"fulfilled\") {\n encryptedValues[index] = outcome.value;\n continue;\n }\n if (isFatalBatchError(outcome.reason)) {\n throw outcome.reason;\n }\n errors.set(\n token.address,\n outcome.reason instanceof ZamaError\n ? outcome.reason\n : new DecryptionFailedError(toError(outcome.reason).message, { cause: outcome.reason }),\n );\n }\n return encryptedValues;\n }\n\n // WRITE OPERATIONS\n\n /**\n * Confidential transfer. Encrypts the amount via FHE, then calls the contract.\n *\n * By default, the SDK validates the confidential balance before submitting.\n * If a cached plaintext balance exists it is used; otherwise, if credentials\n * are cached, it decrypts on the fly. Set `skipBalanceCheck: true` to bypass\n * this validation (e.g. for smart wallets).\n *\n * @param to - Recipient address.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param options - Optional: `skipBalanceCheck` (default `false`).\n * @returns The transaction hash and mined receipt.\n * @throws if signer and provider are on different chains. {@link ChainMismatchError}\n * @throws if the balance is less than `amount`. {@link InsufficientConfidentialBalanceError}\n * @throws if balance validation requires decryption that is not possible. {@link BalanceCheckUnavailableError}\n * @throws if FHE encryption fails. {@link EncryptionFailedError}\n * @throws if the on-chain transfer reverts. {@link TransactionRevertedError}\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransfer(\"0xRecipient\", 1000n);\n * ```\n */\n async confidentialTransfer(\n to: Address,\n amount: bigint,\n options?: TransferOptions,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransfer\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransfer\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const { skipBalanceCheck = false, onEncryptComplete, onTransferSubmitted } = options ?? {};\n\n const normalizedTo = getAddress(to);\n\n if (!skipBalanceCheck) {\n await this.assertConfidentialBalance(amount);\n }\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\"transfer: onEncryptComplete\", () => onEncryptComplete?.(), this.sdk.logger);\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transfer\",\n config: confidentialTransferContract(\n this.address,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n ),\n onSubmitted: onTransferSubmitted,\n });\n }\n\n /**\n * Operator encrypted transfer on behalf of another address.\n * The caller must be an approved operator for `from`.\n *\n * @param from - The address to transfer from (caller must be an approved operator).\n * @param to - Recipient address.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFrom(\"0xFrom\", \"0xTo\", 500n);\n * ```\n */\n async confidentialTransferFrom(\n from: Address,\n to: Address,\n amount: bigint,\n callbacks?: TransferCallbacks,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferFrom\");\n await requireAlignedWalletAccount(\n \"confidentialTransferFrom\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const normalizedFrom = getAddress(from);\n const normalizedTo = getAddress(to);\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: normalizedFrom,\n });\n void swallow(\n \"transferFrom: onEncryptComplete\",\n () => callbacks?.onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferFrom\",\n config: confidentialTransferFromContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n ),\n onSubmitted: callbacks?.onTransferSubmitted,\n });\n }\n\n /**\n * ERC-7984 `confidentialTransferAndCall`: encrypted transfer that also invokes\n * the recipient's receiver hook (`onConfidentialTransferReceived`) in a single\n * transaction. The caller crafts the opaque `data` payload — the SDK does not\n * encode, validate, or interpret it.\n *\n * Balance validation follows the same rules as {@link Token.confidentialTransfer}.\n *\n * @param to - Recipient address. Must implement the ERC-7984 receiver hook.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param data - Opaque bytes forwarded to the recipient's receiver hook.\n * @param options - Optional: `skipBalanceCheck` (default `false`).\n * @returns The transaction hash and mined receipt.\n *\n * @throws if signer and provider are on different chains. {@link ChainMismatchError}\n * @throws if the balance is less than `amount`. {@link InsufficientConfidentialBalanceError}\n * @throws if balance validation requires decryption that is not possible. {@link BalanceCheckUnavailableError}\n * @throws if FHE encryption fails. {@link EncryptionFailedError}\n * @throws if the on-chain transfer reverts. {@link TransactionRevertedError}\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferAndCall(\n * \"0xRecipient\",\n * 1000n,\n * \"0xabcd\", // caller-encoded payload forwarded to the receiver hook\n * );\n * ```\n */\n async confidentialTransferAndCall(\n to: Address,\n amount: bigint,\n data: Hex,\n options?: TransferOptions,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferAndCall\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransferAndCall\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const { skipBalanceCheck = false, onEncryptComplete, onTransferSubmitted } = options ?? {};\n\n const normalizedTo = getAddress(to);\n\n if (!skipBalanceCheck) {\n await this.assertConfidentialBalance(amount);\n }\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\n \"transferAndCall: onEncryptComplete\",\n () => onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferAndCall\",\n config: confidentialTransferAndCallContract(\n this.address,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n data,\n ),\n onSubmitted: onTransferSubmitted,\n });\n }\n\n /**\n * ERC-7984 `confidentialTransferFromAndCall`: operator-initiated encrypted\n * transfer that also invokes the recipient's receiver hook in a single\n * transaction. The caller must be an approved operator for `from` and crafts\n * the opaque `data` payload — the SDK does not encode or interpret it.\n *\n * @param from - The address to transfer from (caller must be an approved operator).\n * @param to - Recipient address. Must implement the ERC-7984 receiver hook.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param data - Opaque bytes forwarded to the recipient's receiver hook.\n * @param callbacks - Optional progress callbacks.\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFromAndCall(\n * \"0xFrom\",\n * \"0xRecipient\",\n * 500n,\n * \"0xabcd\",\n * );\n * ```\n */\n async confidentialTransferFromAndCall(\n from: Address,\n to: Address,\n amount: bigint,\n data: Hex,\n callbacks?: TransferCallbacks,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferFromAndCall\");\n await requireAlignedWalletAccount(\n \"confidentialTransferFromAndCall\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const normalizedFrom = getAddress(from);\n const normalizedTo = getAddress(to);\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: normalizedFrom,\n });\n void swallow(\n \"transferFromAndCall: onEncryptComplete\",\n () => callbacks?.onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferFromAndCall\",\n config: confidentialTransferFromAndCallContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n data,\n ),\n onSubmitted: callbacks?.onTransferSubmitted,\n });\n }\n\n // OPERATOR APPROVAL\n\n /**\n * Set operator approval for the confidential token.\n * Defaults to 1 hour from now if `until` is not specified.\n *\n * @param operator - The address to set as an operator.\n * @param until - Optional Unix timestamp for approval expiry. Defaults to now + 1 hour.\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.setOperator(\"0xOperator\");\n * ```\n */\n async setOperator(operator: Address, until?: number): Promise<TransactionResult> {\n this.#requireSigner(\"setOperator\");\n await requireChainAlignment(\"setOperator\", this.sdk.signer, this.sdk.provider);\n const normalizedOperator = getAddress(operator);\n return this.submitTransaction({\n operation: \"setOperator\",\n config: setOperatorContract(this.address, normalizedOperator, until),\n });\n }\n\n /**\n * Check if a spender is an approved operator for a given holder.\n *\n * @param holder - The token holder address.\n * @param spender - The address to check operator approval for.\n * @returns `true` if the spender is an approved operator for the holder.\n *\n * @example\n * ```ts\n * if (await token.isOperator(\"0xHolder\", \"0xSpender\")) {\n * // spender can call transferFrom on behalf of holder\n * }\n * ```\n */\n async isOperator(holder: Address, spender: Address): Promise<boolean> {\n return this.sdk.provider.readContract(\n isOperatorContract(this.address, getAddress(holder), getAddress(spender)),\n );\n }\n\n // PROTECTED HELPERS\n\n /**\n * Read the on-chain encrypted balance for a given owner.\n *\n * @internal\n */\n protected async readConfidentialBalanceOf(owner: Address): Promise<EncryptedValue> {\n return await this.sdk.provider.readContract(confidentialBalanceOfContract(this.address, owner));\n }\n\n /**\n * Pre-flight check: decrypt the confidential balance and compare against the\n * requested amount. If credentials are cached the decrypt happens silently;\n * if not, throws {@link BalanceCheckUnavailableError} instead of triggering\n * a surprise EIP-712 popup.\n *\n * @internal\n */\n protected async assertConfidentialBalance(amount: bigint): Promise<void> {\n if (amount === 0n) {\n return;\n }\n\n let balance: bigint;\n try {\n const account = await requireAlignedWalletAccount(\n \"assertConfidentialBalance\",\n this.sdk.signer,\n this.sdk.provider,\n );\n balance = await this.balanceOf(getAddress(account.address));\n } catch (error) {\n if (error instanceof ZamaError) {\n throw error;\n }\n throw new BalanceCheckUnavailableError(`Balance validation failed (token: ${this.address})`, {\n cause: error,\n });\n }\n\n if (balance < amount) {\n throw new InsufficientConfidentialBalanceError(\n `Insufficient confidential balance: requested ${amount}, available ${balance} (token: ${this.address})`,\n { requested: amount, available: balance, token: this.address },\n );\n }\n }\n\n /**\n * Emit a token-scoped event through the owning {@link ZamaSDK} so that\n * subscribers see a unified stream.\n *\n * @internal\n */\n protected emit(input: ZamaSDKEventInput): void {\n this.sdk.emitEvent(input, this.address);\n }\n\n /**\n * Submit a token-scoped write transaction through the shared SDK transaction\n * pipeline. Callers keep pre-flight and operation-specific work local.\n *\n * @internal\n */\n protected async submitTransaction(params: {\n operation: TransactionOperation;\n config: WriteContractConfig;\n onSubmitted?: (txHash: Hex) => void;\n }): Promise<TransactionResult> {\n const { operation, config, onSubmitted } = params;\n return submitSdkTransaction({\n operation,\n signer: this.#requireSigner(operation),\n provider: this.sdk.provider,\n config,\n emit: (input) => this.emit(input),\n onSubmitted,\n logger: this.sdk.logger,\n });\n }\n\n /** Verify all tokens share the same SDK instance and return it. */\n private static assertSameSdk(tokens: Token[]): ZamaSDK {\n const sdk = tokens[0]!.sdk;\n for (let i = 1; i < tokens.length; i++) {\n if (tokens[i]!.sdk !== sdk) {\n throw new ConfigurationError(\n \"All tokens in a batch operation must share the same ZamaSDK instance\",\n );\n }\n }\n return sdk;\n }\n}\n"],"mappings":"mHAGA,IAAa,EAAb,cAA2CA,EAAAA,CAAU,CACnD,YAAY,EAAiB,EAAwB,CACnD,MAAMC,EAAAA,EAAc,iBAAkB,EAAS,CAAO,EACtD,KAAK,KAAO,uBACd,CACF,EAGa,EAAb,cAA2CD,EAAAA,CAAU,CACnD,YAAY,EAAiB,EAAwB,CACnD,MAAMC,EAAAA,EAAc,iBAAkB,EAAS,CAAO,EACtD,KAAK,KAAO,uBACd,CACF,ECSa,EAAb,cAAuCC,EAAAA,CAAU,CAO/C,WAEA,YAAY,EAAiB,EAAkD,CAC7E,GAAM,CAAE,aAAY,GAAG,GAAiB,GAAW,CAAC,EACpD,MAAMC,EAAAA,EAAc,eAAgB,EAAS,CAAY,EACzD,KAAK,KAAO,oBACZ,KAAK,WAAa,CACpB,CACF,ECjBa,EAAb,cAAwCC,EAAAA,CAAU,CAEhD,UAEA,cAEA,gBAEA,YACE,CACE,YACA,gBACA,mBAEF,EACA,CACA,MACEC,EAAAA,EAAc,cACd,cAAc,EAAU,iFACI,EAAc,4BAA4B,EAAgB,GACtF,CACF,EACA,KAAK,KAAO,qBACZ,KAAK,UAAY,EACjB,KAAK,cAAgB,EACrB,KAAK,gBAAkB,CACzB,CACF,ECpCa,EAAb,cAA0DC,EAAAA,CAAU,CAElE,UAEA,UAEA,MAEA,YAAY,EAAiB,EAA8B,EAAwB,CACjF,MAAMC,EAAAA,EAAc,gCAAiC,EAAS,CAAO,EACrE,KAAK,KAAO,uCACZ,KAAK,UAAY,EAAQ,UACzB,KAAK,UAAY,EAAQ,UACzB,KAAK,MAAQ,EAAQ,KACvB,CACF,EAGa,EAAb,cAAmDD,EAAAA,CAAU,CAE3D,UAEA,UAEA,MAEA,YAAY,EAAiB,EAA8B,EAAwB,CACjF,MAAMC,EAAAA,EAAc,yBAA0B,EAAS,CAAO,EAC9D,KAAK,KAAO,gCACZ,KAAK,UAAY,EAAQ,UACzB,KAAK,UAAY,EAAQ,UACzB,KAAK,MAAQ,EAAQ,KACvB,CACF,EAGa,EAAb,cAAgDD,EAAAA,CAAU,CAExD,UAEA,UAEA,MAEA,YAAY,EAAiB,EAA8B,EAAwB,CACjF,MAAMC,EAAAA,EAAc,sBAAuB,EAAS,CAAO,EAC3D,KAAK,KAAO,6BACZ,KAAK,UAAY,EAAQ,UACzB,KAAK,UAAY,EAAQ,UACzB,KAAK,MAAQ,EAAQ,KACvB,CACF,EAGa,EAAb,cAAkDD,EAAAA,CAAU,CAC1D,YAAY,EAAiB,EAAwB,CACnD,MAAMC,EAAAA,EAAc,wBAAyB,EAAS,CAAO,EAC7D,KAAK,KAAO,8BACd,CACF,EAGa,EAAb,cAA0CD,EAAAA,CAAU,CAClD,YAAY,EAAiB,EAAwB,CACnD,MAAMC,EAAAA,EAAc,gBAAiB,EAAS,CAAO,EACrD,KAAK,KAAO,sBACd,CACF,ECjEA,SAAgB,EAAkB,EAAyB,CACzD,OACE,aAAiBC,EAAAA,GACjB,aAAiBC,EAAAA,GACjB,aAAiBC,EAAAA,GACjB,aAAiB,CAErB,CCkCA,MAEM,EAAsC,CAC1C,MAAO,EAEP,OAAQ,EACR,QAAS,EACT,QAAS,EACT,QAAS,EACT,SAAU,EACV,SAAU,EACV,SAAU,CACZ,EAEM,EAAsC,CAC1C,EAAG,QAEH,EAAG,SACH,EAAG,UACH,EAAG,UACH,EAAG,UACH,EAAG,WACH,EAAG,WACH,EAAG,UACL,EAEM,EAAkE,CACtE,EAAG,EAEH,EAAG,EACH,EAAG,GACH,EAAG,GACH,EAAG,GACH,EAAG,IACH,EAAG,IACH,EAAG,GACL,EAaA,OAAO,OAAO,CAAe,EAC7B,OAAO,OAAO,CAAe,EAC7B,OAAO,OAAO,CAA6B,EAC3C,OAAO,OAAO,CAbZ,EAAG,EACH,EAAG,EACH,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,IAAK,EACL,IAAK,EACL,IAAK,CAMO,CAA6B,EAM3C,SAAgB,EAAY,EAAoC,CAC9D,OAAQ,EAAR,CACE,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACL,IAAK,GACH,MAAO,GACT,QACE,MAAO,EACX,CACF,CAyCA,SAAgB,EAA4B,EAAgC,CAC1E,GAAI,CAAC,EAAY,CAAM,EACrB,MAAU,MAAM,uBAAuB,EAAO,EAAE,EAElD,IAAM,EAAK,EAA8B,GACzC,GAAI,EAAK,EACP,MAAU,MACR,yCAAyC,EAAG,qBAC9C,EAEF,OAAO,CACT,CC3KA,SAAgB,EAAqB,EAAiC,CACpE,OAAO,IAAA,sEAA2C,IAAmB,IACvE,CA0BA,SAAgB,EAAwB,EAAwC,CAC9E,IAAI,EACJ,GAAI,CACF,EAAc,OAAO,CAAc,CACrC,MAAQ,CACN,MAAO,IACT,CACA,IAAM,EAAW,OAAQ,GAAe,GAAM,IAAK,EACnD,OAAO,EAAY,CAAQ,EAAI,EAA4B,CAAQ,EAAI,GACzE,CASA,SAAgB,EACd,EACA,EAAkB,KACE,CACpB,IAAM,EAA6B,CAAC,EAChC,EAA4B,CAAC,EAC7B,EAAc,EAElB,IAAK,IAAM,KAAU,EAAS,CAC5B,IAAM,EAAO,EAAwB,CAAM,EACvC,EAAQ,OAAS,GAAK,EAAc,EAAO,IAC7C,EAAO,KAAK,CAAO,EACnB,EAAU,CAAC,EACX,EAAc,GAEhB,EAAQ,KAAK,CAAM,EACnB,GAAe,CACjB,CAIA,OAHI,EAAQ,OAAS,GACnB,EAAO,KAAK,CAAO,EAEd,CACT,CChEA,eAAsB,EACpB,EACA,EACA,EACwB,CACxB,GAAI,CAAC,EACH,MAAM,IAAIC,EAAAA,EAAyB,CAAS,EAE9C,IAAI,EACJ,GAAI,CACF,EAAU,EAAO,qBAAqB,CAAS,CACjD,OAAS,EAAO,CACd,GAAI,EAAE,aAAiBC,EAAAA,IAA+B,CAAC,EAAO,qBAC5D,MAAM,EAER,MAAM,EAAO,qBAAqB,EAClC,EAAU,EAAO,qBAAqB,CAAS,CACjD,CACA,IAAM,EAAkB,MAAM,EAAS,WAAW,EAClD,GAAI,EAAQ,UAAY,EACtB,MAAM,IAAI,EAAmB,CAAE,YAAW,cAAe,EAAQ,QAAS,iBAAgB,CAAC,EAE7F,OAAO,CACT,CASA,eAAsB,EACpB,EACA,EACA,EACiB,CACjB,OAAQ,MAAM,EAA4B,EAAW,EAAQ,CAAQ,EAAA,CAAG,OAC1E,CChDA,eAAsB,EACpB,EACA,EAAiB,IACH,CACd,GAAI,OAAO,SAAS,CAAc,GAAK,GAAkB,EACvD,MAAU,MAAM,0CAA0C,EAE5D,GAAI,CAAC,OAAO,SAAS,CAAc,GAAK,GAAkB,EAAI,OAC5D,OAAO,QAAQ,IAAI,EAAI,IAAK,GAAM,EAAE,CAAC,CAAC,EAGxC,IAAM,EAAe,MAAM,KAAK,CAAE,OAAQ,EAAI,MAAO,CAAC,EAClD,EAAQ,EAEZ,eAAe,GAAS,CACtB,KAAO,EAAQ,EAAI,QAAQ,CACzB,IAAM,EAAI,IACN,EAAI,KACN,EAAQ,GAAK,MAAM,EAAI,EAAE,CAAC,EAE9B,CACF,CAGA,OADA,MAAM,QAAQ,IAAI,MAAM,KAAK,CAAE,OAAQ,CAAe,EAAG,CAAM,CAAC,EACzD,CACT,CCJA,eAAsB,EAAkB,EAQT,CAC7B,GAAM,CAAE,YAAW,SAAQ,WAAU,SAAQ,OAAM,cAAa,UAAW,EACrE,EAAWC,EAAAA,EAA6B,GAE9C,GAAI,CACF,IAAM,EAAS,MAAM,EAAO,cAAc,CAAM,EAIhD,OAHA,EAAK,EAAS,eAAe,CAAM,CAAC,EACpC,EAAKC,EAAQ,GAAG,EAAU,mBAAsB,IAAc,CAAM,EAAG,CAAM,EAEtE,CAAE,SAAQ,QAAA,MADK,EAAS,0BAA0B,CAAM,CACtC,CAC3B,OAAS,EAAO,CACd,IAAM,EACJ,aAAiBC,EAAAA,EACb,EACA,IAAIC,EAAAA,EAAyB,6BAA6B,IAAa,CAAE,MAAO,CAAM,CAAC,EAG7F,MADA,EAAK,CAAE,KAAMC,EAAAA,EAAc,iBAAkB,YAAW,MAAO,CAAQ,CAAC,EAClE,CACR,CACF,CCiCA,IAAa,EAAb,MAAa,CAAM,CAEjB,IAEA,QAEA,YAAY,EAAc,EAAkB,CAC1C,KAAK,IAAM,EACX,KAAK,SAAA,EAAA,EAAA,WAAA,CAAqB,CAAO,CACnC,CAGA,GAAe,EAAkC,CAC/C,OAAOC,EAAAA,EAAkB,KAAK,IAAI,OAAQ,CAAS,CACrD,CAKA,MAAM,MAAwB,CAC5B,OAAO,KAAK,IAAI,SAAS,aAAaC,EAAAA,EAAa,KAAK,OAAO,CAAC,CAClE,CAGA,MAAM,QAA0B,CAC9B,OAAO,KAAK,IAAI,SAAS,aAAaC,EAAAA,EAAe,KAAK,OAAO,CAAC,CACpE,CAGA,MAAM,UAA4B,CAChC,OAAO,KAAK,IAAI,SAAS,aAAaC,EAAAA,EAAiB,KAAK,OAAO,CAAC,CACtE,CASA,MAAM,gBAAmC,CACvC,OAAO,KAAK,IAAI,SAAS,aACvBC,EAAAA,EAA0B,KAAK,QAASC,EAAAA,CAAoB,CAC9D,CACF,CAQA,MAAM,WAA8B,CAClC,OAAO,KAAK,IAAI,SAAS,aACvBD,EAAAA,EAA0B,KAAK,QAASE,EAAAA,CAA4B,CACtE,CACF,CAiBA,MAAM,UAAU,EAAiC,CAC/C,IAAM,GAAA,EAAA,EAAA,WAAA,CAA0B,CAAK,EAC/B,EAAiB,MAAM,KAAK,0BAA0B,CAAY,EAIlE,GAAQ,MAHO,KAAK,IAAI,WAAW,cAAc,CACrD,CAAE,iBAAgB,gBAAiB,KAAK,OAAQ,CAClD,CAAC,EAAA,CACoB,GACrB,GAAI,IAAU,IAAA,GACZ,MAAM,IAAI,EAAsB,oCAAoC,GAAgB,EAGtF,OADA,EAAA,EAAa,EAAO,mCAAmC,EAChD,CACT,CAaA,MAAM,sBAAsB,EAAyC,CACnE,OAAO,KAAK,2BAAA,EAAA,EAAA,WAAA,CAAqC,CAAK,CAAC,CACzD,CA2BA,MAAM,iBAAiB,CACrB,mBACA,kBAIkB,CAClB,MAAM,EAAsB,mBAAoB,KAAK,IAAI,OAAQ,KAAK,IAAI,QAAQ,EAClF,IAAM,GAAA,EAAA,EAAA,WAAA,CAAiC,CAAgB,EACjD,EAAoB,GAAA,EAAA,EAAA,WAAA,CAA4B,CAAc,EAAI,EAElE,EAAiB,MAAM,KAAK,0BAA0B,CAAiB,EAC7E,GAAI,EAAqB,CAAc,EACrC,OAAO,GAST,IAAM,GAAQ,MANO,KAAK,IAAI,WAAW,uBACvC,CAAC,CAAE,iBAAgB,gBAAiB,KAAK,OAAQ,CAAC,EAClD,EACA,CACF,EAAA,CAEqB,GACrB,GAAI,IAAU,IAAA,GACZ,MAAM,IAAI,EACR,8CAA8C,GAChD,EAGF,OADA,EAAA,EAAa,EAAO,0CAA0C,EACvD,CACT,CAsBA,aAAa,gBAAgB,EAAiB,EAA8C,CAC1F,IAAM,EAAU,IAAI,IACd,EAAS,IAAI,IACnB,GAAI,EAAO,SAAW,EACpB,MAAO,CAAE,UAAS,QAAO,EAG3B,IAAM,EAAM,EAAM,cAAc,CAAM,EAEtC,MAAM,EAAsB,kBAAmB,EAAI,OAAQ,EAAI,QAAQ,EAGvE,MAAM,EAAI,QAAQ,YAAY,EAAO,IAAK,GAAM,EAAE,OAAO,CAAC,EAE1D,IAAM,EAAW,MAAM,EACrB,EAAO,IAAK,GAAM,SAAY,CAC5B,GAAI,CACF,MAAO,CAAE,OAAQ,YAAsB,MAAO,MAAM,EAAE,UAAU,CAAK,CAAE,CACzE,OAAS,EAAQ,CACf,MAAO,CAAE,OAAQ,WAAqB,QAAO,CAC/C,CACF,CAAC,EACD,CACF,EAEA,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CACtC,IAAM,EAAe,EAAO,EAAE,CAAE,QAC1B,EAAU,EAAS,GACzB,GAAI,EAAQ,SAAW,YACrB,EAAQ,IAAI,EAAc,EAAQ,KAAK,MAClC,CACL,IAAM,EAAS,EAAQ,OAGvB,GAAI,EAAkB,CAAM,EAC1B,MAAM,EAER,IAAM,EACJ,aAAkBC,EAAAA,EACd,EACA,IAAI,EAAsBC,EAAAA,EAAQ,CAAM,CAAC,CAAC,QAAS,CAAE,MAAO,CAAO,CAAC,EAC1E,EAAO,IAAI,EAAc,CAAK,CAChC,CACF,CAGA,GAAI,EAAO,OAAS,EAAO,OAEzB,MADmB,EAAO,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,OACtB,IAAI,EAAsB,sCAAsC,EAGtF,MAAO,CAAE,UAAS,QAAO,CAC3B,CA2BA,aAAa,uBACX,EACA,EAC+B,CAC/B,GAAI,EAAO,SAAW,EACpB,OAAO,IAAI,IAGb,IAAM,EAAM,EAAM,cAAc,CAAM,EAChC,EAAU,IAAI,IACd,EAAS,IAAI,IACb,EAAoB,EAAQ,gBAAA,EAAA,EAAA,WAAA,CACnB,EAAQ,cAAc,GAAA,EAAA,EAAA,WAAA,CACtB,EAAQ,gBAAgB,EACjC,EAAiB,EAAQ,gBAAkB,GACjD,GAAI,EAAQ,iBAAmB,EAAO,SAAW,EAAQ,gBAAgB,OACvE,MAAM,IAAI,EACR,kBAAkB,EAAO,OAAO,uCAAuC,EAAQ,gBAAgB,OAAO,EACxG,EAEF,IAAM,EACJ,EAAQ,iBACP,MAAM,EAAM,wBAAwB,EAAQ,EAAmB,EAAQ,CAAc,EAElF,EAA2E,CAAC,EAClF,IAAK,GAAM,CAAC,EAAO,KAAU,EAAO,QAAQ,EAAG,CAC7C,IAAM,EAAiB,EAAwB,GAC3C,CAAC,GAAkB,EAAO,IAAI,EAAM,OAAO,IAG3C,EAAqB,CAAc,EAErC,EAAQ,IAAI,EAAM,QAAS,EAAE,EAE7B,EAAgB,KAAK,CAAE,QAAO,gBAAe,CAAC,EAElD,CAEA,GAAI,EAAgB,OAAS,EAAG,CAC9B,IAAM,EAAY,MAAM,EAAI,WAAW,4BAA4B,CACjE,gBAAiB,EAAgB,KAAK,CAAE,QAAO,qBAAsB,CACnE,iBACA,gBAAiB,EAAM,OACzB,EAAE,EACF,iBAAkB,EAAQ,iBAC1B,eAAgB,EAAQ,eACxB,gBACF,CAAC,EAED,IAAK,GAAM,CAAC,EAAO,KAAS,EAAU,MAAM,QAAQ,EAAG,CACrD,IAAM,EAAU,EAAgB,GAChC,GAAI,CAAC,EACH,SAEF,GAAI,EAAK,MAAO,CACd,EAAO,IAAI,EAAQ,MAAM,QAAS,EAAK,KAAK,EAC5C,QACF,CACA,IAAM,EAAQ,EAAK,MACnB,GAAI,IAAU,IAAA,GAAW,CACvB,EAAO,IACL,EAAQ,MAAM,QACd,IAAI,EACF,oDAAoD,EAAK,eAAe,YAAY,EAAQ,MAAM,SACpG,CACF,EACA,QACF,CACA,EAAA,EAAa,EAAO,gDAAgD,EACpE,EAAQ,IAAI,EAAQ,MAAM,QAAS,CAAK,CAC1C,CACF,CAEA,GAAI,EAAO,OAAS,EAClB,OAAO,EAGT,GAAI,EAAQ,QAAS,CACnB,IAAM,EAA4D,CAAC,EACnE,IAAK,GAAM,CAAC,EAAS,KAAU,EAC7B,GAAI,CACF,EAAQ,IAAI,EAAS,EAAQ,QAAQ,EAAO,CAAO,CAAC,CACtD,OAAS,EAAe,CACtB,EAAe,KAAK,CAAE,UAAS,MAAOA,EAAAA,EAAQ,CAAa,CAAE,CAAC,CAChE,CAEF,GAAI,EAAe,OAAS,EAAG,CAC7B,IAAM,EAAU,EACb,KAAK,CAAE,UAAS,WAAY,GAAG,EAAQ,IAAI,EAAM,SAAS,CAAC,CAC3D,KAAK,IAAI,EACZ,MAAM,IAAI,EACR,0DAA0D,EAAe,OAAO,aAAa,IAC7F,CAAE,MAAO,EAAe,EAAE,EAAE,KAAM,CACpC,CACF,CACA,OAAO,CACT,CAEA,IAAM,EAAe,MAAM,KAAK,EAAO,QAAQ,CAAC,EAC1C,EAAU,EAAa,KAAK,CAAC,EAAM,KAAO,GAAG,EAAK,IAAI,EAAE,SAAS,CAAC,CAAC,KAAK,IAAI,EAClF,MAAM,IAAI,EACR,yCAAyC,EAAO,KAAK,aAAa,IAClE,CAAE,MAAO,EAAa,EAAE,GAAG,EAAG,CAChC,CACF,CAEA,aAAqB,wBACnB,EACA,EACA,EACA,EAC4C,CAC5C,IAAM,EAAW,MAAM,EACrB,EAAO,IAAK,GAAU,SAAY,CAChC,GAAI,CACF,MAAO,CACL,OAAQ,YACR,MAAO,MAAM,EAAM,0BAA0B,CAAc,CAC7D,CACF,OAAS,EAAQ,CACf,MAAO,CAAE,OAAQ,WAAqB,QAAO,CAC/C,CACF,CAAC,EACD,CACF,EAEM,EAAqD,CAAC,EAC5D,IAAK,GAAM,CAAC,EAAO,KAAU,EAAO,QAAQ,EAAG,CAC7C,IAAM,EAAU,EAAS,GACpB,KAGL,IAAI,EAAQ,SAAW,YAAa,CAClC,EAAgB,GAAS,EAAQ,MACjC,QACF,CACA,GAAI,EAAkB,EAAQ,MAAM,EAClC,MAAM,EAAQ,OAEhB,EAAO,IACL,EAAM,QACN,EAAQ,kBAAkBD,EAAAA,EACtB,EAAQ,OACR,IAAI,EAAsBC,EAAAA,EAAQ,EAAQ,MAAM,CAAC,CAAC,QAAS,CAAE,MAAO,EAAQ,MAAO,CAAC,CAC1F,CATA,CAUF,CACA,OAAO,CACT,CA2BA,MAAM,qBACJ,EACA,EACA,EAC4B,CAC5B,KAAKC,GAAe,sBAAsB,EAC1C,IAAM,EAAU,MAAM,EACpB,uBACA,KAAK,IAAI,OACT,KAAK,IAAI,QACX,EACM,CAAE,mBAAmB,GAAO,oBAAmB,uBAAwB,GAAW,CAAC,EAEnF,GAAA,EAAA,EAAA,WAAA,CAA0B,CAAE,EAE7B,GACH,MAAM,KAAK,0BAA0B,CAAM,EAG7C,GAAM,CAAE,kBAAiB,cAAe,MAAM,KAAK,IAAI,QAAQ,CAC7D,OAAQ,CAAC,CAAE,MAAO,EAAQ,KAAM,SAAU,CAAC,EAC3C,gBAAiB,KAAK,QACtB,aAAA,EAAA,EAAA,WAAA,CAAwB,EAAQ,OAAO,CACzC,CAAC,EAGD,GAFA,EAAKC,EAAQ,kCAAqC,IAAoB,EAAG,KAAK,IAAI,MAAM,EAEpF,EAAgB,SAAW,EAC7B,MAAM,IAAI,EAAsB,yCAAyC,EAG3E,OAAO,KAAK,kBAAkB,CAC5B,UAAW,WACX,OAAQC,EAAAA,EACN,KAAK,QACL,EACA,EAAgB,GAChB,CACF,EACA,YAAa,CACf,CAAC,CACH,CAgBA,MAAM,yBACJ,EACA,EACA,EACA,EAC4B,CAC5B,KAAKF,GAAe,0BAA0B,EAC9C,MAAM,EACJ,2BACA,KAAK,IAAI,OACT,KAAK,IAAI,QACX,EACA,IAAM,GAAA,EAAA,EAAA,WAAA,CAA4B,CAAI,EAChC,GAAA,EAAA,EAAA,WAAA,CAA0B,CAAE,EAE5B,CAAE,kBAAiB,cAAe,MAAM,KAAK,IAAI,QAAQ,CAC7D,OAAQ,CAAC,CAAE,MAAO,EAAQ,KAAM,SAAU,CAAC,EAC3C,gBAAiB,KAAK,QACtB,YAAa,CACf,CAAC,EAOD,GANA,EAAKC,EACH,sCACM,GAAW,oBAAoB,EACrC,KAAK,IAAI,MACX,EAEI,EAAgB,SAAW,EAC7B,MAAM,IAAI,EAAsB,yCAAyC,EAG3E,OAAO,KAAK,kBAAkB,CAC5B,UAAW,eACX,OAAQE,EAAAA,EACN,KAAK,QACL,EACA,EACA,EAAgB,GAChB,CACF,EACA,YAAa,GAAW,mBAC1B,CAAC,CACH,CA+BA,MAAM,4BACJ,EACA,EACA,EACA,EAC4B,CAC5B,KAAKH,GAAe,6BAA6B,EACjD,IAAM,EAAU,MAAM,EACpB,8BACA,KAAK,IAAI,OACT,KAAK,IAAI,QACX,EACM,CAAE,mBAAmB,GAAO,oBAAmB,uBAAwB,GAAW,CAAC,EAEnF,GAAA,EAAA,EAAA,WAAA,CAA0B,CAAE,EAE7B,GACH,MAAM,KAAK,0BAA0B,CAAM,EAG7C,GAAM,CAAE,kBAAiB,cAAe,MAAM,KAAK,IAAI,QAAQ,CAC7D,OAAQ,CAAC,CAAE,MAAO,EAAQ,KAAM,SAAU,CAAC,EAC3C,gBAAiB,KAAK,QACtB,aAAA,EAAA,EAAA,WAAA,CAAwB,EAAQ,OAAO,CACzC,CAAC,EAOD,GANA,EAAKC,EACH,yCACM,IAAoB,EAC1B,KAAK,IAAI,MACX,EAEI,EAAgB,SAAW,EAC7B,MAAM,IAAI,EAAsB,yCAAyC,EAG3E,OAAO,KAAK,kBAAkB,CAC5B,UAAW,kBACX,OAAQG,EAAAA,EACN,KAAK,QACL,EACA,EAAgB,GAChB,EACA,CACF,EACA,YAAa,CACf,CAAC,CACH,CAyBA,MAAM,gCACJ,EACA,EACA,EACA,EACA,EAC4B,CAC5B,KAAKJ,GAAe,iCAAiC,EACrD,MAAM,EACJ,kCACA,KAAK,IAAI,OACT,KAAK,IAAI,QACX,EACA,IAAM,GAAA,EAAA,EAAA,WAAA,CAA4B,CAAI,EAChC,GAAA,EAAA,EAAA,WAAA,CAA0B,CAAE,EAE5B,CAAE,kBAAiB,cAAe,MAAM,KAAK,IAAI,QAAQ,CAC7D,OAAQ,CAAC,CAAE,MAAO,EAAQ,KAAM,SAAU,CAAC,EAC3C,gBAAiB,KAAK,QACtB,YAAa,CACf,CAAC,EAOD,GANA,EAAKC,EACH,6CACM,GAAW,oBAAoB,EACrC,KAAK,IAAI,MACX,EAEI,EAAgB,SAAW,EAC7B,MAAM,IAAI,EAAsB,yCAAyC,EAG3E,OAAO,KAAK,kBAAkB,CAC5B,UAAW,sBACX,OAAQI,EAAAA,EACN,KAAK,QACL,EACA,EACA,EAAgB,GAChB,EACA,CACF,EACA,YAAa,GAAW,mBAC1B,CAAC,CACH,CAiBA,MAAM,YAAY,EAAmB,EAA4C,CAC/E,KAAKL,GAAe,aAAa,EACjC,MAAM,EAAsB,cAAe,KAAK,IAAI,OAAQ,KAAK,IAAI,QAAQ,EAC7E,IAAM,GAAA,EAAA,EAAA,WAAA,CAAgC,CAAQ,EAC9C,OAAO,KAAK,kBAAkB,CAC5B,UAAW,cACX,OAAQM,EAAAA,EAAoB,KAAK,QAAS,EAAoB,CAAK,CACrE,CAAC,CACH,CAgBA,MAAM,WAAW,EAAiB,EAAoC,CACpE,OAAO,KAAK,IAAI,SAAS,aACvBC,EAAAA,EAAmB,KAAK,SAAA,EAAA,EAAA,WAAA,CAAoB,CAAM,GAAA,EAAA,EAAA,WAAA,CAAc,CAAO,CAAC,CAC1E,CACF,CASA,MAAgB,0BAA0B,EAAyC,CACjF,OAAO,MAAM,KAAK,IAAI,SAAS,aAAaC,EAAAA,EAA8B,KAAK,QAAS,CAAK,CAAC,CAChG,CAUA,MAAgB,0BAA0B,EAA+B,CACvE,GAAI,IAAW,GACb,OAGF,IAAI,EACJ,GAAI,CACF,IAAM,EAAU,MAAM,EACpB,4BACA,KAAK,IAAI,OACT,KAAK,IAAI,QACX,EACA,EAAU,MAAM,KAAK,WAAA,EAAA,EAAA,WAAA,CAAqB,EAAQ,OAAO,CAAC,CAC5D,OAAS,EAAO,CAId,MAHI,aAAiBV,EAAAA,EACb,EAEF,IAAI,EAA6B,qCAAqC,KAAK,QAAQ,GAAI,CAC3F,MAAO,CACT,CAAC,CACH,CAEA,GAAI,EAAU,EACZ,MAAM,IAAI,EACR,gDAAgD,EAAO,cAAc,EAAQ,WAAW,KAAK,QAAQ,GACrG,CAAE,UAAW,EAAQ,UAAW,EAAS,MAAO,KAAK,OAAQ,CAC/D,CAEJ,CAQA,KAAe,EAAgC,CAC7C,KAAK,IAAI,UAAU,EAAO,KAAK,OAAO,CACxC,CAQA,MAAgB,kBAAkB,EAIH,CAC7B,GAAM,CAAE,YAAW,SAAQ,eAAgB,EAC3C,OAAOW,EAAqB,CAC1B,YACA,OAAQ,KAAKT,GAAe,CAAS,EACrC,SAAU,KAAK,IAAI,SACnB,SACA,KAAO,GAAU,KAAK,KAAK,CAAK,EAChC,cACA,OAAQ,KAAK,IAAI,MACnB,CAAC,CACH,CAGA,OAAe,cAAc,EAA0B,CACrD,IAAM,EAAM,EAAO,EAAE,CAAE,IACvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IACjC,GAAI,EAAO,EAAE,CAAE,MAAQ,EACrB,MAAM,IAAIU,EAAAA,EACR,sEACF,EAGJ,OAAO,CACT,CACF"}
1
+ {"version":3,"file":"token.cjs","names":["ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","SigningRejectedError","SigningFailedError","ConfigurationError","SignerNotConfiguredError","WalletAccountNotReadyError","transactionOperationMetadata","swallow","ZamaError","TransactionRevertedError","ZamaSDKEvents","requireConfigured","nameContract","symbolContract","decimalsContract","supportsInterfaceContract","ERC7984_INTERFACE_ID","ERC7984_WRAPPER_INTERFACE_ID","ZamaError","toError","#requireSigner","swallow","confidentialTransferContract","confidentialTransferFromContract","confidentialTransferAndCallContract","confidentialTransferFromAndCallContract","setOperatorContract","isOperatorContract","confidentialBalanceOfContract","submitSdkTransaction","ConfigurationError"],"sources":["../../src/errors/encryption.ts","../../src/errors/rpc.ts","../../src/errors/chain.ts","../../src/errors/balance.ts","../../src/errors/fatal-batch.ts","../../src/utils/fhe-type.ts","../../src/utils/handles.ts","../../src/utils/alignment.ts","../../src/utils/concurrency.ts","../../src/utils/submit-transaction.ts","../../src/token/token.ts"],"sourcesContent":["import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** FHE encryption failed. */\nexport class EncryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.EncryptionFailed, message, options);\n this.name = \"EncryptionFailedError\";\n }\n}\n\n/** FHE decryption failed. */\nexport class DecryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.DecryptionFailed, message, options);\n this.name = \"DecryptionFailedError\";\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * The consumer's RPC provider rate-limited an on-chain read the SDK performs\n * during decryption (e.g. the ACL check) — HTTP 429 or JSON-RPC `-32005`. An\n * RPC-endpoint problem, **not** a decryption/entitlement failure, and safe to\n * **retry**. Kept distinct from the relayer's own back-pressure\n * ({@link RelayerRequestFailedError}).\n *\n * Backoff for chain RPC is owned by the consumer's transport: viem/ethers\n * already honor the `Retry-After` header and retry internally before this error\n * surfaces, so it is configured on the transport you pass via `chain.network`\n * (not re-implemented here).\n *\n * @example\n * ```ts\n * try {\n * await sdk.decryption.decryptValues([{ encryptedValue, contractAddress }]);\n * } catch (e) {\n * if (e instanceof RpcRateLimitError) {\n * // back off and retry; consider a higher-throughput RPC endpoint\n * }\n * }\n * ```\n */\nexport class RpcRateLimitError extends ZamaError {\n /**\n * Suggested delay before retrying, in **seconds**, when a numeric `retryAfter`\n * is present on the error. Usually `undefined` for chain RPC: the `Retry-After`\n * header is consumed by the consumer's viem/ethers transport (which owns the\n * backoff), not surfaced here — see the class doc.\n */\n readonly retryAfter: number | undefined;\n\n constructor(message: string, options?: ErrorOptions & { retryAfter?: number }) {\n const { retryAfter, ...errorOptions } = options ?? {};\n super(ZamaErrorCode.RpcRateLimited, message, errorOptions);\n this.name = \"RpcRateLimitError\";\n this.retryAfter = retryAfter;\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * Thrown when the signer and provider are connected to different chains at the\n * start of a write operation.\n *\n * Every write method runs a chain-alignment pre-flight check. If\n * `signer.getChainId()` and `provider.getChainId()` return different values,\n * this error is thrown before any RPC mutation is attempted.\n *\n * @example\n * ```ts\n * try {\n * await token.shield(1000n);\n * } catch (e) {\n * if (e instanceof ChainMismatchError) {\n * console.error(\n * `Signer is on chain ${e.signerChainId} but provider is on chain ${e.providerChainId}`,\n * );\n * }\n * }\n * ```\n */\nexport class ChainMismatchError extends ZamaError {\n /** Name of the operation that triggered the check. */\n readonly operation: string;\n /** Chain ID the signer is connected to. */\n readonly signerChainId: number;\n /** Chain ID the provider is connected to. */\n readonly providerChainId: number;\n\n constructor(\n {\n operation,\n signerChainId,\n providerChainId,\n }: { operation: string; signerChainId: number; providerChainId: number },\n options?: ErrorOptions,\n ) {\n super(\n ZamaErrorCode.ChainMismatch,\n `Operation \"${operation}\" requires signer and provider to be on the same chain, ` +\n `but signer is on chain ${signerChainId} and provider is on chain ${providerChainId}.`,\n options,\n );\n this.name = \"ChainMismatchError\";\n this.operation = operation;\n this.signerChainId = signerChainId;\n this.providerChainId = providerChainId;\n }\n}\n","import type { Address } from \"viem\";\nimport { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** Structured details shared by balance-related errors. */\nexport interface BalanceErrorDetails {\n /** Amount the caller requested, in the token's base units. */\n readonly requested: bigint;\n /** Amount available at the time of the check, in the token's base units. */\n readonly available: bigint;\n /** Address of the token contract involved. */\n readonly token: Address;\n}\n\n/** Confidential (cToken) balance is insufficient for the requested operation. */\nexport class InsufficientConfidentialBalanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The available balance at the time of the check. */\n readonly available: bigint;\n /** The token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientConfidentialBalance, message, options);\n this.name = \"InsufficientConfidentialBalanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** ERC-20 balance is insufficient for the requested shield amount. */\nexport class InsufficientERC20BalanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The available balance at the time of the check. */\n readonly available: bigint;\n /** The ERC-20 token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientERC20Balance, message, options);\n this.name = \"InsufficientERC20BalanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** ERC-20 allowance granted to the wrapper is insufficient for the requested wrap amount. */\nexport class InsufficientAllowanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The allowance available at the time of the check. */\n readonly available: bigint;\n /** The underlying ERC-20 token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientAllowance, message, options);\n this.name = \"InsufficientAllowanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** Balance validation could not be performed (no cached credentials and decryption not possible). */\nexport class BalanceCheckUnavailableError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.BalanceCheckUnavailable, message, options);\n this.name = \"BalanceCheckUnavailableError\";\n }\n}\n\n/** A public ERC-20 read (e.g. balanceOf) failed due to a network or contract error. */\nexport class ERC20ReadFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.ERC20ReadFailed, message, options);\n this.name = \"ERC20ReadFailedError\";\n }\n}\n","import { ConfigurationError } from \"./relayer\";\nimport { RpcRateLimitError } from \"./rpc\";\nimport { SigningRejectedError, SigningFailedError } from \"./signing\";\n\n/**\n * Returns `true` for errors that should abort an entire batch operation\n * rather than be recorded per-item — wallet signature rejected, signing\n * infrastructure broken, SDK misconfigured, or the RPC provider throttling.\n * These are systemic failures that won't recover within the same call; for a\n * rate-limit in particular, the per-item retry loop would only amplify the\n * throttle by re-hitting the already-rate-limited endpoint.\n *\n * Callers iterating over a batch (e.g. per-token decrypt) should rethrow when\n * this predicate is true so the whole batch aborts, and record the error\n * per-item otherwise.\n */\nexport function isFatalBatchError(error: unknown): boolean {\n return (\n error instanceof SigningRejectedError ||\n error instanceof SigningFailedError ||\n error instanceof ConfigurationError ||\n error instanceof RpcRateLimitError\n );\n}\n","// Copied from @zama-fhe/relayer-sdk/src/sdk/FheType.ts\n// Pure utility functions with zero WASM dependency.\n// Adapted to use simple errors instead of RelayerErrorBase hierarchy.\n\n////////////////////////////////////////////////////////////////////////////////\n// Types (from types/primitives.d.ts)\n////////////////////////////////////////////////////////////////////////////////\n\nexport interface FheTypeNameToIdMap {\n ebool: 0;\n //euint4: 1; deprecated\n euint8: 2;\n euint16: 3;\n euint32: 4;\n euint64: 5;\n euint128: 6;\n eaddress: 7;\n euint256: 8;\n}\n\nexport interface FheTypeIdToNameMap {\n 0: \"ebool\";\n //1: 'euint4'; deprecated\n 2: \"euint8\";\n 3: \"euint16\";\n 4: \"euint32\";\n 5: \"euint64\";\n 6: \"euint128\";\n 7: \"eaddress\";\n 8: \"euint256\";\n}\n\nexport interface FheTypeEncryptionBitwidthToIdMap {\n 2: FheTypeNameToIdMap[\"ebool\"];\n 8: FheTypeNameToIdMap[\"euint8\"];\n 16: FheTypeNameToIdMap[\"euint16\"];\n 32: FheTypeNameToIdMap[\"euint32\"];\n 64: FheTypeNameToIdMap[\"euint64\"];\n 128: FheTypeNameToIdMap[\"euint128\"];\n 160: FheTypeNameToIdMap[\"eaddress\"];\n 256: FheTypeNameToIdMap[\"euint256\"];\n}\n\nexport type FheTypeIdToEncryptionBitwidthMap = {\n [K in keyof FheTypeEncryptionBitwidthToIdMap as FheTypeEncryptionBitwidthToIdMap[K]]: K;\n};\n\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type FheTypeName = Prettify<keyof FheTypeNameToIdMap>;\nexport type FheTypeId = Prettify<keyof FheTypeIdToNameMap>;\nexport type EncryptionBits = Prettify<keyof FheTypeEncryptionBitwidthToIdMap>;\n\n////////////////////////////////////////////////////////////////////////////////\n// Lookup Maps\n////////////////////////////////////////////////////////////////////////////////\n\nconst MINIMUM_ENCRYPTION_BIT_WIDTH = 2;\n\nconst FheTypeNameToId: FheTypeNameToIdMap = {\n ebool: 0,\n //euint4: 1, deprecated\n euint8: 2,\n euint16: 3,\n euint32: 4,\n euint64: 5,\n euint128: 6,\n eaddress: 7,\n euint256: 8,\n} as const;\n\nconst FheTypeIdToName: FheTypeIdToNameMap = {\n 0: \"ebool\",\n //1: 'euint4', deprecated\n 2: \"euint8\",\n 3: \"euint16\",\n 4: \"euint32\",\n 5: \"euint64\",\n 6: \"euint128\",\n 7: \"eaddress\",\n 8: \"euint256\",\n} as const;\n\nconst FheTypeIdToEncryptionBitwidth: FheTypeIdToEncryptionBitwidthMap = {\n 0: 2,\n //1:?, euint4 deprecated\n 2: 8,\n 3: 16,\n 4: 32,\n 5: 64,\n 6: 128,\n 7: 160,\n 8: 256,\n} as const;\n\nconst EncryptionBitwidthToFheTypeId: FheTypeEncryptionBitwidthToIdMap = {\n 2: 0,\n 8: 2,\n 16: 3,\n 32: 4,\n 64: 5,\n 128: 6,\n 160: 7,\n 256: 8,\n} as const;\n\nObject.freeze(FheTypeNameToId);\nObject.freeze(FheTypeIdToName);\nObject.freeze(FheTypeIdToEncryptionBitwidth);\nObject.freeze(EncryptionBitwidthToFheTypeId);\n\n////////////////////////////////////////////////////////////////////////////////\n// Type Guards\n////////////////////////////////////////////////////////////////////////////////\n\nexport function isFheTypeId(value: unknown): value is FheTypeId {\n switch (value as FheTypeId) {\n case 0:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n case 8:\n return true;\n default:\n return false;\n }\n}\n\nexport function isFheTypeName(value: unknown): value is FheTypeName {\n if (typeof value !== \"string\") {\n return false;\n }\n return value in FheTypeNameToId;\n}\n\nexport function isEncryptionBits(value: unknown): value is EncryptionBits {\n if (typeof value !== \"number\") {\n return false;\n }\n return value in EncryptionBitwidthToFheTypeId;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Converters\n////////////////////////////////////////////////////////////////////////////////\n\nexport function fheTypeIdFromEncryptionBits(bitwidth: number): FheTypeId {\n if (!isEncryptionBits(bitwidth)) {\n throw new Error(`Invalid encryption bits ${bitwidth}`);\n }\n return EncryptionBitwidthToFheTypeId[bitwidth];\n}\n\nexport function fheTypeIdFromName(name: string): FheTypeId {\n if (!isFheTypeName(name)) {\n throw new Error(`Invalid FheType name '${name}'`);\n }\n return FheTypeNameToId[name];\n}\n\nexport function fheTypeNameFromId(id: number): FheTypeName {\n if (!isFheTypeId(id)) {\n throw new Error(`Invalid FheType id '${id}'`);\n }\n return FheTypeIdToName[id];\n}\n\nexport function encryptionBitsFromFheTypeId(typeId: number): EncryptionBits {\n if (!isFheTypeId(typeId)) {\n throw new Error(`Invalid FheType id '${typeId}'`);\n }\n const bw = FheTypeIdToEncryptionBitwidth[typeId];\n if (bw < MINIMUM_ENCRYPTION_BIT_WIDTH) {\n throw new Error(\n `Invalid FheType encryption bit width: ${bw}. Minimum is ${MINIMUM_ENCRYPTION_BIT_WIDTH} bits.`,\n );\n }\n return bw;\n}\n\nexport function encryptionBitsFromFheTypeName(name: string): EncryptionBits {\n if (!isFheTypeName(name)) {\n throw new Error(`Invalid FheType name '${name}'`);\n }\n const bw = FheTypeIdToEncryptionBitwidth[FheTypeNameToId[name]];\n if (bw < MINIMUM_ENCRYPTION_BIT_WIDTH) {\n throw new Error(\n `Invalid FheType encryption bit width: ${bw}. Minimum is ${MINIMUM_ENCRYPTION_BIT_WIDTH} bits.`,\n );\n }\n return bw;\n}\n","import type { EncryptedValue } from \"../relayer/types\";\nimport { encryptionBitsFromFheTypeId, isFheTypeId } from \"./fhe-type\";\n\n/** All-zero encrypted-value sentinel — a 32-byte zero handle representing the cleartext value `0`. */\nexport const ZERO_ENCRYPTED_VALUE =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\n\n/**\n * Check whether an encrypted value represents the zero value.\n */\nexport function isEncryptedValueZero(encryptedValue: string): boolean {\n return encryptedValue === ZERO_ENCRYPTED_VALUE || encryptedValue === \"0x\";\n}\n\n/**\n * Per-request cleartext-bit budget enforced by the KMS gateway, mirrored from\n * `@fhevm/sdk`'s `MAX_KMS_DECRYPT_DECRYPTION_BIT_LIMIT` (protocol-level constant,\n * not imported — see {@link MAX_CONTRACTS_PER_PERMIT} for why). Internal: decrypt\n * requests are chunked to respect it automatically, so callers never need this value.\n */\nexport const MAX_DECRYPTION_REQUEST_BITS = 2048;\n\n/** Max encryption bit width among all currently-known FHE types (euint256). */\nconst MAX_KNOWN_ENCRYPTION_BITS = 256;\n\n/**\n * Cleartext bit cost of decrypting a single handle, derived from its FHE\n * type (encoded at bits 8-15 of the handle — the same layout `@fhevm/sdk`'s\n * `FhevmHandle` decodes, byte 30 of the 32-byte handle).\n *\n * Falls back to {@link MAX_KNOWN_ENCRYPTION_BITS} for an unrecognized type\n * byte, or for a value that isn't parseable hex at all, instead of throwing.\n * A real on-chain handle is always well-formed with a valid type byte, so\n * this fallback only ever fires for synthetic test/placeholder handles —\n * deliberately more permissive than the relayer's own strict validation so\n * chunking stays safe without requiring every test fixture to encode a real\n * FHE handle. Do not tighten this to match relayer semantics.\n */\nexport function encryptionBitsForHandle(encryptedValue: EncryptedValue): number {\n let handleValue: bigint;\n try {\n handleValue = BigInt(encryptedValue);\n } catch {\n return MAX_KNOWN_ENCRYPTION_BITS;\n }\n const typeByte = Number((handleValue >> 8n) & 0xffn);\n return isFheTypeId(typeByte) ? encryptionBitsFromFheTypeId(typeByte) : MAX_KNOWN_ENCRYPTION_BITS;\n}\n\n/**\n * Split `handles` into groups whose cumulative cleartext-bit cost never\n * exceeds `maxBits`, preserving input order. Unlike {@link chunkContracts}\n * (fixed-size slices), a greedy accumulate-until-exceeded walk is required\n * since per-handle cost varies by FHE type. A handle whose own cost exceeds\n * `maxBits` still gets a solo chunk — always makes forward progress.\n */\nexport function chunkHandlesByBitBudget(\n handles: readonly EncryptedValue[],\n maxBits: number = MAX_DECRYPTION_REQUEST_BITS,\n): EncryptedValue[][] {\n const chunks: EncryptedValue[][] = [];\n let current: EncryptedValue[] = [];\n let currentBits = 0;\n\n for (const handle of handles) {\n const bits = encryptionBitsForHandle(handle);\n if (current.length > 0 && currentBits + bits > maxBits) {\n chunks.push(current);\n current = [];\n currentBits = 0;\n }\n current.push(handle);\n currentBits += bits;\n }\n if (current.length > 0) {\n chunks.push(current);\n }\n return chunks;\n}\n","import {\n ChainMismatchError,\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n} from \"../errors\";\nimport type { GenericProvider, GenericSigner, WalletAccount } from \"../types\";\n\n/**\n * Pre-flight guard for signer-required operations. Resolves the connected\n * wallet account (refreshing once if the signer reports it isn't ready) and\n * verifies the signer's chain matches the provider's.\n *\n * @internal\n */\nexport async function requireAlignedWalletAccount(\n operation: string,\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n): Promise<WalletAccount> {\n if (!signer) {\n throw new SignerNotConfiguredError(operation);\n }\n let account: WalletAccount;\n try {\n account = signer.requireWalletAccount(operation);\n } catch (error) {\n if (!(error instanceof WalletAccountNotReadyError) || !signer.refreshWalletAccount) {\n throw error;\n }\n await signer.refreshWalletAccount();\n account = signer.requireWalletAccount(operation);\n }\n const providerChainId = await provider.getChainId();\n if (account.chainId !== providerChainId) {\n throw new ChainMismatchError({ operation, signerChainId: account.chainId, providerChainId });\n }\n return account;\n}\n\n/**\n * Variant of {@link requireAlignedWalletAccount} that returns only the aligned\n * chain ID. Useful when a write path only needs to ensure signer/provider\n * coherence and doesn't otherwise consume the account.\n *\n * @internal\n */\nexport async function requireChainAlignment(\n operation: string,\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n): Promise<number> {\n return (await requireAlignedWalletAccount(operation, signer, provider)).chainId;\n}\n","/**\n * Execute an array of async thunks with bounded concurrency.\n * Defaults to `Infinity` (equivalent to `Promise.all`).\n */\nexport async function pLimit<T>(\n fns: (() => Promise<T>)[],\n maxConcurrency = Infinity,\n): Promise<T[]> {\n if (Number.isFinite(maxConcurrency) && maxConcurrency <= 0) {\n throw new Error(\"maxConcurrency must be a positive number\");\n }\n if (!Number.isFinite(maxConcurrency) || maxConcurrency >= fns.length) {\n return Promise.all(fns.map((f) => f()));\n }\n\n const results: T[] = Array.from({ length: fns.length });\n let index = 0;\n\n async function worker() {\n while (index < fns.length) {\n const i = index++;\n if (fns[i]) {\n results[i] = await fns[i]();\n }\n }\n }\n\n await Promise.all(Array.from({ length: maxConcurrency }, worker));\n return results;\n}\n","import type { Hex } from \"viem\";\nimport { TransactionRevertedError, ZamaError } from \"../errors\";\nimport type { TransactionOperation, ZamaSDKEventInput } from \"../events/sdk-events\";\nimport { transactionOperationMetadata, ZamaSDKEvents } from \"../events/sdk-events\";\nimport type {\n GenericLogger,\n GenericProvider,\n GenericSigner,\n TransactionResult,\n WriteContractConfig,\n} from \"../types\";\nimport { swallow } from \"./swallow\";\n\n/**\n * Shared write-transaction pipeline for SDK calls that submit a transaction.\n *\n * On success: writes the tx, emits the per-operation submitted event from\n * {@link transactionOperationMetadata}, fires `onSubmitted`, waits for the\n * receipt, and returns `{ txHash, receipt }`.\n *\n * On failure: emits a {@link ZamaSDKEvents.TransactionError} event with the\n * transaction-level error it will throw, then throws it. Existing `ZamaError`\n * instances are rethrown as-is; all other failures are wrapped in\n * `TransactionRevertedError` with the original error as `cause`.\n */\nexport async function submitTransaction(params: {\n operation: TransactionOperation;\n signer: GenericSigner;\n provider: GenericProvider;\n config: WriteContractConfig;\n emit: (input: ZamaSDKEventInput) => void;\n onSubmitted?: (txHash: Hex) => void;\n logger: GenericLogger;\n}): Promise<TransactionResult> {\n const { operation, signer, provider, config, emit, onSubmitted, logger } = params;\n const metadata = transactionOperationMetadata[operation];\n\n try {\n const txHash = await signer.writeContract(config);\n emit(metadata.submittedEvent(txHash));\n void swallow(`${operation}: onSubmitted`, () => onSubmitted?.(txHash), logger);\n const receipt = await provider.waitForTransactionReceipt(txHash);\n return { txHash, receipt };\n } catch (error) {\n const failure =\n error instanceof ZamaError\n ? error\n : new TransactionRevertedError(`Transaction failed during ${operation}`, { cause: error });\n\n emit({ type: ZamaSDKEvents.TransactionError, operation, error: failure });\n throw failure;\n }\n}\n","import { type Address, getAddress, type Hex } from \"viem\";\nimport {\n confidentialBalanceOfContract,\n confidentialTransferAndCallContract,\n confidentialTransferContract,\n confidentialTransferFromAndCallContract,\n confidentialTransferFromContract,\n decimalsContract,\n ERC7984_INTERFACE_ID,\n ERC7984_WRAPPER_INTERFACE_ID,\n isOperatorContract,\n nameContract,\n setOperatorContract,\n supportsInterfaceContract,\n symbolContract,\n} from \"../contracts\";\nimport {\n BalanceCheckUnavailableError,\n ConfigurationError,\n DecryptionFailedError,\n EncryptionFailedError,\n InsufficientConfidentialBalanceError,\n isFatalBatchError,\n requireConfigured,\n ZamaError,\n} from \"../errors\";\nimport type { TransactionOperation, ZamaSDKEventInput } from \"../events/sdk-events\";\nimport type { EncryptedValue } from \"../relayer/types\";\nimport { toError } from \"../utils\";\nimport { requireAlignedWalletAccount, requireChainAlignment } from \"../utils/alignment\";\nimport { assertBigint } from \"../utils/assertions\";\nimport { pLimit } from \"../utils/concurrency\";\nimport { isEncryptedValueZero } from \"../utils/handles\";\nimport { submitTransaction as submitSdkTransaction } from \"../utils/submit-transaction\";\nimport { swallow } from \"../utils/swallow\";\nimport type {\n GenericSigner,\n TransactionResult,\n TransferCallbacks,\n TransferOptions,\n WriteContractConfig,\n} from \"../types\";\nimport type { ZamaSDK } from \"../zama-sdk\";\n\n/** Options for {@link Token.batchDecryptBalancesAs}. */\nexport interface BatchDecryptAsOptions {\n /** The address of the account that delegated decryption rights. */\n delegatorAddress: Address;\n /** Pre-fetched encrypted values. When omitted, they are fetched from the chain. */\n encryptedValues?: EncryptedValue[];\n /**\n * The account whose on-chain balance to read. Defaults to the delegator\n * address, which is the common case (the delegator grants permission to\n * decrypt their own balance). Only set this when the account differs\n * from the delegator.\n *\n * Matches the `account` parameter of `confidentialBalanceOf(account)` on-chain.\n */\n accountAddress?: Address;\n /** Maximum number of concurrent decrypt calls. Default: 10. */\n maxConcurrency?: number;\n /** Called when decryption fails for a single token. Return a fallback bigint. */\n onError?: (error: Error, address: Address) => bigint;\n}\n\n/** Result of {@link Token.batchBalancesOf}. */\nexport interface BatchBalancesResult {\n /** Successfully decrypted balances, keyed by token address. */\n results: Map<Address, bigint>;\n /** Per-token errors for tokens that failed to decrypt. */\n errors: Map<Address, ZamaError>;\n}\n\n/**\n * High-level interface for an ERC-7984 confidential token.\n * Hides FHE complexity (encryption, decryption, EIP-712 signing) behind\n * familiar ERC-20-like methods.\n *\n * For ERC-7984 wrappers (shield/unshield), use {@link WrappedToken} instead —\n * it extends `Token` with wrapper-specific operations.\n *\n * Decryption, credentials, caching, and event emission are handled by the\n * owning {@link ZamaSDK} — this class only exposes token-scoped helpers\n * that delegate to `sdk.decryption.decryptValues` and `sdk.permits.grantPermit`.\n */\nexport class Token {\n /** The SDK instance this token operates through. */\n readonly sdk: ZamaSDK;\n /** Checksummed address of the confidential token contract. */\n readonly address: Address;\n\n constructor(sdk: ZamaSDK, address: Address) {\n this.sdk = sdk;\n this.address = getAddress(address);\n }\n\n /** Resolve `sdk.signer` or throw {@link SignerNotConfiguredError} tagged with `operation`. */\n #requireSigner(operation: string): GenericSigner {\n return requireConfigured(this.sdk.signer, operation);\n }\n\n // METADATA\n\n /** Read the token name from the contract. */\n async name(): Promise<string> {\n return this.sdk.provider.readContract(nameContract(this.address));\n }\n\n /** Read the token symbol from the contract. */\n async symbol(): Promise<string> {\n return this.sdk.provider.readContract(symbolContract(this.address));\n }\n\n /** Read the token decimals from the contract. */\n async decimals(): Promise<number> {\n return this.sdk.provider.readContract(decimalsContract(this.address));\n }\n\n // ERC-165 DISCOVERY\n\n /**\n * ERC-165 check for {@link ERC7984_INTERFACE_ID} support.\n *\n * @returns `true` if the contract implements the ERC-7984 confidential token interface.\n */\n async isConfidential(): Promise<boolean> {\n return this.sdk.provider.readContract(\n supportsInterfaceContract(this.address, ERC7984_INTERFACE_ID),\n );\n }\n\n /**\n * ERC-165 check for IERC7984ERC20Wrapper support.\n *\n * @returns `true` if the contract implements the ERC-7984 wrapper interface\n * ({@link ERC7984_WRAPPER_INTERFACE_ID}, `0x1f1c62b2`).\n */\n async isWrapper(): Promise<boolean> {\n return this.sdk.provider.readContract(\n supportsInterfaceContract(this.address, ERC7984_WRAPPER_INTERFACE_ID),\n );\n }\n\n // BALANCES\n\n /**\n * Decrypt and return the plaintext balance for the given owner.\n * Acquires FHE credentials via a wallet signature if none are cached.\n *\n * @param owner - Balance owner address.\n * @returns The decrypted plaintext balance as a bigint.\n * @throws if FHE decryption fails. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balance = await token.balanceOf(\"0xOwner\");\n * ```\n */\n async balanceOf(owner: Address): Promise<bigint> {\n const ownerAddress = getAddress(owner);\n const encryptedValue = await this.readConfidentialBalanceOf(ownerAddress);\n const result = await this.sdk.decryption.decryptValues([\n { encryptedValue, contractAddress: this.address },\n ]);\n const value = result[encryptedValue];\n if (value === undefined) {\n throw new DecryptionFailedError(`Decryption returned no value for ${encryptedValue}`);\n }\n assertBigint(value, \"balanceOf: result[encryptedValue]\");\n return value;\n }\n\n /**\n * Return the raw encrypted balance without decrypting.\n *\n * @param owner - Balance owner address.\n * @returns The encrypted balance as a hex string.\n *\n * @example\n * ```ts\n * const encryptedValue = await token.confidentialBalanceOf(\"0xOwner\");\n * ```\n */\n async confidentialBalanceOf(owner: Address): Promise<EncryptedValue> {\n return this.readConfidentialBalanceOf(getAddress(owner));\n }\n\n /**\n * Decrypt the balance of a delegator using delegated decryption credentials.\n * The connected signer acts as the delegatee who has been granted permission\n * by the delegator to decrypt their balance.\n *\n * Clear values are cached in storage keyed by `(account, token, encryptedValue)`.\n * Because every on-chain balance change produces a new encrypted value,\n * stale cache entries are never served. Cache write failures are silently\n * ignored — they do not affect the returned value.\n *\n * @param delegatorAddress - The address of the account that delegated decryption rights.\n * @param accountAddress - The account whose on-chain balance to read. Defaults\n * to the delegator address.\n * @returns The decrypted plaintext balance as a bigint.\n * @throws if no active delegation exists. {@link DelegationNotFoundError}\n * @throws if the delegation has expired. {@link DelegationExpiredError}\n * @throws if delegated decryption fails. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balance = await token.decryptBalanceAs({\n * delegatorAddress: \"0xDelegator\",\n * });\n * ```\n */\n async decryptBalanceAs({\n delegatorAddress,\n accountAddress,\n }: {\n delegatorAddress: Address;\n accountAddress?: Address;\n }): Promise<bigint> {\n await requireChainAlignment(\"decryptBalanceAs\", this.sdk.signer, this.sdk.provider);\n const normalizedDelegator = getAddress(delegatorAddress);\n const normalizedAccount = accountAddress ? getAddress(accountAddress) : normalizedDelegator;\n\n const encryptedValue = await this.readConfidentialBalanceOf(normalizedAccount);\n if (isEncryptedValueZero(encryptedValue)) {\n return 0n;\n }\n\n const result = await this.sdk.decryption.delegatedDecryptValues(\n [{ encryptedValue, contractAddress: this.address }],\n normalizedDelegator,\n normalizedAccount,\n );\n\n const value = result[encryptedValue];\n if (value === undefined) {\n throw new DecryptionFailedError(\n `Delegated decryption returned no value for ${encryptedValue}`,\n );\n }\n assertBigint(value, \"decryptBalanceAs: result[encryptedValue]\");\n return value;\n }\n\n // BATCH STATICS\n\n /**\n * Decrypt confidential balances for multiple tokens in parallel, returning\n * successes and per-token errors separately. Pre-authorizes all token\n * addresses in a single wallet signature, then delegates each decrypt to\n * `sdk.decryption.decryptValues`.\n *\n * Tokens that fail to decrypt land in `errors` rather than aborting the\n * whole batch — caller decides how to surface them.\n *\n * @param tokens - Array of {@link Token} instances bound to the same SDK.\n * @param owner - Balance owner address.\n * @returns `{ results, errors }` partitioning the per-token outcomes.\n *\n * @example\n * ```ts\n * const { results, errors } = await Token.batchBalancesOf(tokens, owner);\n * ```\n */\n static async batchBalancesOf(tokens: Token[], owner: Address): Promise<BatchBalancesResult> {\n const results = new Map<Address, bigint>();\n const errors = new Map<Address, ZamaError>();\n if (tokens.length === 0) {\n return { results, errors };\n }\n\n const sdk = Token.assertSameSdk(tokens);\n // Fail fast on chain mismatch before prompting the wallet for a signature.\n await requireChainAlignment(\"batchBalancesOf\", sdk.signer, sdk.provider);\n // Pre-authorize the full token set in one wallet signature so subsequent\n // per-token decryptValues calls reuse the cached credentials.\n await sdk.permits.grantPermit(tokens.map((t) => t.address));\n\n const outcomes = await pLimit(\n tokens.map((t) => async () => {\n try {\n return { status: \"fulfilled\" as const, value: await t.balanceOf(owner) };\n } catch (reason) {\n return { status: \"rejected\" as const, reason };\n }\n }),\n 5,\n );\n\n for (let i = 0; i < tokens.length; i++) {\n const tokenAddress = tokens[i]!.address;\n const outcome = outcomes[i]!;\n if (outcome.status === \"fulfilled\") {\n results.set(tokenAddress, outcome.value);\n } else {\n const reason = outcome.reason;\n // Session-level failures (user rejected signature, SDK misconfigured)\n // apply to every token — surface them instead of collecting per-token.\n if (isFatalBatchError(reason)) {\n throw reason;\n }\n const error =\n reason instanceof ZamaError\n ? reason\n : new DecryptionFailedError(toError(reason).message, { cause: reason });\n errors.set(tokenAddress, error);\n }\n }\n\n // Total failure: surface the first error so callers know nothing decrypted.\n if (errors.size === tokens.length) {\n const firstError = errors.values().next().value;\n throw firstError ?? new DecryptionFailedError(\"All token balance decryptions failed\");\n }\n\n return { results, errors };\n }\n\n /**\n * Batch decrypt confidential balances as a delegate across multiple tokens.\n * Mirrors {@link batchBalancesOf} but uses delegated credentials.\n *\n * **Error handling:** If a per-token decryption fails and no `onError` callback\n * is provided, errors are collected and thrown as an aggregated\n * `DecryptionFailedError`. When the relayer returns no value for an encrypted value,\n * a `DecryptionFailedError` is thrown for that token (never silently returns `0n`).\n * Pass `onError: () => 0n` to opt into the silent zero behavior.\n *\n * @param tokens - Array of Token instances to decrypt balances for.\n * @param options - Delegated decryption configuration.\n * @returns A Map from token address to decrypted balance.\n * @throws if no active delegation exists. {@link DelegationNotFoundError}\n * @throws if the delegation has expired. {@link DelegationExpiredError}\n * @throws if any decryption fails and no `onError` is provided. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balances = await Token.batchDecryptBalancesAs(tokens, {\n * delegatorAddress: \"0xDelegator\",\n * onError: (err, addr) => { console.error(addr, err); return 0n; },\n * });\n * ```\n */\n static async batchDecryptBalancesAs(\n tokens: Token[],\n options: BatchDecryptAsOptions,\n ): Promise<Map<Address, bigint>> {\n if (tokens.length === 0) {\n return new Map();\n }\n\n const sdk = Token.assertSameSdk(tokens);\n const results = new Map<Address, bigint>();\n const errors = new Map<Address, ZamaError>();\n const normalizedAccount = options.accountAddress\n ? getAddress(options.accountAddress)\n : getAddress(options.delegatorAddress);\n const maxConcurrency = options.maxConcurrency ?? 10;\n if (options.encryptedValues && tokens.length !== options.encryptedValues.length) {\n throw new DecryptionFailedError(\n `tokens.length (${tokens.length}) must equal encryptedValues.length (${options.encryptedValues.length})`,\n );\n }\n const resolvedEncryptedValues =\n options.encryptedValues ??\n (await Token.readBalanceHandlesBatch(tokens, normalizedAccount, errors, maxConcurrency));\n\n const decryptRequests: Array<{ token: Token; encryptedValue: EncryptedValue }> = [];\n for (const [index, token] of tokens.entries()) {\n const encryptedValue = resolvedEncryptedValues[index];\n if (!encryptedValue || errors.has(token.address)) {\n continue;\n }\n if (isEncryptedValueZero(encryptedValue)) {\n // Zero balance → skip the relayer; no decryption needed.\n results.set(token.address, 0n);\n } else {\n decryptRequests.push({ token, encryptedValue });\n }\n }\n\n if (decryptRequests.length > 0) {\n const decrypted = await sdk.decryption.delegatedBatchDecryptValues({\n encryptedInputs: decryptRequests.map(({ token, encryptedValue }) => ({\n encryptedValue,\n contractAddress: token.address,\n })),\n delegatorAddress: options.delegatorAddress,\n accountAddress: options.accountAddress,\n maxConcurrency,\n });\n\n for (const [index, item] of decrypted.items.entries()) {\n const request = decryptRequests[index];\n if (!request) {\n continue;\n }\n if (item.error) {\n errors.set(request.token.address, item.error);\n continue;\n }\n const value = item.value;\n if (value === undefined) {\n errors.set(\n request.token.address,\n new DecryptionFailedError(\n `Batch delegated decryption returned no value for ${item.encryptedValue} on token ${request.token.address}`,\n ),\n );\n continue;\n }\n assertBigint(value, \"batchDecryptBalancesAs: result[encryptedValue]\");\n results.set(request.token.address, value);\n }\n }\n\n if (errors.size === 0) {\n return results;\n }\n\n if (options.onError) {\n const callbackErrors: Array<{ address: Address; error: Error }> = [];\n for (const [address, error] of errors) {\n try {\n results.set(address, options.onError(error, address));\n } catch (callbackError) {\n callbackErrors.push({ address, error: toError(callbackError) });\n }\n }\n if (callbackErrors.length > 0) {\n const message = callbackErrors\n .map(({ address, error }) => `${address}: ${error.message}`)\n .join(\"; \");\n throw new DecryptionFailedError(\n `Batch delegated decryption onError callback failed for ${callbackErrors.length} token(s): ${message}`,\n { cause: callbackErrors[0]?.error },\n );\n }\n return results;\n }\n\n const errorEntries = Array.from(errors.entries());\n const message = errorEntries.map(([addr, e]) => `${addr}: ${e.message}`).join(\"; \");\n throw new DecryptionFailedError(\n `Batch delegated decryption failed for ${errors.size} token(s): ${message}`,\n { cause: errorEntries[0]?.[1] },\n );\n }\n\n private static async readBalanceHandlesBatch(\n tokens: Token[],\n accountAddress: Address,\n errors: Map<Address, ZamaError>,\n maxConcurrency: number,\n ): Promise<Array<EncryptedValue | undefined>> {\n const outcomes = await pLimit(\n tokens.map((token) => async () => {\n try {\n return {\n status: \"fulfilled\" as const,\n value: await token.readConfidentialBalanceOf(accountAddress),\n };\n } catch (reason) {\n return { status: \"rejected\" as const, reason };\n }\n }),\n maxConcurrency,\n );\n\n const encryptedValues: Array<EncryptedValue | undefined> = [];\n for (const [index, token] of tokens.entries()) {\n const outcome = outcomes[index];\n if (!outcome) {\n continue;\n }\n if (outcome.status === \"fulfilled\") {\n encryptedValues[index] = outcome.value;\n continue;\n }\n if (isFatalBatchError(outcome.reason)) {\n throw outcome.reason;\n }\n errors.set(\n token.address,\n outcome.reason instanceof ZamaError\n ? outcome.reason\n : new DecryptionFailedError(toError(outcome.reason).message, { cause: outcome.reason }),\n );\n }\n return encryptedValues;\n }\n\n // WRITE OPERATIONS\n\n /**\n * Confidential transfer. Encrypts the amount via FHE, then calls the contract.\n *\n * By default, the SDK validates the confidential balance before submitting.\n * If a cached plaintext balance exists it is used; otherwise, if credentials\n * are cached, it decrypts on the fly. Set `skipBalanceCheck: true` to bypass\n * this validation (e.g. for smart wallets).\n *\n * @param to - Recipient address.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param options - Optional: `skipBalanceCheck` (default `false`).\n * @returns The transaction hash and mined receipt.\n * @throws if signer and provider are on different chains. {@link ChainMismatchError}\n * @throws if the balance is less than `amount`. {@link InsufficientConfidentialBalanceError}\n * @throws if balance validation requires decryption that is not possible. {@link BalanceCheckUnavailableError}\n * @throws if FHE encryption fails. {@link EncryptionFailedError}\n * @throws if the on-chain transfer reverts. {@link TransactionRevertedError}\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransfer(\"0xRecipient\", 1000n);\n * ```\n */\n async confidentialTransfer(\n to: Address,\n amount: bigint,\n options?: TransferOptions,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransfer\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransfer\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const { skipBalanceCheck = false, onEncryptComplete, onTransferSubmitted } = options ?? {};\n\n const normalizedTo = getAddress(to);\n\n if (!skipBalanceCheck) {\n await this.assertConfidentialBalance(amount);\n }\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\"transfer: onEncryptComplete\", () => onEncryptComplete?.(), this.sdk.logger);\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transfer\",\n config: confidentialTransferContract(\n this.address,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n ),\n onSubmitted: onTransferSubmitted,\n });\n }\n\n /**\n * Operator encrypted transfer on behalf of another address.\n * The caller must be an approved operator for `from`.\n *\n * @param from - The address to transfer from (caller must be an approved operator).\n * @param to - Recipient address.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFrom(\"0xFrom\", \"0xTo\", 500n);\n * ```\n */\n async confidentialTransferFrom(\n from: Address,\n to: Address,\n amount: bigint,\n callbacks?: TransferCallbacks,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferFrom\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransferFrom\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const normalizedFrom = getAddress(from);\n const normalizedTo = getAddress(to);\n\n // The input proof is verified against msg.sender, so it binds to the caller, not `from`.\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\n \"transferFrom: onEncryptComplete\",\n () => callbacks?.onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferFrom\",\n config: confidentialTransferFromContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n ),\n onSubmitted: callbacks?.onTransferSubmitted,\n });\n }\n\n /**\n * ERC-7984 `confidentialTransferAndCall`: encrypted transfer that also invokes\n * the recipient's receiver hook (`onConfidentialTransferReceived`) in a single\n * transaction. The caller crafts the opaque `data` payload — the SDK does not\n * encode, validate, or interpret it.\n *\n * Balance validation follows the same rules as {@link Token.confidentialTransfer}.\n *\n * @param to - Recipient address. Must implement the ERC-7984 receiver hook.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param data - Opaque bytes forwarded to the recipient's receiver hook.\n * @param options - Optional: `skipBalanceCheck` (default `false`).\n * @returns The transaction hash and mined receipt.\n *\n * @throws if signer and provider are on different chains. {@link ChainMismatchError}\n * @throws if the balance is less than `amount`. {@link InsufficientConfidentialBalanceError}\n * @throws if balance validation requires decryption that is not possible. {@link BalanceCheckUnavailableError}\n * @throws if FHE encryption fails. {@link EncryptionFailedError}\n * @throws if the on-chain transfer reverts. {@link TransactionRevertedError}\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferAndCall(\n * \"0xRecipient\",\n * 1000n,\n * \"0xabcd\", // caller-encoded payload forwarded to the receiver hook\n * );\n * ```\n */\n async confidentialTransferAndCall(\n to: Address,\n amount: bigint,\n data: Hex,\n options?: TransferOptions,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferAndCall\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransferAndCall\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const { skipBalanceCheck = false, onEncryptComplete, onTransferSubmitted } = options ?? {};\n\n const normalizedTo = getAddress(to);\n\n if (!skipBalanceCheck) {\n await this.assertConfidentialBalance(amount);\n }\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\n \"transferAndCall: onEncryptComplete\",\n () => onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferAndCall\",\n config: confidentialTransferAndCallContract(\n this.address,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n data,\n ),\n onSubmitted: onTransferSubmitted,\n });\n }\n\n /**\n * ERC-7984 `confidentialTransferFromAndCall`: operator-initiated encrypted\n * transfer that also invokes the recipient's receiver hook in a single\n * transaction. The caller must be an approved operator for `from` and crafts\n * the opaque `data` payload — the SDK does not encode or interpret it.\n *\n * @param from - The address to transfer from (caller must be an approved operator).\n * @param to - Recipient address. Must implement the ERC-7984 receiver hook.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param data - Opaque bytes forwarded to the recipient's receiver hook.\n * @param callbacks - Optional progress callbacks.\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFromAndCall(\n * \"0xFrom\",\n * \"0xRecipient\",\n * 500n,\n * \"0xabcd\",\n * );\n * ```\n */\n async confidentialTransferFromAndCall(\n from: Address,\n to: Address,\n amount: bigint,\n data: Hex,\n callbacks?: TransferCallbacks,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferFromAndCall\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransferFromAndCall\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const normalizedFrom = getAddress(from);\n const normalizedTo = getAddress(to);\n\n // The input proof is verified against msg.sender, so it binds to the caller, not `from`.\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\n \"transferFromAndCall: onEncryptComplete\",\n () => callbacks?.onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferFromAndCall\",\n config: confidentialTransferFromAndCallContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n data,\n ),\n onSubmitted: callbacks?.onTransferSubmitted,\n });\n }\n\n // OPERATOR APPROVAL\n\n /**\n * Set operator approval for the confidential token.\n * Defaults to 1 hour from now if `until` is not specified.\n *\n * @param operator - The address to set as an operator.\n * @param until - Optional Unix timestamp for approval expiry. Defaults to now + 1 hour.\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.setOperator(\"0xOperator\");\n * ```\n */\n async setOperator(operator: Address, until?: number): Promise<TransactionResult> {\n this.#requireSigner(\"setOperator\");\n await requireChainAlignment(\"setOperator\", this.sdk.signer, this.sdk.provider);\n const normalizedOperator = getAddress(operator);\n return this.submitTransaction({\n operation: \"setOperator\",\n config: setOperatorContract(this.address, normalizedOperator, until),\n });\n }\n\n /**\n * Check if a spender is an approved operator for a given holder.\n *\n * @param holder - The token holder address.\n * @param spender - The address to check operator approval for.\n * @returns `true` if the spender is an approved operator for the holder.\n *\n * @example\n * ```ts\n * if (await token.isOperator(\"0xHolder\", \"0xSpender\")) {\n * // spender can call transferFrom on behalf of holder\n * }\n * ```\n */\n async isOperator(holder: Address, spender: Address): Promise<boolean> {\n return this.sdk.provider.readContract(\n isOperatorContract(this.address, getAddress(holder), getAddress(spender)),\n );\n }\n\n // PROTECTED HELPERS\n\n /**\n * Read the on-chain encrypted balance for a given owner.\n *\n * @internal\n */\n protected async readConfidentialBalanceOf(owner: Address): Promise<EncryptedValue> {\n return await this.sdk.provider.readContract(confidentialBalanceOfContract(this.address, owner));\n }\n\n /**\n * Pre-flight check: decrypt the confidential balance and compare against the\n * requested amount. If credentials are cached the decrypt happens silently;\n * if not, throws {@link BalanceCheckUnavailableError} instead of triggering\n * a surprise EIP-712 popup.\n *\n * @internal\n */\n protected async assertConfidentialBalance(amount: bigint): Promise<void> {\n if (amount === 0n) {\n return;\n }\n\n let balance: bigint;\n try {\n const account = await requireAlignedWalletAccount(\n \"assertConfidentialBalance\",\n this.sdk.signer,\n this.sdk.provider,\n );\n balance = await this.balanceOf(getAddress(account.address));\n } catch (error) {\n if (error instanceof ZamaError) {\n throw error;\n }\n throw new BalanceCheckUnavailableError(`Balance validation failed (token: ${this.address})`, {\n cause: error,\n });\n }\n\n if (balance < amount) {\n throw new InsufficientConfidentialBalanceError(\n `Insufficient confidential balance: requested ${amount}, available ${balance} (token: ${this.address})`,\n { requested: amount, available: balance, token: this.address },\n );\n }\n }\n\n /**\n * Emit a token-scoped event through the owning {@link ZamaSDK} so that\n * subscribers see a unified stream.\n *\n * @internal\n */\n protected emit(input: ZamaSDKEventInput): void {\n this.sdk.emitEvent(input, this.address);\n }\n\n /**\n * Submit a token-scoped write transaction through the shared SDK transaction\n * pipeline. Callers keep pre-flight and operation-specific work local.\n *\n * @internal\n */\n protected async submitTransaction(params: {\n operation: TransactionOperation;\n config: WriteContractConfig;\n onSubmitted?: (txHash: Hex) => void;\n }): Promise<TransactionResult> {\n const { operation, config, onSubmitted } = params;\n return submitSdkTransaction({\n operation,\n signer: this.#requireSigner(operation),\n provider: this.sdk.provider,\n config,\n emit: (input) => this.emit(input),\n onSubmitted,\n logger: this.sdk.logger,\n });\n }\n\n /** Verify all tokens share the same SDK instance and return it. */\n private static assertSameSdk(tokens: Token[]): ZamaSDK {\n const sdk = tokens[0]!.sdk;\n for (let i = 1; i < tokens.length; i++) {\n if (tokens[i]!.sdk !== sdk) {\n throw new ConfigurationError(\n \"All tokens in a batch operation must share the same ZamaSDK instance\",\n );\n }\n }\n return sdk;\n }\n}\n"],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h}from"./relayer-BWHOLVcG.js";import{A as g,B as ee,C as te,D as ne,F as re,G as _,H as ie,I as v,K as ae,L as y,M as oe,N as se,P as ce,R as b,S as le,T as ue,U as de,V as fe,W as pe,X as me,Y as he,Z as ge,_ as x,a as _e,b as ve,c as ye,d as be,f as xe,g as Se,h as Ce,i as we,j as Te,k as Ee,l as De,m as Oe,o as ke,p as Ae,q as je,r as Me,s as Ne,t as S,u as Pe,v as C,w as Fe,y as w,z as T}from"./sdk-events-DI-bw_nW.js";import{_ as E,a as Ie,c as Le,d as D,f as Re,g as O,h as ze,i as k,l as Be,m as A,n as Ve,o as He,p as Ue,r as We,s as Ge,t as Ke,u as qe,v as j}from"./token-BBInYv3L.js";import{t as Je}from"./cleartext-Qqh5JohW.js";import{a as Ye,c as Xe,d as M,f as Ze,g as Qe,h as $e,i as et,l as tt,m as nt,n as rt,o as it,p as at,r as ot,s as N,t as st,u as P}from"./base-signer-BniXgTt5.js";import{a as ct,c as lt,i as ut,l as dt,n as ft,o as pt,r as mt,s as ht,t as gt}from"./chains-DkH7vYTf.js";import{r as _t,t as vt}from"./assertions-Ca1ePdRJ.js";import{getAddress as F,keccak256 as yt,size as bt,toBytes as xt}from"viem";import{z as I}from"zod/mini";function St(e,t){if(e instanceof p){let n=t[e.code];if(n)return n(e)}return t._?.(e)}var L=class extends p{encryptedValue;contractAddress;account;constructor(e,t){super(s.NotEntitled,`Account ${e.account} is not entitled to decrypt encrypted value ${e.encryptedValue} on contract ${e.contractAddress}. This is not a transient failure — the account needs an on-chain ACL grant before it can decrypt this encrypted value.`,t),this.name=`NotEntitledError`,this.encryptedValue=e.encryptedValue,this.contractAddress=e.contractAddress,this.account=e.account}},R=class extends p{constructor(e,t){super(s.DelegationSelfNotAllowed,e,t),this.name=`DelegationSelfNotAllowedError`}},Ct=class extends p{constructor(e,t){super(s.DelegationCooldown,e,t),this.name=`DelegationCooldownError`}},z=class extends p{constructor(e,t){super(s.DelegationNotFound,e,t),this.name=`DelegationNotFoundError`}},wt=class extends p{constructor(e,t){super(s.DelegationExpired,e,t),this.name=`DelegationExpiredError`}},B=class extends p{constructor(e,t){super(s.DelegationExpiryUnchanged,e,t),this.name=`DelegationExpiryUnchangedError`}},V=class extends p{constructor(e,t){super(s.DelegationDelegateEqualsContract,e,t),this.name=`DelegationDelegateEqualsContractError`}},Tt=class extends p{constructor(e,t){super(s.DelegationContractIsSelf,e,t),this.name=`DelegationContractIsSelfError`}},Et=class extends p{constructor(e,t){super(s.AclPaused,e,t),this.name=`AclPausedError`}},H=class extends p{constructor(e,t){super(s.DelegationExpirationTooSoon,e,t),this.name=`DelegationExpirationTooSoonError`}},U=class extends p{constructor(e,t){super(s.DelegationNotPropagated,e,t),this.name=`DelegationNotPropagatedError`}};const Dt=[E,me,u,U,je,ae,L,O,he];function W(e,t,s={}){if(Dt.some(t=>e instanceof t))return e;let d=e instanceof Error?e.message:t;if(e instanceof Error&&r(e.message))return new he(e.message,{cause:e});if(e instanceof Error&&i(e.message))return s.isDelegated?new U(`Delegated decryption was denied by the on-chain ACL check. This is most commonly caused by the delegation not having propagated yet, or by the RPC node serving a stale block. Propagation usually completes within ~10 blocks (a few seconds) and the SDK retries across that window; seeing this means it did not sync in time. Retry shortly (and prefer a fresh, low-lag RPC endpoint). If it persists, the delegator may genuinely lack the on-chain ACL grant.`,{cause:e}):new L({encryptedValue:a(e.message)??``,contractAddress:s.contractAddress??``,account:s.account??``},{cause:e});if(c(e))return new O(d,{cause:e,retryAfter:n(e)});let p=m(e);return p===void 0&&o(e)?new O(d,{cause:e,retryAfter:n(e)}):p===400?new me(e instanceof Error?e.message:`No ciphertext for this account`,{cause:e}):s.isDelegated&&p===500?new U(`Delegated decryption failed with a server error. This is most commonly caused by the delegation not having propagated to the gateway yet. Cross-chain sync usually completes within ~10 blocks (a few seconds) and the SDK retries across that window; seeing this means it did not sync in time — retry shortly. If the error persists, the gateway or relayer may be experiencing an unrelated issue.`,{cause:e}):f(e)||p!==void 0?new u(d,p,{cause:e,retryAfter:n(e),retryable:l(e)||void 0}):new E(t,{cause:e})}function Ot(e,t){if(e instanceof p)return e;let r=m(e),i=l(e);return r!==void 0||f(e)?new u(e instanceof Error?e.message:t,r,{cause:e,retryAfter:n(e),retryable:i||void 0}):new j(t,{cause:e})}const kt=[{type:`function`,name:`allowance`,inputs:[{name:`owner`,type:`address`,internalType:`address`},{name:`spender`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`approve`,inputs:[{name:`spender`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`approveAndCall`,inputs:[{name:`spender`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`approveAndCall`,inputs:[{name:`spender`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`},{name:`data`,type:`bytes`,internalType:`bytes`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`balanceOf`,inputs:[{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`supportsInterface`,inputs:[{name:`interfaceId`,type:`bytes4`,internalType:`bytes4`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`totalSupply`,inputs:[],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`transfer`,inputs:[{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferAndCall`,inputs:[{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferAndCall`,inputs:[{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`},{name:`data`,type:`bytes`,internalType:`bytes`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferFrom`,inputs:[{name:`from`,type:`address`,internalType:`address`},{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferFromAndCall`,inputs:[{name:`from`,type:`address`,internalType:`address`},{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`},{name:`data`,type:`bytes`,internalType:`bytes`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferFromAndCall`,inputs:[{name:`from`,type:`address`,internalType:`address`},{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`event`,name:`Approval`,inputs:[{name:`owner`,type:`address`,indexed:!0,internalType:`address`},{name:`spender`,type:`address`,indexed:!0,internalType:`address`},{name:`value`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`Transfer`,inputs:[{name:`from`,type:`address`,indexed:!0,internalType:`address`},{name:`to`,type:`address`,indexed:!0,internalType:`address`},{name:`value`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1}];function G(e,t,n,r=`0x`){return{address:e,abi:kt,functionName:`transferAndCall`,args:[t,n,r]}}const K=[{type:`function`,name:`allow`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`allowForDecryption`,inputs:[{name:`handlesList`,type:`bytes32[]`,internalType:`bytes32[]`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`allowTransient`,inputs:[{name:`ciphertext`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`cleanTransientStorage`,inputs:[],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`delegateForUserDecryption`,inputs:[{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`},{name:`expirationDate`,type:`uint64`,internalType:`uint64`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`getUserDecryptionDelegationExpirationDate`,inputs:[{name:`delegator`,type:`address`,internalType:`address`},{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`uint64`,internalType:`uint64`}],stateMutability:`view`},{type:`function`,name:`isAccountDenied`,inputs:[{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isAllowed`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isAllowedForDecryption`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isHandleDelegatedForUserDecryption`,inputs:[{name:`delegator`,type:`address`,internalType:`address`},{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`},{name:`handle`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`multicall`,inputs:[{name:`data`,type:`bytes[]`,internalType:`bytes[]`}],outputs:[{name:`results`,type:`bytes[]`,internalType:`bytes[]`}],stateMutability:`payable`},{type:`function`,name:`persistAllowed`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`revokeDelegationForUserDecryption`,inputs:[{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`}];function q(e,t,n,r){return{address:e,abi:K,functionName:`delegateForUserDecryption`,args:[t,n,r]}}function At(e,t,n){return{address:e,abi:K,functionName:`revokeDelegationForUserDecryption`,args:[t,n]}}function jt(e,t,n,r){return{address:e,abi:K,functionName:`getUserDecryptionDelegationExpirationDate`,args:[t,n,r]}}function Mt(e,t,n,r,i){return{address:e,abi:K,functionName:`isHandleDelegatedForUserDecryption`,args:[t,n,r,i]}}const Nt=2n**64n-1n;function Pt(e){return et(e.signer,e.provider,e)}function Ft(e){return e.startsWith(`0x`)?e:`0x${e}`}function J(e){return yt(xt(e))}const Y={ConfidentialTransfer:J(`ConfidentialTransfer(address,address,bytes32)`),Wrap:J(`Wrap(address,uint256,bytes32)`),UnwrapRequested:J(`UnwrapRequested(address,bytes32,bytes32)`),UnwrapFinalized:J(`UnwrapFinalized(address,bytes32,bytes32,uint64)`)};function X(e){return F(Ft(e.slice(-40)))}function It(e){return e}function Lt(e,t){let n=2+t*64,r=e.slice(n,n+64);return r.length===64?r:r.padEnd(64,`0`)}function Rt(e,t){return F(Ft(Lt(e,t).slice(-40)))}function Z(e,t){return BigInt(`0x`+Lt(e,t))}function zt(e,t){return Ft(Lt(e,t))}function Bt(e){return e.topics[0]!==Y.ConfidentialTransfer||e.topics.length<4?null:{eventName:`ConfidentialTransfer`,from:X(e.topics[1]),to:X(e.topics[2]),encryptedAmount:It(e.topics[3])}}function Vt(e){return e.topics[0]!==Y.Wrap||e.topics.length<2?null:{eventName:`Wrap`,to:X(e.topics[1]),roundedAmount:Z(e.data,0),encryptedWrappedAmount:zt(e.data,1)}}function Ht(e){return e.topics[0]!==Y.UnwrapRequested||e.topics.length<3?null:{eventName:`UnwrapRequested`,receiver:X(e.topics[1]),unwrapRequestId:It(e.topics[2]),encryptedAmount:zt(e.data,0)}}function Ut(e){return e.topics[0]!==Y.UnwrapFinalized||e.topics.length<3?null:{eventName:`UnwrapFinalized`,receiver:X(e.topics[1]),unwrapRequestId:It(e.topics[2]),encryptedAmount:zt(e.data,0),cleartextAmount:Z(e.data,1)}}function Wt(e){return Bt(e)??Vt(e)??Ht(e)??Ut(e)}function Gt(e){let t=[];for(let n of e){let e=Wt(n);e&&t.push(e)}return t}function Kt(e){for(let t of e){let e=Ht(t);if(e)return e}return null}function qt(e){for(let t of e){let e=Vt(t);if(e)return e}return null}const Jt=[Y.ConfidentialTransfer,Y.Wrap,Y.UnwrapRequested,Y.UnwrapFinalized],Q={DelegatedForUserDecryption:J(`DelegatedForUserDecryption(address,address,address,uint64,uint64,uint64)`),RevokedDelegationForUserDecryption:J(`RevokedDelegationForUserDecryption(address,address,address,uint64,uint64)`)};function Yt(e){return e.topics[0]!==Q.DelegatedForUserDecryption||e.topics.length<3?null:{eventName:`DelegatedForUserDecryption`,delegator:X(e.topics[1]),delegate:X(e.topics[2]),contractAddress:Rt(e.data,0),delegationCounter:Z(e.data,1),oldExpirationDate:Z(e.data,2),newExpirationDate:Z(e.data,3)}}function Xt(e){return e.topics[0]!==Q.RevokedDelegationForUserDecryption||e.topics.length<3?null:{eventName:`RevokedDelegationForUserDecryption`,delegator:X(e.topics[1]),delegate:X(e.topics[2]),contractAddress:Rt(e.data,0),delegationCounter:Z(e.data,1),oldExpirationDate:Z(e.data,2)}}function Zt(e){return Yt(e)??Xt(e)}function Qt(e){let t=[];for(let n of e){let e=Zt(n);e&&t.push(e)}return t}function $t(e){for(let t of e){let e=Yt(t);if(e)return e}return null}function en(e){for(let t of e){let e=Xt(t);if(e)return e}return null}const tn=[Q.DelegatedForUserDecryption,Q.RevokedDelegationForUserDecryption];var nn=class{#e;#t;#n;#r;#i;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.cachingService,this.#r=e.credentialService,this.#i=e.logger}#a(e){return pe(this.#r,e)}async grantPermit(e){if(e.length===0)return;let t=this.#a(`grantPermit`);await Ie(`grantPermit`,this.#e,this.#t),await t.grantPermit(e)}async grantDelegationPermit(e,t){if(t.length===0)return;let n=this.#a(`grantDelegationPermit`);await Ie(`grantDelegationPermit`,this.#e,this.#t),await n.grantPermit(t,e)}async hasPermit(e){return this.#r?this.#r.hasPermit(e):!1}async hasDelegationPermit(e,t){return this.#r?this.#r.hasPermit(t,e):!1}async warmTransportKeyPair(){let e=this.#r;if(!e)return;let t=this.#e?.walletAccount.getSnapshot();t&&await e.warmTransportKeyPair(t.address)}async revokePermits(e){let t=this.#a(`revokePermits`),n=F((await k(`revokePermits`,this.#e,this.#t)).address);try{await t.revokePermits(e)}finally{await this.#o(n)}}async clear(){let e=this.#a(`clear`),t=F((await k(`clear`,this.#e,this.#t)).address);try{await e.clearCredentials()}finally{await this.#o(t)}}async#o(e){await T(`clear decrypt cache`,()=>this.#n.clearForRequester(e),this.#i)}async revokeTransportKeyPair(e){await this.#a(`revokeTransportKeyPair`).revokeTransportKeyPair(e)}async warmTransportKeyPairScope(e){await this.#a(`warmTransportKeyPairScope`).warmTransportKeyPairScope(e)}},rn=class{#e;#t;#n;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.delegationService}#r(e){return pe(this.#e,e)}async delegateDecryption({contractAddress:e,delegateAddress:t,expirationDate:n}){let r=this.#r(`delegateDecryption`),i=await k(`delegateDecryption`,this.#e,this.#t);return this.#n.delegateDecryption(r,{contractAddress:e,delegateAddress:t,delegatorAddress:i.address,expirationDate:n})}async revokeDelegation({contractAddress:e,delegateAddress:t}){let n=this.#r(`revokeDelegation`),r=await k(`revokeDelegation`,this.#e,this.#t);return this.#n.revokeDelegation(n,{contractAddress:e,delegateAddress:t,delegatorAddress:r.address})}async isActive(e){return this.#n.isDelegated(e)}async getExpiry(e){return this.#n.getDelegationExpiry(e)}async getStatus(e){return this.#n.getStatus(e)}},an=class{#e;#t;#n;#r;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.router,this.#r=e.decryptionService}#i(e){return pe(this.#r,e)}async decryptValues(e,t){let n=this.#i(`decryptValues`),r=await k(`decryptValues`,this.#e,this.#t);return n.decryptValues(e,r.address,t)}async delegatedDecryptValues(e,t,n=t,r){let i=this.#i(`delegatedDecryptValues`),a=await k(`delegatedDecryptValues`,this.#e,this.#t);return i.delegatedDecryptValues(e,t,a.address,n,r)}async decryptPublicValues(e,t){if(e.length===0)return{clearValues:{},decryptionProof:`0x`,abiEncodedClearValues:`0x`};try{let n=await this.#n.relayer.decryptPublicValuesWithSignatures({encryptedValues:e,options:t}),r={};return n.checkSignaturesArgs.handlesList.forEach((e,t)=>{_t(n.clearValues[t],`result.clearValues[${t}]`),r[e]=n.clearValues[t].value}),{clearValues:r,abiEncodedClearValues:n.checkSignaturesArgs.abiEncodedCleartexts,decryptionProof:n.checkSignaturesArgs.decryptionProof}}catch(e){throw W(e,`Public decryption failed`)}}async delegatedBatchDecryptValues({encryptedInputs:e,delegatorAddress:t,accountAddress:n=t,maxConcurrency:r,waitForPropagation:i}){let a=this.#i(`delegatedBatchDecryptValues`),o=await k(`delegatedBatchDecryptValues`,this.#e,this.#t);return a.delegatedBatchDecryptHandlesAs({encryptedInputs:e,delegatorAddress:t,delegateAddress:o.address,accountAddress:n,maxConcurrency:r,waitForPropagation:i})}},on=class{#e;constructor(e){this.#e=e}prepare(e,t){return this.#e.prepare(e,t)}},sn=class{async get(e){return(await chrome.storage.session.get(e))[e]??null}async set(e,t){await chrome.storage.session.set({[e]:t})}async delete(e){await chrome.storage.session.remove(e)}};const cn=new sn;function $(e){return`zama:pending-unshield:${tt(e)}`}const ln=I.union([I.pipe(M,I.transform(e=>({unwrapTxHash:e}))),I.pipe(I.object({version:I.literal(1),unwrapTxHash:M,unwrapRequestId:I.optional(M)}),I.transform(({unwrapTxHash:e,unwrapRequestId:t})=>({unwrapTxHash:e,unwrapRequestId:t})))]);async function un(e,t,n,r){if(r===void 0){await e.set($(t),n);return}await e.set($(t),{version:1,unwrapTxHash:n,unwrapRequestId:r})}async function dn(e,t){return(await fn(e,t))?.unwrapTxHash??null}async function fn(e,t){let n=$(t),r=await e.get(n);if(r==null)return null;let i=ln.safeParse(r);return i.success?i.data:(await e.delete(n),null)}async function pn(e,t){await e.delete($(t))}var mn=class extends Ke{#e;#t=null;#n=null;#r(e){try{return _t(this.sdk.signer,`WrappedToken.sdk.signer`),this.sdk.signer}catch(t){throw new ee(e,{cause:t})}}async underlying(){return this.#s()}async isPayable(){if(this.#n!==null)return this.#n;try{let e=await this.#s();this.#n=await this.sdk.provider.readContract(Ce(e))}catch{this.#n=!1}return this.#n}async allowance(e){let t=await this.#s();return this.sdk.provider.readContract(x(t,F(e),this.address))}async shield(t,n){let r=await k(`shield`,this.sdk.signer,this.sdk.provider),i=await this.isPayable(),a=await this.#s(),o=F(r.address),s;try{s=await this.sdk.provider.readContract(w(a,o))}catch(t){throw t instanceof p?t:new D(`Could not read ERC-20 balance for shield validation (token: ${a})`,{cause:e(t)})}if(s<t)throw new A(`Insufficient ERC-20 balance: requested ${t}, available ${s} (token: ${a})`,{requested:t,available:s,token:a});return i?this.#i(t,a,o,n):this.#a(t,o,n)}async#i(e,t,n,r){this.#r(`shield`);let i=r?.to?F(r.to):n,a=i===n?`0x`:i;return this.submitTransaction({operation:`shield:transferAndCall`,config:G(t,this.address,e,a),onSubmitted:r?.onShieldSubmitted})}async wrap(t,n){this.#r(`wrap`);let r=await k(`wrap`,this.sdk.signer,this.sdk.provider),i=await this.#s(),a=F(r.address),o;try{o=await this.sdk.provider.readContract(w(i,a))}catch(t){throw t instanceof p?t:new D(`Could not read ERC-20 balance for wrap validation (token: ${i})`,{cause:e(t)})}if(o<t)throw new A(`Insufficient ERC-20 balance: requested ${t}, available ${o} (token: ${i})`,{requested:t,available:o,token:i});let s;try{s=await this.sdk.provider.readContract(x(i,a,this.address))}catch(t){throw t instanceof p?t:new D(`Could not read ERC-20 allowance for wrap validation (token: ${i})`,{cause:e(t)})}if(s<t)throw new Re(`Insufficient allowance for wrap: requested ${t}, approved ${s}. Call approveUnderlying() first (token: ${i}).`,{requested:t,available:s,token:i});let c=n?.to?F(n.to):a;return this.submitTransaction({operation:`wrap`,config:b(this.address,c,t),onSubmitted:n?.onWrapSubmitted})}async#a(e,t,n){this.#r(`shield`);let r=n?.approvalStrategy??`exact`;r!==`skip`&&await this.#l(e,r===`max`,n);let i=n?.to?F(n.to):t;return this.submitTransaction({operation:`shield:approveAndWrap`,config:b(this.address,i,e),onSubmitted:n?.onShieldSubmitted})}async approveUnderlying(e){this.#r(`approveUnderlying`);let t=await k(`approveUnderlying`,this.sdk.signer,this.sdk.provider),n=await this.#s(),r=F(t.address),i=e??2n**256n-1n;return i>0n&&await this.sdk.provider.readContract(x(n,r,this.address))>0n&&await this.submitTransaction({operation:`approveUnderlying:reset`,config:C(n,this.address,0n)}),this.submitTransaction({operation:`approveUnderlying`,config:C(n,this.address,i)})}async unshield(e,t){let{skipBalanceCheck:n=!1,onUnwrapSubmitted:r,onFinalizing:i,onFinalizeSubmitted:a}=t??{};n||await this.assertConfidentialBalance(e);let o={onFinalizing:i,onFinalizeSubmitted:a},s=crypto.randomUUID(),c=await this.unwrap(e);return T(`unshield: onUnwrapSubmitted`,()=>r?.(c.txHash),this.sdk.logger),this.#c(c.unwrapRequestId,c.txHash,s,o)}async unshieldAll(e){let t=crypto.randomUUID(),n=await this.unwrapAll();return T(`unshieldAll: onUnwrapSubmitted`,()=>e?.onUnwrapSubmitted?.(n.txHash),this.sdk.logger),this.#c(n.unwrapRequestId,n.txHash,t,e)}async resumeUnshield(e,t){let n;try{n=await this.sdk.provider.waitForTransactionReceipt(e)}catch(e){throw e instanceof p?e:new _(`Failed to get unwrap receipt`,{cause:e})}let r=this.#o(n.logs);return this.#c(r,e,crypto.randomUUID(),t)}async getPendingUnshield(){return dn(this.sdk.storage,this.address)}async unwrap(e){this.#r(`unwrap`);let t=F((await k(`unwrap`,this.sdk.signer,this.sdk.provider)).address),{encryptedValues:n,inputProof:r}=await this.sdk.encrypt({values:[{value:e,type:`euint64`}],contractAddress:this.address,userAddress:t}),[i]=n;if(!i)throw new j(`Encryption returned no encrypted values`);let a=await this.submitTransaction({operation:`unwrap`,config:v(this.address,t,t,i,r)});return{...a,unwrapRequestId:this.#o(a.receipt.logs)}}async unwrapAll(){this.#r(`unwrapAll`);let e=F((await k(`unwrapAll`,this.sdk.signer,this.sdk.provider)).address),t=await this.readConfidentialBalanceOf(e);if(Le(t))throw new E(`Cannot unshield: balance is zero`);let n=await this.submitTransaction({operation:`unwrapAll`,config:y(this.address,e,e,t)});return{...n,unwrapRequestId:this.#o(n.receipt.logs)}}async finalizeUnwrap(e){this.#r(`finalizeUnwrap`),await Ie(`finalizeUnwrap`,this.sdk.signer,this.sdk.provider);let t=await this.sdk.decryption.decryptPublicValues([e]),n=t.clearValues[e];return vt(n,`finalizeUnwrap: clearValue`),this.submitTransaction({operation:`finalizeUnwrap`,config:g(this.address,e,n,t.decryptionProof)})}#o(e){let t=Kt(e);if(!t)throw new _(`No UnwrapRequested event found in unwrap receipt`);return t.unwrapRequestId}async#s(){return this.#e===void 0?(this.#t||=this.sdk.provider.readContract(re(this.address)).then(e=>(this.#e=e,this.#t=null,e)).catch(e=>{throw this.#t=null,e}),this.#t):this.#e}async#c(e,t,n,r){this.emit({type:S.UnshieldPhase1Submitted,txHash:t,operationId:n}),await T(`unshield: savePendingUnshield`,()=>un(this.sdk.storage,this.address,t),this.sdk.logger),this.emit({type:S.UnshieldPhase2Started,operationId:n}),T(`unshield: onFinalizing`,()=>r?.onFinalizing?.(),this.sdk.logger);let i=await this.finalizeUnwrap(e);return this.emit({type:S.UnshieldPhase2Submitted,txHash:i.txHash,operationId:n}),T(`unshield: onFinalizeSubmitted`,()=>r?.onFinalizeSubmitted?.(i.txHash),this.sdk.logger),await T(`unshield: clearPendingUnshield`,()=>pn(this.sdk.storage,this.address),this.sdk.logger),i}async#l(e,t,n){this.#r(`approveUnderlying`);let r=await this.#s(),i=F((await k(`approveUnderlying`,this.sdk.signer,this.sdk.provider)).address),a=await this.sdk.provider.readContract(x(r,i,this.address));if(a>=e)return;a>0n&&await this.submitTransaction({operation:`approveUnderlying:reset`,config:C(r,this.address,0n)});let o=t?2n**256n-1n:e;await this.submitTransaction({operation:`approveUnderlying`,config:C(r,this.address,o),onSubmitted:n?.onApprovalSubmitted})}};const hn=I.union([I.bigint(),I.boolean(),P]),gn=I.array(I.string());var _n=class{#e;#t;#n=`zama:decrypt`;#r=`${this.#n}:keys`;#i=Promise.resolve();constructor(e,t){this.#e=e,this.#t=t}async get(e,t,n){try{let r=this.#c(e,t,n),i=await this.#e.get(r);if(i===null)return null;let a=hn.safeParse(i);return a.success?a.data:(await this.delete(e,t,n),null)}catch(e){return this.#t.warn(`CachingService.get failed`,{error:e}),null}}async set(e,t,n,r){try{let i=this.#c(e,t,n);await this.#e.set(i,r),this.#i=this.#i.then(()=>this.#u(i).catch(e=>{this.#t.warn(`CachingService index write failed`,{error:e})})),await this.#i}catch(e){this.#t.warn(`CachingService.set failed`,{error:e})}}async delete(e,t,n){let r=this.#c(e,t,n);this.#i=this.#i.then(()=>this.#a(r).catch(e=>{this.#t.warn(`CachingService.delete failed`,{error:e})})),await this.#i}async clearForRequester(e){this.#i=this.#i.then(()=>this.#o(e).catch(e=>{this.#t.warn(`CachingService.clearForRequester failed`,{error:e})})),await this.#i}async clearAll(){this.#i=this.#i.then(()=>this.#s().catch(e=>{this.#t.warn(`CachingService.clearAll failed`,{error:e})})),await this.#i}async#a(e){await this.#e.delete(e).catch(()=>{});let t=await this.#l(),n=t.filter(t=>t!==e);n.length!==t.length&&await this.#e.set(this.#r,n)}async#o(e){let t=F(e),n=`${this.#n}:${t}:`,r=await this.#l(),i=[],a=[];for(let e of r)e.startsWith(n)?i.push(e):a.push(e);await Promise.all(i.map(e=>this.#e.delete(e).catch(()=>{}))),await this.#e.set(this.#r,a)}async#s(){let e=await this.#l();await Promise.all(e.map(e=>this.#e.delete(e).catch(()=>{}))),await this.#e.delete(this.#r)}#c(e,t,n){return`${this.#n}:${F(e)}:${F(t)}:${n.toLowerCase()}`}async#l(){let e=await this.#e.get(this.#r);if(e===null)return[];let t=gn.safeParse(e);return t.success?t.data:(await this.#e.delete(this.#r).catch(()=>{}),[])}async#u(e){let t=await this.#l();t.includes(e)||(t.push(e),await this.#e.set(this.#r,t))}};function vn(e,t){let n=yn(e,t);if(!n)throw new E(`No permit covers contract ${t} after allow()`);return{privateKey:e.keypair.privateKey,publicKey:e.keypair.publicKey,serializedPermit:n.serializedPermit}}function yn(e,t){let n=tt(t);return e.permissions.find(e=>e.contractAddresses.includes(n))}const bn=e=>new Promise(t=>setTimeout(t,e));var xn=class{#e;#t;#n;#r;#i;constructor({cache:e,credentialService:t,delegationService:n,router:r,emitEvent:i}){this.#e=e,this.#t=t,this.#n=n,this.#r=r,this.#i=i}async decryptValues(e,t,n){let r=F(t);return this.#s(e,{requesterAddress:r,aclActorAddress:r,resolveCredentials:e=>this.#t.grantPermit(e),decryptContract:({credentials:e,contractAddress:t,encryptedValues:n,options:r})=>this.#o(e,t,n,r),errorMessage:`Failed to decrypt encrypted values`},n)}async delegatedDecryptValues(e,t,n,r,i){let a=F(t),o=F(n);return this.#a(i?.waitForPropagation??!0,()=>this.#s(e,{requesterAddress:F(r),aclActorAddress:a,resolveCredentials:e=>this.#t.grantPermit(e,a),validate:e=>this.#f(e,{delegatorAddress:a,delegateAddress:o}),decryptContract:({credentials:e,contractAddress:t,encryptedValues:n,options:r})=>this.#o(e,t,n,r),errorMessage:`Failed to decrypt delegated encrypted values`,delegated:!0}))}async#a(e,t){let n;for(let r=0;r<16;r++)try{return await t()}catch(t){if(n=t,!(r<15&&e&&t instanceof U))throw t;await bn(2e3)}throw n}async delegatedBatchDecryptHandlesAs({encryptedInputs:e,delegatorAddress:t,delegateAddress:n,accountAddress:r,maxConcurrency:i=5,waitForPropagation:a=!0}){let o=e.map(e=>({encryptedValue:e.encryptedValue,contractAddress:F(e.contractAddress)}));if(o.length===0)return{items:o};let s=F(r);try{let e=await this.delegatedDecryptValues(o.map(({encryptedValue:e,contractAddress:t})=>({encryptedValue:e,contractAddress:t})),t,n,s,{waitForPropagation:a});for(let t of o)this.#l(t,e);return{items:o}}catch(e){if(Be(e))throw e;if(o.length===1){let[n=this.#d()]=o;return n.error=this.#u(e,`Failed to decrypt delegated encrypted values`,{isDelegated:!0,contractAddress:n.contractAddress,account:F(t)}),{items:o}}}let c=!1;return await We(o.map(e=>async()=>{if(!c)try{let r=await this.delegatedDecryptValues([{encryptedValue:e.encryptedValue,contractAddress:e.contractAddress}],t,n,s,{waitForPropagation:!1});this.#l(e,r)}catch(n){if(Be(n))throw c=!0,n;e.error=this.#u(n,`Failed to decrypt delegated encrypted values`,{isDelegated:!0,contractAddress:e.contractAddress,account:F(t)})}}),i),{items:o}}async#o(e,t,n,i){let a=vn(e,t),o;try{o=await this.#r.relayer.parseTransportKeyPair({publicKey:a.publicKey,privateKey:a.privateKey,tkmsVersion:e.keypair.tkmsVersion})}catch(e){throw e instanceof Error&&r(e.message)&&await this.#t.evictTransportKeyPair(),e}let s=await this.#r.relayer.parseSignedDecryptionPermit({transportKeyPair:o,serializedPermit:a.serializedPermit});return this.#r.relayer.decryptValues({transportKeyPair:o,signedPermit:s,encryptedValues:n,contractAddress:t,options:i})}async#s(t,n,r){if(t.length===0)return{};let i=t.map(e=>({encryptedValue:e.encryptedValue,contractAddress:F(e.contractAddress)})),a={},s=[];for(let e of i)Le(e.encryptedValue)?a[e.encryptedValue]=0n:s.push(e);if(s.length===0)return a;let c=Array.from(new Set(i.map(e=>e.contractAddress))),l=Array.from(new Set(s.map(e=>e.contractAddress)));if(n.validate)try{await n.validate(l)}catch(e){throw o(e)?this.#c(e,`the delegation pre-check`):e}let u=[];for(let e of s){let t=await this.#e.get(n.requesterAddress,e.contractAddress,e.encryptedValue);t===null?u.push(e):a[e.encryptedValue]=t}if(u.length===0)return a;let d=await n.resolveCredentials(c),f=new Map;for(let e of u){let t=f.get(e.contractAddress);t?t.push(e.encryptedValue):f.set(e.contractAddress,[e.encryptedValue])}let m=[];for(let[e,t]of f)for(let n of Ge(t))m.push({contractAddress:e,encryptedValues:n});let h=Date.now(),g=u.map(e=>e.encryptedValue);try{this.#i({type:S.DecryptStart,encryptedValues:g}),await We(m.map(({contractAddress:e,encryptedValues:t})=>async()=>{let i;try{i=await n.decryptContract({credentials:d,contractAddress:e,encryptedValues:t,options:r})}catch(t){throw W(t,n.errorMessage,{isDelegated:n.delegated,contractAddress:e,account:n.aclActorAddress})}for(let r=0;r<t.length;r++){let o=t[r],s=i[r]?.value;o!==void 0&&s!==void 0&&(a[o]=s,await this.#e.set(n.requesterAddress,e,o,s))}let o=t.filter(e=>a[e]===void 0);if(o.length>0)throw new E(`${n.errorMessage}: relayer returned no clear value for ${o.length} of ${t.length} handle(s) on ${e}`,{cause:AggregateError(o.map(t=>new E(`No clear value for handle ${t} on ${e}`)),`${o.length} handle(s) missing a clear value on ${e}`)})}),5);let e={};for(let t of g){let n=a[t];n!==void 0&&(e[t]=n)}return this.#i({type:S.DecryptEnd,durationMs:Date.now()-h,encryptedValues:g,result:e}),a}catch(t){let r=t instanceof p&&t.cause instanceof Error?t.cause:t;throw this.#i({type:S.DecryptError,error:e(r),durationMs:Date.now()-h,encryptedValues:g}),W(t,n.errorMessage,{isDelegated:n.delegated})}}#c(e,t){return new O(`RPC provider rate-limited ${t}; retry with backoff.`,{cause:e,retryAfter:n(e)})}#l(e,t){let n=t[e.encryptedValue];if(n===void 0){e.error=new E(`Batch delegated decryption returned no value for encrypted value ${e.encryptedValue} on contract ${e.contractAddress}`);return}e.value=n}#u(e,t,n){return e instanceof p?e:W(e,t,n)}#d(){throw new E(`Batch delegated decryption invariant failed: missing item`)}async#f(e,{delegatorAddress:t,delegateAddress:n}){let r=await this.#n.findInactiveDelegations(e,t,n);if(r.size!==0)for(let e of r.values())throw e}};function Sn(e){if(!(e instanceof Error))return null;let t=e.cause;if(typeof t!=`object`||!t||!(`data`in t))return null;let{data:n}=t;return typeof n!=`object`||!n||!(`errorName`in n)?null:typeof n.errorName==`string`?n.errorName:null}const Cn={AlreadyDelegatedOrRevokedInSameBlock:e=>new Ct(`Only one delegate/revoke per (delegator, delegate, contract) per block. Wait for the next block before retrying.`,{cause:e}),SenderCannotBeContractAddress:e=>new Tt(`The contract address cannot be the caller address.`,{cause:e}),EnforcedPause:e=>new Et(`The ACL contract is paused. Delegation operations are temporarily disabled.`,{cause:e}),SenderCannotBeDelegate:e=>new R(`Cannot delegate to yourself (delegate === msg.sender).`,{cause:e}),DelegateCannotBeContractAddress:e=>new V(`Delegate address cannot be the same as the contract address.`,{cause:e}),ExpirationDateBeforeOneHour:e=>new H(`Expiration date must be at least 1 hour in the future.`,{cause:e}),ExpirationDateAlreadySetToSameValue:e=>new B(`The new expiration date is the same as the current one.`,{cause:e}),NotDelegatedYet:e=>new z(`Cannot revoke: no active delegation exists.`,{cause:e})};function wn(e){return e in Cn}function Tn(e,t){let n=Sn(e);if(n&&wn(n))return Cn[n](t);let r=e instanceof Error?e.message:String(e);for(let[e,n]of Object.entries(Cn))if(r.includes(e))return n(t);return null}var En=class{#e;#t;#n;#r;constructor({provider:e,router:t,emitEvent:n=()=>{},logger:r}){this.#t=e,this.#e=t,this.#r=r,this.#n=n}async delegateDecryption(e,{contractAddress:t,delegateAddress:n,delegatorAddress:r,expirationDate:i}){if(i&&i.getTime()<Date.now()+36e5)throw new H(`Expiration date must be at least 1 hour in the future`);let a=F(t),o=F(n),s=F(r);if(o===s)throw new R(`Cannot delegate to yourself (delegate === msg.sender).`);if(o===a)throw new V(`Delegate address cannot be the same as the contract address (${a}).`);let c=this.#e.relayer.chain.aclContractAddress,l=i?BigInt(Math.floor(i.getTime()/1e3)):Nt,u;try{u=await this.getDelegationExpiry({contractAddress:a,delegatorAddress:s,delegateAddress:o})}catch(e){this.#r.warn(`delegateDecryption: pre-flight expiry check failed`,{error:e}),u=-1n}if(u===l)throw new B(`The new expiration date (${l}) is the same as the current one. No on-chain change needed.`);return this.#i({operation:`delegateDecryption`,signer:e,contractAddress:a,config:q(c,o,a,l)})}async revokeDelegation(e,{contractAddress:t,delegateAddress:n,delegatorAddress:r}){let i=F(t),a=F(n),o=F(r),s=this.#e.relayer.chain.aclContractAddress,c;try{c=await this.getDelegationExpiry({contractAddress:i,delegatorAddress:o,delegateAddress:a})}catch(e){this.#r.warn(`revokeDelegation: pre-flight expiry check failed`,{error:e}),c=1n}if(c===0n)throw new z(`No active delegation found for delegate ${a} on contract ${i}.`);return this.#i({operation:`revokeDelegation`,signer:e,contractAddress:i,config:At(s,a,i)})}async isDelegated(e){return(await this.getStatus(e)).isActive}async getStatus(e){let t=await this.getDelegationExpiry(e);return t===0n?{isActive:!1,expiryTimestamp:t}:t===Nt?{isActive:!0,expiryTimestamp:t}:{isActive:t>await this.#t.getBlockTimestamp(),expiryTimestamp:t}}async getDelegationExpiry({contractAddress:e,delegatorAddress:t,delegateAddress:n}){let r=this.#e.relayer.chain.aclContractAddress;return this.#t.readContract(jt(r,F(t),F(n),F(e)))}async#i({operation:e,signer:t,contractAddress:n,config:r}){try{return await Ve({operation:e,signer:t,provider:this.#t,config:r,emit:e=>this.#n(e,n),logger:this.#r})}catch(e){throw this.#a(e),e}}#a(e){if(!(e instanceof _))return;let t=Tn(e.cause??e,e);if(t)throw t}async findInactiveDelegations(e,t,n){let r=new Map;return await Promise.all(e.map(async e=>{try{await this.assertDelegationActive(e,t,n)}catch(t){if(t instanceof z||t instanceof wt){let n=F(e);r.set(n,t);return}throw t}})),r}async assertDelegationActive(e,t,n){let r=F(e),i=F(t),a=F(n),{isActive:o,expiryTimestamp:s}=await this.getStatus({contractAddress:r,delegatorAddress:i,delegateAddress:a});if(!o)throw s===0n?new z(`No active delegation from ${i} to ${a} for ${r}`):new wt(`Delegation from ${i} to ${a} for ${r} has expired`)}},Dn=class{#e;#t;constructor({router:e,emitEvent:t}){this.#e=e,this.#t=t}async encryptValues(t,n){let r=Date.now(),i=F(t.contractAddress);try{this.#t({type:S.EncryptStart},i);let e=await this.#e.relayer.encryptValues({...t,options:n});return this.#t({type:S.EncryptEnd,durationMs:Date.now()-r},i),e}catch(t){throw this.#t({type:S.EncryptError,error:e(t),durationMs:Date.now()-r},i),Ot(t,`Encryption failed`)}}},On=class{#e;#t;#n;#r;#i;#a=new Set;#o;constructor(e){this.#e=e.signer,this.#t=e.router,this.#n=e.cachingService,this.#r=e.credentialService,this.#i=e.logger,this.#e&&(this.#o=this.#e.walletAccount.subscribe(e=>{this.#s(e).catch(e=>{this.#i.warn(`wallet account handler failed`,{error:e})})}))}onWalletAccountChange(e){return this.#a.add(e),()=>{this.#a.delete(e)}}dispose(){this.#o?.(),this.#o=void 0,this.#a.clear()}async#s(e){let t=e.previous,n=e.next,r=n?.chainId;r!==void 0&&await T(`switch relayer chain`,()=>this.#t.switchChain(r),this.#i);let i=this.#r;i&&await T(`credential wallet account change`,()=>i.handleWalletAccountChange(t,n),this.#i),t&&await T(`clear decrypt cache`,()=>this.#n.clearForRequester(t.address),this.#i),await Promise.all(Array.from(this.#a,t=>T(`wallet account listener`,()=>t(e),this.#i)))}};const kn=I.object({kind:I.literal(`ConfidentialTransfer`),from:P,token:P,to:P,amount:I.bigint()}),An=I.object({kind:I.literal(`ConfidentialTransferFrom`),from:P,token:P,owner:P,to:P,amount:I.bigint()}),jn=I.object({kind:I.literal(`SetOperator`),from:P,token:P,operator:P,until:Ze}),Mn=I.object({kind:I.literal(`Unwrap`),from:P,token:P,to:P,amount:I.bigint()}),Nn=I.object({kind:I.literal(`UnwrapAll`),from:P,token:P,to:P}),Pn=I.object({kind:I.literal(`FinalizeUnwrap`),from:P,wrapper:P,unwrapRequestIdOrAmount:M}),Fn=I.object({kind:I.literal(`ApproveUnderlying`),from:P,underlying:P,spender:P,amount:I.bigint()}),In=I.object({kind:I.literal(`Wrap`),from:P,wrapper:P,to:P,amount:I.bigint()}),Ln=M.check(I.refine(e=>e===`0x`||bt(e)===20,`TransferAndCall.recipientData must be "0x" (self-shield to the sender) or a raw 20-byte address, not a 32-byte ABI-encoded value the wrapper would truncate to a garbage address`)),Rn=I.object({kind:I.literal(`TransferAndCall`),from:P,underlying:P,wrapper:P,amount:I.bigint(),recipientData:I.optional(Ln)}),zn=I.object({kind:I.literal(`DelegateDecryption`),from:P,contractAddress:P,delegateAddress:P,expirationDate:I.optional(I.date())}),Bn=I.object({kind:I.literal(`RevokeDelegation`),from:P,contractAddress:P,delegateAddress:P});I.discriminatedUnion(`kind`,[kn,An,jn,Mn,Nn,Pn,Fn,In,Rn,zn,Bn]);const Vn=I.strictObject({maxFeePerGas:I.bigint(),maxPriorityFeePerGas:I.bigint()}),Hn=I.object({nonce:I.optional(I.int().check(I.nonnegative())),gasLimit:I.optional(I.bigint()),fees:I.optional(Vn)}),Un=I.object({address:P,abi:I.array(I.unknown()),functionName:I.string(),args:I.array(I.unknown()),value:I.optional(I.bigint()),gas:I.optional(I.bigint())}),Wn=I.extend(Hn,{from:P,calldata:Un});var Gn=class{#e;#t;#n;constructor(e){this.#e=e.provider,this.#t=e.router,this.#n=e.encryption}async prepare(e,t){t&&=N(Hn,t);let n=await this.#e.getChainId(),r=this.#t.chain.id;if(n!==r)throw new h(`Offline.prepare: provider is on chain ${n} but the SDK is configured for chain ${r}. The prepared transaction's contract addresses and encrypted inputs are bound to chain ${r} — point the provider at the same chain.`);let i=N(Wn,{calldata:await this.#r(e),from:e.from,nonce:t?.nonce,gasLimit:t?.gasLimit,fees:t?.fees}),a=await this.#e.prepareTransaction(i);return{kind:e.kind,unsignedTx:a,from:i.from}}async#r(e){switch(e.kind){case`ConfidentialTransfer`:return this.#i(e);case`ConfidentialTransferFrom`:return this.#a(e);case`SetOperator`:return this.#o(e);case`Unwrap`:return this.#s(e);case`UnwrapAll`:return this.#c(e);case`FinalizeUnwrap`:return this.#l(e);case`ApproveUnderlying`:return this.#u(e);case`Wrap`:return this.#d(e);case`TransferAndCall`:return this.#f(e);case`DelegateDecryption`:return this.#p(e);case`RevokeDelegation`:return this.#m(e);default:throw new h(`OfflineService.prepare: unsupported transaction kind '${e.kind}'.`)}}async#i(e){e=N(kn,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from}),r=t[0];if(!r)throw new j(`Encryption returned no handles for ConfidentialTransfer`);return ne(e.token,e.to,r,n)}async#a(e){e=N(An,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from}),r=t[0];if(!r)throw new j(`Encryption returned no handles for ConfidentialTransferFrom`);return Ee(e.token,e.owner,e.to,r,n)}#o(e){return e=N(jn,e),ce(e.token,e.operator,e.until)}async#s(e){e=N(Mn,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from}),r=t[0];if(!r)throw new j(`Encryption returned no handles for Unwrap`);return v(e.token,e.from,e.to,r,n)}async#c(e){e=N(Nn,e);let t=await this.#e.readContract(Fe(e.token,e.from));return y(e.token,e.from,e.to,t)}async#l(e){e=N(Pn,e);let t=await this.#t.relayer.decryptPublicValuesWithSignatures({encryptedValues:[e.unwrapRequestIdOrAmount]}).catch(e=>{throw W(e,`Public decryption failed during FinalizeUnwrap`)}),n=t.clearValues[0]?.value;return vt(n,`FinalizeUnwrap: decryptPublicValuesWithSignatures(handle).clearValue`),g(e.wrapper,e.unwrapRequestIdOrAmount,n,t.checkSignaturesArgs.decryptionProof)}#u(e){return e=N(Fn,e),C(e.underlying,e.spender,e.amount)}#d(e){return e=N(In,e),b(e.wrapper,e.to,e.amount)}#f(e){return e=N(Rn,e),G(e.underlying,e.wrapper,e.amount,e.recipientData)}#p(e){if(e=N(zn,e),e.expirationDate&&e.expirationDate.getTime()<Date.now()+36e5)throw new H(`Expiration date must be at least 1 hour in the future`);if(e.delegateAddress===e.from)throw new R(`Cannot delegate to yourself (delegate === msg.sender).`);if(e.delegateAddress===e.contractAddress)throw new V(`Delegate address cannot be the same as the contract address (${e.contractAddress}).`);let t=e.expirationDate?BigInt(Math.floor(e.expirationDate.getTime()/1e3)):Nt;return q(this.#t.chain.aclContractAddress,e.delegateAddress,e.contractAddress,t)}#m(e){return e=N(Bn,e),At(this.#t.chain.aclContractAddress,e.delegateAddress,e.contractAddress)}},Kn=class{#e;provider;signer;storage;registry;permits;delegations;decryption;offline;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;constructor(e){this.#e=e.router,this.provider=e.provider,this.signer=e.signer,this.storage=e.storage,this.#r=e.onEvent??function(){},this.#i=e.logger,this.#a=new _n(e.storage,this.#i),this.#u=new En({provider:this.provider,router:e.router,emitEvent:this.emitEvent.bind(this),logger:this.#i});let t={};for(let n of e.chains)n.registryAddress&&(t[n.id]=n.registryAddress);this.registry=new it({provider:this.provider,registryAddresses:t,registryTTL:e.registryTTL}),this.#n=t,this.#t=e.registryTTL,this.#l=new Xe({router:e.router,signer:e.signer,transportKeyPairTTL:e.transportKeyPairTTL,permitTTL:e.permitTTL,scope:e.transportKeyPairScope,storage:this.storage,permitStorage:e.permitStorage,logger:this.#i}),e.signer&&(this.#c=new xn({cache:this.#a,credentialService:this.#l,delegationService:this.#u,router:e.router,emitEvent:this.emitEvent.bind(this)})),this.#s=new Dn({router:e.router,emitEvent:this.emitEvent.bind(this)}),this.#o=new On({signer:e.signer,router:e.router,cachingService:this.#a,credentialService:this.#l,logger:this.#i}),this.#d=new Gn({provider:this.provider,router:e.router,encryption:this.#s,emitEvent:(e,t)=>this.emitEvent(e,t)}),this.permits=new nn({signer:this.signer,provider:this.provider,cachingService:this.#a,credentialService:this.#l,logger:this.#i}),this.delegations=new rn({signer:this.signer,provider:this.provider,delegationService:this.#u}),this.decryption=new an({signer:this.signer,provider:this.provider,router:e.router,decryptionService:this.#c}),this.offline=new on(this.#d)}onWalletAccountChange(e){return this.#o.onWalletAccountChange(e)}get logger(){return this.#i}get relayer(){return this.#e.relayer}emitEvent(e,t){try{this.#r({...e,tokenAddress:t,timestamp:Date.now()})}catch(t){this.#i.warn(`${e.type} event listener silently failed`,{error:t})}}createWrappersRegistry(e){return new it({provider:this.provider,registryAddresses:{...this.#n,...e},registryTTL:this.#t})}async encrypt(e,t){return this.#s.encryptValues(e,t)}createToken(e){return new Ke(this,e)}createWrappedToken(e){return new mn(this,e)}dispose(){this.#o.dispose()}terminate(){this.dispose(),this.signer?.dispose?.()}[Symbol.dispose](){this.terminate()}};export{tn as ACL_TOPICS,Et as AclPausedError,Q as AclTopics,qe as BalanceCheckUnavailableError,st as BaseSigner,ze as ChainMismatchError,sn as ChromeSessionStorage,h as ConfigurationError,an as Decryption,E as DecryptionFailedError,Ye as DefaultRegistryAddresses,Tt as DelegationContractIsSelfError,Ct as DelegationCooldownError,V as DelegationDelegateEqualsContractError,H as DelegationExpirationTooSoonError,wt as DelegationExpiredError,B as DelegationExpiryUnchangedError,z as DelegationNotFoundError,U as DelegationNotPropagatedError,R as DelegationSelfNotAllowedError,rn as Delegations,Pe as ERC1363_INTERFACE_ID,D as ERC20ReadFailedError,be as ERC7984_INTERFACE_ID,xe as ERC7984_WRAPPER_INTERFACE_ID,j as EncryptionFailedError,$e as IndexedDBStorage,Re as InsufficientAllowanceError,Ue as InsufficientConfidentialBalanceError,A as InsufficientERC20BalanceError,he as InvalidTransportKeyPairError,at as MemoryStorage,rt as MutableWalletAccountStore,me as NoCiphertextError,L as NotEntitledError,on as Offline,nn as Permits,u as RelayerRequestFailedError,O as RpcRateLimitError,ee as SignerNotConfiguredError,fe as SignerRequiredError,ae as SigningFailedError,je as SigningRejectedError,Jt as TOKEN_TOPICS,Ke as Token,Y as Topics,_ as TransactionRevertedError,ge as TransportKeyPairExpiredError,ie as WalletAccountNotReadyError,de as WalletNotConnectedError,mn as WrappedToken,it as WrappersRegistry,He as ZERO_ENCRYPTED_VALUE,p as ZamaError,s as ZamaErrorCode,Kn as ZamaSDK,S as ZamaSDKEvents,x as allowanceContract,gt as anvil,C as approveContract,w as balanceOfContract,ft as bscTestnet,mt as chains,cn as chromeSessionStorage,Je as cleartext,Fe as confidentialBalanceOfContract,ue as confidentialTotalSupplyContract,ne as confidentialTransferContract,Ee as confidentialTransferFromContract,Pt as createConfig,ot as createWalletAccountStore,ve as decimalsContract,Zt as decodeAclEvent,Qt as decodeAclEvents,Bt as decodeConfidentialTransfer,Yt as decodeDelegatedForUserDecryption,Wt as decodeOnChainEvent,Gt as decodeOnChainEvents,Xt as decodeRevokedDelegationForUserDecryption,Ut as decodeUnwrapFinalized,Ht as decodeUnwrapRequested,Vt as decodeWrap,q as delegateForUserDecryptionContract,g as finalizeUnwrapContract,$t as findDelegatedForUserDecryption,en as findRevokedDelegationForUserDecryption,Kt as findUnwrapRequested,qt as findWrap,Me as getConfidentialTokenAddressContract,jt as getDelegationExpiryContract,we as getTokenAddressContract,_e as getTokenPairContract,ke as getTokenPairsContract,Ne as getTokenPairsLengthContract,ye as getTokenPairsSliceContract,ut as hardhat,ct as hoodi,Qe as indexedDBStorage,Te as inferredTotalSupplyContract,pt as ingenTestnet,Ae as isConfidentialTokenContract,De as isConfidentialTokenValidContract,Oe as isConfidentialWrapperContract,Le as isEncryptedValueZero,Mt as isHandleDelegatedContract,oe as isOperatorContract,t as isRetryable,ht as mainnet,St as matchZamaError,nt as memoryStorage,le as nameContract,lt as polygonAmoy,se as rateContract,d as retryAfterSeconds,At as revokeDelegationContract,dt as sepolia,ce as setOperatorContract,Se as supportsInterfaceContract,te as symbolContract,G as transferAndCallContract,re as underlyingContract,v as unwrapContract,y as unwrapFromBalanceContract,b as wrapContract};
1
+ import{_ as e,a as t,c as n,d as r,f as i,g as a,h as o,i as s,l as c,m as l,n as u,o as d,p as f,r as p,s as m,t as h}from"./relayer-BWHOLVcG.js";import{A as g,B as ee,C as te,D as ne,F as re,G as _,H as ie,I as v,K as ae,L as y,M as oe,N as se,P as ce,R as b,S as le,T as ue,U as de,V as fe,W as pe,X as me,Y as he,Z as ge,_ as x,a as _e,b as ve,c as ye,d as be,f as xe,g as Se,h as Ce,i as we,j as Te,k as Ee,l as De,m as Oe,o as ke,p as Ae,q as je,r as Me,s as Ne,t as S,u as Pe,v as C,w as Fe,y as w,z as T}from"./sdk-events-DI-bw_nW.js";import{_ as E,a as Ie,c as Le,d as D,f as Re,g as O,h as ze,i as k,l as Be,m as A,n as Ve,o as He,p as Ue,r as We,s as Ge,t as Ke,u as qe,v as j}from"./token-BStJgk0D.js";import{t as Je}from"./cleartext-Qqh5JohW.js";import{a as Ye,c as Xe,d as M,f as Ze,g as Qe,h as $e,i as et,l as tt,m as nt,n as rt,o as it,p as at,r as ot,s as N,t as st,u as P}from"./base-signer-BniXgTt5.js";import{a as ct,c as lt,i as ut,l as dt,n as ft,o as pt,r as mt,s as ht,t as gt}from"./chains-DkH7vYTf.js";import{r as _t,t as vt}from"./assertions-Ca1ePdRJ.js";import{getAddress as F,keccak256 as yt,size as bt,toBytes as xt}from"viem";import{z as I}from"zod/mini";function St(e,t){if(e instanceof p){let n=t[e.code];if(n)return n(e)}return t._?.(e)}var L=class extends p{encryptedValue;contractAddress;account;constructor(e,t){super(s.NotEntitled,`Account ${e.account} is not entitled to decrypt encrypted value ${e.encryptedValue} on contract ${e.contractAddress}. This is not a transient failure — the account needs an on-chain ACL grant before it can decrypt this encrypted value.`,t),this.name=`NotEntitledError`,this.encryptedValue=e.encryptedValue,this.contractAddress=e.contractAddress,this.account=e.account}},R=class extends p{constructor(e,t){super(s.DelegationSelfNotAllowed,e,t),this.name=`DelegationSelfNotAllowedError`}},Ct=class extends p{constructor(e,t){super(s.DelegationCooldown,e,t),this.name=`DelegationCooldownError`}},z=class extends p{constructor(e,t){super(s.DelegationNotFound,e,t),this.name=`DelegationNotFoundError`}},wt=class extends p{constructor(e,t){super(s.DelegationExpired,e,t),this.name=`DelegationExpiredError`}},B=class extends p{constructor(e,t){super(s.DelegationExpiryUnchanged,e,t),this.name=`DelegationExpiryUnchangedError`}},V=class extends p{constructor(e,t){super(s.DelegationDelegateEqualsContract,e,t),this.name=`DelegationDelegateEqualsContractError`}},Tt=class extends p{constructor(e,t){super(s.DelegationContractIsSelf,e,t),this.name=`DelegationContractIsSelfError`}},Et=class extends p{constructor(e,t){super(s.AclPaused,e,t),this.name=`AclPausedError`}},H=class extends p{constructor(e,t){super(s.DelegationExpirationTooSoon,e,t),this.name=`DelegationExpirationTooSoonError`}},U=class extends p{constructor(e,t){super(s.DelegationNotPropagated,e,t),this.name=`DelegationNotPropagatedError`}};const Dt=[E,me,u,U,je,ae,L,O,he];function W(e,t,s={}){if(Dt.some(t=>e instanceof t))return e;let d=e instanceof Error?e.message:t;if(e instanceof Error&&r(e.message))return new he(e.message,{cause:e});if(e instanceof Error&&i(e.message))return s.isDelegated?new U(`Delegated decryption was denied by the on-chain ACL check. This is most commonly caused by the delegation not having propagated yet, or by the RPC node serving a stale block. Propagation usually completes within ~10 blocks (a few seconds) and the SDK retries across that window; seeing this means it did not sync in time. Retry shortly (and prefer a fresh, low-lag RPC endpoint). If it persists, the delegator may genuinely lack the on-chain ACL grant.`,{cause:e}):new L({encryptedValue:a(e.message)??``,contractAddress:s.contractAddress??``,account:s.account??``},{cause:e});if(c(e))return new O(d,{cause:e,retryAfter:n(e)});let p=m(e);return p===void 0&&o(e)?new O(d,{cause:e,retryAfter:n(e)}):p===400?new me(e instanceof Error?e.message:`No ciphertext for this account`,{cause:e}):s.isDelegated&&p===500?new U(`Delegated decryption failed with a server error. This is most commonly caused by the delegation not having propagated to the gateway yet. Cross-chain sync usually completes within ~10 blocks (a few seconds) and the SDK retries across that window; seeing this means it did not sync in time — retry shortly. If the error persists, the gateway or relayer may be experiencing an unrelated issue.`,{cause:e}):f(e)||p!==void 0?new u(d,p,{cause:e,retryAfter:n(e),retryable:l(e)||void 0}):new E(t,{cause:e})}function Ot(e,t){if(e instanceof p)return e;let r=m(e),i=l(e);return r!==void 0||f(e)?new u(e instanceof Error?e.message:t,r,{cause:e,retryAfter:n(e),retryable:i||void 0}):new j(t,{cause:e})}const kt=[{type:`function`,name:`allowance`,inputs:[{name:`owner`,type:`address`,internalType:`address`},{name:`spender`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`approve`,inputs:[{name:`spender`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`approveAndCall`,inputs:[{name:`spender`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`approveAndCall`,inputs:[{name:`spender`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`},{name:`data`,type:`bytes`,internalType:`bytes`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`balanceOf`,inputs:[{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`supportsInterface`,inputs:[{name:`interfaceId`,type:`bytes4`,internalType:`bytes4`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`totalSupply`,inputs:[],outputs:[{name:``,type:`uint256`,internalType:`uint256`}],stateMutability:`view`},{type:`function`,name:`transfer`,inputs:[{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferAndCall`,inputs:[{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferAndCall`,inputs:[{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`},{name:`data`,type:`bytes`,internalType:`bytes`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferFrom`,inputs:[{name:`from`,type:`address`,internalType:`address`},{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferFromAndCall`,inputs:[{name:`from`,type:`address`,internalType:`address`},{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`},{name:`data`,type:`bytes`,internalType:`bytes`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`function`,name:`transferFromAndCall`,inputs:[{name:`from`,type:`address`,internalType:`address`},{name:`to`,type:`address`,internalType:`address`},{name:`value`,type:`uint256`,internalType:`uint256`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`nonpayable`},{type:`event`,name:`Approval`,inputs:[{name:`owner`,type:`address`,indexed:!0,internalType:`address`},{name:`spender`,type:`address`,indexed:!0,internalType:`address`},{name:`value`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`Transfer`,inputs:[{name:`from`,type:`address`,indexed:!0,internalType:`address`},{name:`to`,type:`address`,indexed:!0,internalType:`address`},{name:`value`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1}];function G(e,t,n,r=`0x`){return{address:e,abi:kt,functionName:`transferAndCall`,args:[t,n,r]}}const K=[{type:`function`,name:`allow`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`allowForDecryption`,inputs:[{name:`handlesList`,type:`bytes32[]`,internalType:`bytes32[]`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`allowTransient`,inputs:[{name:`ciphertext`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`cleanTransientStorage`,inputs:[],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`delegateForUserDecryption`,inputs:[{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`},{name:`expirationDate`,type:`uint64`,internalType:`uint64`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`getUserDecryptionDelegationExpirationDate`,inputs:[{name:`delegator`,type:`address`,internalType:`address`},{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`uint64`,internalType:`uint64`}],stateMutability:`view`},{type:`function`,name:`isAccountDenied`,inputs:[{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isAllowed`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isAllowedForDecryption`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`isHandleDelegatedForUserDecryption`,inputs:[{name:`delegator`,type:`address`,internalType:`address`},{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`},{name:`handle`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`multicall`,inputs:[{name:`data`,type:`bytes[]`,internalType:`bytes[]`}],outputs:[{name:`results`,type:`bytes[]`,internalType:`bytes[]`}],stateMutability:`payable`},{type:`function`,name:`persistAllowed`,inputs:[{name:`handle`,type:`bytes32`,internalType:`bytes32`},{name:`account`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bool`,internalType:`bool`}],stateMutability:`view`},{type:`function`,name:`revokeDelegationForUserDecryption`,inputs:[{name:`delegate`,type:`address`,internalType:`address`},{name:`contractAddress`,type:`address`,internalType:`address`}],outputs:[],stateMutability:`nonpayable`}];function q(e,t,n,r){return{address:e,abi:K,functionName:`delegateForUserDecryption`,args:[t,n,r]}}function At(e,t,n){return{address:e,abi:K,functionName:`revokeDelegationForUserDecryption`,args:[t,n]}}function jt(e,t,n,r){return{address:e,abi:K,functionName:`getUserDecryptionDelegationExpirationDate`,args:[t,n,r]}}function Mt(e,t,n,r,i){return{address:e,abi:K,functionName:`isHandleDelegatedForUserDecryption`,args:[t,n,r,i]}}const Nt=2n**64n-1n;function Pt(e){return et(e.signer,e.provider,e)}function Ft(e){return e.startsWith(`0x`)?e:`0x${e}`}function J(e){return yt(xt(e))}const Y={ConfidentialTransfer:J(`ConfidentialTransfer(address,address,bytes32)`),Wrap:J(`Wrap(address,uint256,bytes32)`),UnwrapRequested:J(`UnwrapRequested(address,bytes32,bytes32)`),UnwrapFinalized:J(`UnwrapFinalized(address,bytes32,bytes32,uint64)`)};function X(e){return F(Ft(e.slice(-40)))}function It(e){return e}function Lt(e,t){let n=2+t*64,r=e.slice(n,n+64);return r.length===64?r:r.padEnd(64,`0`)}function Rt(e,t){return F(Ft(Lt(e,t).slice(-40)))}function Z(e,t){return BigInt(`0x`+Lt(e,t))}function zt(e,t){return Ft(Lt(e,t))}function Bt(e){return e.topics[0]!==Y.ConfidentialTransfer||e.topics.length<4?null:{eventName:`ConfidentialTransfer`,from:X(e.topics[1]),to:X(e.topics[2]),encryptedAmount:It(e.topics[3])}}function Vt(e){return e.topics[0]!==Y.Wrap||e.topics.length<2?null:{eventName:`Wrap`,to:X(e.topics[1]),roundedAmount:Z(e.data,0),encryptedWrappedAmount:zt(e.data,1)}}function Ht(e){return e.topics[0]!==Y.UnwrapRequested||e.topics.length<3?null:{eventName:`UnwrapRequested`,receiver:X(e.topics[1]),unwrapRequestId:It(e.topics[2]),encryptedAmount:zt(e.data,0)}}function Ut(e){return e.topics[0]!==Y.UnwrapFinalized||e.topics.length<3?null:{eventName:`UnwrapFinalized`,receiver:X(e.topics[1]),unwrapRequestId:It(e.topics[2]),encryptedAmount:zt(e.data,0),cleartextAmount:Z(e.data,1)}}function Wt(e){return Bt(e)??Vt(e)??Ht(e)??Ut(e)}function Gt(e){let t=[];for(let n of e){let e=Wt(n);e&&t.push(e)}return t}function Kt(e){for(let t of e){let e=Ht(t);if(e)return e}return null}function qt(e){for(let t of e){let e=Vt(t);if(e)return e}return null}const Jt=[Y.ConfidentialTransfer,Y.Wrap,Y.UnwrapRequested,Y.UnwrapFinalized],Q={DelegatedForUserDecryption:J(`DelegatedForUserDecryption(address,address,address,uint64,uint64,uint64)`),RevokedDelegationForUserDecryption:J(`RevokedDelegationForUserDecryption(address,address,address,uint64,uint64)`)};function Yt(e){return e.topics[0]!==Q.DelegatedForUserDecryption||e.topics.length<3?null:{eventName:`DelegatedForUserDecryption`,delegator:X(e.topics[1]),delegate:X(e.topics[2]),contractAddress:Rt(e.data,0),delegationCounter:Z(e.data,1),oldExpirationDate:Z(e.data,2),newExpirationDate:Z(e.data,3)}}function Xt(e){return e.topics[0]!==Q.RevokedDelegationForUserDecryption||e.topics.length<3?null:{eventName:`RevokedDelegationForUserDecryption`,delegator:X(e.topics[1]),delegate:X(e.topics[2]),contractAddress:Rt(e.data,0),delegationCounter:Z(e.data,1),oldExpirationDate:Z(e.data,2)}}function Zt(e){return Yt(e)??Xt(e)}function Qt(e){let t=[];for(let n of e){let e=Zt(n);e&&t.push(e)}return t}function $t(e){for(let t of e){let e=Yt(t);if(e)return e}return null}function en(e){for(let t of e){let e=Xt(t);if(e)return e}return null}const tn=[Q.DelegatedForUserDecryption,Q.RevokedDelegationForUserDecryption];var nn=class{#e;#t;#n;#r;#i;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.cachingService,this.#r=e.credentialService,this.#i=e.logger}#a(e){return pe(this.#r,e)}async grantPermit(e){if(e.length===0)return;let t=this.#a(`grantPermit`);await Ie(`grantPermit`,this.#e,this.#t),await t.grantPermit(e)}async grantDelegationPermit(e,t){if(t.length===0)return;let n=this.#a(`grantDelegationPermit`);await Ie(`grantDelegationPermit`,this.#e,this.#t),await n.grantPermit(t,e)}async hasPermit(e){return this.#r?this.#r.hasPermit(e):!1}async hasDelegationPermit(e,t){return this.#r?this.#r.hasPermit(t,e):!1}async warmTransportKeyPair(){let e=this.#r;if(!e)return;let t=this.#e?.walletAccount.getSnapshot();t&&await e.warmTransportKeyPair(t.address)}async revokePermits(e){let t=this.#a(`revokePermits`),n=F((await k(`revokePermits`,this.#e,this.#t)).address);try{await t.revokePermits(e)}finally{await this.#o(n)}}async clear(){let e=this.#a(`clear`),t=F((await k(`clear`,this.#e,this.#t)).address);try{await e.clearCredentials()}finally{await this.#o(t)}}async#o(e){await T(`clear decrypt cache`,()=>this.#n.clearForRequester(e),this.#i)}async revokeTransportKeyPair(e){await this.#a(`revokeTransportKeyPair`).revokeTransportKeyPair(e)}async warmTransportKeyPairScope(e){await this.#a(`warmTransportKeyPairScope`).warmTransportKeyPairScope(e)}},rn=class{#e;#t;#n;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.delegationService}#r(e){return pe(this.#e,e)}async delegateDecryption({contractAddress:e,delegateAddress:t,expirationDate:n}){let r=this.#r(`delegateDecryption`),i=await k(`delegateDecryption`,this.#e,this.#t);return this.#n.delegateDecryption(r,{contractAddress:e,delegateAddress:t,delegatorAddress:i.address,expirationDate:n})}async revokeDelegation({contractAddress:e,delegateAddress:t}){let n=this.#r(`revokeDelegation`),r=await k(`revokeDelegation`,this.#e,this.#t);return this.#n.revokeDelegation(n,{contractAddress:e,delegateAddress:t,delegatorAddress:r.address})}async isActive(e){return this.#n.isDelegated(e)}async getExpiry(e){return this.#n.getDelegationExpiry(e)}async getStatus(e){return this.#n.getStatus(e)}},an=class{#e;#t;#n;#r;constructor(e){this.#e=e.signer,this.#t=e.provider,this.#n=e.router,this.#r=e.decryptionService}#i(e){return pe(this.#r,e)}async decryptValues(e,t){let n=this.#i(`decryptValues`),r=await k(`decryptValues`,this.#e,this.#t);return n.decryptValues(e,r.address,t)}async delegatedDecryptValues(e,t,n=t,r){let i=this.#i(`delegatedDecryptValues`),a=await k(`delegatedDecryptValues`,this.#e,this.#t);return i.delegatedDecryptValues(e,t,a.address,n,r)}async decryptPublicValues(e,t){if(e.length===0)return{clearValues:{},decryptionProof:`0x`,abiEncodedClearValues:`0x`};try{let n=await this.#n.relayer.decryptPublicValuesWithSignatures({encryptedValues:e,options:t}),r={};return n.checkSignaturesArgs.handlesList.forEach((e,t)=>{_t(n.clearValues[t],`result.clearValues[${t}]`),r[e]=n.clearValues[t].value}),{clearValues:r,abiEncodedClearValues:n.checkSignaturesArgs.abiEncodedCleartexts,decryptionProof:n.checkSignaturesArgs.decryptionProof}}catch(e){throw W(e,`Public decryption failed`)}}async delegatedBatchDecryptValues({encryptedInputs:e,delegatorAddress:t,accountAddress:n=t,maxConcurrency:r,waitForPropagation:i}){let a=this.#i(`delegatedBatchDecryptValues`),o=await k(`delegatedBatchDecryptValues`,this.#e,this.#t);return a.delegatedBatchDecryptHandlesAs({encryptedInputs:e,delegatorAddress:t,delegateAddress:o.address,accountAddress:n,maxConcurrency:r,waitForPropagation:i})}},on=class{#e;constructor(e){this.#e=e}prepare(e,t){return this.#e.prepare(e,t)}},sn=class{async get(e){return(await chrome.storage.session.get(e))[e]??null}async set(e,t){await chrome.storage.session.set({[e]:t})}async delete(e){await chrome.storage.session.remove(e)}};const cn=new sn;function $(e){return`zama:pending-unshield:${tt(e)}`}const ln=I.union([I.pipe(M,I.transform(e=>({unwrapTxHash:e}))),I.pipe(I.object({version:I.literal(1),unwrapTxHash:M,unwrapRequestId:I.optional(M)}),I.transform(({unwrapTxHash:e,unwrapRequestId:t})=>({unwrapTxHash:e,unwrapRequestId:t})))]);async function un(e,t,n,r){if(r===void 0){await e.set($(t),n);return}await e.set($(t),{version:1,unwrapTxHash:n,unwrapRequestId:r})}async function dn(e,t){return(await fn(e,t))?.unwrapTxHash??null}async function fn(e,t){let n=$(t),r=await e.get(n);if(r==null)return null;let i=ln.safeParse(r);return i.success?i.data:(await e.delete(n),null)}async function pn(e,t){await e.delete($(t))}var mn=class extends Ke{#e;#t=null;#n=null;#r(e){try{return _t(this.sdk.signer,`WrappedToken.sdk.signer`),this.sdk.signer}catch(t){throw new ee(e,{cause:t})}}async underlying(){return this.#s()}async isPayable(){if(this.#n!==null)return this.#n;try{let e=await this.#s();this.#n=await this.sdk.provider.readContract(Ce(e))}catch{this.#n=!1}return this.#n}async allowance(e){let t=await this.#s();return this.sdk.provider.readContract(x(t,F(e),this.address))}async shield(t,n){let r=await k(`shield`,this.sdk.signer,this.sdk.provider),i=await this.isPayable(),a=await this.#s(),o=F(r.address),s;try{s=await this.sdk.provider.readContract(w(a,o))}catch(t){throw t instanceof p?t:new D(`Could not read ERC-20 balance for shield validation (token: ${a})`,{cause:e(t)})}if(s<t)throw new A(`Insufficient ERC-20 balance: requested ${t}, available ${s} (token: ${a})`,{requested:t,available:s,token:a});return i?this.#i(t,a,o,n):this.#a(t,o,n)}async#i(e,t,n,r){this.#r(`shield`);let i=r?.to?F(r.to):n,a=i===n?`0x`:i;return this.submitTransaction({operation:`shield:transferAndCall`,config:G(t,this.address,e,a),onSubmitted:r?.onShieldSubmitted})}async wrap(t,n){this.#r(`wrap`);let r=await k(`wrap`,this.sdk.signer,this.sdk.provider),i=await this.#s(),a=F(r.address),o;try{o=await this.sdk.provider.readContract(w(i,a))}catch(t){throw t instanceof p?t:new D(`Could not read ERC-20 balance for wrap validation (token: ${i})`,{cause:e(t)})}if(o<t)throw new A(`Insufficient ERC-20 balance: requested ${t}, available ${o} (token: ${i})`,{requested:t,available:o,token:i});let s;try{s=await this.sdk.provider.readContract(x(i,a,this.address))}catch(t){throw t instanceof p?t:new D(`Could not read ERC-20 allowance for wrap validation (token: ${i})`,{cause:e(t)})}if(s<t)throw new Re(`Insufficient allowance for wrap: requested ${t}, approved ${s}. Call approveUnderlying() first (token: ${i}).`,{requested:t,available:s,token:i});let c=n?.to?F(n.to):a;return this.submitTransaction({operation:`wrap`,config:b(this.address,c,t),onSubmitted:n?.onWrapSubmitted})}async#a(e,t,n){this.#r(`shield`);let r=n?.approvalStrategy??`exact`;r!==`skip`&&await this.#l(e,r===`max`,n);let i=n?.to?F(n.to):t;return this.submitTransaction({operation:`shield:approveAndWrap`,config:b(this.address,i,e),onSubmitted:n?.onShieldSubmitted})}async approveUnderlying(e){this.#r(`approveUnderlying`);let t=await k(`approveUnderlying`,this.sdk.signer,this.sdk.provider),n=await this.#s(),r=F(t.address),i=e??2n**256n-1n;return i>0n&&await this.sdk.provider.readContract(x(n,r,this.address))>0n&&await this.submitTransaction({operation:`approveUnderlying:reset`,config:C(n,this.address,0n)}),this.submitTransaction({operation:`approveUnderlying`,config:C(n,this.address,i)})}async unshield(e,t){let{skipBalanceCheck:n=!1,onUnwrapSubmitted:r,onFinalizing:i,onFinalizeSubmitted:a}=t??{};n||await this.assertConfidentialBalance(e);let o={onFinalizing:i,onFinalizeSubmitted:a},s=crypto.randomUUID(),c=await this.unwrap(e);return T(`unshield: onUnwrapSubmitted`,()=>r?.(c.txHash),this.sdk.logger),this.#c(c.unwrapRequestId,c.txHash,s,o)}async unshieldAll(e){let t=crypto.randomUUID(),n=await this.unwrapAll();return T(`unshieldAll: onUnwrapSubmitted`,()=>e?.onUnwrapSubmitted?.(n.txHash),this.sdk.logger),this.#c(n.unwrapRequestId,n.txHash,t,e)}async resumeUnshield(e,t){let n;try{n=await this.sdk.provider.waitForTransactionReceipt(e)}catch(e){throw e instanceof p?e:new _(`Failed to get unwrap receipt`,{cause:e})}let r=this.#o(n.logs);return this.#c(r,e,crypto.randomUUID(),t)}async getPendingUnshield(){return dn(this.sdk.storage,this.address)}async unwrap(e){this.#r(`unwrap`);let t=F((await k(`unwrap`,this.sdk.signer,this.sdk.provider)).address),{encryptedValues:n,inputProof:r}=await this.sdk.encrypt({values:[{value:e,type:`euint64`}],contractAddress:this.address,userAddress:t}),[i]=n;if(!i)throw new j(`Encryption returned no encrypted values`);let a=await this.submitTransaction({operation:`unwrap`,config:v(this.address,t,t,i,r)});return{...a,unwrapRequestId:this.#o(a.receipt.logs)}}async unwrapAll(){this.#r(`unwrapAll`);let e=F((await k(`unwrapAll`,this.sdk.signer,this.sdk.provider)).address),t=await this.readConfidentialBalanceOf(e);if(Le(t))throw new E(`Cannot unshield: balance is zero`);let n=await this.submitTransaction({operation:`unwrapAll`,config:y(this.address,e,e,t)});return{...n,unwrapRequestId:this.#o(n.receipt.logs)}}async finalizeUnwrap(e){this.#r(`finalizeUnwrap`),await Ie(`finalizeUnwrap`,this.sdk.signer,this.sdk.provider);let t=await this.sdk.decryption.decryptPublicValues([e]),n=t.clearValues[e];return vt(n,`finalizeUnwrap: clearValue`),this.submitTransaction({operation:`finalizeUnwrap`,config:g(this.address,e,n,t.decryptionProof)})}#o(e){let t=Kt(e);if(!t)throw new _(`No UnwrapRequested event found in unwrap receipt`);return t.unwrapRequestId}async#s(){return this.#e===void 0?(this.#t||=this.sdk.provider.readContract(re(this.address)).then(e=>(this.#e=e,this.#t=null,e)).catch(e=>{throw this.#t=null,e}),this.#t):this.#e}async#c(e,t,n,r){this.emit({type:S.UnshieldPhase1Submitted,txHash:t,operationId:n}),await T(`unshield: savePendingUnshield`,()=>un(this.sdk.storage,this.address,t),this.sdk.logger),this.emit({type:S.UnshieldPhase2Started,operationId:n}),T(`unshield: onFinalizing`,()=>r?.onFinalizing?.(),this.sdk.logger);let i=await this.finalizeUnwrap(e);return this.emit({type:S.UnshieldPhase2Submitted,txHash:i.txHash,operationId:n}),T(`unshield: onFinalizeSubmitted`,()=>r?.onFinalizeSubmitted?.(i.txHash),this.sdk.logger),await T(`unshield: clearPendingUnshield`,()=>pn(this.sdk.storage,this.address),this.sdk.logger),i}async#l(e,t,n){this.#r(`approveUnderlying`);let r=await this.#s(),i=F((await k(`approveUnderlying`,this.sdk.signer,this.sdk.provider)).address),a=await this.sdk.provider.readContract(x(r,i,this.address));if(a>=e)return;a>0n&&await this.submitTransaction({operation:`approveUnderlying:reset`,config:C(r,this.address,0n)});let o=t?2n**256n-1n:e;await this.submitTransaction({operation:`approveUnderlying`,config:C(r,this.address,o),onSubmitted:n?.onApprovalSubmitted})}};const hn=I.union([I.bigint(),I.boolean(),P]),gn=I.array(I.string());var _n=class{#e;#t;#n=`zama:decrypt`;#r=`${this.#n}:keys`;#i=Promise.resolve();constructor(e,t){this.#e=e,this.#t=t}async get(e,t,n){try{let r=this.#c(e,t,n),i=await this.#e.get(r);if(i===null)return null;let a=hn.safeParse(i);return a.success?a.data:(await this.delete(e,t,n),null)}catch(e){return this.#t.warn(`CachingService.get failed`,{error:e}),null}}async set(e,t,n,r){try{let i=this.#c(e,t,n);await this.#e.set(i,r),this.#i=this.#i.then(()=>this.#u(i).catch(e=>{this.#t.warn(`CachingService index write failed`,{error:e})})),await this.#i}catch(e){this.#t.warn(`CachingService.set failed`,{error:e})}}async delete(e,t,n){let r=this.#c(e,t,n);this.#i=this.#i.then(()=>this.#a(r).catch(e=>{this.#t.warn(`CachingService.delete failed`,{error:e})})),await this.#i}async clearForRequester(e){this.#i=this.#i.then(()=>this.#o(e).catch(e=>{this.#t.warn(`CachingService.clearForRequester failed`,{error:e})})),await this.#i}async clearAll(){this.#i=this.#i.then(()=>this.#s().catch(e=>{this.#t.warn(`CachingService.clearAll failed`,{error:e})})),await this.#i}async#a(e){await this.#e.delete(e).catch(()=>{});let t=await this.#l(),n=t.filter(t=>t!==e);n.length!==t.length&&await this.#e.set(this.#r,n)}async#o(e){let t=F(e),n=`${this.#n}:${t}:`,r=await this.#l(),i=[],a=[];for(let e of r)e.startsWith(n)?i.push(e):a.push(e);await Promise.all(i.map(e=>this.#e.delete(e).catch(()=>{}))),await this.#e.set(this.#r,a)}async#s(){let e=await this.#l();await Promise.all(e.map(e=>this.#e.delete(e).catch(()=>{}))),await this.#e.delete(this.#r)}#c(e,t,n){return`${this.#n}:${F(e)}:${F(t)}:${n.toLowerCase()}`}async#l(){let e=await this.#e.get(this.#r);if(e===null)return[];let t=gn.safeParse(e);return t.success?t.data:(await this.#e.delete(this.#r).catch(()=>{}),[])}async#u(e){let t=await this.#l();t.includes(e)||(t.push(e),await this.#e.set(this.#r,t))}};function vn(e,t){let n=yn(e,t);if(!n)throw new E(`No permit covers contract ${t} after allow()`);return{privateKey:e.keypair.privateKey,publicKey:e.keypair.publicKey,serializedPermit:n.serializedPermit}}function yn(e,t){let n=tt(t);return e.permissions.find(e=>e.contractAddresses.includes(n))}const bn=e=>new Promise(t=>setTimeout(t,e));var xn=class{#e;#t;#n;#r;#i;constructor({cache:e,credentialService:t,delegationService:n,router:r,emitEvent:i}){this.#e=e,this.#t=t,this.#n=n,this.#r=r,this.#i=i}async decryptValues(e,t,n){let r=F(t);return this.#s(e,{requesterAddress:r,aclActorAddress:r,resolveCredentials:e=>this.#t.grantPermit(e),decryptContract:({credentials:e,contractAddress:t,encryptedValues:n,options:r})=>this.#o(e,t,n,r),errorMessage:`Failed to decrypt encrypted values`},n)}async delegatedDecryptValues(e,t,n,r,i){let a=F(t),o=F(n);return this.#a(i?.waitForPropagation??!0,()=>this.#s(e,{requesterAddress:F(r),aclActorAddress:a,resolveCredentials:e=>this.#t.grantPermit(e,a),validate:e=>this.#f(e,{delegatorAddress:a,delegateAddress:o}),decryptContract:({credentials:e,contractAddress:t,encryptedValues:n,options:r})=>this.#o(e,t,n,r),errorMessage:`Failed to decrypt delegated encrypted values`,delegated:!0}))}async#a(e,t){let n;for(let r=0;r<16;r++)try{return await t()}catch(t){if(n=t,!(r<15&&e&&t instanceof U))throw t;await bn(2e3)}throw n}async delegatedBatchDecryptHandlesAs({encryptedInputs:e,delegatorAddress:t,delegateAddress:n,accountAddress:r,maxConcurrency:i=5,waitForPropagation:a=!0}){let o=e.map(e=>({encryptedValue:e.encryptedValue,contractAddress:F(e.contractAddress)}));if(o.length===0)return{items:o};let s=F(r);try{let e=await this.delegatedDecryptValues(o.map(({encryptedValue:e,contractAddress:t})=>({encryptedValue:e,contractAddress:t})),t,n,s,{waitForPropagation:a});for(let t of o)this.#l(t,e);return{items:o}}catch(e){if(Be(e))throw e;if(o.length===1){let[n=this.#d()]=o;return n.error=this.#u(e,`Failed to decrypt delegated encrypted values`,{isDelegated:!0,contractAddress:n.contractAddress,account:F(t)}),{items:o}}}let c=!1;return await We(o.map(e=>async()=>{if(!c)try{let r=await this.delegatedDecryptValues([{encryptedValue:e.encryptedValue,contractAddress:e.contractAddress}],t,n,s,{waitForPropagation:!1});this.#l(e,r)}catch(n){if(Be(n))throw c=!0,n;e.error=this.#u(n,`Failed to decrypt delegated encrypted values`,{isDelegated:!0,contractAddress:e.contractAddress,account:F(t)})}}),i),{items:o}}async#o(e,t,n,i){let a=vn(e,t),o;try{o=await this.#r.relayer.parseTransportKeyPair({publicKey:a.publicKey,privateKey:a.privateKey,tkmsVersion:e.keypair.tkmsVersion})}catch(e){throw e instanceof Error&&r(e.message)&&await this.#t.evictTransportKeyPair(),e}let s=await this.#r.relayer.parseSignedDecryptionPermit({transportKeyPair:o,serializedPermit:a.serializedPermit});return this.#r.relayer.decryptValues({transportKeyPair:o,signedPermit:s,encryptedValues:n,contractAddress:t,options:i})}async#s(t,n,r){if(t.length===0)return{};let i=t.map(e=>({encryptedValue:e.encryptedValue,contractAddress:F(e.contractAddress)})),a={},s=[];for(let e of i)Le(e.encryptedValue)?a[e.encryptedValue]=0n:s.push(e);if(s.length===0)return a;let c=Array.from(new Set(i.map(e=>e.contractAddress))),l=Array.from(new Set(s.map(e=>e.contractAddress)));if(n.validate)try{await n.validate(l)}catch(e){throw o(e)?this.#c(e,`the delegation pre-check`):e}let u=[];for(let e of s){let t=await this.#e.get(n.requesterAddress,e.contractAddress,e.encryptedValue);t===null?u.push(e):a[e.encryptedValue]=t}if(u.length===0)return a;let d=await n.resolveCredentials(c),f=new Map;for(let e of u){let t=f.get(e.contractAddress);t?t.push(e.encryptedValue):f.set(e.contractAddress,[e.encryptedValue])}let m=[];for(let[e,t]of f)for(let n of Ge(t))m.push({contractAddress:e,encryptedValues:n});let h=Date.now(),g=u.map(e=>e.encryptedValue);try{this.#i({type:S.DecryptStart,encryptedValues:g}),await We(m.map(({contractAddress:e,encryptedValues:t})=>async()=>{let i;try{i=await n.decryptContract({credentials:d,contractAddress:e,encryptedValues:t,options:r})}catch(t){throw W(t,n.errorMessage,{isDelegated:n.delegated,contractAddress:e,account:n.aclActorAddress})}for(let r=0;r<t.length;r++){let o=t[r],s=i[r]?.value;o!==void 0&&s!==void 0&&(a[o]=s,await this.#e.set(n.requesterAddress,e,o,s))}let o=t.filter(e=>a[e]===void 0);if(o.length>0)throw new E(`${n.errorMessage}: relayer returned no clear value for ${o.length} of ${t.length} handle(s) on ${e}`,{cause:AggregateError(o.map(t=>new E(`No clear value for handle ${t} on ${e}`)),`${o.length} handle(s) missing a clear value on ${e}`)})}),5);let e={};for(let t of g){let n=a[t];n!==void 0&&(e[t]=n)}return this.#i({type:S.DecryptEnd,durationMs:Date.now()-h,encryptedValues:g,result:e}),a}catch(t){let r=t instanceof p&&t.cause instanceof Error?t.cause:t;throw this.#i({type:S.DecryptError,error:e(r),durationMs:Date.now()-h,encryptedValues:g}),W(t,n.errorMessage,{isDelegated:n.delegated})}}#c(e,t){return new O(`RPC provider rate-limited ${t}; retry with backoff.`,{cause:e,retryAfter:n(e)})}#l(e,t){let n=t[e.encryptedValue];if(n===void 0){e.error=new E(`Batch delegated decryption returned no value for encrypted value ${e.encryptedValue} on contract ${e.contractAddress}`);return}e.value=n}#u(e,t,n){return e instanceof p?e:W(e,t,n)}#d(){throw new E(`Batch delegated decryption invariant failed: missing item`)}async#f(e,{delegatorAddress:t,delegateAddress:n}){let r=await this.#n.findInactiveDelegations(e,t,n);if(r.size!==0)for(let e of r.values())throw e}};function Sn(e){if(!(e instanceof Error))return null;let t=e.cause;if(typeof t!=`object`||!t||!(`data`in t))return null;let{data:n}=t;return typeof n!=`object`||!n||!(`errorName`in n)?null:typeof n.errorName==`string`?n.errorName:null}const Cn={AlreadyDelegatedOrRevokedInSameBlock:e=>new Ct(`Only one delegate/revoke per (delegator, delegate, contract) per block. Wait for the next block before retrying.`,{cause:e}),SenderCannotBeContractAddress:e=>new Tt(`The contract address cannot be the caller address.`,{cause:e}),EnforcedPause:e=>new Et(`The ACL contract is paused. Delegation operations are temporarily disabled.`,{cause:e}),SenderCannotBeDelegate:e=>new R(`Cannot delegate to yourself (delegate === msg.sender).`,{cause:e}),DelegateCannotBeContractAddress:e=>new V(`Delegate address cannot be the same as the contract address.`,{cause:e}),ExpirationDateBeforeOneHour:e=>new H(`Expiration date must be at least 1 hour in the future.`,{cause:e}),ExpirationDateAlreadySetToSameValue:e=>new B(`The new expiration date is the same as the current one.`,{cause:e}),NotDelegatedYet:e=>new z(`Cannot revoke: no active delegation exists.`,{cause:e})};function wn(e){return e in Cn}function Tn(e,t){let n=Sn(e);if(n&&wn(n))return Cn[n](t);let r=e instanceof Error?e.message:String(e);for(let[e,n]of Object.entries(Cn))if(r.includes(e))return n(t);return null}var En=class{#e;#t;#n;#r;constructor({provider:e,router:t,emitEvent:n=()=>{},logger:r}){this.#t=e,this.#e=t,this.#r=r,this.#n=n}async delegateDecryption(e,{contractAddress:t,delegateAddress:n,delegatorAddress:r,expirationDate:i}){if(i&&i.getTime()<Date.now()+36e5)throw new H(`Expiration date must be at least 1 hour in the future`);let a=F(t),o=F(n),s=F(r);if(o===s)throw new R(`Cannot delegate to yourself (delegate === msg.sender).`);if(o===a)throw new V(`Delegate address cannot be the same as the contract address (${a}).`);let c=this.#e.relayer.chain.aclContractAddress,l=i?BigInt(Math.floor(i.getTime()/1e3)):Nt,u;try{u=await this.getDelegationExpiry({contractAddress:a,delegatorAddress:s,delegateAddress:o})}catch(e){this.#r.warn(`delegateDecryption: pre-flight expiry check failed`,{error:e}),u=-1n}if(u===l)throw new B(`The new expiration date (${l}) is the same as the current one. No on-chain change needed.`);return this.#i({operation:`delegateDecryption`,signer:e,contractAddress:a,config:q(c,o,a,l)})}async revokeDelegation(e,{contractAddress:t,delegateAddress:n,delegatorAddress:r}){let i=F(t),a=F(n),o=F(r),s=this.#e.relayer.chain.aclContractAddress,c;try{c=await this.getDelegationExpiry({contractAddress:i,delegatorAddress:o,delegateAddress:a})}catch(e){this.#r.warn(`revokeDelegation: pre-flight expiry check failed`,{error:e}),c=1n}if(c===0n)throw new z(`No active delegation found for delegate ${a} on contract ${i}.`);return this.#i({operation:`revokeDelegation`,signer:e,contractAddress:i,config:At(s,a,i)})}async isDelegated(e){return(await this.getStatus(e)).isActive}async getStatus(e){let t=await this.getDelegationExpiry(e);return t===0n?{isActive:!1,expiryTimestamp:t}:t===Nt?{isActive:!0,expiryTimestamp:t}:{isActive:t>await this.#t.getBlockTimestamp(),expiryTimestamp:t}}async getDelegationExpiry({contractAddress:e,delegatorAddress:t,delegateAddress:n}){let r=this.#e.relayer.chain.aclContractAddress;return this.#t.readContract(jt(r,F(t),F(n),F(e)))}async#i({operation:e,signer:t,contractAddress:n,config:r}){try{return await Ve({operation:e,signer:t,provider:this.#t,config:r,emit:e=>this.#n(e,n),logger:this.#r})}catch(e){throw this.#a(e),e}}#a(e){if(!(e instanceof _))return;let t=Tn(e.cause??e,e);if(t)throw t}async findInactiveDelegations(e,t,n){let r=new Map;return await Promise.all(e.map(async e=>{try{await this.assertDelegationActive(e,t,n)}catch(t){if(t instanceof z||t instanceof wt){let n=F(e);r.set(n,t);return}throw t}})),r}async assertDelegationActive(e,t,n){let r=F(e),i=F(t),a=F(n),{isActive:o,expiryTimestamp:s}=await this.getStatus({contractAddress:r,delegatorAddress:i,delegateAddress:a});if(!o)throw s===0n?new z(`No active delegation from ${i} to ${a} for ${r}`):new wt(`Delegation from ${i} to ${a} for ${r} has expired`)}},Dn=class{#e;#t;constructor({router:e,emitEvent:t}){this.#e=e,this.#t=t}async encryptValues(t,n){let r=Date.now(),i=F(t.contractAddress);try{this.#t({type:S.EncryptStart},i);let e=await this.#e.relayer.encryptValues({...t,options:n});return this.#t({type:S.EncryptEnd,durationMs:Date.now()-r},i),e}catch(t){throw this.#t({type:S.EncryptError,error:e(t),durationMs:Date.now()-r},i),Ot(t,`Encryption failed`)}}},On=class{#e;#t;#n;#r;#i;#a=new Set;#o;constructor(e){this.#e=e.signer,this.#t=e.router,this.#n=e.cachingService,this.#r=e.credentialService,this.#i=e.logger,this.#e&&(this.#o=this.#e.walletAccount.subscribe(e=>{this.#s(e).catch(e=>{this.#i.warn(`wallet account handler failed`,{error:e})})}))}onWalletAccountChange(e){return this.#a.add(e),()=>{this.#a.delete(e)}}dispose(){this.#o?.(),this.#o=void 0,this.#a.clear()}async#s(e){let t=e.previous,n=e.next,r=n?.chainId;r!==void 0&&await T(`switch relayer chain`,()=>this.#t.switchChain(r),this.#i);let i=this.#r;i&&await T(`credential wallet account change`,()=>i.handleWalletAccountChange(t,n),this.#i),t&&await T(`clear decrypt cache`,()=>this.#n.clearForRequester(t.address),this.#i),await Promise.all(Array.from(this.#a,t=>T(`wallet account listener`,()=>t(e),this.#i)))}};const kn=I.object({kind:I.literal(`ConfidentialTransfer`),from:P,token:P,to:P,amount:I.bigint()}),An=I.object({kind:I.literal(`ConfidentialTransferFrom`),from:P,token:P,owner:P,to:P,amount:I.bigint()}),jn=I.object({kind:I.literal(`SetOperator`),from:P,token:P,operator:P,until:Ze}),Mn=I.object({kind:I.literal(`Unwrap`),from:P,token:P,to:P,amount:I.bigint()}),Nn=I.object({kind:I.literal(`UnwrapAll`),from:P,token:P,to:P}),Pn=I.object({kind:I.literal(`FinalizeUnwrap`),from:P,wrapper:P,unwrapRequestIdOrAmount:M}),Fn=I.object({kind:I.literal(`ApproveUnderlying`),from:P,underlying:P,spender:P,amount:I.bigint()}),In=I.object({kind:I.literal(`Wrap`),from:P,wrapper:P,to:P,amount:I.bigint()}),Ln=M.check(I.refine(e=>e===`0x`||bt(e)===20,`TransferAndCall.recipientData must be "0x" (self-shield to the sender) or a raw 20-byte address, not a 32-byte ABI-encoded value the wrapper would truncate to a garbage address`)),Rn=I.object({kind:I.literal(`TransferAndCall`),from:P,underlying:P,wrapper:P,amount:I.bigint(),recipientData:I.optional(Ln)}),zn=I.object({kind:I.literal(`DelegateDecryption`),from:P,contractAddress:P,delegateAddress:P,expirationDate:I.optional(I.date())}),Bn=I.object({kind:I.literal(`RevokeDelegation`),from:P,contractAddress:P,delegateAddress:P});I.discriminatedUnion(`kind`,[kn,An,jn,Mn,Nn,Pn,Fn,In,Rn,zn,Bn]);const Vn=I.strictObject({maxFeePerGas:I.bigint(),maxPriorityFeePerGas:I.bigint()}),Hn=I.object({nonce:I.optional(I.int().check(I.nonnegative())),gasLimit:I.optional(I.bigint()),fees:I.optional(Vn)}),Un=I.object({address:P,abi:I.array(I.unknown()),functionName:I.string(),args:I.array(I.unknown()),value:I.optional(I.bigint()),gas:I.optional(I.bigint())}),Wn=I.extend(Hn,{from:P,calldata:Un});var Gn=class{#e;#t;#n;constructor(e){this.#e=e.provider,this.#t=e.router,this.#n=e.encryption}async prepare(e,t){t&&=N(Hn,t);let n=await this.#e.getChainId(),r=this.#t.chain.id;if(n!==r)throw new h(`Offline.prepare: provider is on chain ${n} but the SDK is configured for chain ${r}. The prepared transaction's contract addresses and encrypted inputs are bound to chain ${r} — point the provider at the same chain.`);let i=N(Wn,{calldata:await this.#r(e),from:e.from,nonce:t?.nonce,gasLimit:t?.gasLimit,fees:t?.fees}),a=await this.#e.prepareTransaction(i);return{kind:e.kind,unsignedTx:a,from:i.from}}async#r(e){switch(e.kind){case`ConfidentialTransfer`:return this.#i(e);case`ConfidentialTransferFrom`:return this.#a(e);case`SetOperator`:return this.#o(e);case`Unwrap`:return this.#s(e);case`UnwrapAll`:return this.#c(e);case`FinalizeUnwrap`:return this.#l(e);case`ApproveUnderlying`:return this.#u(e);case`Wrap`:return this.#d(e);case`TransferAndCall`:return this.#f(e);case`DelegateDecryption`:return this.#p(e);case`RevokeDelegation`:return this.#m(e);default:throw new h(`OfflineService.prepare: unsupported transaction kind '${e.kind}'.`)}}async#i(e){e=N(kn,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from}),r=t[0];if(!r)throw new j(`Encryption returned no handles for ConfidentialTransfer`);return ne(e.token,e.to,r,n)}async#a(e){e=N(An,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from}),r=t[0];if(!r)throw new j(`Encryption returned no handles for ConfidentialTransferFrom`);return Ee(e.token,e.owner,e.to,r,n)}#o(e){return e=N(jn,e),ce(e.token,e.operator,e.until)}async#s(e){e=N(Mn,e);let{encryptedValues:t,inputProof:n}=await this.#n.encryptValues({values:[{value:e.amount,type:`euint64`}],contractAddress:e.token,userAddress:e.from}),r=t[0];if(!r)throw new j(`Encryption returned no handles for Unwrap`);return v(e.token,e.from,e.to,r,n)}async#c(e){e=N(Nn,e);let t=await this.#e.readContract(Fe(e.token,e.from));return y(e.token,e.from,e.to,t)}async#l(e){e=N(Pn,e);let t=await this.#t.relayer.decryptPublicValuesWithSignatures({encryptedValues:[e.unwrapRequestIdOrAmount]}).catch(e=>{throw W(e,`Public decryption failed during FinalizeUnwrap`)}),n=t.clearValues[0]?.value;return vt(n,`FinalizeUnwrap: decryptPublicValuesWithSignatures(handle).clearValue`),g(e.wrapper,e.unwrapRequestIdOrAmount,n,t.checkSignaturesArgs.decryptionProof)}#u(e){return e=N(Fn,e),C(e.underlying,e.spender,e.amount)}#d(e){return e=N(In,e),b(e.wrapper,e.to,e.amount)}#f(e){return e=N(Rn,e),G(e.underlying,e.wrapper,e.amount,e.recipientData)}#p(e){if(e=N(zn,e),e.expirationDate&&e.expirationDate.getTime()<Date.now()+36e5)throw new H(`Expiration date must be at least 1 hour in the future`);if(e.delegateAddress===e.from)throw new R(`Cannot delegate to yourself (delegate === msg.sender).`);if(e.delegateAddress===e.contractAddress)throw new V(`Delegate address cannot be the same as the contract address (${e.contractAddress}).`);let t=e.expirationDate?BigInt(Math.floor(e.expirationDate.getTime()/1e3)):Nt;return q(this.#t.chain.aclContractAddress,e.delegateAddress,e.contractAddress,t)}#m(e){return e=N(Bn,e),At(this.#t.chain.aclContractAddress,e.delegateAddress,e.contractAddress)}},Kn=class{#e;provider;signer;storage;registry;permits;delegations;decryption;offline;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;constructor(e){this.#e=e.router,this.provider=e.provider,this.signer=e.signer,this.storage=e.storage,this.#r=e.onEvent??function(){},this.#i=e.logger,this.#a=new _n(e.storage,this.#i),this.#u=new En({provider:this.provider,router:e.router,emitEvent:this.emitEvent.bind(this),logger:this.#i});let t={};for(let n of e.chains)n.registryAddress&&(t[n.id]=n.registryAddress);this.registry=new it({provider:this.provider,registryAddresses:t,registryTTL:e.registryTTL}),this.#n=t,this.#t=e.registryTTL,this.#l=new Xe({router:e.router,signer:e.signer,transportKeyPairTTL:e.transportKeyPairTTL,permitTTL:e.permitTTL,scope:e.transportKeyPairScope,storage:this.storage,permitStorage:e.permitStorage,logger:this.#i}),e.signer&&(this.#c=new xn({cache:this.#a,credentialService:this.#l,delegationService:this.#u,router:e.router,emitEvent:this.emitEvent.bind(this)})),this.#s=new Dn({router:e.router,emitEvent:this.emitEvent.bind(this)}),this.#o=new On({signer:e.signer,router:e.router,cachingService:this.#a,credentialService:this.#l,logger:this.#i}),this.#d=new Gn({provider:this.provider,router:e.router,encryption:this.#s,emitEvent:(e,t)=>this.emitEvent(e,t)}),this.permits=new nn({signer:this.signer,provider:this.provider,cachingService:this.#a,credentialService:this.#l,logger:this.#i}),this.delegations=new rn({signer:this.signer,provider:this.provider,delegationService:this.#u}),this.decryption=new an({signer:this.signer,provider:this.provider,router:e.router,decryptionService:this.#c}),this.offline=new on(this.#d)}onWalletAccountChange(e){return this.#o.onWalletAccountChange(e)}get logger(){return this.#i}get relayer(){return this.#e.relayer}emitEvent(e,t){try{this.#r({...e,tokenAddress:t,timestamp:Date.now()})}catch(t){this.#i.warn(`${e.type} event listener silently failed`,{error:t})}}createWrappersRegistry(e){return new it({provider:this.provider,registryAddresses:{...this.#n,...e},registryTTL:this.#t})}async encrypt(e,t){return this.#s.encryptValues(e,t)}createToken(e){return new Ke(this,e)}createWrappedToken(e){return new mn(this,e)}dispose(){this.#o.dispose()}terminate(){this.dispose(),this.signer?.dispose?.()}[Symbol.dispose](){this.terminate()}};export{tn as ACL_TOPICS,Et as AclPausedError,Q as AclTopics,qe as BalanceCheckUnavailableError,st as BaseSigner,ze as ChainMismatchError,sn as ChromeSessionStorage,h as ConfigurationError,an as Decryption,E as DecryptionFailedError,Ye as DefaultRegistryAddresses,Tt as DelegationContractIsSelfError,Ct as DelegationCooldownError,V as DelegationDelegateEqualsContractError,H as DelegationExpirationTooSoonError,wt as DelegationExpiredError,B as DelegationExpiryUnchangedError,z as DelegationNotFoundError,U as DelegationNotPropagatedError,R as DelegationSelfNotAllowedError,rn as Delegations,Pe as ERC1363_INTERFACE_ID,D as ERC20ReadFailedError,be as ERC7984_INTERFACE_ID,xe as ERC7984_WRAPPER_INTERFACE_ID,j as EncryptionFailedError,$e as IndexedDBStorage,Re as InsufficientAllowanceError,Ue as InsufficientConfidentialBalanceError,A as InsufficientERC20BalanceError,he as InvalidTransportKeyPairError,at as MemoryStorage,rt as MutableWalletAccountStore,me as NoCiphertextError,L as NotEntitledError,on as Offline,nn as Permits,u as RelayerRequestFailedError,O as RpcRateLimitError,ee as SignerNotConfiguredError,fe as SignerRequiredError,ae as SigningFailedError,je as SigningRejectedError,Jt as TOKEN_TOPICS,Ke as Token,Y as Topics,_ as TransactionRevertedError,ge as TransportKeyPairExpiredError,ie as WalletAccountNotReadyError,de as WalletNotConnectedError,mn as WrappedToken,it as WrappersRegistry,He as ZERO_ENCRYPTED_VALUE,p as ZamaError,s as ZamaErrorCode,Kn as ZamaSDK,S as ZamaSDKEvents,x as allowanceContract,gt as anvil,C as approveContract,w as balanceOfContract,ft as bscTestnet,mt as chains,cn as chromeSessionStorage,Je as cleartext,Fe as confidentialBalanceOfContract,ue as confidentialTotalSupplyContract,ne as confidentialTransferContract,Ee as confidentialTransferFromContract,Pt as createConfig,ot as createWalletAccountStore,ve as decimalsContract,Zt as decodeAclEvent,Qt as decodeAclEvents,Bt as decodeConfidentialTransfer,Yt as decodeDelegatedForUserDecryption,Wt as decodeOnChainEvent,Gt as decodeOnChainEvents,Xt as decodeRevokedDelegationForUserDecryption,Ut as decodeUnwrapFinalized,Ht as decodeUnwrapRequested,Vt as decodeWrap,q as delegateForUserDecryptionContract,g as finalizeUnwrapContract,$t as findDelegatedForUserDecryption,en as findRevokedDelegationForUserDecryption,Kt as findUnwrapRequested,qt as findWrap,Me as getConfidentialTokenAddressContract,jt as getDelegationExpiryContract,we as getTokenAddressContract,_e as getTokenPairContract,ke as getTokenPairsContract,Ne as getTokenPairsLengthContract,ye as getTokenPairsSliceContract,ut as hardhat,ct as hoodi,Qe as indexedDBStorage,Te as inferredTotalSupplyContract,pt as ingenTestnet,Ae as isConfidentialTokenContract,De as isConfidentialTokenValidContract,Oe as isConfidentialWrapperContract,Le as isEncryptedValueZero,Mt as isHandleDelegatedContract,oe as isOperatorContract,t as isRetryable,ht as mainnet,St as matchZamaError,nt as memoryStorage,le as nameContract,lt as polygonAmoy,se as rateContract,d as retryAfterSeconds,At as revokeDelegationContract,dt as sepolia,ce as setOperatorContract,Se as supportsInterfaceContract,te as symbolContract,G as transferAndCallContract,re as underlyingContract,v as unwrapContract,y as unwrapFromBalanceContract,b as wrapContract};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import{u as e}from"../relayer-BWHOLVcG.js";import{C as t,F as n,M as r,S as i,_ as a,a as o,b as s,c,i as l,j as ee,l as te,m as u,o as d,p as f,r as p,s as m,t as h}from"../sdk-events-DI-bw_nW.js";import{t as g}from"../token-BBInYv3L.js";import{r as _}from"../assertions-Ca1ePdRJ.js";import{getAddress as v,zeroAddress as y}from"viem";import{z as b}from"zod/mini";function x(e){if(!S(e))return!1;let t=e.constructor;if(t===void 0)return!0;let n=t.prototype;return!(!S(n)||!n.hasOwnProperty(`isPrototypeOf`))}function S(e){return Object.prototype.toString.call(e)===`[object Object]`}function C(e){let{gcTime:t,staleTime:n,enabled:r,select:i,refetchInterval:a,refetchOnMount:o,refetchOnWindowFocus:s,refetchOnReconnect:c,retry:l,retryDelay:ee,retryOnMount:te,queryFn:u,queryKey:d,queryKeyHashFn:f,initialData:p,initialDataUpdatedAt:m,placeholderData:h,structuralSharing:g,throwOnError:_,meta:v,query:y,pollingInterval:b,...x}=e;return x}function w(e){return JSON.stringify(e,(e,t)=>x(t)?Object.keys(t).toSorted().reduce((e,n)=>(e[n]=t[n],e),{}):typeof t==`bigint`?t.toString():t)}const T=e=>e.map(e=>v(e)),E=e=>e===void 0?void 0:v(e),D=e=>e?{walletAddress:v(e.address),walletChainId:e.chainId}:{},O={confidentialBalance:{all:[`zama.confidentialBalance`],token:e=>[`zama.confidentialBalance`,{tokenAddress:v(e)}],owner:(e,t,n)=>[`zama.confidentialBalance`,{tokenAddress:v(e),...D(n),...t?{owner:v(t)}:{}}]},confidentialBalances:{all:[`zama.confidentialBalances`],tokens:(e,t,n)=>[`zama.confidentialBalances`,{tokenAddresses:T(e),...D(n),...t?{owner:v(t)}:{}}]},tokenMetadata:{all:[`zama.tokenMetadata`],token:e=>[`zama.tokenMetadata`,{tokenAddress:v(e)}]},isConfidential:{all:[`zama.isConfidential`],token:e=>[`zama.isConfidential`,{tokenAddress:v(e)}]},isWrapper:{all:[`zama.isWrapper`],token:e=>[`zama.isWrapper`,{tokenAddress:v(e)}]},wrapperDiscovery:{all:[`zama.wrapperDiscovery`],token:(e,t,n)=>{let r=E(e),i=E(t),a=E(n);return[`zama.wrapperDiscovery`,{...r?{tokenAddress:r}:{},...i?{erc20Address:i}:{},...a?{registryAddress:a}:{}}]}},underlyingAllowance:{all:[`zama.underlyingAllowance`],token:e=>[`zama.underlyingAllowance`,{tokenAddress:v(e)}],scope:(e,t)=>[`zama.underlyingAllowance`,{tokenAddress:v(e),...t?{owner:v(t)}:{}}]},confidentialIsOperator:{all:[`zama.confidentialIsOperator`],token:e=>{let t=E(e);return[`zama.confidentialIsOperator`,t?{tokenAddress:t}:{}]},scope:(e,t,n)=>{let r=E(e),i=E(t),a=E(n);return[`zama.confidentialIsOperator`,{...r?{tokenAddress:r}:{},...i?{holder:i}:{},...a?{spender:a}:{}}]}},totalSupply:{all:[`zama.totalSupply`],token:e=>[`zama.totalSupply`,{tokenAddress:v(e)}]},pendingUnshield:{all:[`zama.pendingUnshield`],token:e=>[`zama.pendingUnshield`,{tokenAddress:v(e)}]},hasPermit:{all:[`zama.hasPermit`],scope:(e,t)=>[`zama.hasPermit`,{...D(t),contractAddresses:T(e).toSorted()}]},delegationStatus:{all:[`zama.delegationStatus`],contract:e=>{let t=E(e);return[`zama.delegationStatus`,t?{contractAddress:t}:{}]},scope:(e,t,n)=>{let r=E(e),i=E(t),a=E(n);return[`zama.delegationStatus`,{...r?{contractAddress:r}:{},...i?{delegatorAddress:i}:{},...a?{delegateAddress:a}:{}}]}},decryption:{all:[`zama.decryption`],encryptedValue:(e,t)=>[`zama.decryption`,{encryptedValue:e,...t===void 0?{}:{contractAddress:v(t)}}],encryptedInputs:(e,t)=>[`zama.decryption`,{...D(t),encryptedInputs:[...e].toSorted((e,t)=>e.encryptedValue.localeCompare(t.encryptedValue)).map(e=>({encryptedValue:e.encryptedValue,contractAddress:v(e.contractAddress)}))}]},wrappersRegistry:{all:[`zama.wrappersRegistry`],chainId:()=>[`zama.wrappersRegistry`,{type:`chainId`}],tokenPairs:e=>[`zama.wrappersRegistry`,{type:`tokenPairs`,registryAddress:v(e)}],confidentialTokenAddress:(e,t)=>[`zama.wrappersRegistry`,{type:`confidentialTokenAddress`,registryAddress:v(e),tokenAddress:v(t)}],tokenAddress:(e,t)=>[`zama.wrappersRegistry`,{type:`tokenAddress`,registryAddress:v(e),confidentialTokenAddress:v(t)}],tokenPairsLength:e=>[`zama.wrappersRegistry`,{type:`tokenPairsLength`,registryAddress:v(e)}],tokenPairsSlice:(e,t,n)=>[`zama.wrappersRegistry`,{type:`tokenPairsSlice`,registryAddress:v(e),fromIndex:t,toIndex:n}],tokenPair:(e,t)=>[`zama.wrappersRegistry`,{type:`tokenPair`,registryAddress:v(e),index:t}],isConfidentialTokenValid:(e,t)=>[`zama.wrappersRegistry`,{type:`isConfidentialTokenValid`,registryAddress:v(e),confidentialTokenAddress:v(t)}],listPairs:(e,t,n,r)=>[`zama.wrappersRegistry`,{type:`listPairs`,registryAddress:v(e),page:t,pageSize:n,metadata:r}]}};function k(e,t){e.invalidateQueries({queryKey:O.underlyingAllowance.token(t)})}function A(e,t){e.invalidateQueries({queryKey:O.pendingUnshield.token(t)})}function j(e,t){N(e,t),k(e,t),A(e,t),K(e)}function M(e,t){N(e,t),k(e,t),K(e)}function N(e,t){e.invalidateQueries({queryKey:O.confidentialBalance.token(t)}),e.invalidateQueries({queryKey:O.confidentialBalances.all})}function P(e,t){N(e,t),k(e,t),K(e)}function F(e,t){N(e,t),k(e,t),A(e,t),K(e)}function I(e,t){A(e,t)}function L(e,t){N(e,t)}function R(e,t){k(e,t)}function z(e,t){e.invalidateQueries({queryKey:O.confidentialIsOperator.token(t)})}function B(e){return Array.isArray(e.queryKey)&&typeof e.queryKey[0]==`string`?e.queryKey[0].startsWith(`zama.`):!1}const V=b.enum([`balanceOf`,`confidentialBalanceOf`]),H=b.object({functionName:V}),U=b.object({contracts:b.array(b.unknown())});function W(e){if(H.safeParse(e).success)return!0;let t=U.safeParse(e);return t.success&&t.data.contracts.some(e=>H.safeParse(e).success)}function G(e){return Array.isArray(e.queryKey)&&e.queryKey.some(W)}function K(e){e.invalidateQueries({predicate:G})}function q(e){e.removeQueries({queryKey:O.decryption.all}),e.removeQueries({queryKey:O.hasPermit.all}),e.invalidateQueries({predicate:B}),K(e)}function J(e,n,r){let a=O.tokenMetadata.token(n);return{...C(r?.query??{}),queryKey:a,queryFn:async n=>{let[,{tokenAddress:r}]=n.queryKey,[a,o,c]=await Promise.all([e.provider.readContract(i(r)),e.provider.readContract(t(r)),e.provider.readContract(s(r))]);return{name:a,symbol:o,decimals:c}},staleTime:1/0,enabled:r?.query?.enabled!==!1}}function Y(t,n,r){let i=O.isConfidential.token(n);return{...C(r?.query??{}),queryKey:i,queryFn:async n=>{let[,{tokenAddress:r}]=n.queryKey;try{return await t.provider.readContract(f(r))}catch(t){if(e(t))return!1;throw t}},staleTime:1/0,enabled:r?.query?.enabled!==!1}}function X(t,n,r){let i=O.isWrapper.token(n);return{...C(r?.query??{}),queryKey:i,queryFn:async n=>{let[,{tokenAddress:r}]=n.queryKey;try{return await t.provider.readContract(u(r))}catch(t){if(e(t))return!1;throw t}},staleTime:1/0,enabled:r?.query?.enabled!==!1}}function Z(e,t,n){let r=O.totalSupply.token(t);return{...C(n?.query??{}),queryKey:r,queryFn:async t=>{let[,{tokenAddress:n}]=t.queryKey;return e.provider.readContract(ee(n))},staleTime:3e4,enabled:n?.query?.enabled!==!1}}function Q(e,t){let n=O.wrapperDiscovery.token(t.tokenAddress,t.erc20Address,t.registryAddress);return{...C(t.query??{}),queryKey:n,queryFn:async t=>{let[,{erc20Address:n}]=t.queryKey;_(n,`wrapperDiscoveryQueryOptions: erc20Address`);let r=await e.getConfidentialToken(n);return r?r.confidentialTokenAddress:null},staleTime:1/0,enabled:!!(t.tokenAddress&&t.erc20Address&&t.registryAddress)&&t.query?.enabled!==!1}}function ne(e,t,r){let i=r.owner,o=r.query?.enabled!==!1,s=O.underlyingAllowance.scope(t,i);return{...C(r.query??{}),queryKey:s,queryFn:async t=>{let[,{tokenAddress:r,owner:i}]=t.queryKey;_(i,`underlyingAllowanceQueryOptions: owner`);let o=await e.provider.readContract(n(r));return e.provider.readContract(a(o,i,r))},staleTime:3e4,enabled:!!i&&o}}function re(e,t,n){let r=O.pendingUnshield.token(t);return{...C(n?.query??{}),queryKey:r,queryFn:async t=>{let[,{tokenAddress:n}]=t.queryKey;return e.createWrappedToken(n).getPendingUnshield()},staleTime:0,enabled:n?.query?.enabled!==!1}}function ie(e,t,n){let i=n.holder,a=n.spender,o=n.query?.enabled!==!1,s=O.confidentialIsOperator.scope(t,i,a);return{...C(n.query??{}),queryKey:s,queryFn:async t=>{let[,{tokenAddress:n,holder:i,spender:a}]=t.queryKey;return _(n,`confidentialIsOperatorQueryOptions: tokenAddress`),_(i,`confidentialIsOperatorQueryOptions: holder`),_(a,`confidentialIsOperatorQueryOptions: spender`),e.provider.readContract(r(n,i,a))},staleTime:3e4,enabled:!!(t&&i&&a)&&o}}function ae(e,t,n={}){let r=t.query??{};return{...C(r),queryKey:O.confidentialBalance.owner(t.tokenAddress,t.account,n.walletAccount),queryFn:async t=>{let[,{owner:n}]=t.queryKey;return _(n,`confidentialBalanceQueryOptions: owner`),e.balanceOf(n)},enabled:!!t.account&&n.walletAccount!==void 0&&r?.enabled!==!1}}function oe(e,t,n={}){let r=t?.account,i=n.walletAccount,a=t?.query??{},o=e.map(e=>e.address);return{...C(a),queryKey:O.confidentialBalances.tokens(o,r,i),queryFn:async t=>{let[,{owner:n}]=t.queryKey;return _(n,`confidentialBalancesQueryOptions: owner`),g.batchBalancesOf(e,n)},enabled:!!r&&e.length>0&&i!==void 0&&a?.enabled!==!1}}function se(e,t){let n=!!t.registryAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenPairs(t.registryAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n}]=t.queryKey;return e.provider.readContract(d(n))},staleTime:e.registry.ttlMs,enabled:n}}function $(e,t){let n=!!t.registryAddress&&!!t.tokenAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.confidentialTokenAddress(t.registryAddress??y,t.tokenAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,tokenAddress:r}]=t.queryKey;return e.provider.readContract(p(n,r))},staleTime:e.registry.ttlMs,enabled:n}}function ce(e,t){let n=!!t.registryAddress&&!!t.confidentialTokenAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenAddress(t.registryAddress??y,t.confidentialTokenAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,confidentialTokenAddress:r}]=t.queryKey;return e.provider.readContract(l(n,r))},staleTime:e.registry.ttlMs,enabled:n}}function le(e,t){let n=!!t.registryAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenPairsLength(t.registryAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n}]=t.queryKey;return e.provider.readContract(m(n))},staleTime:e.registry.ttlMs,enabled:n}}function ue(e,t){let n=!!t.registryAddress&&t.fromIndex!==void 0&&t.toIndex!==void 0&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenPairsSlice(t.registryAddress??y,String(t.fromIndex??0n),String(t.toIndex??0n));return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,fromIndex:r,toIndex:i}]=t.queryKey;return e.provider.readContract(c(n,BigInt(r),BigInt(i)))},staleTime:e.registry.ttlMs,enabled:n}}function de(e,t){let n=!!t.registryAddress&&t.index!==void 0&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenPair(t.registryAddress??y,String(t.index??0n));return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,index:r}]=t.queryKey;return e.provider.readContract(o(n,BigInt(r)))},staleTime:e.registry.ttlMs,enabled:n}}function fe(e,t){let n=!!t.registryAddress&&!!t.confidentialTokenAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.isConfidentialTokenValid(t.registryAddress??y,t.confidentialTokenAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,confidentialTokenAddress:r}]=t.queryKey;return e.provider.readContract(te(n,r))},staleTime:e.registry.ttlMs,enabled:n}}function pe(e,t){let n=!!t.registryAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.listPairs(t.registryAddress??y,t.page??1,t.pageSize??100,t.metadata??!1);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{page:n,pageSize:r,metadata:i}]=t.queryKey;return e.listPairs({page:n,pageSize:r,metadata:i})},staleTime:e.ttlMs,enabled:n}}function me(e){return{mutationKey:[`zama.shield`,e.address],mutationFn:async({amount:t,...n})=>e.shield(t,n)}}function he(e){return{mutationKey:[`zama.confidentialTransfer`,e.address],mutationFn:async({to:t,amount:n,...r})=>e.confidentialTransfer(t,n,r)}}function ge(e){return{mutationKey:[`zama.confidentialTransferAndCall`,e.address],mutationFn:async({to:t,amount:n,data:r,...i})=>e.confidentialTransferAndCall(t,n,r,i)}}function _e(e){return{mutationKey:[`zama.confidentialTransferFrom`,e.address],mutationFn:async({from:t,to:n,amount:r,callbacks:i})=>e.confidentialTransferFrom(t,n,r,i)}}function ve(e){return{mutationKey:[`zama.confidentialTransferFromAndCall`,e.address],mutationFn:async({from:t,to:n,amount:r,data:i,callbacks:a})=>e.confidentialTransferFromAndCall(t,n,r,i,a)}}function ye(e){return{mutationKey:[`zama.confidentialSetOperator`,e.address],mutationFn:async({operator:t,until:n})=>e.setOperator(t,n)}}function be(e){return{mutationKey:[`zama.approveUnderlying`,e.address],mutationFn:async({amount:t})=>e.approveUnderlying(t)}}function xe(e){return{mutationKey:[`zama.unshield`,e.address],mutationFn:async({amount:t,...n})=>e.unshield(t,n)}}function Se(e){return{mutationKey:[`zama.unshieldAll`,e.address],mutationFn:async t=>e.unshieldAll(t||void 0)}}function Ce(e){return{mutationKey:[`zama.resumeUnshield`,e.address],mutationFn:async({unwrapTxHash:t,...n})=>e.resumeUnshield(t,n)}}function we(e){return{mutationKey:[`zama.unwrap`,e.address],mutationFn:async({amount:t})=>e.unwrap(t)}}function Te(e){return{mutationKey:[`zama.wrap`,e.address],mutationFn:async({amount:t,...n})=>e.wrap(t,n)}}function Ee(e){return{mutationKey:[`zama.unwrapAll`,e.address],mutationFn:async()=>e.unwrapAll()}}function De(e){return{mutationKey:[`zama.finalizeUnwrap`,e.address],mutationFn:async({unwrapRequestId:t})=>e.finalizeUnwrap(t)}}function Oe(e){return{mutationKey:[`zama.encrypt`],mutationFn:async t=>e.encrypt(t)}}function ke(e){return{mutationKey:[`zama.delegatedDecryptValues`],mutationFn:async t=>e.decryption.delegatedDecryptValues(t.encryptedInputs,t.delegatorAddress)}}function Ae(e){return{mutationKey:[`zama.decryptPublicValues`],mutationFn:async t=>e.decryption.decryptPublicValues(t),onSuccess:(e,t,n,r)=>{for(let[t,n]of Object.entries(e.clearValues))r.client.setQueryData(O.decryption.encryptedValue(t),n)}}}function je(e){return{mutationKey:[`zama.grantPermit`],mutationFn:t=>e.permits.grantPermit(t)}}function Me(e,t,n={}){let r=t.query?.enabled!==!1;return{...C(t?.query??{}),queryKey:O.hasPermit.scope(t.contractAddresses,n.walletAccount),queryFn:t=>{let[,{contractAddresses:n}]=t.queryKey;return e.permits.hasPermit(n)},staleTime:0,gcTime:0,refetchOnMount:`always`,refetchOnWindowFocus:!1,enabled:r&&n.walletAccount!==void 0&&t.contractAddresses.length>0}}function Ne(e){return{mutationKey:[`zama.revokePermits`],mutationFn:t=>t===void 0?e.permits.revokePermits():e.permits.revokePermits(t)}}function Pe(e){return{mutationKey:[`zama.clearCredentials`],mutationFn:()=>e.permits.clear()}}function Fe(e,t){return{mutationKey:[`zama.delegateDecryption`,t],mutationFn:async({delegateAddress:n,expirationDate:r})=>e.delegations.delegateDecryption({contractAddress:t,delegateAddress:n,expirationDate:r})}}function Ie(e,t,n={}){return{queryKey:O.decryption.encryptedInputs(t,n.walletAccount),queryFn:t=>{let[,{encryptedInputs:n}]=t.queryKey;return e.decryption.decryptValues(n)},staleTime:1/0,enabled:t.length>0&&n.walletAccount!==void 0}}function Le(e){return{mutationKey:[`zama.decryptBalanceAs`,e.address],mutationFn:async({delegatorAddress:t,accountAddress:n})=>e.decryptBalanceAs({delegatorAddress:t,accountAddress:n})}}function Re(e){return{mutationKey:[`zama.batchDecryptBalancesAs`,...e.map(e=>e.address)],mutationFn:async t=>g.batchDecryptBalancesAs(e,t)}}function ze(e,t){return{mutationKey:[`zama.revokeDelegation`,t],mutationFn:async({delegateAddress:n})=>e.delegations.revokeDelegation({contractAddress:t,delegateAddress:n})}}function Be(e,t){return{...C(t.query??{}),queryKey:O.delegationStatus.scope(t.contractAddress,t.delegatorAddress,t.delegateAddress),queryFn:async t=>{let[,{contractAddress:n,delegatorAddress:r,delegateAddress:i}]=t.queryKey;return _(n,`delegationStatusQueryOptions: contractAddress`),_(r,`delegationStatusQueryOptions: delegatorAddress`),_(i,`delegationStatusQueryOptions: delegateAddress`),e.delegations.getStatus({contractAddress:n,delegatorAddress:r,delegateAddress:i})},enabled:!!(t.contractAddress&&t.delegatorAddress&&t.delegateAddress)&&t.query?.enabled!==!1}}export{h as ZamaSDKEvents,be as approveUnderlyingMutationOptions,Re as batchDecryptBalancesAsMutationOptions,Pe as clearCredentialsMutationOptions,ae as confidentialBalanceQueryOptions,oe as confidentialBalancesQueryOptions,ie as confidentialIsOperatorQueryOptions,ye as confidentialSetOperatorMutationOptions,$ as confidentialTokenAddressQueryOptions,ge as confidentialTransferAndCallMutationOptions,ve as confidentialTransferFromAndCallMutationOptions,_e as confidentialTransferFromMutationOptions,he as confidentialTransferMutationOptions,Le as decryptBalanceAsMutationOptions,Ae as decryptPublicValuesMutationOptions,Ie as decryptValuesQueryOptions,Fe as delegateDecryptionMutationOptions,ke as delegatedDecryptValuesMutationOptions,Be as delegationStatusQueryOptions,Oe as encryptMutationOptions,C as filterQueryOptions,De as finalizeUnwrapMutationOptions,je as grantPermitMutationOptions,Me as hasPermitQueryOptions,w as hashFn,R as invalidateAfterApproveUnderlying,z as invalidateAfterSetOperator,P as invalidateAfterShield,L as invalidateAfterTransfer,F as invalidateAfterUnshield,I as invalidateAfterUnshieldSettled,j as invalidateAfterUnwrap,M as invalidateAfterWrap,N as invalidateBalanceQueries,K as invalidateWagmiBalanceQueries,q as invalidateWalletLifecycleQueries,Y as isConfidentialQueryOptions,fe as isConfidentialTokenValidQueryOptions,X as isWrapperQueryOptions,pe as listPairsQueryOptions,re as pendingUnshieldQueryOptions,Ce as resumeUnshieldMutationOptions,ze as revokeDelegationMutationOptions,Ne as revokePermitsMutationOptions,me as shieldMutationOptions,ce as tokenAddressQueryOptions,J as tokenMetadataQueryOptions,de as tokenPairQueryOptions,le as tokenPairsLengthQueryOptions,se as tokenPairsQueryOptions,ue as tokenPairsSliceQueryOptions,Z as totalSupplyQueryOptions,ne as underlyingAllowanceQueryOptions,Se as unshieldAllMutationOptions,xe as unshieldMutationOptions,Ee as unwrapAllMutationOptions,we as unwrapMutationOptions,Te as wrapMutationOptions,Q as wrapperDiscoveryQueryOptions,O as zamaQueryKeys};
1
+ import{u as e}from"../relayer-BWHOLVcG.js";import{C as t,F as n,M as r,S as i,_ as a,a as o,b as s,c,i as l,j as ee,l as te,m as u,o as d,p as f,r as p,s as m,t as h}from"../sdk-events-DI-bw_nW.js";import{t as g}from"../token-BStJgk0D.js";import{r as _}from"../assertions-Ca1ePdRJ.js";import{getAddress as v,zeroAddress as y}from"viem";import{z as b}from"zod/mini";function x(e){if(!S(e))return!1;let t=e.constructor;if(t===void 0)return!0;let n=t.prototype;return!(!S(n)||!n.hasOwnProperty(`isPrototypeOf`))}function S(e){return Object.prototype.toString.call(e)===`[object Object]`}function C(e){let{gcTime:t,staleTime:n,enabled:r,select:i,refetchInterval:a,refetchOnMount:o,refetchOnWindowFocus:s,refetchOnReconnect:c,retry:l,retryDelay:ee,retryOnMount:te,queryFn:u,queryKey:d,queryKeyHashFn:f,initialData:p,initialDataUpdatedAt:m,placeholderData:h,structuralSharing:g,throwOnError:_,meta:v,query:y,pollingInterval:b,...x}=e;return x}function w(e){return JSON.stringify(e,(e,t)=>x(t)?Object.keys(t).toSorted().reduce((e,n)=>(e[n]=t[n],e),{}):typeof t==`bigint`?t.toString():t)}const T=e=>e.map(e=>v(e)),E=e=>e===void 0?void 0:v(e),D=e=>e?{walletAddress:v(e.address),walletChainId:e.chainId}:{},O={confidentialBalance:{all:[`zama.confidentialBalance`],token:e=>[`zama.confidentialBalance`,{tokenAddress:v(e)}],owner:(e,t,n)=>[`zama.confidentialBalance`,{tokenAddress:v(e),...D(n),...t?{owner:v(t)}:{}}]},confidentialBalances:{all:[`zama.confidentialBalances`],tokens:(e,t,n)=>[`zama.confidentialBalances`,{tokenAddresses:T(e),...D(n),...t?{owner:v(t)}:{}}]},tokenMetadata:{all:[`zama.tokenMetadata`],token:e=>[`zama.tokenMetadata`,{tokenAddress:v(e)}]},isConfidential:{all:[`zama.isConfidential`],token:e=>[`zama.isConfidential`,{tokenAddress:v(e)}]},isWrapper:{all:[`zama.isWrapper`],token:e=>[`zama.isWrapper`,{tokenAddress:v(e)}]},wrapperDiscovery:{all:[`zama.wrapperDiscovery`],token:(e,t,n)=>{let r=E(e),i=E(t),a=E(n);return[`zama.wrapperDiscovery`,{...r?{tokenAddress:r}:{},...i?{erc20Address:i}:{},...a?{registryAddress:a}:{}}]}},underlyingAllowance:{all:[`zama.underlyingAllowance`],token:e=>[`zama.underlyingAllowance`,{tokenAddress:v(e)}],scope:(e,t)=>[`zama.underlyingAllowance`,{tokenAddress:v(e),...t?{owner:v(t)}:{}}]},confidentialIsOperator:{all:[`zama.confidentialIsOperator`],token:e=>{let t=E(e);return[`zama.confidentialIsOperator`,t?{tokenAddress:t}:{}]},scope:(e,t,n)=>{let r=E(e),i=E(t),a=E(n);return[`zama.confidentialIsOperator`,{...r?{tokenAddress:r}:{},...i?{holder:i}:{},...a?{spender:a}:{}}]}},totalSupply:{all:[`zama.totalSupply`],token:e=>[`zama.totalSupply`,{tokenAddress:v(e)}]},pendingUnshield:{all:[`zama.pendingUnshield`],token:e=>[`zama.pendingUnshield`,{tokenAddress:v(e)}]},hasPermit:{all:[`zama.hasPermit`],scope:(e,t)=>[`zama.hasPermit`,{...D(t),contractAddresses:T(e).toSorted()}]},delegationStatus:{all:[`zama.delegationStatus`],contract:e=>{let t=E(e);return[`zama.delegationStatus`,t?{contractAddress:t}:{}]},scope:(e,t,n)=>{let r=E(e),i=E(t),a=E(n);return[`zama.delegationStatus`,{...r?{contractAddress:r}:{},...i?{delegatorAddress:i}:{},...a?{delegateAddress:a}:{}}]}},decryption:{all:[`zama.decryption`],encryptedValue:(e,t)=>[`zama.decryption`,{encryptedValue:e,...t===void 0?{}:{contractAddress:v(t)}}],encryptedInputs:(e,t)=>[`zama.decryption`,{...D(t),encryptedInputs:[...e].toSorted((e,t)=>e.encryptedValue.localeCompare(t.encryptedValue)).map(e=>({encryptedValue:e.encryptedValue,contractAddress:v(e.contractAddress)}))}]},wrappersRegistry:{all:[`zama.wrappersRegistry`],chainId:()=>[`zama.wrappersRegistry`,{type:`chainId`}],tokenPairs:e=>[`zama.wrappersRegistry`,{type:`tokenPairs`,registryAddress:v(e)}],confidentialTokenAddress:(e,t)=>[`zama.wrappersRegistry`,{type:`confidentialTokenAddress`,registryAddress:v(e),tokenAddress:v(t)}],tokenAddress:(e,t)=>[`zama.wrappersRegistry`,{type:`tokenAddress`,registryAddress:v(e),confidentialTokenAddress:v(t)}],tokenPairsLength:e=>[`zama.wrappersRegistry`,{type:`tokenPairsLength`,registryAddress:v(e)}],tokenPairsSlice:(e,t,n)=>[`zama.wrappersRegistry`,{type:`tokenPairsSlice`,registryAddress:v(e),fromIndex:t,toIndex:n}],tokenPair:(e,t)=>[`zama.wrappersRegistry`,{type:`tokenPair`,registryAddress:v(e),index:t}],isConfidentialTokenValid:(e,t)=>[`zama.wrappersRegistry`,{type:`isConfidentialTokenValid`,registryAddress:v(e),confidentialTokenAddress:v(t)}],listPairs:(e,t,n,r)=>[`zama.wrappersRegistry`,{type:`listPairs`,registryAddress:v(e),page:t,pageSize:n,metadata:r}]}};function k(e,t){e.invalidateQueries({queryKey:O.underlyingAllowance.token(t)})}function A(e,t){e.invalidateQueries({queryKey:O.pendingUnshield.token(t)})}function j(e,t){N(e,t),k(e,t),A(e,t),K(e)}function M(e,t){N(e,t),k(e,t),K(e)}function N(e,t){e.invalidateQueries({queryKey:O.confidentialBalance.token(t)}),e.invalidateQueries({queryKey:O.confidentialBalances.all})}function P(e,t){N(e,t),k(e,t),K(e)}function F(e,t){N(e,t),k(e,t),A(e,t),K(e)}function I(e,t){A(e,t)}function L(e,t){N(e,t)}function R(e,t){k(e,t)}function z(e,t){e.invalidateQueries({queryKey:O.confidentialIsOperator.token(t)})}function B(e){return Array.isArray(e.queryKey)&&typeof e.queryKey[0]==`string`?e.queryKey[0].startsWith(`zama.`):!1}const V=b.enum([`balanceOf`,`confidentialBalanceOf`]),H=b.object({functionName:V}),U=b.object({contracts:b.array(b.unknown())});function W(e){if(H.safeParse(e).success)return!0;let t=U.safeParse(e);return t.success&&t.data.contracts.some(e=>H.safeParse(e).success)}function G(e){return Array.isArray(e.queryKey)&&e.queryKey.some(W)}function K(e){e.invalidateQueries({predicate:G})}function q(e){e.removeQueries({queryKey:O.decryption.all}),e.removeQueries({queryKey:O.hasPermit.all}),e.invalidateQueries({predicate:B}),K(e)}function J(e,n,r){let a=O.tokenMetadata.token(n);return{...C(r?.query??{}),queryKey:a,queryFn:async n=>{let[,{tokenAddress:r}]=n.queryKey,[a,o,c]=await Promise.all([e.provider.readContract(i(r)),e.provider.readContract(t(r)),e.provider.readContract(s(r))]);return{name:a,symbol:o,decimals:c}},staleTime:1/0,enabled:r?.query?.enabled!==!1}}function Y(t,n,r){let i=O.isConfidential.token(n);return{...C(r?.query??{}),queryKey:i,queryFn:async n=>{let[,{tokenAddress:r}]=n.queryKey;try{return await t.provider.readContract(f(r))}catch(t){if(e(t))return!1;throw t}},staleTime:1/0,enabled:r?.query?.enabled!==!1}}function X(t,n,r){let i=O.isWrapper.token(n);return{...C(r?.query??{}),queryKey:i,queryFn:async n=>{let[,{tokenAddress:r}]=n.queryKey;try{return await t.provider.readContract(u(r))}catch(t){if(e(t))return!1;throw t}},staleTime:1/0,enabled:r?.query?.enabled!==!1}}function Z(e,t,n){let r=O.totalSupply.token(t);return{...C(n?.query??{}),queryKey:r,queryFn:async t=>{let[,{tokenAddress:n}]=t.queryKey;return e.provider.readContract(ee(n))},staleTime:3e4,enabled:n?.query?.enabled!==!1}}function Q(e,t){let n=O.wrapperDiscovery.token(t.tokenAddress,t.erc20Address,t.registryAddress);return{...C(t.query??{}),queryKey:n,queryFn:async t=>{let[,{erc20Address:n}]=t.queryKey;_(n,`wrapperDiscoveryQueryOptions: erc20Address`);let r=await e.getConfidentialToken(n);return r?r.confidentialTokenAddress:null},staleTime:1/0,enabled:!!(t.tokenAddress&&t.erc20Address&&t.registryAddress)&&t.query?.enabled!==!1}}function ne(e,t,r){let i=r.owner,o=r.query?.enabled!==!1,s=O.underlyingAllowance.scope(t,i);return{...C(r.query??{}),queryKey:s,queryFn:async t=>{let[,{tokenAddress:r,owner:i}]=t.queryKey;_(i,`underlyingAllowanceQueryOptions: owner`);let o=await e.provider.readContract(n(r));return e.provider.readContract(a(o,i,r))},staleTime:3e4,enabled:!!i&&o}}function re(e,t,n){let r=O.pendingUnshield.token(t);return{...C(n?.query??{}),queryKey:r,queryFn:async t=>{let[,{tokenAddress:n}]=t.queryKey;return e.createWrappedToken(n).getPendingUnshield()},staleTime:0,enabled:n?.query?.enabled!==!1}}function ie(e,t,n){let i=n.holder,a=n.spender,o=n.query?.enabled!==!1,s=O.confidentialIsOperator.scope(t,i,a);return{...C(n.query??{}),queryKey:s,queryFn:async t=>{let[,{tokenAddress:n,holder:i,spender:a}]=t.queryKey;return _(n,`confidentialIsOperatorQueryOptions: tokenAddress`),_(i,`confidentialIsOperatorQueryOptions: holder`),_(a,`confidentialIsOperatorQueryOptions: spender`),e.provider.readContract(r(n,i,a))},staleTime:3e4,enabled:!!(t&&i&&a)&&o}}function ae(e,t,n={}){let r=t.query??{};return{...C(r),queryKey:O.confidentialBalance.owner(t.tokenAddress,t.account,n.walletAccount),queryFn:async t=>{let[,{owner:n}]=t.queryKey;return _(n,`confidentialBalanceQueryOptions: owner`),e.balanceOf(n)},enabled:!!t.account&&n.walletAccount!==void 0&&r?.enabled!==!1}}function oe(e,t,n={}){let r=t?.account,i=n.walletAccount,a=t?.query??{},o=e.map(e=>e.address);return{...C(a),queryKey:O.confidentialBalances.tokens(o,r,i),queryFn:async t=>{let[,{owner:n}]=t.queryKey;return _(n,`confidentialBalancesQueryOptions: owner`),g.batchBalancesOf(e,n)},enabled:!!r&&e.length>0&&i!==void 0&&a?.enabled!==!1}}function se(e,t){let n=!!t.registryAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenPairs(t.registryAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n}]=t.queryKey;return e.provider.readContract(d(n))},staleTime:e.registry.ttlMs,enabled:n}}function $(e,t){let n=!!t.registryAddress&&!!t.tokenAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.confidentialTokenAddress(t.registryAddress??y,t.tokenAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,tokenAddress:r}]=t.queryKey;return e.provider.readContract(p(n,r))},staleTime:e.registry.ttlMs,enabled:n}}function ce(e,t){let n=!!t.registryAddress&&!!t.confidentialTokenAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenAddress(t.registryAddress??y,t.confidentialTokenAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,confidentialTokenAddress:r}]=t.queryKey;return e.provider.readContract(l(n,r))},staleTime:e.registry.ttlMs,enabled:n}}function le(e,t){let n=!!t.registryAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenPairsLength(t.registryAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n}]=t.queryKey;return e.provider.readContract(m(n))},staleTime:e.registry.ttlMs,enabled:n}}function ue(e,t){let n=!!t.registryAddress&&t.fromIndex!==void 0&&t.toIndex!==void 0&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenPairsSlice(t.registryAddress??y,String(t.fromIndex??0n),String(t.toIndex??0n));return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,fromIndex:r,toIndex:i}]=t.queryKey;return e.provider.readContract(c(n,BigInt(r),BigInt(i)))},staleTime:e.registry.ttlMs,enabled:n}}function de(e,t){let n=!!t.registryAddress&&t.index!==void 0&&t.query?.enabled!==!1,r=O.wrappersRegistry.tokenPair(t.registryAddress??y,String(t.index??0n));return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,index:r}]=t.queryKey;return e.provider.readContract(o(n,BigInt(r)))},staleTime:e.registry.ttlMs,enabled:n}}function fe(e,t){let n=!!t.registryAddress&&!!t.confidentialTokenAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.isConfidentialTokenValid(t.registryAddress??y,t.confidentialTokenAddress??y);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{registryAddress:n,confidentialTokenAddress:r}]=t.queryKey;return e.provider.readContract(te(n,r))},staleTime:e.registry.ttlMs,enabled:n}}function pe(e,t){let n=!!t.registryAddress&&t.query?.enabled!==!1,r=O.wrappersRegistry.listPairs(t.registryAddress??y,t.page??1,t.pageSize??100,t.metadata??!1);return{...C(t.query??{}),queryKey:r,queryFn:async t=>{let[,{page:n,pageSize:r,metadata:i}]=t.queryKey;return e.listPairs({page:n,pageSize:r,metadata:i})},staleTime:e.ttlMs,enabled:n}}function me(e){return{mutationKey:[`zama.shield`,e.address],mutationFn:async({amount:t,...n})=>e.shield(t,n)}}function he(e){return{mutationKey:[`zama.confidentialTransfer`,e.address],mutationFn:async({to:t,amount:n,...r})=>e.confidentialTransfer(t,n,r)}}function ge(e){return{mutationKey:[`zama.confidentialTransferAndCall`,e.address],mutationFn:async({to:t,amount:n,data:r,...i})=>e.confidentialTransferAndCall(t,n,r,i)}}function _e(e){return{mutationKey:[`zama.confidentialTransferFrom`,e.address],mutationFn:async({from:t,to:n,amount:r,callbacks:i})=>e.confidentialTransferFrom(t,n,r,i)}}function ve(e){return{mutationKey:[`zama.confidentialTransferFromAndCall`,e.address],mutationFn:async({from:t,to:n,amount:r,data:i,callbacks:a})=>e.confidentialTransferFromAndCall(t,n,r,i,a)}}function ye(e){return{mutationKey:[`zama.confidentialSetOperator`,e.address],mutationFn:async({operator:t,until:n})=>e.setOperator(t,n)}}function be(e){return{mutationKey:[`zama.approveUnderlying`,e.address],mutationFn:async({amount:t})=>e.approveUnderlying(t)}}function xe(e){return{mutationKey:[`zama.unshield`,e.address],mutationFn:async({amount:t,...n})=>e.unshield(t,n)}}function Se(e){return{mutationKey:[`zama.unshieldAll`,e.address],mutationFn:async t=>e.unshieldAll(t||void 0)}}function Ce(e){return{mutationKey:[`zama.resumeUnshield`,e.address],mutationFn:async({unwrapTxHash:t,...n})=>e.resumeUnshield(t,n)}}function we(e){return{mutationKey:[`zama.unwrap`,e.address],mutationFn:async({amount:t})=>e.unwrap(t)}}function Te(e){return{mutationKey:[`zama.wrap`,e.address],mutationFn:async({amount:t,...n})=>e.wrap(t,n)}}function Ee(e){return{mutationKey:[`zama.unwrapAll`,e.address],mutationFn:async()=>e.unwrapAll()}}function De(e){return{mutationKey:[`zama.finalizeUnwrap`,e.address],mutationFn:async({unwrapRequestId:t})=>e.finalizeUnwrap(t)}}function Oe(e){return{mutationKey:[`zama.encrypt`],mutationFn:async t=>e.encrypt(t)}}function ke(e){return{mutationKey:[`zama.delegatedDecryptValues`],mutationFn:async t=>e.decryption.delegatedDecryptValues(t.encryptedInputs,t.delegatorAddress)}}function Ae(e){return{mutationKey:[`zama.decryptPublicValues`],mutationFn:async t=>e.decryption.decryptPublicValues(t),onSuccess:(e,t,n,r)=>{for(let[t,n]of Object.entries(e.clearValues))r.client.setQueryData(O.decryption.encryptedValue(t),n)}}}function je(e){return{mutationKey:[`zama.grantPermit`],mutationFn:t=>e.permits.grantPermit(t)}}function Me(e,t,n={}){let r=t.query?.enabled!==!1;return{...C(t?.query??{}),queryKey:O.hasPermit.scope(t.contractAddresses,n.walletAccount),queryFn:t=>{let[,{contractAddresses:n}]=t.queryKey;return e.permits.hasPermit(n)},staleTime:0,gcTime:0,refetchOnMount:`always`,refetchOnWindowFocus:!1,enabled:r&&n.walletAccount!==void 0&&t.contractAddresses.length>0}}function Ne(e){return{mutationKey:[`zama.revokePermits`],mutationFn:t=>t===void 0?e.permits.revokePermits():e.permits.revokePermits(t)}}function Pe(e){return{mutationKey:[`zama.clearCredentials`],mutationFn:()=>e.permits.clear()}}function Fe(e,t){return{mutationKey:[`zama.delegateDecryption`,t],mutationFn:async({delegateAddress:n,expirationDate:r})=>e.delegations.delegateDecryption({contractAddress:t,delegateAddress:n,expirationDate:r})}}function Ie(e,t,n={}){return{queryKey:O.decryption.encryptedInputs(t,n.walletAccount),queryFn:t=>{let[,{encryptedInputs:n}]=t.queryKey;return e.decryption.decryptValues(n)},staleTime:1/0,enabled:t.length>0&&n.walletAccount!==void 0}}function Le(e){return{mutationKey:[`zama.decryptBalanceAs`,e.address],mutationFn:async({delegatorAddress:t,accountAddress:n})=>e.decryptBalanceAs({delegatorAddress:t,accountAddress:n})}}function Re(e){return{mutationKey:[`zama.batchDecryptBalancesAs`,...e.map(e=>e.address)],mutationFn:async t=>g.batchDecryptBalancesAs(e,t)}}function ze(e,t){return{mutationKey:[`zama.revokeDelegation`,t],mutationFn:async({delegateAddress:n})=>e.delegations.revokeDelegation({contractAddress:t,delegateAddress:n})}}function Be(e,t){return{...C(t.query??{}),queryKey:O.delegationStatus.scope(t.contractAddress,t.delegatorAddress,t.delegateAddress),queryFn:async t=>{let[,{contractAddress:n,delegatorAddress:r,delegateAddress:i}]=t.queryKey;return _(n,`delegationStatusQueryOptions: contractAddress`),_(r,`delegationStatusQueryOptions: delegatorAddress`),_(i,`delegationStatusQueryOptions: delegateAddress`),e.delegations.getStatus({contractAddress:n,delegatorAddress:r,delegateAddress:i})},enabled:!!(t.contractAddress&&t.delegatorAddress&&t.delegateAddress)&&t.query?.enabled!==!1}}export{h as ZamaSDKEvents,be as approveUnderlyingMutationOptions,Re as batchDecryptBalancesAsMutationOptions,Pe as clearCredentialsMutationOptions,ae as confidentialBalanceQueryOptions,oe as confidentialBalancesQueryOptions,ie as confidentialIsOperatorQueryOptions,ye as confidentialSetOperatorMutationOptions,$ as confidentialTokenAddressQueryOptions,ge as confidentialTransferAndCallMutationOptions,ve as confidentialTransferFromAndCallMutationOptions,_e as confidentialTransferFromMutationOptions,he as confidentialTransferMutationOptions,Le as decryptBalanceAsMutationOptions,Ae as decryptPublicValuesMutationOptions,Ie as decryptValuesQueryOptions,Fe as delegateDecryptionMutationOptions,ke as delegatedDecryptValuesMutationOptions,Be as delegationStatusQueryOptions,Oe as encryptMutationOptions,C as filterQueryOptions,De as finalizeUnwrapMutationOptions,je as grantPermitMutationOptions,Me as hasPermitQueryOptions,w as hashFn,R as invalidateAfterApproveUnderlying,z as invalidateAfterSetOperator,P as invalidateAfterShield,L as invalidateAfterTransfer,F as invalidateAfterUnshield,I as invalidateAfterUnshieldSettled,j as invalidateAfterUnwrap,M as invalidateAfterWrap,N as invalidateBalanceQueries,K as invalidateWagmiBalanceQueries,q as invalidateWalletLifecycleQueries,Y as isConfidentialQueryOptions,fe as isConfidentialTokenValidQueryOptions,X as isWrapperQueryOptions,pe as listPairsQueryOptions,re as pendingUnshieldQueryOptions,Ce as resumeUnshieldMutationOptions,ze as revokeDelegationMutationOptions,Ne as revokePermitsMutationOptions,me as shieldMutationOptions,ce as tokenAddressQueryOptions,J as tokenMetadataQueryOptions,de as tokenPairQueryOptions,le as tokenPairsLengthQueryOptions,se as tokenPairsQueryOptions,ue as tokenPairsSliceQueryOptions,Z as totalSupplyQueryOptions,ne as underlyingAllowanceQueryOptions,Se as unshieldAllMutationOptions,xe as unshieldMutationOptions,Ee as unwrapAllMutationOptions,we as unwrapMutationOptions,Te as wrapMutationOptions,Q as wrapperDiscoveryQueryOptions,O as zamaQueryKeys};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import{_ as e,i as t,r as n,t as r}from"./relayer-BWHOLVcG.js";import{B as i,C as a,D as o,E as s,G as c,H as l,K as u,M as d,O as f,P as p,S as m,W as h,b as g,d as _,f as v,g as y,k as b,n as x,q as S,t as C,w,z as T}from"./sdk-events-DI-bw_nW.js";import{t as E}from"./assertions-Ca1ePdRJ.js";import{getAddress as D}from"viem";var O=class extends n{constructor(e,n){super(t.EncryptionFailed,e,n),this.name=`EncryptionFailedError`}},k=class extends n{constructor(e,n){super(t.DecryptionFailed,e,n),this.name=`DecryptionFailedError`}},A=class extends n{retryAfter;constructor(e,n){let{retryAfter:r,...i}=n??{};super(t.RpcRateLimited,e,i),this.name=`RpcRateLimitError`,this.retryAfter=r}},j=class extends n{operation;signerChainId;providerChainId;constructor({operation:e,signerChainId:n,providerChainId:r},i){super(t.ChainMismatch,`Operation "${e}" requires signer and provider to be on the same chain, but signer is on chain ${n} and provider is on chain ${r}.`,i),this.name=`ChainMismatchError`,this.operation=e,this.signerChainId=n,this.providerChainId=r}},M=class extends n{requested;available;token;constructor(e,n,r){super(t.InsufficientConfidentialBalance,e,r),this.name=`InsufficientConfidentialBalanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},N=class extends n{requested;available;token;constructor(e,n,r){super(t.InsufficientERC20Balance,e,r),this.name=`InsufficientERC20BalanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},P=class extends n{requested;available;token;constructor(e,n,r){super(t.InsufficientAllowance,e,r),this.name=`InsufficientAllowanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},F=class extends n{constructor(e,n){super(t.BalanceCheckUnavailable,e,n),this.name=`BalanceCheckUnavailableError`}},I=class extends n{constructor(e,n){super(t.ERC20ReadFailed,e,n),this.name=`ERC20ReadFailedError`}};function L(e){return e instanceof S||e instanceof u||e instanceof r||e instanceof A}const R={ebool:0,euint8:2,euint16:3,euint32:4,euint64:5,euint128:6,eaddress:7,euint256:8},z={0:`ebool`,2:`euint8`,3:`euint16`,4:`euint32`,5:`euint64`,6:`euint128`,7:`eaddress`,8:`euint256`},B={0:2,2:8,3:16,4:32,5:64,6:128,7:160,8:256};Object.freeze(R),Object.freeze(z),Object.freeze(B),Object.freeze({2:0,8:2,16:3,32:4,64:5,128:6,160:7,256:8});function V(e){switch(e){case 0:case 2:case 3:case 4:case 5:case 6:case 7:case 8:return!0;default:return!1}}function H(e){if(!V(e))throw Error(`Invalid FheType id '${e}'`);let t=B[e];if(t<2)throw Error(`Invalid FheType encryption bit width: ${t}. Minimum is 2 bits.`);return t}const U=`0x0000000000000000000000000000000000000000000000000000000000000000`;function W(e){return e===`0x0000000000000000000000000000000000000000000000000000000000000000`||e===`0x`}function G(e){let t;try{t=BigInt(e)}catch{return 256}let n=Number(t>>8n&255n);return V(n)?H(n):256}function K(e,t=2048){let n=[],r=[],i=0;for(let a of e){let e=G(a);r.length>0&&i+e>t&&(n.push(r),r=[],i=0),r.push(a),i+=e}return r.length>0&&n.push(r),n}async function q(e,t,n){if(!t)throw new i(e);let r;try{r=t.requireWalletAccount(e)}catch(n){if(!(n instanceof l)||!t.refreshWalletAccount)throw n;await t.refreshWalletAccount(),r=t.requireWalletAccount(e)}let a=await n.getChainId();if(r.chainId!==a)throw new j({operation:e,signerChainId:r.chainId,providerChainId:a});return r}async function J(e,t,n){return(await q(e,t,n)).chainId}async function Y(e,t=1/0){if(Number.isFinite(t)&&t<=0)throw Error(`maxConcurrency must be a positive number`);if(!Number.isFinite(t)||t>=e.length)return Promise.all(e.map(e=>e()));let n=Array.from({length:e.length}),r=0;async function i(){for(;r<e.length;){let t=r++;e[t]&&(n[t]=await e[t]())}}return await Promise.all(Array.from({length:t},i)),n}async function X(e){let{operation:t,signer:r,provider:i,config:a,emit:o,onSubmitted:s,logger:l}=e,u=x[t];try{let e=await r.writeContract(a);return o(u.submittedEvent(e)),T(`${t}: onSubmitted`,()=>s?.(e),l),{txHash:e,receipt:await i.waitForTransactionReceipt(e)}}catch(e){let r=e instanceof n?e:new c(`Transaction failed during ${t}`,{cause:e});throw o({type:C.TransactionError,operation:t,error:r}),r}}var Z=class t{sdk;address;constructor(e,t){this.sdk=e,this.address=D(t)}#e(e){return h(this.sdk.signer,e)}async name(){return this.sdk.provider.readContract(m(this.address))}async symbol(){return this.sdk.provider.readContract(a(this.address))}async decimals(){return this.sdk.provider.readContract(g(this.address))}async isConfidential(){return this.sdk.provider.readContract(y(this.address,_))}async isWrapper(){return this.sdk.provider.readContract(y(this.address,v))}async balanceOf(e){let t=D(e),n=await this.readConfidentialBalanceOf(t),r=(await this.sdk.decryption.decryptValues([{encryptedValue:n,contractAddress:this.address}]))[n];if(r===void 0)throw new k(`Decryption returned no value for ${n}`);return E(r,`balanceOf: result[encryptedValue]`),r}async confidentialBalanceOf(e){return this.readConfidentialBalanceOf(D(e))}async decryptBalanceAs({delegatorAddress:e,accountAddress:t}){await J(`decryptBalanceAs`,this.sdk.signer,this.sdk.provider);let n=D(e),r=t?D(t):n,i=await this.readConfidentialBalanceOf(r);if(W(i))return 0n;let a=(await this.sdk.decryption.delegatedDecryptValues([{encryptedValue:i,contractAddress:this.address}],n,r))[i];if(a===void 0)throw new k(`Delegated decryption returned no value for ${i}`);return E(a,`decryptBalanceAs: result[encryptedValue]`),a}static async batchBalancesOf(r,i){let a=new Map,o=new Map;if(r.length===0)return{results:a,errors:o};let s=t.assertSameSdk(r);await J(`batchBalancesOf`,s.signer,s.provider),await s.permits.grantPermit(r.map(e=>e.address));let c=await Y(r.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.balanceOf(i)}}catch(e){return{status:`rejected`,reason:e}}}),5);for(let t=0;t<r.length;t++){let i=r[t].address,s=c[t];if(s.status===`fulfilled`)a.set(i,s.value);else{let t=s.reason;if(L(t))throw t;let r=t instanceof n?t:new k(e(t).message,{cause:t});o.set(i,r)}}if(o.size===r.length)throw o.values().next().value??new k(`All token balance decryptions failed`);return{results:a,errors:o}}static async batchDecryptBalancesAs(n,r){if(n.length===0)return new Map;let i=t.assertSameSdk(n),a=new Map,o=new Map,s=r.accountAddress?D(r.accountAddress):D(r.delegatorAddress),c=r.maxConcurrency??10;if(r.encryptedValues&&n.length!==r.encryptedValues.length)throw new k(`tokens.length (${n.length}) must equal encryptedValues.length (${r.encryptedValues.length})`);let l=r.encryptedValues??await t.readBalanceHandlesBatch(n,s,o,c),u=[];for(let[e,t]of n.entries()){let n=l[e];!n||o.has(t.address)||(W(n)?a.set(t.address,0n):u.push({token:t,encryptedValue:n}))}if(u.length>0){let e=await i.decryption.delegatedBatchDecryptValues({encryptedInputs:u.map(({token:e,encryptedValue:t})=>({encryptedValue:t,contractAddress:e.address})),delegatorAddress:r.delegatorAddress,accountAddress:r.accountAddress,maxConcurrency:c});for(let[t,n]of e.items.entries()){let e=u[t];if(!e)continue;if(n.error){o.set(e.token.address,n.error);continue}let r=n.value;if(r===void 0){o.set(e.token.address,new k(`Batch delegated decryption returned no value for ${n.encryptedValue} on token ${e.token.address}`));continue}E(r,`batchDecryptBalancesAs: result[encryptedValue]`),a.set(e.token.address,r)}}if(o.size===0)return a;if(r.onError){let t=[];for(let[n,i]of o)try{a.set(n,r.onError(i,n))}catch(r){t.push({address:n,error:e(r)})}if(t.length>0){let e=t.map(({address:e,error:t})=>`${e}: ${t.message}`).join(`; `);throw new k(`Batch delegated decryption onError callback failed for ${t.length} token(s): ${e}`,{cause:t[0]?.error})}return a}let d=Array.from(o.entries()),f=d.map(([e,t])=>`${e}: ${t.message}`).join(`; `);throw new k(`Batch delegated decryption failed for ${o.size} token(s): ${f}`,{cause:d[0]?.[1]})}static async readBalanceHandlesBatch(t,r,i,a){let o=await Y(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.readConfidentialBalanceOf(r)}}catch(e){return{status:`rejected`,reason:e}}}),a),s=[];for(let[r,a]of t.entries()){let t=o[r];if(t){if(t.status===`fulfilled`){s[r]=t.value;continue}if(L(t.reason))throw t.reason;i.set(a.address,t.reason instanceof n?t.reason:new k(e(t.reason).message,{cause:t.reason}))}}return s}async confidentialTransfer(e,t,n){this.#e(`confidentialTransfer`);let r=await q(`confidentialTransfer`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:i=!1,onEncryptComplete:a,onTransferSubmitted:s}=n??{},c=D(e);i||await this.assertConfidentialBalance(t);let{encryptedValues:l,inputProof:u}=await this.sdk.encrypt({values:[{value:t,type:`euint64`}],contractAddress:this.address,userAddress:D(r.address)});if(T(`transfer: onEncryptComplete`,()=>a?.(),this.sdk.logger),l.length===0)throw new O(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transfer`,config:o(this.address,c,l[0],u),onSubmitted:s})}async confidentialTransferFrom(e,t,n,r){this.#e(`confidentialTransferFrom`),await q(`confidentialTransferFrom`,this.sdk.signer,this.sdk.provider);let i=D(e),a=D(t),{encryptedValues:o,inputProof:s}=await this.sdk.encrypt({values:[{value:n,type:`euint64`}],contractAddress:this.address,userAddress:i});if(T(`transferFrom: onEncryptComplete`,()=>r?.onEncryptComplete?.(),this.sdk.logger),o.length===0)throw new O(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFrom`,config:b(this.address,i,a,o[0],s),onSubmitted:r?.onTransferSubmitted})}async confidentialTransferAndCall(e,t,n,r){this.#e(`confidentialTransferAndCall`);let i=await q(`confidentialTransferAndCall`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:a=!1,onEncryptComplete:o,onTransferSubmitted:c}=r??{},l=D(e);a||await this.assertConfidentialBalance(t);let{encryptedValues:u,inputProof:d}=await this.sdk.encrypt({values:[{value:t,type:`euint64`}],contractAddress:this.address,userAddress:D(i.address)});if(T(`transferAndCall: onEncryptComplete`,()=>o?.(),this.sdk.logger),u.length===0)throw new O(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferAndCall`,config:s(this.address,l,u[0],d,n),onSubmitted:c})}async confidentialTransferFromAndCall(e,t,n,r,i){this.#e(`confidentialTransferFromAndCall`),await q(`confidentialTransferFromAndCall`,this.sdk.signer,this.sdk.provider);let a=D(e),o=D(t),{encryptedValues:s,inputProof:c}=await this.sdk.encrypt({values:[{value:n,type:`euint64`}],contractAddress:this.address,userAddress:a});if(T(`transferFromAndCall: onEncryptComplete`,()=>i?.onEncryptComplete?.(),this.sdk.logger),s.length===0)throw new O(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFromAndCall`,config:f(this.address,a,o,s[0],c,r),onSubmitted:i?.onTransferSubmitted})}async setOperator(e,t){this.#e(`setOperator`),await J(`setOperator`,this.sdk.signer,this.sdk.provider);let n=D(e);return this.submitTransaction({operation:`setOperator`,config:p(this.address,n,t)})}async isOperator(e,t){return this.sdk.provider.readContract(d(this.address,D(e),D(t)))}async readConfidentialBalanceOf(e){return await this.sdk.provider.readContract(w(this.address,e))}async assertConfidentialBalance(e){if(e===0n)return;let t;try{let e=await q(`assertConfidentialBalance`,this.sdk.signer,this.sdk.provider);t=await this.balanceOf(D(e.address))}catch(e){throw e instanceof n?e:new F(`Balance validation failed (token: ${this.address})`,{cause:e})}if(t<e)throw new M(`Insufficient confidential balance: requested ${e}, available ${t} (token: ${this.address})`,{requested:e,available:t,token:this.address})}emit(e){this.sdk.emitEvent(e,this.address)}async submitTransaction(e){let{operation:t,config:n,onSubmitted:r}=e;return X({operation:t,signer:this.#e(t),provider:this.sdk.provider,config:n,emit:e=>this.emit(e),onSubmitted:r,logger:this.sdk.logger})}static assertSameSdk(e){let t=e[0].sdk;for(let n=1;n<e.length;n++)if(e[n].sdk!==t)throw new r(`All tokens in a batch operation must share the same ZamaSDK instance`);return t}};export{k as _,J as a,W as c,I as d,P as f,A as g,j as h,q as i,L as l,N as m,X as n,U as o,M as p,Y as r,K as s,Z as t,F as u,O as v};
2
- //# sourceMappingURL=token-BBInYv3L.js.map
1
+ import{_ as e,i as t,r as n,t as r}from"./relayer-BWHOLVcG.js";import{B as i,C as a,D as o,E as s,G as c,H as l,K as u,M as d,O as f,P as p,S as m,W as h,b as g,d as _,f as v,g as y,k as b,n as x,q as S,t as C,w,z as T}from"./sdk-events-DI-bw_nW.js";import{t as E}from"./assertions-Ca1ePdRJ.js";import{getAddress as D}from"viem";var O=class extends n{constructor(e,n){super(t.EncryptionFailed,e,n),this.name=`EncryptionFailedError`}},k=class extends n{constructor(e,n){super(t.DecryptionFailed,e,n),this.name=`DecryptionFailedError`}},A=class extends n{retryAfter;constructor(e,n){let{retryAfter:r,...i}=n??{};super(t.RpcRateLimited,e,i),this.name=`RpcRateLimitError`,this.retryAfter=r}},j=class extends n{operation;signerChainId;providerChainId;constructor({operation:e,signerChainId:n,providerChainId:r},i){super(t.ChainMismatch,`Operation "${e}" requires signer and provider to be on the same chain, but signer is on chain ${n} and provider is on chain ${r}.`,i),this.name=`ChainMismatchError`,this.operation=e,this.signerChainId=n,this.providerChainId=r}},M=class extends n{requested;available;token;constructor(e,n,r){super(t.InsufficientConfidentialBalance,e,r),this.name=`InsufficientConfidentialBalanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},N=class extends n{requested;available;token;constructor(e,n,r){super(t.InsufficientERC20Balance,e,r),this.name=`InsufficientERC20BalanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},P=class extends n{requested;available;token;constructor(e,n,r){super(t.InsufficientAllowance,e,r),this.name=`InsufficientAllowanceError`,this.requested=n.requested,this.available=n.available,this.token=n.token}},F=class extends n{constructor(e,n){super(t.BalanceCheckUnavailable,e,n),this.name=`BalanceCheckUnavailableError`}},I=class extends n{constructor(e,n){super(t.ERC20ReadFailed,e,n),this.name=`ERC20ReadFailedError`}};function L(e){return e instanceof S||e instanceof u||e instanceof r||e instanceof A}const R={ebool:0,euint8:2,euint16:3,euint32:4,euint64:5,euint128:6,eaddress:7,euint256:8},z={0:`ebool`,2:`euint8`,3:`euint16`,4:`euint32`,5:`euint64`,6:`euint128`,7:`eaddress`,8:`euint256`},B={0:2,2:8,3:16,4:32,5:64,6:128,7:160,8:256};Object.freeze(R),Object.freeze(z),Object.freeze(B),Object.freeze({2:0,8:2,16:3,32:4,64:5,128:6,160:7,256:8});function V(e){switch(e){case 0:case 2:case 3:case 4:case 5:case 6:case 7:case 8:return!0;default:return!1}}function H(e){if(!V(e))throw Error(`Invalid FheType id '${e}'`);let t=B[e];if(t<2)throw Error(`Invalid FheType encryption bit width: ${t}. Minimum is 2 bits.`);return t}const U=`0x0000000000000000000000000000000000000000000000000000000000000000`;function W(e){return e===`0x0000000000000000000000000000000000000000000000000000000000000000`||e===`0x`}function G(e){let t;try{t=BigInt(e)}catch{return 256}let n=Number(t>>8n&255n);return V(n)?H(n):256}function K(e,t=2048){let n=[],r=[],i=0;for(let a of e){let e=G(a);r.length>0&&i+e>t&&(n.push(r),r=[],i=0),r.push(a),i+=e}return r.length>0&&n.push(r),n}async function q(e,t,n){if(!t)throw new i(e);let r;try{r=t.requireWalletAccount(e)}catch(n){if(!(n instanceof l)||!t.refreshWalletAccount)throw n;await t.refreshWalletAccount(),r=t.requireWalletAccount(e)}let a=await n.getChainId();if(r.chainId!==a)throw new j({operation:e,signerChainId:r.chainId,providerChainId:a});return r}async function J(e,t,n){return(await q(e,t,n)).chainId}async function Y(e,t=1/0){if(Number.isFinite(t)&&t<=0)throw Error(`maxConcurrency must be a positive number`);if(!Number.isFinite(t)||t>=e.length)return Promise.all(e.map(e=>e()));let n=Array.from({length:e.length}),r=0;async function i(){for(;r<e.length;){let t=r++;e[t]&&(n[t]=await e[t]())}}return await Promise.all(Array.from({length:t},i)),n}async function X(e){let{operation:t,signer:r,provider:i,config:a,emit:o,onSubmitted:s,logger:l}=e,u=x[t];try{let e=await r.writeContract(a);return o(u.submittedEvent(e)),T(`${t}: onSubmitted`,()=>s?.(e),l),{txHash:e,receipt:await i.waitForTransactionReceipt(e)}}catch(e){let r=e instanceof n?e:new c(`Transaction failed during ${t}`,{cause:e});throw o({type:C.TransactionError,operation:t,error:r}),r}}var Z=class t{sdk;address;constructor(e,t){this.sdk=e,this.address=D(t)}#e(e){return h(this.sdk.signer,e)}async name(){return this.sdk.provider.readContract(m(this.address))}async symbol(){return this.sdk.provider.readContract(a(this.address))}async decimals(){return this.sdk.provider.readContract(g(this.address))}async isConfidential(){return this.sdk.provider.readContract(y(this.address,_))}async isWrapper(){return this.sdk.provider.readContract(y(this.address,v))}async balanceOf(e){let t=D(e),n=await this.readConfidentialBalanceOf(t),r=(await this.sdk.decryption.decryptValues([{encryptedValue:n,contractAddress:this.address}]))[n];if(r===void 0)throw new k(`Decryption returned no value for ${n}`);return E(r,`balanceOf: result[encryptedValue]`),r}async confidentialBalanceOf(e){return this.readConfidentialBalanceOf(D(e))}async decryptBalanceAs({delegatorAddress:e,accountAddress:t}){await J(`decryptBalanceAs`,this.sdk.signer,this.sdk.provider);let n=D(e),r=t?D(t):n,i=await this.readConfidentialBalanceOf(r);if(W(i))return 0n;let a=(await this.sdk.decryption.delegatedDecryptValues([{encryptedValue:i,contractAddress:this.address}],n,r))[i];if(a===void 0)throw new k(`Delegated decryption returned no value for ${i}`);return E(a,`decryptBalanceAs: result[encryptedValue]`),a}static async batchBalancesOf(r,i){let a=new Map,o=new Map;if(r.length===0)return{results:a,errors:o};let s=t.assertSameSdk(r);await J(`batchBalancesOf`,s.signer,s.provider),await s.permits.grantPermit(r.map(e=>e.address));let c=await Y(r.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.balanceOf(i)}}catch(e){return{status:`rejected`,reason:e}}}),5);for(let t=0;t<r.length;t++){let i=r[t].address,s=c[t];if(s.status===`fulfilled`)a.set(i,s.value);else{let t=s.reason;if(L(t))throw t;let r=t instanceof n?t:new k(e(t).message,{cause:t});o.set(i,r)}}if(o.size===r.length)throw o.values().next().value??new k(`All token balance decryptions failed`);return{results:a,errors:o}}static async batchDecryptBalancesAs(n,r){if(n.length===0)return new Map;let i=t.assertSameSdk(n),a=new Map,o=new Map,s=r.accountAddress?D(r.accountAddress):D(r.delegatorAddress),c=r.maxConcurrency??10;if(r.encryptedValues&&n.length!==r.encryptedValues.length)throw new k(`tokens.length (${n.length}) must equal encryptedValues.length (${r.encryptedValues.length})`);let l=r.encryptedValues??await t.readBalanceHandlesBatch(n,s,o,c),u=[];for(let[e,t]of n.entries()){let n=l[e];!n||o.has(t.address)||(W(n)?a.set(t.address,0n):u.push({token:t,encryptedValue:n}))}if(u.length>0){let e=await i.decryption.delegatedBatchDecryptValues({encryptedInputs:u.map(({token:e,encryptedValue:t})=>({encryptedValue:t,contractAddress:e.address})),delegatorAddress:r.delegatorAddress,accountAddress:r.accountAddress,maxConcurrency:c});for(let[t,n]of e.items.entries()){let e=u[t];if(!e)continue;if(n.error){o.set(e.token.address,n.error);continue}let r=n.value;if(r===void 0){o.set(e.token.address,new k(`Batch delegated decryption returned no value for ${n.encryptedValue} on token ${e.token.address}`));continue}E(r,`batchDecryptBalancesAs: result[encryptedValue]`),a.set(e.token.address,r)}}if(o.size===0)return a;if(r.onError){let t=[];for(let[n,i]of o)try{a.set(n,r.onError(i,n))}catch(r){t.push({address:n,error:e(r)})}if(t.length>0){let e=t.map(({address:e,error:t})=>`${e}: ${t.message}`).join(`; `);throw new k(`Batch delegated decryption onError callback failed for ${t.length} token(s): ${e}`,{cause:t[0]?.error})}return a}let d=Array.from(o.entries()),f=d.map(([e,t])=>`${e}: ${t.message}`).join(`; `);throw new k(`Batch delegated decryption failed for ${o.size} token(s): ${f}`,{cause:d[0]?.[1]})}static async readBalanceHandlesBatch(t,r,i,a){let o=await Y(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.readConfidentialBalanceOf(r)}}catch(e){return{status:`rejected`,reason:e}}}),a),s=[];for(let[r,a]of t.entries()){let t=o[r];if(t){if(t.status===`fulfilled`){s[r]=t.value;continue}if(L(t.reason))throw t.reason;i.set(a.address,t.reason instanceof n?t.reason:new k(e(t.reason).message,{cause:t.reason}))}}return s}async confidentialTransfer(e,t,n){this.#e(`confidentialTransfer`);let r=await q(`confidentialTransfer`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:i=!1,onEncryptComplete:a,onTransferSubmitted:s}=n??{},c=D(e);i||await this.assertConfidentialBalance(t);let{encryptedValues:l,inputProof:u}=await this.sdk.encrypt({values:[{value:t,type:`euint64`}],contractAddress:this.address,userAddress:D(r.address)});if(T(`transfer: onEncryptComplete`,()=>a?.(),this.sdk.logger),l.length===0)throw new O(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transfer`,config:o(this.address,c,l[0],u),onSubmitted:s})}async confidentialTransferFrom(e,t,n,r){this.#e(`confidentialTransferFrom`);let i=await q(`confidentialTransferFrom`,this.sdk.signer,this.sdk.provider),a=D(e),o=D(t),{encryptedValues:s,inputProof:c}=await this.sdk.encrypt({values:[{value:n,type:`euint64`}],contractAddress:this.address,userAddress:D(i.address)});if(T(`transferFrom: onEncryptComplete`,()=>r?.onEncryptComplete?.(),this.sdk.logger),s.length===0)throw new O(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFrom`,config:b(this.address,a,o,s[0],c),onSubmitted:r?.onTransferSubmitted})}async confidentialTransferAndCall(e,t,n,r){this.#e(`confidentialTransferAndCall`);let i=await q(`confidentialTransferAndCall`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:a=!1,onEncryptComplete:o,onTransferSubmitted:c}=r??{},l=D(e);a||await this.assertConfidentialBalance(t);let{encryptedValues:u,inputProof:d}=await this.sdk.encrypt({values:[{value:t,type:`euint64`}],contractAddress:this.address,userAddress:D(i.address)});if(T(`transferAndCall: onEncryptComplete`,()=>o?.(),this.sdk.logger),u.length===0)throw new O(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferAndCall`,config:s(this.address,l,u[0],d,n),onSubmitted:c})}async confidentialTransferFromAndCall(e,t,n,r,i){this.#e(`confidentialTransferFromAndCall`);let a=await q(`confidentialTransferFromAndCall`,this.sdk.signer,this.sdk.provider),o=D(e),s=D(t),{encryptedValues:c,inputProof:l}=await this.sdk.encrypt({values:[{value:n,type:`euint64`}],contractAddress:this.address,userAddress:D(a.address)});if(T(`transferFromAndCall: onEncryptComplete`,()=>i?.onEncryptComplete?.(),this.sdk.logger),c.length===0)throw new O(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFromAndCall`,config:f(this.address,o,s,c[0],l,r),onSubmitted:i?.onTransferSubmitted})}async setOperator(e,t){this.#e(`setOperator`),await J(`setOperator`,this.sdk.signer,this.sdk.provider);let n=D(e);return this.submitTransaction({operation:`setOperator`,config:p(this.address,n,t)})}async isOperator(e,t){return this.sdk.provider.readContract(d(this.address,D(e),D(t)))}async readConfidentialBalanceOf(e){return await this.sdk.provider.readContract(w(this.address,e))}async assertConfidentialBalance(e){if(e===0n)return;let t;try{let e=await q(`assertConfidentialBalance`,this.sdk.signer,this.sdk.provider);t=await this.balanceOf(D(e.address))}catch(e){throw e instanceof n?e:new F(`Balance validation failed (token: ${this.address})`,{cause:e})}if(t<e)throw new M(`Insufficient confidential balance: requested ${e}, available ${t} (token: ${this.address})`,{requested:e,available:t,token:this.address})}emit(e){this.sdk.emitEvent(e,this.address)}async submitTransaction(e){let{operation:t,config:n,onSubmitted:r}=e;return X({operation:t,signer:this.#e(t),provider:this.sdk.provider,config:n,emit:e=>this.emit(e),onSubmitted:r,logger:this.sdk.logger})}static assertSameSdk(e){let t=e[0].sdk;for(let n=1;n<e.length;n++)if(e[n].sdk!==t)throw new r(`All tokens in a batch operation must share the same ZamaSDK instance`);return t}};export{k as _,J as a,W as c,I as d,P as f,A as g,j as h,q as i,L as l,N as m,X as n,U as o,M as p,Y as r,K as s,Z as t,F as u,O as v};
2
+ //# sourceMappingURL=token-BStJgk0D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"token-BBInYv3L.js","names":["#requireSigner","submitSdkTransaction"],"sources":["../../src/errors/encryption.ts","../../src/errors/rpc.ts","../../src/errors/chain.ts","../../src/errors/balance.ts","../../src/errors/fatal-batch.ts","../../src/utils/fhe-type.ts","../../src/utils/handles.ts","../../src/utils/alignment.ts","../../src/utils/concurrency.ts","../../src/utils/submit-transaction.ts","../../src/token/token.ts"],"sourcesContent":["import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** FHE encryption failed. */\nexport class EncryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.EncryptionFailed, message, options);\n this.name = \"EncryptionFailedError\";\n }\n}\n\n/** FHE decryption failed. */\nexport class DecryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.DecryptionFailed, message, options);\n this.name = \"DecryptionFailedError\";\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * The consumer's RPC provider rate-limited an on-chain read the SDK performs\n * during decryption (e.g. the ACL check) — HTTP 429 or JSON-RPC `-32005`. An\n * RPC-endpoint problem, **not** a decryption/entitlement failure, and safe to\n * **retry**. Kept distinct from the relayer's own back-pressure\n * ({@link RelayerRequestFailedError}).\n *\n * Backoff for chain RPC is owned by the consumer's transport: viem/ethers\n * already honor the `Retry-After` header and retry internally before this error\n * surfaces, so it is configured on the transport you pass via `chain.network`\n * (not re-implemented here).\n *\n * @example\n * ```ts\n * try {\n * await sdk.decryption.decryptValues([{ encryptedValue, contractAddress }]);\n * } catch (e) {\n * if (e instanceof RpcRateLimitError) {\n * // back off and retry; consider a higher-throughput RPC endpoint\n * }\n * }\n * ```\n */\nexport class RpcRateLimitError extends ZamaError {\n /**\n * Suggested delay before retrying, in **seconds**, when a numeric `retryAfter`\n * is present on the error. Usually `undefined` for chain RPC: the `Retry-After`\n * header is consumed by the consumer's viem/ethers transport (which owns the\n * backoff), not surfaced here — see the class doc.\n */\n readonly retryAfter: number | undefined;\n\n constructor(message: string, options?: ErrorOptions & { retryAfter?: number }) {\n const { retryAfter, ...errorOptions } = options ?? {};\n super(ZamaErrorCode.RpcRateLimited, message, errorOptions);\n this.name = \"RpcRateLimitError\";\n this.retryAfter = retryAfter;\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * Thrown when the signer and provider are connected to different chains at the\n * start of a write operation.\n *\n * Every write method runs a chain-alignment pre-flight check. If\n * `signer.getChainId()` and `provider.getChainId()` return different values,\n * this error is thrown before any RPC mutation is attempted.\n *\n * @example\n * ```ts\n * try {\n * await token.shield(1000n);\n * } catch (e) {\n * if (e instanceof ChainMismatchError) {\n * console.error(\n * `Signer is on chain ${e.signerChainId} but provider is on chain ${e.providerChainId}`,\n * );\n * }\n * }\n * ```\n */\nexport class ChainMismatchError extends ZamaError {\n /** Name of the operation that triggered the check. */\n readonly operation: string;\n /** Chain ID the signer is connected to. */\n readonly signerChainId: number;\n /** Chain ID the provider is connected to. */\n readonly providerChainId: number;\n\n constructor(\n {\n operation,\n signerChainId,\n providerChainId,\n }: { operation: string; signerChainId: number; providerChainId: number },\n options?: ErrorOptions,\n ) {\n super(\n ZamaErrorCode.ChainMismatch,\n `Operation \"${operation}\" requires signer and provider to be on the same chain, ` +\n `but signer is on chain ${signerChainId} and provider is on chain ${providerChainId}.`,\n options,\n );\n this.name = \"ChainMismatchError\";\n this.operation = operation;\n this.signerChainId = signerChainId;\n this.providerChainId = providerChainId;\n }\n}\n","import type { Address } from \"viem\";\nimport { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** Structured details shared by balance-related errors. */\nexport interface BalanceErrorDetails {\n /** Amount the caller requested, in the token's base units. */\n readonly requested: bigint;\n /** Amount available at the time of the check, in the token's base units. */\n readonly available: bigint;\n /** Address of the token contract involved. */\n readonly token: Address;\n}\n\n/** Confidential (cToken) balance is insufficient for the requested operation. */\nexport class InsufficientConfidentialBalanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The available balance at the time of the check. */\n readonly available: bigint;\n /** The token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientConfidentialBalance, message, options);\n this.name = \"InsufficientConfidentialBalanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** ERC-20 balance is insufficient for the requested shield amount. */\nexport class InsufficientERC20BalanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The available balance at the time of the check. */\n readonly available: bigint;\n /** The ERC-20 token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientERC20Balance, message, options);\n this.name = \"InsufficientERC20BalanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** ERC-20 allowance granted to the wrapper is insufficient for the requested wrap amount. */\nexport class InsufficientAllowanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The allowance available at the time of the check. */\n readonly available: bigint;\n /** The underlying ERC-20 token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientAllowance, message, options);\n this.name = \"InsufficientAllowanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** Balance validation could not be performed (no cached credentials and decryption not possible). */\nexport class BalanceCheckUnavailableError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.BalanceCheckUnavailable, message, options);\n this.name = \"BalanceCheckUnavailableError\";\n }\n}\n\n/** A public ERC-20 read (e.g. balanceOf) failed due to a network or contract error. */\nexport class ERC20ReadFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.ERC20ReadFailed, message, options);\n this.name = \"ERC20ReadFailedError\";\n }\n}\n","import { ConfigurationError } from \"./relayer\";\nimport { RpcRateLimitError } from \"./rpc\";\nimport { SigningRejectedError, SigningFailedError } from \"./signing\";\n\n/**\n * Returns `true` for errors that should abort an entire batch operation\n * rather than be recorded per-item — wallet signature rejected, signing\n * infrastructure broken, SDK misconfigured, or the RPC provider throttling.\n * These are systemic failures that won't recover within the same call; for a\n * rate-limit in particular, the per-item retry loop would only amplify the\n * throttle by re-hitting the already-rate-limited endpoint.\n *\n * Callers iterating over a batch (e.g. per-token decrypt) should rethrow when\n * this predicate is true so the whole batch aborts, and record the error\n * per-item otherwise.\n */\nexport function isFatalBatchError(error: unknown): boolean {\n return (\n error instanceof SigningRejectedError ||\n error instanceof SigningFailedError ||\n error instanceof ConfigurationError ||\n error instanceof RpcRateLimitError\n );\n}\n","// Copied from @zama-fhe/relayer-sdk/src/sdk/FheType.ts\n// Pure utility functions with zero WASM dependency.\n// Adapted to use simple errors instead of RelayerErrorBase hierarchy.\n\n////////////////////////////////////////////////////////////////////////////////\n// Types (from types/primitives.d.ts)\n////////////////////////////////////////////////////////////////////////////////\n\nexport interface FheTypeNameToIdMap {\n ebool: 0;\n //euint4: 1; deprecated\n euint8: 2;\n euint16: 3;\n euint32: 4;\n euint64: 5;\n euint128: 6;\n eaddress: 7;\n euint256: 8;\n}\n\nexport interface FheTypeIdToNameMap {\n 0: \"ebool\";\n //1: 'euint4'; deprecated\n 2: \"euint8\";\n 3: \"euint16\";\n 4: \"euint32\";\n 5: \"euint64\";\n 6: \"euint128\";\n 7: \"eaddress\";\n 8: \"euint256\";\n}\n\nexport interface FheTypeEncryptionBitwidthToIdMap {\n 2: FheTypeNameToIdMap[\"ebool\"];\n 8: FheTypeNameToIdMap[\"euint8\"];\n 16: FheTypeNameToIdMap[\"euint16\"];\n 32: FheTypeNameToIdMap[\"euint32\"];\n 64: FheTypeNameToIdMap[\"euint64\"];\n 128: FheTypeNameToIdMap[\"euint128\"];\n 160: FheTypeNameToIdMap[\"eaddress\"];\n 256: FheTypeNameToIdMap[\"euint256\"];\n}\n\nexport type FheTypeIdToEncryptionBitwidthMap = {\n [K in keyof FheTypeEncryptionBitwidthToIdMap as FheTypeEncryptionBitwidthToIdMap[K]]: K;\n};\n\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type FheTypeName = Prettify<keyof FheTypeNameToIdMap>;\nexport type FheTypeId = Prettify<keyof FheTypeIdToNameMap>;\nexport type EncryptionBits = Prettify<keyof FheTypeEncryptionBitwidthToIdMap>;\n\n////////////////////////////////////////////////////////////////////////////////\n// Lookup Maps\n////////////////////////////////////////////////////////////////////////////////\n\nconst MINIMUM_ENCRYPTION_BIT_WIDTH = 2;\n\nconst FheTypeNameToId: FheTypeNameToIdMap = {\n ebool: 0,\n //euint4: 1, deprecated\n euint8: 2,\n euint16: 3,\n euint32: 4,\n euint64: 5,\n euint128: 6,\n eaddress: 7,\n euint256: 8,\n} as const;\n\nconst FheTypeIdToName: FheTypeIdToNameMap = {\n 0: \"ebool\",\n //1: 'euint4', deprecated\n 2: \"euint8\",\n 3: \"euint16\",\n 4: \"euint32\",\n 5: \"euint64\",\n 6: \"euint128\",\n 7: \"eaddress\",\n 8: \"euint256\",\n} as const;\n\nconst FheTypeIdToEncryptionBitwidth: FheTypeIdToEncryptionBitwidthMap = {\n 0: 2,\n //1:?, euint4 deprecated\n 2: 8,\n 3: 16,\n 4: 32,\n 5: 64,\n 6: 128,\n 7: 160,\n 8: 256,\n} as const;\n\nconst EncryptionBitwidthToFheTypeId: FheTypeEncryptionBitwidthToIdMap = {\n 2: 0,\n 8: 2,\n 16: 3,\n 32: 4,\n 64: 5,\n 128: 6,\n 160: 7,\n 256: 8,\n} as const;\n\nObject.freeze(FheTypeNameToId);\nObject.freeze(FheTypeIdToName);\nObject.freeze(FheTypeIdToEncryptionBitwidth);\nObject.freeze(EncryptionBitwidthToFheTypeId);\n\n////////////////////////////////////////////////////////////////////////////////\n// Type Guards\n////////////////////////////////////////////////////////////////////////////////\n\nexport function isFheTypeId(value: unknown): value is FheTypeId {\n switch (value as FheTypeId) {\n case 0:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n case 8:\n return true;\n default:\n return false;\n }\n}\n\nexport function isFheTypeName(value: unknown): value is FheTypeName {\n if (typeof value !== \"string\") {\n return false;\n }\n return value in FheTypeNameToId;\n}\n\nexport function isEncryptionBits(value: unknown): value is EncryptionBits {\n if (typeof value !== \"number\") {\n return false;\n }\n return value in EncryptionBitwidthToFheTypeId;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Converters\n////////////////////////////////////////////////////////////////////////////////\n\nexport function fheTypeIdFromEncryptionBits(bitwidth: number): FheTypeId {\n if (!isEncryptionBits(bitwidth)) {\n throw new Error(`Invalid encryption bits ${bitwidth}`);\n }\n return EncryptionBitwidthToFheTypeId[bitwidth];\n}\n\nexport function fheTypeIdFromName(name: string): FheTypeId {\n if (!isFheTypeName(name)) {\n throw new Error(`Invalid FheType name '${name}'`);\n }\n return FheTypeNameToId[name];\n}\n\nexport function fheTypeNameFromId(id: number): FheTypeName {\n if (!isFheTypeId(id)) {\n throw new Error(`Invalid FheType id '${id}'`);\n }\n return FheTypeIdToName[id];\n}\n\nexport function encryptionBitsFromFheTypeId(typeId: number): EncryptionBits {\n if (!isFheTypeId(typeId)) {\n throw new Error(`Invalid FheType id '${typeId}'`);\n }\n const bw = FheTypeIdToEncryptionBitwidth[typeId];\n if (bw < MINIMUM_ENCRYPTION_BIT_WIDTH) {\n throw new Error(\n `Invalid FheType encryption bit width: ${bw}. Minimum is ${MINIMUM_ENCRYPTION_BIT_WIDTH} bits.`,\n );\n }\n return bw;\n}\n\nexport function encryptionBitsFromFheTypeName(name: string): EncryptionBits {\n if (!isFheTypeName(name)) {\n throw new Error(`Invalid FheType name '${name}'`);\n }\n const bw = FheTypeIdToEncryptionBitwidth[FheTypeNameToId[name]];\n if (bw < MINIMUM_ENCRYPTION_BIT_WIDTH) {\n throw new Error(\n `Invalid FheType encryption bit width: ${bw}. Minimum is ${MINIMUM_ENCRYPTION_BIT_WIDTH} bits.`,\n );\n }\n return bw;\n}\n","import type { EncryptedValue } from \"../relayer/types\";\nimport { encryptionBitsFromFheTypeId, isFheTypeId } from \"./fhe-type\";\n\n/** All-zero encrypted-value sentinel — a 32-byte zero handle representing the cleartext value `0`. */\nexport const ZERO_ENCRYPTED_VALUE =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\n\n/**\n * Check whether an encrypted value represents the zero value.\n */\nexport function isEncryptedValueZero(encryptedValue: string): boolean {\n return encryptedValue === ZERO_ENCRYPTED_VALUE || encryptedValue === \"0x\";\n}\n\n/**\n * Per-request cleartext-bit budget enforced by the KMS gateway, mirrored from\n * `@fhevm/sdk`'s `MAX_KMS_DECRYPT_DECRYPTION_BIT_LIMIT` (protocol-level constant,\n * not imported — see {@link MAX_CONTRACTS_PER_PERMIT} for why). Internal: decrypt\n * requests are chunked to respect it automatically, so callers never need this value.\n */\nexport const MAX_DECRYPTION_REQUEST_BITS = 2048;\n\n/** Max encryption bit width among all currently-known FHE types (euint256). */\nconst MAX_KNOWN_ENCRYPTION_BITS = 256;\n\n/**\n * Cleartext bit cost of decrypting a single handle, derived from its FHE\n * type (encoded at bits 8-15 of the handle — the same layout `@fhevm/sdk`'s\n * `FhevmHandle` decodes, byte 30 of the 32-byte handle).\n *\n * Falls back to {@link MAX_KNOWN_ENCRYPTION_BITS} for an unrecognized type\n * byte, or for a value that isn't parseable hex at all, instead of throwing.\n * A real on-chain handle is always well-formed with a valid type byte, so\n * this fallback only ever fires for synthetic test/placeholder handles —\n * deliberately more permissive than the relayer's own strict validation so\n * chunking stays safe without requiring every test fixture to encode a real\n * FHE handle. Do not tighten this to match relayer semantics.\n */\nexport function encryptionBitsForHandle(encryptedValue: EncryptedValue): number {\n let handleValue: bigint;\n try {\n handleValue = BigInt(encryptedValue);\n } catch {\n return MAX_KNOWN_ENCRYPTION_BITS;\n }\n const typeByte = Number((handleValue >> 8n) & 0xffn);\n return isFheTypeId(typeByte) ? encryptionBitsFromFheTypeId(typeByte) : MAX_KNOWN_ENCRYPTION_BITS;\n}\n\n/**\n * Split `handles` into groups whose cumulative cleartext-bit cost never\n * exceeds `maxBits`, preserving input order. Unlike {@link chunkContracts}\n * (fixed-size slices), a greedy accumulate-until-exceeded walk is required\n * since per-handle cost varies by FHE type. A handle whose own cost exceeds\n * `maxBits` still gets a solo chunk — always makes forward progress.\n */\nexport function chunkHandlesByBitBudget(\n handles: readonly EncryptedValue[],\n maxBits: number = MAX_DECRYPTION_REQUEST_BITS,\n): EncryptedValue[][] {\n const chunks: EncryptedValue[][] = [];\n let current: EncryptedValue[] = [];\n let currentBits = 0;\n\n for (const handle of handles) {\n const bits = encryptionBitsForHandle(handle);\n if (current.length > 0 && currentBits + bits > maxBits) {\n chunks.push(current);\n current = [];\n currentBits = 0;\n }\n current.push(handle);\n currentBits += bits;\n }\n if (current.length > 0) {\n chunks.push(current);\n }\n return chunks;\n}\n","import {\n ChainMismatchError,\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n} from \"../errors\";\nimport type { GenericProvider, GenericSigner, WalletAccount } from \"../types\";\n\n/**\n * Pre-flight guard for signer-required operations. Resolves the connected\n * wallet account (refreshing once if the signer reports it isn't ready) and\n * verifies the signer's chain matches the provider's.\n *\n * @internal\n */\nexport async function requireAlignedWalletAccount(\n operation: string,\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n): Promise<WalletAccount> {\n if (!signer) {\n throw new SignerNotConfiguredError(operation);\n }\n let account: WalletAccount;\n try {\n account = signer.requireWalletAccount(operation);\n } catch (error) {\n if (!(error instanceof WalletAccountNotReadyError) || !signer.refreshWalletAccount) {\n throw error;\n }\n await signer.refreshWalletAccount();\n account = signer.requireWalletAccount(operation);\n }\n const providerChainId = await provider.getChainId();\n if (account.chainId !== providerChainId) {\n throw new ChainMismatchError({ operation, signerChainId: account.chainId, providerChainId });\n }\n return account;\n}\n\n/**\n * Variant of {@link requireAlignedWalletAccount} that returns only the aligned\n * chain ID. Useful when a write path only needs to ensure signer/provider\n * coherence and doesn't otherwise consume the account.\n *\n * @internal\n */\nexport async function requireChainAlignment(\n operation: string,\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n): Promise<number> {\n return (await requireAlignedWalletAccount(operation, signer, provider)).chainId;\n}\n","/**\n * Execute an array of async thunks with bounded concurrency.\n * Defaults to `Infinity` (equivalent to `Promise.all`).\n */\nexport async function pLimit<T>(\n fns: (() => Promise<T>)[],\n maxConcurrency = Infinity,\n): Promise<T[]> {\n if (Number.isFinite(maxConcurrency) && maxConcurrency <= 0) {\n throw new Error(\"maxConcurrency must be a positive number\");\n }\n if (!Number.isFinite(maxConcurrency) || maxConcurrency >= fns.length) {\n return Promise.all(fns.map((f) => f()));\n }\n\n const results: T[] = Array.from({ length: fns.length });\n let index = 0;\n\n async function worker() {\n while (index < fns.length) {\n const i = index++;\n if (fns[i]) {\n results[i] = await fns[i]();\n }\n }\n }\n\n await Promise.all(Array.from({ length: maxConcurrency }, worker));\n return results;\n}\n","import type { Hex } from \"viem\";\nimport { TransactionRevertedError, ZamaError } from \"../errors\";\nimport type { TransactionOperation, ZamaSDKEventInput } from \"../events/sdk-events\";\nimport { transactionOperationMetadata, ZamaSDKEvents } from \"../events/sdk-events\";\nimport type {\n GenericLogger,\n GenericProvider,\n GenericSigner,\n TransactionResult,\n WriteContractConfig,\n} from \"../types\";\nimport { swallow } from \"./swallow\";\n\n/**\n * Shared write-transaction pipeline for SDK calls that submit a transaction.\n *\n * On success: writes the tx, emits the per-operation submitted event from\n * {@link transactionOperationMetadata}, fires `onSubmitted`, waits for the\n * receipt, and returns `{ txHash, receipt }`.\n *\n * On failure: emits a {@link ZamaSDKEvents.TransactionError} event with the\n * transaction-level error it will throw, then throws it. Existing `ZamaError`\n * instances are rethrown as-is; all other failures are wrapped in\n * `TransactionRevertedError` with the original error as `cause`.\n */\nexport async function submitTransaction(params: {\n operation: TransactionOperation;\n signer: GenericSigner;\n provider: GenericProvider;\n config: WriteContractConfig;\n emit: (input: ZamaSDKEventInput) => void;\n onSubmitted?: (txHash: Hex) => void;\n logger: GenericLogger;\n}): Promise<TransactionResult> {\n const { operation, signer, provider, config, emit, onSubmitted, logger } = params;\n const metadata = transactionOperationMetadata[operation];\n\n try {\n const txHash = await signer.writeContract(config);\n emit(metadata.submittedEvent(txHash));\n void swallow(`${operation}: onSubmitted`, () => onSubmitted?.(txHash), logger);\n const receipt = await provider.waitForTransactionReceipt(txHash);\n return { txHash, receipt };\n } catch (error) {\n const failure =\n error instanceof ZamaError\n ? error\n : new TransactionRevertedError(`Transaction failed during ${operation}`, { cause: error });\n\n emit({ type: ZamaSDKEvents.TransactionError, operation, error: failure });\n throw failure;\n }\n}\n","import { type Address, getAddress, type Hex } from \"viem\";\nimport {\n confidentialBalanceOfContract,\n confidentialTransferAndCallContract,\n confidentialTransferContract,\n confidentialTransferFromAndCallContract,\n confidentialTransferFromContract,\n decimalsContract,\n ERC7984_INTERFACE_ID,\n ERC7984_WRAPPER_INTERFACE_ID,\n isOperatorContract,\n nameContract,\n setOperatorContract,\n supportsInterfaceContract,\n symbolContract,\n} from \"../contracts\";\nimport {\n BalanceCheckUnavailableError,\n ConfigurationError,\n DecryptionFailedError,\n EncryptionFailedError,\n InsufficientConfidentialBalanceError,\n isFatalBatchError,\n requireConfigured,\n ZamaError,\n} from \"../errors\";\nimport type { TransactionOperation, ZamaSDKEventInput } from \"../events/sdk-events\";\nimport type { EncryptedValue } from \"../relayer/types\";\nimport { toError } from \"../utils\";\nimport { requireAlignedWalletAccount, requireChainAlignment } from \"../utils/alignment\";\nimport { assertBigint } from \"../utils/assertions\";\nimport { pLimit } from \"../utils/concurrency\";\nimport { isEncryptedValueZero } from \"../utils/handles\";\nimport { submitTransaction as submitSdkTransaction } from \"../utils/submit-transaction\";\nimport { swallow } from \"../utils/swallow\";\nimport type {\n GenericSigner,\n TransactionResult,\n TransferCallbacks,\n TransferOptions,\n WriteContractConfig,\n} from \"../types\";\nimport type { ZamaSDK } from \"../zama-sdk\";\n\n/** Options for {@link Token.batchDecryptBalancesAs}. */\nexport interface BatchDecryptAsOptions {\n /** The address of the account that delegated decryption rights. */\n delegatorAddress: Address;\n /** Pre-fetched encrypted values. When omitted, they are fetched from the chain. */\n encryptedValues?: EncryptedValue[];\n /**\n * The account whose on-chain balance to read. Defaults to the delegator\n * address, which is the common case (the delegator grants permission to\n * decrypt their own balance). Only set this when the account differs\n * from the delegator.\n *\n * Matches the `account` parameter of `confidentialBalanceOf(account)` on-chain.\n */\n accountAddress?: Address;\n /** Maximum number of concurrent decrypt calls. Default: 10. */\n maxConcurrency?: number;\n /** Called when decryption fails for a single token. Return a fallback bigint. */\n onError?: (error: Error, address: Address) => bigint;\n}\n\n/** Result of {@link Token.batchBalancesOf}. */\nexport interface BatchBalancesResult {\n /** Successfully decrypted balances, keyed by token address. */\n results: Map<Address, bigint>;\n /** Per-token errors for tokens that failed to decrypt. */\n errors: Map<Address, ZamaError>;\n}\n\n/**\n * High-level interface for an ERC-7984 confidential token.\n * Hides FHE complexity (encryption, decryption, EIP-712 signing) behind\n * familiar ERC-20-like methods.\n *\n * For ERC-7984 wrappers (shield/unshield), use {@link WrappedToken} instead —\n * it extends `Token` with wrapper-specific operations.\n *\n * Decryption, credentials, caching, and event emission are handled by the\n * owning {@link ZamaSDK} — this class only exposes token-scoped helpers\n * that delegate to `sdk.decryption.decryptValues` and `sdk.permits.grantPermit`.\n */\nexport class Token {\n /** The SDK instance this token operates through. */\n readonly sdk: ZamaSDK;\n /** Checksummed address of the confidential token contract. */\n readonly address: Address;\n\n constructor(sdk: ZamaSDK, address: Address) {\n this.sdk = sdk;\n this.address = getAddress(address);\n }\n\n /** Resolve `sdk.signer` or throw {@link SignerNotConfiguredError} tagged with `operation`. */\n #requireSigner(operation: string): GenericSigner {\n return requireConfigured(this.sdk.signer, operation);\n }\n\n // METADATA\n\n /** Read the token name from the contract. */\n async name(): Promise<string> {\n return this.sdk.provider.readContract(nameContract(this.address));\n }\n\n /** Read the token symbol from the contract. */\n async symbol(): Promise<string> {\n return this.sdk.provider.readContract(symbolContract(this.address));\n }\n\n /** Read the token decimals from the contract. */\n async decimals(): Promise<number> {\n return this.sdk.provider.readContract(decimalsContract(this.address));\n }\n\n // ERC-165 DISCOVERY\n\n /**\n * ERC-165 check for {@link ERC7984_INTERFACE_ID} support.\n *\n * @returns `true` if the contract implements the ERC-7984 confidential token interface.\n */\n async isConfidential(): Promise<boolean> {\n return this.sdk.provider.readContract(\n supportsInterfaceContract(this.address, ERC7984_INTERFACE_ID),\n );\n }\n\n /**\n * ERC-165 check for IERC7984ERC20Wrapper support.\n *\n * @returns `true` if the contract implements the ERC-7984 wrapper interface\n * ({@link ERC7984_WRAPPER_INTERFACE_ID}, `0x1f1c62b2`).\n */\n async isWrapper(): Promise<boolean> {\n return this.sdk.provider.readContract(\n supportsInterfaceContract(this.address, ERC7984_WRAPPER_INTERFACE_ID),\n );\n }\n\n // BALANCES\n\n /**\n * Decrypt and return the plaintext balance for the given owner.\n * Acquires FHE credentials via a wallet signature if none are cached.\n *\n * @param owner - Balance owner address.\n * @returns The decrypted plaintext balance as a bigint.\n * @throws if FHE decryption fails. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balance = await token.balanceOf(\"0xOwner\");\n * ```\n */\n async balanceOf(owner: Address): Promise<bigint> {\n const ownerAddress = getAddress(owner);\n const encryptedValue = await this.readConfidentialBalanceOf(ownerAddress);\n const result = await this.sdk.decryption.decryptValues([\n { encryptedValue, contractAddress: this.address },\n ]);\n const value = result[encryptedValue];\n if (value === undefined) {\n throw new DecryptionFailedError(`Decryption returned no value for ${encryptedValue}`);\n }\n assertBigint(value, \"balanceOf: result[encryptedValue]\");\n return value;\n }\n\n /**\n * Return the raw encrypted balance without decrypting.\n *\n * @param owner - Balance owner address.\n * @returns The encrypted balance as a hex string.\n *\n * @example\n * ```ts\n * const encryptedValue = await token.confidentialBalanceOf(\"0xOwner\");\n * ```\n */\n async confidentialBalanceOf(owner: Address): Promise<EncryptedValue> {\n return this.readConfidentialBalanceOf(getAddress(owner));\n }\n\n /**\n * Decrypt the balance of a delegator using delegated decryption credentials.\n * The connected signer acts as the delegatee who has been granted permission\n * by the delegator to decrypt their balance.\n *\n * Clear values are cached in storage keyed by `(account, token, encryptedValue)`.\n * Because every on-chain balance change produces a new encrypted value,\n * stale cache entries are never served. Cache write failures are silently\n * ignored — they do not affect the returned value.\n *\n * @param delegatorAddress - The address of the account that delegated decryption rights.\n * @param accountAddress - The account whose on-chain balance to read. Defaults\n * to the delegator address.\n * @returns The decrypted plaintext balance as a bigint.\n * @throws if no active delegation exists. {@link DelegationNotFoundError}\n * @throws if the delegation has expired. {@link DelegationExpiredError}\n * @throws if delegated decryption fails. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balance = await token.decryptBalanceAs({\n * delegatorAddress: \"0xDelegator\",\n * });\n * ```\n */\n async decryptBalanceAs({\n delegatorAddress,\n accountAddress,\n }: {\n delegatorAddress: Address;\n accountAddress?: Address;\n }): Promise<bigint> {\n await requireChainAlignment(\"decryptBalanceAs\", this.sdk.signer, this.sdk.provider);\n const normalizedDelegator = getAddress(delegatorAddress);\n const normalizedAccount = accountAddress ? getAddress(accountAddress) : normalizedDelegator;\n\n const encryptedValue = await this.readConfidentialBalanceOf(normalizedAccount);\n if (isEncryptedValueZero(encryptedValue)) {\n return 0n;\n }\n\n const result = await this.sdk.decryption.delegatedDecryptValues(\n [{ encryptedValue, contractAddress: this.address }],\n normalizedDelegator,\n normalizedAccount,\n );\n\n const value = result[encryptedValue];\n if (value === undefined) {\n throw new DecryptionFailedError(\n `Delegated decryption returned no value for ${encryptedValue}`,\n );\n }\n assertBigint(value, \"decryptBalanceAs: result[encryptedValue]\");\n return value;\n }\n\n // BATCH STATICS\n\n /**\n * Decrypt confidential balances for multiple tokens in parallel, returning\n * successes and per-token errors separately. Pre-authorizes all token\n * addresses in a single wallet signature, then delegates each decrypt to\n * `sdk.decryption.decryptValues`.\n *\n * Tokens that fail to decrypt land in `errors` rather than aborting the\n * whole batch — caller decides how to surface them.\n *\n * @param tokens - Array of {@link Token} instances bound to the same SDK.\n * @param owner - Balance owner address.\n * @returns `{ results, errors }` partitioning the per-token outcomes.\n *\n * @example\n * ```ts\n * const { results, errors } = await Token.batchBalancesOf(tokens, owner);\n * ```\n */\n static async batchBalancesOf(tokens: Token[], owner: Address): Promise<BatchBalancesResult> {\n const results = new Map<Address, bigint>();\n const errors = new Map<Address, ZamaError>();\n if (tokens.length === 0) {\n return { results, errors };\n }\n\n const sdk = Token.assertSameSdk(tokens);\n // Fail fast on chain mismatch before prompting the wallet for a signature.\n await requireChainAlignment(\"batchBalancesOf\", sdk.signer, sdk.provider);\n // Pre-authorize the full token set in one wallet signature so subsequent\n // per-token decryptValues calls reuse the cached credentials.\n await sdk.permits.grantPermit(tokens.map((t) => t.address));\n\n const outcomes = await pLimit(\n tokens.map((t) => async () => {\n try {\n return { status: \"fulfilled\" as const, value: await t.balanceOf(owner) };\n } catch (reason) {\n return { status: \"rejected\" as const, reason };\n }\n }),\n 5,\n );\n\n for (let i = 0; i < tokens.length; i++) {\n const tokenAddress = tokens[i]!.address;\n const outcome = outcomes[i]!;\n if (outcome.status === \"fulfilled\") {\n results.set(tokenAddress, outcome.value);\n } else {\n const reason = outcome.reason;\n // Session-level failures (user rejected signature, SDK misconfigured)\n // apply to every token — surface them instead of collecting per-token.\n if (isFatalBatchError(reason)) {\n throw reason;\n }\n const error =\n reason instanceof ZamaError\n ? reason\n : new DecryptionFailedError(toError(reason).message, { cause: reason });\n errors.set(tokenAddress, error);\n }\n }\n\n // Total failure: surface the first error so callers know nothing decrypted.\n if (errors.size === tokens.length) {\n const firstError = errors.values().next().value;\n throw firstError ?? new DecryptionFailedError(\"All token balance decryptions failed\");\n }\n\n return { results, errors };\n }\n\n /**\n * Batch decrypt confidential balances as a delegate across multiple tokens.\n * Mirrors {@link batchBalancesOf} but uses delegated credentials.\n *\n * **Error handling:** If a per-token decryption fails and no `onError` callback\n * is provided, errors are collected and thrown as an aggregated\n * `DecryptionFailedError`. When the relayer returns no value for an encrypted value,\n * a `DecryptionFailedError` is thrown for that token (never silently returns `0n`).\n * Pass `onError: () => 0n` to opt into the silent zero behavior.\n *\n * @param tokens - Array of Token instances to decrypt balances for.\n * @param options - Delegated decryption configuration.\n * @returns A Map from token address to decrypted balance.\n * @throws if no active delegation exists. {@link DelegationNotFoundError}\n * @throws if the delegation has expired. {@link DelegationExpiredError}\n * @throws if any decryption fails and no `onError` is provided. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balances = await Token.batchDecryptBalancesAs(tokens, {\n * delegatorAddress: \"0xDelegator\",\n * onError: (err, addr) => { console.error(addr, err); return 0n; },\n * });\n * ```\n */\n static async batchDecryptBalancesAs(\n tokens: Token[],\n options: BatchDecryptAsOptions,\n ): Promise<Map<Address, bigint>> {\n if (tokens.length === 0) {\n return new Map();\n }\n\n const sdk = Token.assertSameSdk(tokens);\n const results = new Map<Address, bigint>();\n const errors = new Map<Address, ZamaError>();\n const normalizedAccount = options.accountAddress\n ? getAddress(options.accountAddress)\n : getAddress(options.delegatorAddress);\n const maxConcurrency = options.maxConcurrency ?? 10;\n if (options.encryptedValues && tokens.length !== options.encryptedValues.length) {\n throw new DecryptionFailedError(\n `tokens.length (${tokens.length}) must equal encryptedValues.length (${options.encryptedValues.length})`,\n );\n }\n const resolvedEncryptedValues =\n options.encryptedValues ??\n (await Token.readBalanceHandlesBatch(tokens, normalizedAccount, errors, maxConcurrency));\n\n const decryptRequests: Array<{ token: Token; encryptedValue: EncryptedValue }> = [];\n for (const [index, token] of tokens.entries()) {\n const encryptedValue = resolvedEncryptedValues[index];\n if (!encryptedValue || errors.has(token.address)) {\n continue;\n }\n if (isEncryptedValueZero(encryptedValue)) {\n // Zero balance → skip the relayer; no decryption needed.\n results.set(token.address, 0n);\n } else {\n decryptRequests.push({ token, encryptedValue });\n }\n }\n\n if (decryptRequests.length > 0) {\n const decrypted = await sdk.decryption.delegatedBatchDecryptValues({\n encryptedInputs: decryptRequests.map(({ token, encryptedValue }) => ({\n encryptedValue,\n contractAddress: token.address,\n })),\n delegatorAddress: options.delegatorAddress,\n accountAddress: options.accountAddress,\n maxConcurrency,\n });\n\n for (const [index, item] of decrypted.items.entries()) {\n const request = decryptRequests[index];\n if (!request) {\n continue;\n }\n if (item.error) {\n errors.set(request.token.address, item.error);\n continue;\n }\n const value = item.value;\n if (value === undefined) {\n errors.set(\n request.token.address,\n new DecryptionFailedError(\n `Batch delegated decryption returned no value for ${item.encryptedValue} on token ${request.token.address}`,\n ),\n );\n continue;\n }\n assertBigint(value, \"batchDecryptBalancesAs: result[encryptedValue]\");\n results.set(request.token.address, value);\n }\n }\n\n if (errors.size === 0) {\n return results;\n }\n\n if (options.onError) {\n const callbackErrors: Array<{ address: Address; error: Error }> = [];\n for (const [address, error] of errors) {\n try {\n results.set(address, options.onError(error, address));\n } catch (callbackError) {\n callbackErrors.push({ address, error: toError(callbackError) });\n }\n }\n if (callbackErrors.length > 0) {\n const message = callbackErrors\n .map(({ address, error }) => `${address}: ${error.message}`)\n .join(\"; \");\n throw new DecryptionFailedError(\n `Batch delegated decryption onError callback failed for ${callbackErrors.length} token(s): ${message}`,\n { cause: callbackErrors[0]?.error },\n );\n }\n return results;\n }\n\n const errorEntries = Array.from(errors.entries());\n const message = errorEntries.map(([addr, e]) => `${addr}: ${e.message}`).join(\"; \");\n throw new DecryptionFailedError(\n `Batch delegated decryption failed for ${errors.size} token(s): ${message}`,\n { cause: errorEntries[0]?.[1] },\n );\n }\n\n private static async readBalanceHandlesBatch(\n tokens: Token[],\n accountAddress: Address,\n errors: Map<Address, ZamaError>,\n maxConcurrency: number,\n ): Promise<Array<EncryptedValue | undefined>> {\n const outcomes = await pLimit(\n tokens.map((token) => async () => {\n try {\n return {\n status: \"fulfilled\" as const,\n value: await token.readConfidentialBalanceOf(accountAddress),\n };\n } catch (reason) {\n return { status: \"rejected\" as const, reason };\n }\n }),\n maxConcurrency,\n );\n\n const encryptedValues: Array<EncryptedValue | undefined> = [];\n for (const [index, token] of tokens.entries()) {\n const outcome = outcomes[index];\n if (!outcome) {\n continue;\n }\n if (outcome.status === \"fulfilled\") {\n encryptedValues[index] = outcome.value;\n continue;\n }\n if (isFatalBatchError(outcome.reason)) {\n throw outcome.reason;\n }\n errors.set(\n token.address,\n outcome.reason instanceof ZamaError\n ? outcome.reason\n : new DecryptionFailedError(toError(outcome.reason).message, { cause: outcome.reason }),\n );\n }\n return encryptedValues;\n }\n\n // WRITE OPERATIONS\n\n /**\n * Confidential transfer. Encrypts the amount via FHE, then calls the contract.\n *\n * By default, the SDK validates the confidential balance before submitting.\n * If a cached plaintext balance exists it is used; otherwise, if credentials\n * are cached, it decrypts on the fly. Set `skipBalanceCheck: true` to bypass\n * this validation (e.g. for smart wallets).\n *\n * @param to - Recipient address.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param options - Optional: `skipBalanceCheck` (default `false`).\n * @returns The transaction hash and mined receipt.\n * @throws if signer and provider are on different chains. {@link ChainMismatchError}\n * @throws if the balance is less than `amount`. {@link InsufficientConfidentialBalanceError}\n * @throws if balance validation requires decryption that is not possible. {@link BalanceCheckUnavailableError}\n * @throws if FHE encryption fails. {@link EncryptionFailedError}\n * @throws if the on-chain transfer reverts. {@link TransactionRevertedError}\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransfer(\"0xRecipient\", 1000n);\n * ```\n */\n async confidentialTransfer(\n to: Address,\n amount: bigint,\n options?: TransferOptions,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransfer\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransfer\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const { skipBalanceCheck = false, onEncryptComplete, onTransferSubmitted } = options ?? {};\n\n const normalizedTo = getAddress(to);\n\n if (!skipBalanceCheck) {\n await this.assertConfidentialBalance(amount);\n }\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\"transfer: onEncryptComplete\", () => onEncryptComplete?.(), this.sdk.logger);\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transfer\",\n config: confidentialTransferContract(\n this.address,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n ),\n onSubmitted: onTransferSubmitted,\n });\n }\n\n /**\n * Operator encrypted transfer on behalf of another address.\n * The caller must be an approved operator for `from`.\n *\n * @param from - The address to transfer from (caller must be an approved operator).\n * @param to - Recipient address.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFrom(\"0xFrom\", \"0xTo\", 500n);\n * ```\n */\n async confidentialTransferFrom(\n from: Address,\n to: Address,\n amount: bigint,\n callbacks?: TransferCallbacks,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferFrom\");\n await requireAlignedWalletAccount(\n \"confidentialTransferFrom\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const normalizedFrom = getAddress(from);\n const normalizedTo = getAddress(to);\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: normalizedFrom,\n });\n void swallow(\n \"transferFrom: onEncryptComplete\",\n () => callbacks?.onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferFrom\",\n config: confidentialTransferFromContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n ),\n onSubmitted: callbacks?.onTransferSubmitted,\n });\n }\n\n /**\n * ERC-7984 `confidentialTransferAndCall`: encrypted transfer that also invokes\n * the recipient's receiver hook (`onConfidentialTransferReceived`) in a single\n * transaction. The caller crafts the opaque `data` payload — the SDK does not\n * encode, validate, or interpret it.\n *\n * Balance validation follows the same rules as {@link Token.confidentialTransfer}.\n *\n * @param to - Recipient address. Must implement the ERC-7984 receiver hook.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param data - Opaque bytes forwarded to the recipient's receiver hook.\n * @param options - Optional: `skipBalanceCheck` (default `false`).\n * @returns The transaction hash and mined receipt.\n *\n * @throws if signer and provider are on different chains. {@link ChainMismatchError}\n * @throws if the balance is less than `amount`. {@link InsufficientConfidentialBalanceError}\n * @throws if balance validation requires decryption that is not possible. {@link BalanceCheckUnavailableError}\n * @throws if FHE encryption fails. {@link EncryptionFailedError}\n * @throws if the on-chain transfer reverts. {@link TransactionRevertedError}\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferAndCall(\n * \"0xRecipient\",\n * 1000n,\n * \"0xabcd\", // caller-encoded payload forwarded to the receiver hook\n * );\n * ```\n */\n async confidentialTransferAndCall(\n to: Address,\n amount: bigint,\n data: Hex,\n options?: TransferOptions,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferAndCall\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransferAndCall\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const { skipBalanceCheck = false, onEncryptComplete, onTransferSubmitted } = options ?? {};\n\n const normalizedTo = getAddress(to);\n\n if (!skipBalanceCheck) {\n await this.assertConfidentialBalance(amount);\n }\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\n \"transferAndCall: onEncryptComplete\",\n () => onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferAndCall\",\n config: confidentialTransferAndCallContract(\n this.address,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n data,\n ),\n onSubmitted: onTransferSubmitted,\n });\n }\n\n /**\n * ERC-7984 `confidentialTransferFromAndCall`: operator-initiated encrypted\n * transfer that also invokes the recipient's receiver hook in a single\n * transaction. The caller must be an approved operator for `from` and crafts\n * the opaque `data` payload — the SDK does not encode or interpret it.\n *\n * @param from - The address to transfer from (caller must be an approved operator).\n * @param to - Recipient address. Must implement the ERC-7984 receiver hook.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param data - Opaque bytes forwarded to the recipient's receiver hook.\n * @param callbacks - Optional progress callbacks.\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFromAndCall(\n * \"0xFrom\",\n * \"0xRecipient\",\n * 500n,\n * \"0xabcd\",\n * );\n * ```\n */\n async confidentialTransferFromAndCall(\n from: Address,\n to: Address,\n amount: bigint,\n data: Hex,\n callbacks?: TransferCallbacks,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferFromAndCall\");\n await requireAlignedWalletAccount(\n \"confidentialTransferFromAndCall\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const normalizedFrom = getAddress(from);\n const normalizedTo = getAddress(to);\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: normalizedFrom,\n });\n void swallow(\n \"transferFromAndCall: onEncryptComplete\",\n () => callbacks?.onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferFromAndCall\",\n config: confidentialTransferFromAndCallContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n data,\n ),\n onSubmitted: callbacks?.onTransferSubmitted,\n });\n }\n\n // OPERATOR APPROVAL\n\n /**\n * Set operator approval for the confidential token.\n * Defaults to 1 hour from now if `until` is not specified.\n *\n * @param operator - The address to set as an operator.\n * @param until - Optional Unix timestamp for approval expiry. Defaults to now + 1 hour.\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.setOperator(\"0xOperator\");\n * ```\n */\n async setOperator(operator: Address, until?: number): Promise<TransactionResult> {\n this.#requireSigner(\"setOperator\");\n await requireChainAlignment(\"setOperator\", this.sdk.signer, this.sdk.provider);\n const normalizedOperator = getAddress(operator);\n return this.submitTransaction({\n operation: \"setOperator\",\n config: setOperatorContract(this.address, normalizedOperator, until),\n });\n }\n\n /**\n * Check if a spender is an approved operator for a given holder.\n *\n * @param holder - The token holder address.\n * @param spender - The address to check operator approval for.\n * @returns `true` if the spender is an approved operator for the holder.\n *\n * @example\n * ```ts\n * if (await token.isOperator(\"0xHolder\", \"0xSpender\")) {\n * // spender can call transferFrom on behalf of holder\n * }\n * ```\n */\n async isOperator(holder: Address, spender: Address): Promise<boolean> {\n return this.sdk.provider.readContract(\n isOperatorContract(this.address, getAddress(holder), getAddress(spender)),\n );\n }\n\n // PROTECTED HELPERS\n\n /**\n * Read the on-chain encrypted balance for a given owner.\n *\n * @internal\n */\n protected async readConfidentialBalanceOf(owner: Address): Promise<EncryptedValue> {\n return await this.sdk.provider.readContract(confidentialBalanceOfContract(this.address, owner));\n }\n\n /**\n * Pre-flight check: decrypt the confidential balance and compare against the\n * requested amount. If credentials are cached the decrypt happens silently;\n * if not, throws {@link BalanceCheckUnavailableError} instead of triggering\n * a surprise EIP-712 popup.\n *\n * @internal\n */\n protected async assertConfidentialBalance(amount: bigint): Promise<void> {\n if (amount === 0n) {\n return;\n }\n\n let balance: bigint;\n try {\n const account = await requireAlignedWalletAccount(\n \"assertConfidentialBalance\",\n this.sdk.signer,\n this.sdk.provider,\n );\n balance = await this.balanceOf(getAddress(account.address));\n } catch (error) {\n if (error instanceof ZamaError) {\n throw error;\n }\n throw new BalanceCheckUnavailableError(`Balance validation failed (token: ${this.address})`, {\n cause: error,\n });\n }\n\n if (balance < amount) {\n throw new InsufficientConfidentialBalanceError(\n `Insufficient confidential balance: requested ${amount}, available ${balance} (token: ${this.address})`,\n { requested: amount, available: balance, token: this.address },\n );\n }\n }\n\n /**\n * Emit a token-scoped event through the owning {@link ZamaSDK} so that\n * subscribers see a unified stream.\n *\n * @internal\n */\n protected emit(input: ZamaSDKEventInput): void {\n this.sdk.emitEvent(input, this.address);\n }\n\n /**\n * Submit a token-scoped write transaction through the shared SDK transaction\n * pipeline. Callers keep pre-flight and operation-specific work local.\n *\n * @internal\n */\n protected async submitTransaction(params: {\n operation: TransactionOperation;\n config: WriteContractConfig;\n onSubmitted?: (txHash: Hex) => void;\n }): Promise<TransactionResult> {\n const { operation, config, onSubmitted } = params;\n return submitSdkTransaction({\n operation,\n signer: this.#requireSigner(operation),\n provider: this.sdk.provider,\n config,\n emit: (input) => this.emit(input),\n onSubmitted,\n logger: this.sdk.logger,\n });\n }\n\n /** Verify all tokens share the same SDK instance and return it. */\n private static assertSameSdk(tokens: Token[]): ZamaSDK {\n const sdk = tokens[0]!.sdk;\n for (let i = 1; i < tokens.length; i++) {\n if (tokens[i]!.sdk !== sdk) {\n throw new ConfigurationError(\n \"All tokens in a batch operation must share the same ZamaSDK instance\",\n );\n }\n }\n return sdk;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"token-BStJgk0D.js","names":["#requireSigner","submitSdkTransaction"],"sources":["../../src/errors/encryption.ts","../../src/errors/rpc.ts","../../src/errors/chain.ts","../../src/errors/balance.ts","../../src/errors/fatal-batch.ts","../../src/utils/fhe-type.ts","../../src/utils/handles.ts","../../src/utils/alignment.ts","../../src/utils/concurrency.ts","../../src/utils/submit-transaction.ts","../../src/token/token.ts"],"sourcesContent":["import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** FHE encryption failed. */\nexport class EncryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.EncryptionFailed, message, options);\n this.name = \"EncryptionFailedError\";\n }\n}\n\n/** FHE decryption failed. */\nexport class DecryptionFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.DecryptionFailed, message, options);\n this.name = \"DecryptionFailedError\";\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * The consumer's RPC provider rate-limited an on-chain read the SDK performs\n * during decryption (e.g. the ACL check) — HTTP 429 or JSON-RPC `-32005`. An\n * RPC-endpoint problem, **not** a decryption/entitlement failure, and safe to\n * **retry**. Kept distinct from the relayer's own back-pressure\n * ({@link RelayerRequestFailedError}).\n *\n * Backoff for chain RPC is owned by the consumer's transport: viem/ethers\n * already honor the `Retry-After` header and retry internally before this error\n * surfaces, so it is configured on the transport you pass via `chain.network`\n * (not re-implemented here).\n *\n * @example\n * ```ts\n * try {\n * await sdk.decryption.decryptValues([{ encryptedValue, contractAddress }]);\n * } catch (e) {\n * if (e instanceof RpcRateLimitError) {\n * // back off and retry; consider a higher-throughput RPC endpoint\n * }\n * }\n * ```\n */\nexport class RpcRateLimitError extends ZamaError {\n /**\n * Suggested delay before retrying, in **seconds**, when a numeric `retryAfter`\n * is present on the error. Usually `undefined` for chain RPC: the `Retry-After`\n * header is consumed by the consumer's viem/ethers transport (which owns the\n * backoff), not surfaced here — see the class doc.\n */\n readonly retryAfter: number | undefined;\n\n constructor(message: string, options?: ErrorOptions & { retryAfter?: number }) {\n const { retryAfter, ...errorOptions } = options ?? {};\n super(ZamaErrorCode.RpcRateLimited, message, errorOptions);\n this.name = \"RpcRateLimitError\";\n this.retryAfter = retryAfter;\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * Thrown when the signer and provider are connected to different chains at the\n * start of a write operation.\n *\n * Every write method runs a chain-alignment pre-flight check. If\n * `signer.getChainId()` and `provider.getChainId()` return different values,\n * this error is thrown before any RPC mutation is attempted.\n *\n * @example\n * ```ts\n * try {\n * await token.shield(1000n);\n * } catch (e) {\n * if (e instanceof ChainMismatchError) {\n * console.error(\n * `Signer is on chain ${e.signerChainId} but provider is on chain ${e.providerChainId}`,\n * );\n * }\n * }\n * ```\n */\nexport class ChainMismatchError extends ZamaError {\n /** Name of the operation that triggered the check. */\n readonly operation: string;\n /** Chain ID the signer is connected to. */\n readonly signerChainId: number;\n /** Chain ID the provider is connected to. */\n readonly providerChainId: number;\n\n constructor(\n {\n operation,\n signerChainId,\n providerChainId,\n }: { operation: string; signerChainId: number; providerChainId: number },\n options?: ErrorOptions,\n ) {\n super(\n ZamaErrorCode.ChainMismatch,\n `Operation \"${operation}\" requires signer and provider to be on the same chain, ` +\n `but signer is on chain ${signerChainId} and provider is on chain ${providerChainId}.`,\n options,\n );\n this.name = \"ChainMismatchError\";\n this.operation = operation;\n this.signerChainId = signerChainId;\n this.providerChainId = providerChainId;\n }\n}\n","import type { Address } from \"viem\";\nimport { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** Structured details shared by balance-related errors. */\nexport interface BalanceErrorDetails {\n /** Amount the caller requested, in the token's base units. */\n readonly requested: bigint;\n /** Amount available at the time of the check, in the token's base units. */\n readonly available: bigint;\n /** Address of the token contract involved. */\n readonly token: Address;\n}\n\n/** Confidential (cToken) balance is insufficient for the requested operation. */\nexport class InsufficientConfidentialBalanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The available balance at the time of the check. */\n readonly available: bigint;\n /** The token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientConfidentialBalance, message, options);\n this.name = \"InsufficientConfidentialBalanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** ERC-20 balance is insufficient for the requested shield amount. */\nexport class InsufficientERC20BalanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The available balance at the time of the check. */\n readonly available: bigint;\n /** The ERC-20 token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientERC20Balance, message, options);\n this.name = \"InsufficientERC20BalanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** ERC-20 allowance granted to the wrapper is insufficient for the requested wrap amount. */\nexport class InsufficientAllowanceError extends ZamaError {\n /** The amount the caller requested. */\n readonly requested: bigint;\n /** The allowance available at the time of the check. */\n readonly available: bigint;\n /** The underlying ERC-20 token contract address. */\n readonly token: Address;\n\n constructor(message: string, details: BalanceErrorDetails, options?: ErrorOptions) {\n super(ZamaErrorCode.InsufficientAllowance, message, options);\n this.name = \"InsufficientAllowanceError\";\n this.requested = details.requested;\n this.available = details.available;\n this.token = details.token;\n }\n}\n\n/** Balance validation could not be performed (no cached credentials and decryption not possible). */\nexport class BalanceCheckUnavailableError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.BalanceCheckUnavailable, message, options);\n this.name = \"BalanceCheckUnavailableError\";\n }\n}\n\n/** A public ERC-20 read (e.g. balanceOf) failed due to a network or contract error. */\nexport class ERC20ReadFailedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.ERC20ReadFailed, message, options);\n this.name = \"ERC20ReadFailedError\";\n }\n}\n","import { ConfigurationError } from \"./relayer\";\nimport { RpcRateLimitError } from \"./rpc\";\nimport { SigningRejectedError, SigningFailedError } from \"./signing\";\n\n/**\n * Returns `true` for errors that should abort an entire batch operation\n * rather than be recorded per-item — wallet signature rejected, signing\n * infrastructure broken, SDK misconfigured, or the RPC provider throttling.\n * These are systemic failures that won't recover within the same call; for a\n * rate-limit in particular, the per-item retry loop would only amplify the\n * throttle by re-hitting the already-rate-limited endpoint.\n *\n * Callers iterating over a batch (e.g. per-token decrypt) should rethrow when\n * this predicate is true so the whole batch aborts, and record the error\n * per-item otherwise.\n */\nexport function isFatalBatchError(error: unknown): boolean {\n return (\n error instanceof SigningRejectedError ||\n error instanceof SigningFailedError ||\n error instanceof ConfigurationError ||\n error instanceof RpcRateLimitError\n );\n}\n","// Copied from @zama-fhe/relayer-sdk/src/sdk/FheType.ts\n// Pure utility functions with zero WASM dependency.\n// Adapted to use simple errors instead of RelayerErrorBase hierarchy.\n\n////////////////////////////////////////////////////////////////////////////////\n// Types (from types/primitives.d.ts)\n////////////////////////////////////////////////////////////////////////////////\n\nexport interface FheTypeNameToIdMap {\n ebool: 0;\n //euint4: 1; deprecated\n euint8: 2;\n euint16: 3;\n euint32: 4;\n euint64: 5;\n euint128: 6;\n eaddress: 7;\n euint256: 8;\n}\n\nexport interface FheTypeIdToNameMap {\n 0: \"ebool\";\n //1: 'euint4'; deprecated\n 2: \"euint8\";\n 3: \"euint16\";\n 4: \"euint32\";\n 5: \"euint64\";\n 6: \"euint128\";\n 7: \"eaddress\";\n 8: \"euint256\";\n}\n\nexport interface FheTypeEncryptionBitwidthToIdMap {\n 2: FheTypeNameToIdMap[\"ebool\"];\n 8: FheTypeNameToIdMap[\"euint8\"];\n 16: FheTypeNameToIdMap[\"euint16\"];\n 32: FheTypeNameToIdMap[\"euint32\"];\n 64: FheTypeNameToIdMap[\"euint64\"];\n 128: FheTypeNameToIdMap[\"euint128\"];\n 160: FheTypeNameToIdMap[\"eaddress\"];\n 256: FheTypeNameToIdMap[\"euint256\"];\n}\n\nexport type FheTypeIdToEncryptionBitwidthMap = {\n [K in keyof FheTypeEncryptionBitwidthToIdMap as FheTypeEncryptionBitwidthToIdMap[K]]: K;\n};\n\ntype Prettify<T> = { [K in keyof T]: T[K] } & {};\n\nexport type FheTypeName = Prettify<keyof FheTypeNameToIdMap>;\nexport type FheTypeId = Prettify<keyof FheTypeIdToNameMap>;\nexport type EncryptionBits = Prettify<keyof FheTypeEncryptionBitwidthToIdMap>;\n\n////////////////////////////////////////////////////////////////////////////////\n// Lookup Maps\n////////////////////////////////////////////////////////////////////////////////\n\nconst MINIMUM_ENCRYPTION_BIT_WIDTH = 2;\n\nconst FheTypeNameToId: FheTypeNameToIdMap = {\n ebool: 0,\n //euint4: 1, deprecated\n euint8: 2,\n euint16: 3,\n euint32: 4,\n euint64: 5,\n euint128: 6,\n eaddress: 7,\n euint256: 8,\n} as const;\n\nconst FheTypeIdToName: FheTypeIdToNameMap = {\n 0: \"ebool\",\n //1: 'euint4', deprecated\n 2: \"euint8\",\n 3: \"euint16\",\n 4: \"euint32\",\n 5: \"euint64\",\n 6: \"euint128\",\n 7: \"eaddress\",\n 8: \"euint256\",\n} as const;\n\nconst FheTypeIdToEncryptionBitwidth: FheTypeIdToEncryptionBitwidthMap = {\n 0: 2,\n //1:?, euint4 deprecated\n 2: 8,\n 3: 16,\n 4: 32,\n 5: 64,\n 6: 128,\n 7: 160,\n 8: 256,\n} as const;\n\nconst EncryptionBitwidthToFheTypeId: FheTypeEncryptionBitwidthToIdMap = {\n 2: 0,\n 8: 2,\n 16: 3,\n 32: 4,\n 64: 5,\n 128: 6,\n 160: 7,\n 256: 8,\n} as const;\n\nObject.freeze(FheTypeNameToId);\nObject.freeze(FheTypeIdToName);\nObject.freeze(FheTypeIdToEncryptionBitwidth);\nObject.freeze(EncryptionBitwidthToFheTypeId);\n\n////////////////////////////////////////////////////////////////////////////////\n// Type Guards\n////////////////////////////////////////////////////////////////////////////////\n\nexport function isFheTypeId(value: unknown): value is FheTypeId {\n switch (value as FheTypeId) {\n case 0:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n case 8:\n return true;\n default:\n return false;\n }\n}\n\nexport function isFheTypeName(value: unknown): value is FheTypeName {\n if (typeof value !== \"string\") {\n return false;\n }\n return value in FheTypeNameToId;\n}\n\nexport function isEncryptionBits(value: unknown): value is EncryptionBits {\n if (typeof value !== \"number\") {\n return false;\n }\n return value in EncryptionBitwidthToFheTypeId;\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Converters\n////////////////////////////////////////////////////////////////////////////////\n\nexport function fheTypeIdFromEncryptionBits(bitwidth: number): FheTypeId {\n if (!isEncryptionBits(bitwidth)) {\n throw new Error(`Invalid encryption bits ${bitwidth}`);\n }\n return EncryptionBitwidthToFheTypeId[bitwidth];\n}\n\nexport function fheTypeIdFromName(name: string): FheTypeId {\n if (!isFheTypeName(name)) {\n throw new Error(`Invalid FheType name '${name}'`);\n }\n return FheTypeNameToId[name];\n}\n\nexport function fheTypeNameFromId(id: number): FheTypeName {\n if (!isFheTypeId(id)) {\n throw new Error(`Invalid FheType id '${id}'`);\n }\n return FheTypeIdToName[id];\n}\n\nexport function encryptionBitsFromFheTypeId(typeId: number): EncryptionBits {\n if (!isFheTypeId(typeId)) {\n throw new Error(`Invalid FheType id '${typeId}'`);\n }\n const bw = FheTypeIdToEncryptionBitwidth[typeId];\n if (bw < MINIMUM_ENCRYPTION_BIT_WIDTH) {\n throw new Error(\n `Invalid FheType encryption bit width: ${bw}. Minimum is ${MINIMUM_ENCRYPTION_BIT_WIDTH} bits.`,\n );\n }\n return bw;\n}\n\nexport function encryptionBitsFromFheTypeName(name: string): EncryptionBits {\n if (!isFheTypeName(name)) {\n throw new Error(`Invalid FheType name '${name}'`);\n }\n const bw = FheTypeIdToEncryptionBitwidth[FheTypeNameToId[name]];\n if (bw < MINIMUM_ENCRYPTION_BIT_WIDTH) {\n throw new Error(\n `Invalid FheType encryption bit width: ${bw}. Minimum is ${MINIMUM_ENCRYPTION_BIT_WIDTH} bits.`,\n );\n }\n return bw;\n}\n","import type { EncryptedValue } from \"../relayer/types\";\nimport { encryptionBitsFromFheTypeId, isFheTypeId } from \"./fhe-type\";\n\n/** All-zero encrypted-value sentinel — a 32-byte zero handle representing the cleartext value `0`. */\nexport const ZERO_ENCRYPTED_VALUE =\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as const;\n\n/**\n * Check whether an encrypted value represents the zero value.\n */\nexport function isEncryptedValueZero(encryptedValue: string): boolean {\n return encryptedValue === ZERO_ENCRYPTED_VALUE || encryptedValue === \"0x\";\n}\n\n/**\n * Per-request cleartext-bit budget enforced by the KMS gateway, mirrored from\n * `@fhevm/sdk`'s `MAX_KMS_DECRYPT_DECRYPTION_BIT_LIMIT` (protocol-level constant,\n * not imported — see {@link MAX_CONTRACTS_PER_PERMIT} for why). Internal: decrypt\n * requests are chunked to respect it automatically, so callers never need this value.\n */\nexport const MAX_DECRYPTION_REQUEST_BITS = 2048;\n\n/** Max encryption bit width among all currently-known FHE types (euint256). */\nconst MAX_KNOWN_ENCRYPTION_BITS = 256;\n\n/**\n * Cleartext bit cost of decrypting a single handle, derived from its FHE\n * type (encoded at bits 8-15 of the handle — the same layout `@fhevm/sdk`'s\n * `FhevmHandle` decodes, byte 30 of the 32-byte handle).\n *\n * Falls back to {@link MAX_KNOWN_ENCRYPTION_BITS} for an unrecognized type\n * byte, or for a value that isn't parseable hex at all, instead of throwing.\n * A real on-chain handle is always well-formed with a valid type byte, so\n * this fallback only ever fires for synthetic test/placeholder handles —\n * deliberately more permissive than the relayer's own strict validation so\n * chunking stays safe without requiring every test fixture to encode a real\n * FHE handle. Do not tighten this to match relayer semantics.\n */\nexport function encryptionBitsForHandle(encryptedValue: EncryptedValue): number {\n let handleValue: bigint;\n try {\n handleValue = BigInt(encryptedValue);\n } catch {\n return MAX_KNOWN_ENCRYPTION_BITS;\n }\n const typeByte = Number((handleValue >> 8n) & 0xffn);\n return isFheTypeId(typeByte) ? encryptionBitsFromFheTypeId(typeByte) : MAX_KNOWN_ENCRYPTION_BITS;\n}\n\n/**\n * Split `handles` into groups whose cumulative cleartext-bit cost never\n * exceeds `maxBits`, preserving input order. Unlike {@link chunkContracts}\n * (fixed-size slices), a greedy accumulate-until-exceeded walk is required\n * since per-handle cost varies by FHE type. A handle whose own cost exceeds\n * `maxBits` still gets a solo chunk — always makes forward progress.\n */\nexport function chunkHandlesByBitBudget(\n handles: readonly EncryptedValue[],\n maxBits: number = MAX_DECRYPTION_REQUEST_BITS,\n): EncryptedValue[][] {\n const chunks: EncryptedValue[][] = [];\n let current: EncryptedValue[] = [];\n let currentBits = 0;\n\n for (const handle of handles) {\n const bits = encryptionBitsForHandle(handle);\n if (current.length > 0 && currentBits + bits > maxBits) {\n chunks.push(current);\n current = [];\n currentBits = 0;\n }\n current.push(handle);\n currentBits += bits;\n }\n if (current.length > 0) {\n chunks.push(current);\n }\n return chunks;\n}\n","import {\n ChainMismatchError,\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n} from \"../errors\";\nimport type { GenericProvider, GenericSigner, WalletAccount } from \"../types\";\n\n/**\n * Pre-flight guard for signer-required operations. Resolves the connected\n * wallet account (refreshing once if the signer reports it isn't ready) and\n * verifies the signer's chain matches the provider's.\n *\n * @internal\n */\nexport async function requireAlignedWalletAccount(\n operation: string,\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n): Promise<WalletAccount> {\n if (!signer) {\n throw new SignerNotConfiguredError(operation);\n }\n let account: WalletAccount;\n try {\n account = signer.requireWalletAccount(operation);\n } catch (error) {\n if (!(error instanceof WalletAccountNotReadyError) || !signer.refreshWalletAccount) {\n throw error;\n }\n await signer.refreshWalletAccount();\n account = signer.requireWalletAccount(operation);\n }\n const providerChainId = await provider.getChainId();\n if (account.chainId !== providerChainId) {\n throw new ChainMismatchError({ operation, signerChainId: account.chainId, providerChainId });\n }\n return account;\n}\n\n/**\n * Variant of {@link requireAlignedWalletAccount} that returns only the aligned\n * chain ID. Useful when a write path only needs to ensure signer/provider\n * coherence and doesn't otherwise consume the account.\n *\n * @internal\n */\nexport async function requireChainAlignment(\n operation: string,\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n): Promise<number> {\n return (await requireAlignedWalletAccount(operation, signer, provider)).chainId;\n}\n","/**\n * Execute an array of async thunks with bounded concurrency.\n * Defaults to `Infinity` (equivalent to `Promise.all`).\n */\nexport async function pLimit<T>(\n fns: (() => Promise<T>)[],\n maxConcurrency = Infinity,\n): Promise<T[]> {\n if (Number.isFinite(maxConcurrency) && maxConcurrency <= 0) {\n throw new Error(\"maxConcurrency must be a positive number\");\n }\n if (!Number.isFinite(maxConcurrency) || maxConcurrency >= fns.length) {\n return Promise.all(fns.map((f) => f()));\n }\n\n const results: T[] = Array.from({ length: fns.length });\n let index = 0;\n\n async function worker() {\n while (index < fns.length) {\n const i = index++;\n if (fns[i]) {\n results[i] = await fns[i]();\n }\n }\n }\n\n await Promise.all(Array.from({ length: maxConcurrency }, worker));\n return results;\n}\n","import type { Hex } from \"viem\";\nimport { TransactionRevertedError, ZamaError } from \"../errors\";\nimport type { TransactionOperation, ZamaSDKEventInput } from \"../events/sdk-events\";\nimport { transactionOperationMetadata, ZamaSDKEvents } from \"../events/sdk-events\";\nimport type {\n GenericLogger,\n GenericProvider,\n GenericSigner,\n TransactionResult,\n WriteContractConfig,\n} from \"../types\";\nimport { swallow } from \"./swallow\";\n\n/**\n * Shared write-transaction pipeline for SDK calls that submit a transaction.\n *\n * On success: writes the tx, emits the per-operation submitted event from\n * {@link transactionOperationMetadata}, fires `onSubmitted`, waits for the\n * receipt, and returns `{ txHash, receipt }`.\n *\n * On failure: emits a {@link ZamaSDKEvents.TransactionError} event with the\n * transaction-level error it will throw, then throws it. Existing `ZamaError`\n * instances are rethrown as-is; all other failures are wrapped in\n * `TransactionRevertedError` with the original error as `cause`.\n */\nexport async function submitTransaction(params: {\n operation: TransactionOperation;\n signer: GenericSigner;\n provider: GenericProvider;\n config: WriteContractConfig;\n emit: (input: ZamaSDKEventInput) => void;\n onSubmitted?: (txHash: Hex) => void;\n logger: GenericLogger;\n}): Promise<TransactionResult> {\n const { operation, signer, provider, config, emit, onSubmitted, logger } = params;\n const metadata = transactionOperationMetadata[operation];\n\n try {\n const txHash = await signer.writeContract(config);\n emit(metadata.submittedEvent(txHash));\n void swallow(`${operation}: onSubmitted`, () => onSubmitted?.(txHash), logger);\n const receipt = await provider.waitForTransactionReceipt(txHash);\n return { txHash, receipt };\n } catch (error) {\n const failure =\n error instanceof ZamaError\n ? error\n : new TransactionRevertedError(`Transaction failed during ${operation}`, { cause: error });\n\n emit({ type: ZamaSDKEvents.TransactionError, operation, error: failure });\n throw failure;\n }\n}\n","import { type Address, getAddress, type Hex } from \"viem\";\nimport {\n confidentialBalanceOfContract,\n confidentialTransferAndCallContract,\n confidentialTransferContract,\n confidentialTransferFromAndCallContract,\n confidentialTransferFromContract,\n decimalsContract,\n ERC7984_INTERFACE_ID,\n ERC7984_WRAPPER_INTERFACE_ID,\n isOperatorContract,\n nameContract,\n setOperatorContract,\n supportsInterfaceContract,\n symbolContract,\n} from \"../contracts\";\nimport {\n BalanceCheckUnavailableError,\n ConfigurationError,\n DecryptionFailedError,\n EncryptionFailedError,\n InsufficientConfidentialBalanceError,\n isFatalBatchError,\n requireConfigured,\n ZamaError,\n} from \"../errors\";\nimport type { TransactionOperation, ZamaSDKEventInput } from \"../events/sdk-events\";\nimport type { EncryptedValue } from \"../relayer/types\";\nimport { toError } from \"../utils\";\nimport { requireAlignedWalletAccount, requireChainAlignment } from \"../utils/alignment\";\nimport { assertBigint } from \"../utils/assertions\";\nimport { pLimit } from \"../utils/concurrency\";\nimport { isEncryptedValueZero } from \"../utils/handles\";\nimport { submitTransaction as submitSdkTransaction } from \"../utils/submit-transaction\";\nimport { swallow } from \"../utils/swallow\";\nimport type {\n GenericSigner,\n TransactionResult,\n TransferCallbacks,\n TransferOptions,\n WriteContractConfig,\n} from \"../types\";\nimport type { ZamaSDK } from \"../zama-sdk\";\n\n/** Options for {@link Token.batchDecryptBalancesAs}. */\nexport interface BatchDecryptAsOptions {\n /** The address of the account that delegated decryption rights. */\n delegatorAddress: Address;\n /** Pre-fetched encrypted values. When omitted, they are fetched from the chain. */\n encryptedValues?: EncryptedValue[];\n /**\n * The account whose on-chain balance to read. Defaults to the delegator\n * address, which is the common case (the delegator grants permission to\n * decrypt their own balance). Only set this when the account differs\n * from the delegator.\n *\n * Matches the `account` parameter of `confidentialBalanceOf(account)` on-chain.\n */\n accountAddress?: Address;\n /** Maximum number of concurrent decrypt calls. Default: 10. */\n maxConcurrency?: number;\n /** Called when decryption fails for a single token. Return a fallback bigint. */\n onError?: (error: Error, address: Address) => bigint;\n}\n\n/** Result of {@link Token.batchBalancesOf}. */\nexport interface BatchBalancesResult {\n /** Successfully decrypted balances, keyed by token address. */\n results: Map<Address, bigint>;\n /** Per-token errors for tokens that failed to decrypt. */\n errors: Map<Address, ZamaError>;\n}\n\n/**\n * High-level interface for an ERC-7984 confidential token.\n * Hides FHE complexity (encryption, decryption, EIP-712 signing) behind\n * familiar ERC-20-like methods.\n *\n * For ERC-7984 wrappers (shield/unshield), use {@link WrappedToken} instead —\n * it extends `Token` with wrapper-specific operations.\n *\n * Decryption, credentials, caching, and event emission are handled by the\n * owning {@link ZamaSDK} — this class only exposes token-scoped helpers\n * that delegate to `sdk.decryption.decryptValues` and `sdk.permits.grantPermit`.\n */\nexport class Token {\n /** The SDK instance this token operates through. */\n readonly sdk: ZamaSDK;\n /** Checksummed address of the confidential token contract. */\n readonly address: Address;\n\n constructor(sdk: ZamaSDK, address: Address) {\n this.sdk = sdk;\n this.address = getAddress(address);\n }\n\n /** Resolve `sdk.signer` or throw {@link SignerNotConfiguredError} tagged with `operation`. */\n #requireSigner(operation: string): GenericSigner {\n return requireConfigured(this.sdk.signer, operation);\n }\n\n // METADATA\n\n /** Read the token name from the contract. */\n async name(): Promise<string> {\n return this.sdk.provider.readContract(nameContract(this.address));\n }\n\n /** Read the token symbol from the contract. */\n async symbol(): Promise<string> {\n return this.sdk.provider.readContract(symbolContract(this.address));\n }\n\n /** Read the token decimals from the contract. */\n async decimals(): Promise<number> {\n return this.sdk.provider.readContract(decimalsContract(this.address));\n }\n\n // ERC-165 DISCOVERY\n\n /**\n * ERC-165 check for {@link ERC7984_INTERFACE_ID} support.\n *\n * @returns `true` if the contract implements the ERC-7984 confidential token interface.\n */\n async isConfidential(): Promise<boolean> {\n return this.sdk.provider.readContract(\n supportsInterfaceContract(this.address, ERC7984_INTERFACE_ID),\n );\n }\n\n /**\n * ERC-165 check for IERC7984ERC20Wrapper support.\n *\n * @returns `true` if the contract implements the ERC-7984 wrapper interface\n * ({@link ERC7984_WRAPPER_INTERFACE_ID}, `0x1f1c62b2`).\n */\n async isWrapper(): Promise<boolean> {\n return this.sdk.provider.readContract(\n supportsInterfaceContract(this.address, ERC7984_WRAPPER_INTERFACE_ID),\n );\n }\n\n // BALANCES\n\n /**\n * Decrypt and return the plaintext balance for the given owner.\n * Acquires FHE credentials via a wallet signature if none are cached.\n *\n * @param owner - Balance owner address.\n * @returns The decrypted plaintext balance as a bigint.\n * @throws if FHE decryption fails. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balance = await token.balanceOf(\"0xOwner\");\n * ```\n */\n async balanceOf(owner: Address): Promise<bigint> {\n const ownerAddress = getAddress(owner);\n const encryptedValue = await this.readConfidentialBalanceOf(ownerAddress);\n const result = await this.sdk.decryption.decryptValues([\n { encryptedValue, contractAddress: this.address },\n ]);\n const value = result[encryptedValue];\n if (value === undefined) {\n throw new DecryptionFailedError(`Decryption returned no value for ${encryptedValue}`);\n }\n assertBigint(value, \"balanceOf: result[encryptedValue]\");\n return value;\n }\n\n /**\n * Return the raw encrypted balance without decrypting.\n *\n * @param owner - Balance owner address.\n * @returns The encrypted balance as a hex string.\n *\n * @example\n * ```ts\n * const encryptedValue = await token.confidentialBalanceOf(\"0xOwner\");\n * ```\n */\n async confidentialBalanceOf(owner: Address): Promise<EncryptedValue> {\n return this.readConfidentialBalanceOf(getAddress(owner));\n }\n\n /**\n * Decrypt the balance of a delegator using delegated decryption credentials.\n * The connected signer acts as the delegatee who has been granted permission\n * by the delegator to decrypt their balance.\n *\n * Clear values are cached in storage keyed by `(account, token, encryptedValue)`.\n * Because every on-chain balance change produces a new encrypted value,\n * stale cache entries are never served. Cache write failures are silently\n * ignored — they do not affect the returned value.\n *\n * @param delegatorAddress - The address of the account that delegated decryption rights.\n * @param accountAddress - The account whose on-chain balance to read. Defaults\n * to the delegator address.\n * @returns The decrypted plaintext balance as a bigint.\n * @throws if no active delegation exists. {@link DelegationNotFoundError}\n * @throws if the delegation has expired. {@link DelegationExpiredError}\n * @throws if delegated decryption fails. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balance = await token.decryptBalanceAs({\n * delegatorAddress: \"0xDelegator\",\n * });\n * ```\n */\n async decryptBalanceAs({\n delegatorAddress,\n accountAddress,\n }: {\n delegatorAddress: Address;\n accountAddress?: Address;\n }): Promise<bigint> {\n await requireChainAlignment(\"decryptBalanceAs\", this.sdk.signer, this.sdk.provider);\n const normalizedDelegator = getAddress(delegatorAddress);\n const normalizedAccount = accountAddress ? getAddress(accountAddress) : normalizedDelegator;\n\n const encryptedValue = await this.readConfidentialBalanceOf(normalizedAccount);\n if (isEncryptedValueZero(encryptedValue)) {\n return 0n;\n }\n\n const result = await this.sdk.decryption.delegatedDecryptValues(\n [{ encryptedValue, contractAddress: this.address }],\n normalizedDelegator,\n normalizedAccount,\n );\n\n const value = result[encryptedValue];\n if (value === undefined) {\n throw new DecryptionFailedError(\n `Delegated decryption returned no value for ${encryptedValue}`,\n );\n }\n assertBigint(value, \"decryptBalanceAs: result[encryptedValue]\");\n return value;\n }\n\n // BATCH STATICS\n\n /**\n * Decrypt confidential balances for multiple tokens in parallel, returning\n * successes and per-token errors separately. Pre-authorizes all token\n * addresses in a single wallet signature, then delegates each decrypt to\n * `sdk.decryption.decryptValues`.\n *\n * Tokens that fail to decrypt land in `errors` rather than aborting the\n * whole batch — caller decides how to surface them.\n *\n * @param tokens - Array of {@link Token} instances bound to the same SDK.\n * @param owner - Balance owner address.\n * @returns `{ results, errors }` partitioning the per-token outcomes.\n *\n * @example\n * ```ts\n * const { results, errors } = await Token.batchBalancesOf(tokens, owner);\n * ```\n */\n static async batchBalancesOf(tokens: Token[], owner: Address): Promise<BatchBalancesResult> {\n const results = new Map<Address, bigint>();\n const errors = new Map<Address, ZamaError>();\n if (tokens.length === 0) {\n return { results, errors };\n }\n\n const sdk = Token.assertSameSdk(tokens);\n // Fail fast on chain mismatch before prompting the wallet for a signature.\n await requireChainAlignment(\"batchBalancesOf\", sdk.signer, sdk.provider);\n // Pre-authorize the full token set in one wallet signature so subsequent\n // per-token decryptValues calls reuse the cached credentials.\n await sdk.permits.grantPermit(tokens.map((t) => t.address));\n\n const outcomes = await pLimit(\n tokens.map((t) => async () => {\n try {\n return { status: \"fulfilled\" as const, value: await t.balanceOf(owner) };\n } catch (reason) {\n return { status: \"rejected\" as const, reason };\n }\n }),\n 5,\n );\n\n for (let i = 0; i < tokens.length; i++) {\n const tokenAddress = tokens[i]!.address;\n const outcome = outcomes[i]!;\n if (outcome.status === \"fulfilled\") {\n results.set(tokenAddress, outcome.value);\n } else {\n const reason = outcome.reason;\n // Session-level failures (user rejected signature, SDK misconfigured)\n // apply to every token — surface them instead of collecting per-token.\n if (isFatalBatchError(reason)) {\n throw reason;\n }\n const error =\n reason instanceof ZamaError\n ? reason\n : new DecryptionFailedError(toError(reason).message, { cause: reason });\n errors.set(tokenAddress, error);\n }\n }\n\n // Total failure: surface the first error so callers know nothing decrypted.\n if (errors.size === tokens.length) {\n const firstError = errors.values().next().value;\n throw firstError ?? new DecryptionFailedError(\"All token balance decryptions failed\");\n }\n\n return { results, errors };\n }\n\n /**\n * Batch decrypt confidential balances as a delegate across multiple tokens.\n * Mirrors {@link batchBalancesOf} but uses delegated credentials.\n *\n * **Error handling:** If a per-token decryption fails and no `onError` callback\n * is provided, errors are collected and thrown as an aggregated\n * `DecryptionFailedError`. When the relayer returns no value for an encrypted value,\n * a `DecryptionFailedError` is thrown for that token (never silently returns `0n`).\n * Pass `onError: () => 0n` to opt into the silent zero behavior.\n *\n * @param tokens - Array of Token instances to decrypt balances for.\n * @param options - Delegated decryption configuration.\n * @returns A Map from token address to decrypted balance.\n * @throws if no active delegation exists. {@link DelegationNotFoundError}\n * @throws if the delegation has expired. {@link DelegationExpiredError}\n * @throws if any decryption fails and no `onError` is provided. {@link DecryptionFailedError}\n *\n * @example\n * ```ts\n * const balances = await Token.batchDecryptBalancesAs(tokens, {\n * delegatorAddress: \"0xDelegator\",\n * onError: (err, addr) => { console.error(addr, err); return 0n; },\n * });\n * ```\n */\n static async batchDecryptBalancesAs(\n tokens: Token[],\n options: BatchDecryptAsOptions,\n ): Promise<Map<Address, bigint>> {\n if (tokens.length === 0) {\n return new Map();\n }\n\n const sdk = Token.assertSameSdk(tokens);\n const results = new Map<Address, bigint>();\n const errors = new Map<Address, ZamaError>();\n const normalizedAccount = options.accountAddress\n ? getAddress(options.accountAddress)\n : getAddress(options.delegatorAddress);\n const maxConcurrency = options.maxConcurrency ?? 10;\n if (options.encryptedValues && tokens.length !== options.encryptedValues.length) {\n throw new DecryptionFailedError(\n `tokens.length (${tokens.length}) must equal encryptedValues.length (${options.encryptedValues.length})`,\n );\n }\n const resolvedEncryptedValues =\n options.encryptedValues ??\n (await Token.readBalanceHandlesBatch(tokens, normalizedAccount, errors, maxConcurrency));\n\n const decryptRequests: Array<{ token: Token; encryptedValue: EncryptedValue }> = [];\n for (const [index, token] of tokens.entries()) {\n const encryptedValue = resolvedEncryptedValues[index];\n if (!encryptedValue || errors.has(token.address)) {\n continue;\n }\n if (isEncryptedValueZero(encryptedValue)) {\n // Zero balance → skip the relayer; no decryption needed.\n results.set(token.address, 0n);\n } else {\n decryptRequests.push({ token, encryptedValue });\n }\n }\n\n if (decryptRequests.length > 0) {\n const decrypted = await sdk.decryption.delegatedBatchDecryptValues({\n encryptedInputs: decryptRequests.map(({ token, encryptedValue }) => ({\n encryptedValue,\n contractAddress: token.address,\n })),\n delegatorAddress: options.delegatorAddress,\n accountAddress: options.accountAddress,\n maxConcurrency,\n });\n\n for (const [index, item] of decrypted.items.entries()) {\n const request = decryptRequests[index];\n if (!request) {\n continue;\n }\n if (item.error) {\n errors.set(request.token.address, item.error);\n continue;\n }\n const value = item.value;\n if (value === undefined) {\n errors.set(\n request.token.address,\n new DecryptionFailedError(\n `Batch delegated decryption returned no value for ${item.encryptedValue} on token ${request.token.address}`,\n ),\n );\n continue;\n }\n assertBigint(value, \"batchDecryptBalancesAs: result[encryptedValue]\");\n results.set(request.token.address, value);\n }\n }\n\n if (errors.size === 0) {\n return results;\n }\n\n if (options.onError) {\n const callbackErrors: Array<{ address: Address; error: Error }> = [];\n for (const [address, error] of errors) {\n try {\n results.set(address, options.onError(error, address));\n } catch (callbackError) {\n callbackErrors.push({ address, error: toError(callbackError) });\n }\n }\n if (callbackErrors.length > 0) {\n const message = callbackErrors\n .map(({ address, error }) => `${address}: ${error.message}`)\n .join(\"; \");\n throw new DecryptionFailedError(\n `Batch delegated decryption onError callback failed for ${callbackErrors.length} token(s): ${message}`,\n { cause: callbackErrors[0]?.error },\n );\n }\n return results;\n }\n\n const errorEntries = Array.from(errors.entries());\n const message = errorEntries.map(([addr, e]) => `${addr}: ${e.message}`).join(\"; \");\n throw new DecryptionFailedError(\n `Batch delegated decryption failed for ${errors.size} token(s): ${message}`,\n { cause: errorEntries[0]?.[1] },\n );\n }\n\n private static async readBalanceHandlesBatch(\n tokens: Token[],\n accountAddress: Address,\n errors: Map<Address, ZamaError>,\n maxConcurrency: number,\n ): Promise<Array<EncryptedValue | undefined>> {\n const outcomes = await pLimit(\n tokens.map((token) => async () => {\n try {\n return {\n status: \"fulfilled\" as const,\n value: await token.readConfidentialBalanceOf(accountAddress),\n };\n } catch (reason) {\n return { status: \"rejected\" as const, reason };\n }\n }),\n maxConcurrency,\n );\n\n const encryptedValues: Array<EncryptedValue | undefined> = [];\n for (const [index, token] of tokens.entries()) {\n const outcome = outcomes[index];\n if (!outcome) {\n continue;\n }\n if (outcome.status === \"fulfilled\") {\n encryptedValues[index] = outcome.value;\n continue;\n }\n if (isFatalBatchError(outcome.reason)) {\n throw outcome.reason;\n }\n errors.set(\n token.address,\n outcome.reason instanceof ZamaError\n ? outcome.reason\n : new DecryptionFailedError(toError(outcome.reason).message, { cause: outcome.reason }),\n );\n }\n return encryptedValues;\n }\n\n // WRITE OPERATIONS\n\n /**\n * Confidential transfer. Encrypts the amount via FHE, then calls the contract.\n *\n * By default, the SDK validates the confidential balance before submitting.\n * If a cached plaintext balance exists it is used; otherwise, if credentials\n * are cached, it decrypts on the fly. Set `skipBalanceCheck: true` to bypass\n * this validation (e.g. for smart wallets).\n *\n * @param to - Recipient address.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param options - Optional: `skipBalanceCheck` (default `false`).\n * @returns The transaction hash and mined receipt.\n * @throws if signer and provider are on different chains. {@link ChainMismatchError}\n * @throws if the balance is less than `amount`. {@link InsufficientConfidentialBalanceError}\n * @throws if balance validation requires decryption that is not possible. {@link BalanceCheckUnavailableError}\n * @throws if FHE encryption fails. {@link EncryptionFailedError}\n * @throws if the on-chain transfer reverts. {@link TransactionRevertedError}\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransfer(\"0xRecipient\", 1000n);\n * ```\n */\n async confidentialTransfer(\n to: Address,\n amount: bigint,\n options?: TransferOptions,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransfer\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransfer\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const { skipBalanceCheck = false, onEncryptComplete, onTransferSubmitted } = options ?? {};\n\n const normalizedTo = getAddress(to);\n\n if (!skipBalanceCheck) {\n await this.assertConfidentialBalance(amount);\n }\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\"transfer: onEncryptComplete\", () => onEncryptComplete?.(), this.sdk.logger);\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transfer\",\n config: confidentialTransferContract(\n this.address,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n ),\n onSubmitted: onTransferSubmitted,\n });\n }\n\n /**\n * Operator encrypted transfer on behalf of another address.\n * The caller must be an approved operator for `from`.\n *\n * @param from - The address to transfer from (caller must be an approved operator).\n * @param to - Recipient address.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFrom(\"0xFrom\", \"0xTo\", 500n);\n * ```\n */\n async confidentialTransferFrom(\n from: Address,\n to: Address,\n amount: bigint,\n callbacks?: TransferCallbacks,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferFrom\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransferFrom\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const normalizedFrom = getAddress(from);\n const normalizedTo = getAddress(to);\n\n // The input proof is verified against msg.sender, so it binds to the caller, not `from`.\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\n \"transferFrom: onEncryptComplete\",\n () => callbacks?.onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferFrom\",\n config: confidentialTransferFromContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n ),\n onSubmitted: callbacks?.onTransferSubmitted,\n });\n }\n\n /**\n * ERC-7984 `confidentialTransferAndCall`: encrypted transfer that also invokes\n * the recipient's receiver hook (`onConfidentialTransferReceived`) in a single\n * transaction. The caller crafts the opaque `data` payload — the SDK does not\n * encode, validate, or interpret it.\n *\n * Balance validation follows the same rules as {@link Token.confidentialTransfer}.\n *\n * @param to - Recipient address. Must implement the ERC-7984 receiver hook.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param data - Opaque bytes forwarded to the recipient's receiver hook.\n * @param options - Optional: `skipBalanceCheck` (default `false`).\n * @returns The transaction hash and mined receipt.\n *\n * @throws if signer and provider are on different chains. {@link ChainMismatchError}\n * @throws if the balance is less than `amount`. {@link InsufficientConfidentialBalanceError}\n * @throws if balance validation requires decryption that is not possible. {@link BalanceCheckUnavailableError}\n * @throws if FHE encryption fails. {@link EncryptionFailedError}\n * @throws if the on-chain transfer reverts. {@link TransactionRevertedError}\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferAndCall(\n * \"0xRecipient\",\n * 1000n,\n * \"0xabcd\", // caller-encoded payload forwarded to the receiver hook\n * );\n * ```\n */\n async confidentialTransferAndCall(\n to: Address,\n amount: bigint,\n data: Hex,\n options?: TransferOptions,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferAndCall\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransferAndCall\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const { skipBalanceCheck = false, onEncryptComplete, onTransferSubmitted } = options ?? {};\n\n const normalizedTo = getAddress(to);\n\n if (!skipBalanceCheck) {\n await this.assertConfidentialBalance(amount);\n }\n\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\n \"transferAndCall: onEncryptComplete\",\n () => onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferAndCall\",\n config: confidentialTransferAndCallContract(\n this.address,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n data,\n ),\n onSubmitted: onTransferSubmitted,\n });\n }\n\n /**\n * ERC-7984 `confidentialTransferFromAndCall`: operator-initiated encrypted\n * transfer that also invokes the recipient's receiver hook in a single\n * transaction. The caller must be an approved operator for `from` and crafts\n * the opaque `data` payload — the SDK does not encode or interpret it.\n *\n * @param from - The address to transfer from (caller must be an approved operator).\n * @param to - Recipient address. Must implement the ERC-7984 receiver hook.\n * @param amount - Plaintext amount to transfer (encrypted automatically via FHE).\n * @param data - Opaque bytes forwarded to the recipient's receiver hook.\n * @param callbacks - Optional progress callbacks.\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.confidentialTransferFromAndCall(\n * \"0xFrom\",\n * \"0xRecipient\",\n * 500n,\n * \"0xabcd\",\n * );\n * ```\n */\n async confidentialTransferFromAndCall(\n from: Address,\n to: Address,\n amount: bigint,\n data: Hex,\n callbacks?: TransferCallbacks,\n ): Promise<TransactionResult> {\n this.#requireSigner(\"confidentialTransferFromAndCall\");\n const account = await requireAlignedWalletAccount(\n \"confidentialTransferFromAndCall\",\n this.sdk.signer,\n this.sdk.provider,\n );\n const normalizedFrom = getAddress(from);\n const normalizedTo = getAddress(to);\n\n // The input proof is verified against msg.sender, so it binds to the caller, not `from`.\n const { encryptedValues, inputProof } = await this.sdk.encrypt({\n values: [{ value: amount, type: \"euint64\" }],\n contractAddress: this.address,\n userAddress: getAddress(account.address),\n });\n void swallow(\n \"transferFromAndCall: onEncryptComplete\",\n () => callbacks?.onEncryptComplete?.(),\n this.sdk.logger,\n );\n\n if (encryptedValues.length === 0) {\n throw new EncryptionFailedError(\"Encryption returned no encrypted values\");\n }\n\n return this.submitTransaction({\n operation: \"transferFromAndCall\",\n config: confidentialTransferFromAndCallContract(\n this.address,\n normalizedFrom,\n normalizedTo,\n encryptedValues[0]!,\n inputProof,\n data,\n ),\n onSubmitted: callbacks?.onTransferSubmitted,\n });\n }\n\n // OPERATOR APPROVAL\n\n /**\n * Set operator approval for the confidential token.\n * Defaults to 1 hour from now if `until` is not specified.\n *\n * @param operator - The address to set as an operator.\n * @param until - Optional Unix timestamp for approval expiry. Defaults to now + 1 hour.\n * @returns The transaction hash and mined receipt.\n *\n * @example\n * ```ts\n * const txHash = await token.setOperator(\"0xOperator\");\n * ```\n */\n async setOperator(operator: Address, until?: number): Promise<TransactionResult> {\n this.#requireSigner(\"setOperator\");\n await requireChainAlignment(\"setOperator\", this.sdk.signer, this.sdk.provider);\n const normalizedOperator = getAddress(operator);\n return this.submitTransaction({\n operation: \"setOperator\",\n config: setOperatorContract(this.address, normalizedOperator, until),\n });\n }\n\n /**\n * Check if a spender is an approved operator for a given holder.\n *\n * @param holder - The token holder address.\n * @param spender - The address to check operator approval for.\n * @returns `true` if the spender is an approved operator for the holder.\n *\n * @example\n * ```ts\n * if (await token.isOperator(\"0xHolder\", \"0xSpender\")) {\n * // spender can call transferFrom on behalf of holder\n * }\n * ```\n */\n async isOperator(holder: Address, spender: Address): Promise<boolean> {\n return this.sdk.provider.readContract(\n isOperatorContract(this.address, getAddress(holder), getAddress(spender)),\n );\n }\n\n // PROTECTED HELPERS\n\n /**\n * Read the on-chain encrypted balance for a given owner.\n *\n * @internal\n */\n protected async readConfidentialBalanceOf(owner: Address): Promise<EncryptedValue> {\n return await this.sdk.provider.readContract(confidentialBalanceOfContract(this.address, owner));\n }\n\n /**\n * Pre-flight check: decrypt the confidential balance and compare against the\n * requested amount. If credentials are cached the decrypt happens silently;\n * if not, throws {@link BalanceCheckUnavailableError} instead of triggering\n * a surprise EIP-712 popup.\n *\n * @internal\n */\n protected async assertConfidentialBalance(amount: bigint): Promise<void> {\n if (amount === 0n) {\n return;\n }\n\n let balance: bigint;\n try {\n const account = await requireAlignedWalletAccount(\n \"assertConfidentialBalance\",\n this.sdk.signer,\n this.sdk.provider,\n );\n balance = await this.balanceOf(getAddress(account.address));\n } catch (error) {\n if (error instanceof ZamaError) {\n throw error;\n }\n throw new BalanceCheckUnavailableError(`Balance validation failed (token: ${this.address})`, {\n cause: error,\n });\n }\n\n if (balance < amount) {\n throw new InsufficientConfidentialBalanceError(\n `Insufficient confidential balance: requested ${amount}, available ${balance} (token: ${this.address})`,\n { requested: amount, available: balance, token: this.address },\n );\n }\n }\n\n /**\n * Emit a token-scoped event through the owning {@link ZamaSDK} so that\n * subscribers see a unified stream.\n *\n * @internal\n */\n protected emit(input: ZamaSDKEventInput): void {\n this.sdk.emitEvent(input, this.address);\n }\n\n /**\n * Submit a token-scoped write transaction through the shared SDK transaction\n * pipeline. Callers keep pre-flight and operation-specific work local.\n *\n * @internal\n */\n protected async submitTransaction(params: {\n operation: TransactionOperation;\n config: WriteContractConfig;\n onSubmitted?: (txHash: Hex) => void;\n }): Promise<TransactionResult> {\n const { operation, config, onSubmitted } = params;\n return submitSdkTransaction({\n operation,\n signer: this.#requireSigner(operation),\n provider: this.sdk.provider,\n config,\n emit: (input) => this.emit(input),\n onSubmitted,\n logger: this.sdk.logger,\n });\n }\n\n /** Verify all tokens share the same SDK instance and return it. */\n private static assertSameSdk(tokens: Token[]): ZamaSDK {\n const sdk = tokens[0]!.sdk;\n for (let i = 1; i < tokens.length; i++) {\n if (tokens[i]!.sdk !== sdk) {\n throw new ConfigurationError(\n \"All tokens in a batch operation must share the same ZamaSDK instance\",\n );\n }\n }\n return sdk;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zama-fhe/sdk",
3
- "version": "3.5.0-alpha.3",
3
+ "version": "3.5.0-alpha.4",
4
4
  "description": "TypeScript SDK for Zama fhEVM confidential smart contracts",
5
5
  "keywords": [
6
6
  "blockchain",