@zama-fhe/sdk 3.3.0 → 3.3.1-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +0 -2
  2. package/dist/cjs/base-signer.cjs +1 -1
  3. package/dist/cjs/base-signer.cjs.map +1 -1
  4. package/dist/cjs/chains.cjs +1 -1
  5. package/dist/cjs/chains.cjs.map +1 -1
  6. package/dist/cjs/cleartext/index.cjs +1 -1
  7. package/dist/cjs/cleartext.cjs +2 -0
  8. package/dist/cjs/cleartext.cjs.map +1 -0
  9. package/dist/cjs/ethers/index.cjs.map +1 -1
  10. package/dist/cjs/fhevm-relayer.cjs +2 -0
  11. package/dist/cjs/fhevm-relayer.cjs.map +1 -0
  12. package/dist/cjs/index.cjs +1 -1
  13. package/dist/cjs/index.cjs.map +1 -1
  14. package/dist/cjs/node/index.cjs +2 -0
  15. package/dist/cjs/node/index.cjs.map +1 -0
  16. package/dist/cjs/query/index.cjs +1 -1
  17. package/dist/cjs/query/index.cjs.map +1 -1
  18. package/dist/cjs/relayer.cjs +1 -1
  19. package/dist/cjs/relayer.cjs.map +1 -1
  20. package/dist/cjs/token.cjs +1 -1
  21. package/dist/cjs/token.cjs.map +1 -1
  22. package/dist/cjs/viem/index.cjs +1 -1
  23. package/dist/cjs/viem/index.cjs.map +1 -1
  24. package/dist/cjs/web/index.cjs +1 -590
  25. package/dist/cjs/web/index.cjs.map +1 -1
  26. package/dist/cjs/wrappers-registry.cjs.map +1 -1
  27. package/dist/esm/base-signer-CI-FYai2.js +2 -0
  28. package/dist/esm/base-signer-CI-FYai2.js.map +1 -0
  29. package/dist/esm/{base-signer-C3Wc5oi9.d.ts → base-signer-Q2EJECrc.d.ts} +2 -2
  30. package/dist/esm/chains/index.d.ts +2 -3
  31. package/dist/esm/chains/index.js +1 -1
  32. package/dist/esm/chains-CLv9HEJ_.js +2 -0
  33. package/dist/esm/chains-CLv9HEJ_.js.map +1 -0
  34. package/dist/esm/cleartext/index.d.ts +3 -2
  35. package/dist/esm/cleartext/index.js +1 -1
  36. package/dist/esm/cleartext-BfXTVQu-.js +2 -0
  37. package/dist/esm/cleartext-BfXTVQu-.js.map +1 -0
  38. package/dist/esm/cleartext-U6sPs_Kd.d.ts +19 -0
  39. package/dist/esm/ethers/index.d.ts +4 -5
  40. package/dist/esm/ethers/index.js +1 -1
  41. package/dist/esm/ethers/index.js.map +1 -1
  42. package/dist/esm/fhevm-relayer-B-lEKfPQ.js +2 -0
  43. package/dist/esm/fhevm-relayer-B-lEKfPQ.js.map +1 -0
  44. package/dist/esm/index-BnIp_-Ak.d.ts +328 -0
  45. package/dist/esm/{index-CYBH0nyo.d.ts → index-D66eC3G7.d.ts} +60 -13
  46. package/dist/esm/index.d.ts +8 -11
  47. package/dist/esm/index.js +1 -1
  48. package/dist/esm/index.js.map +1 -1
  49. package/dist/esm/node/index.d.ts +5 -194
  50. package/dist/esm/node/index.js +1 -1
  51. package/dist/esm/node/index.js.map +1 -1
  52. package/dist/esm/query/index.d.ts +3 -380
  53. package/dist/esm/query/index.js +1 -1
  54. package/dist/esm/query/index.js.map +1 -1
  55. package/dist/esm/relayer-BYq9bLh8.js +2 -0
  56. package/dist/esm/relayer-BYq9bLh8.js.map +1 -0
  57. package/dist/esm/token-CmHTAAWW.js +2 -0
  58. package/dist/esm/token-CmHTAAWW.js.map +1 -0
  59. package/dist/esm/{types-piBsdTIP.d.ts → types-Bov8XY36.d.ts} +3 -3
  60. package/dist/esm/{types-OHIaPwCy.d.ts → types-BpvL50qX.d.ts} +3 -3
  61. package/dist/esm/types-C-WTLcHZ.d.ts +988 -0
  62. package/dist/esm/viem/index.d.ts +4 -5
  63. package/dist/esm/viem/index.js +1 -1
  64. package/dist/esm/viem/index.js.map +1 -1
  65. package/dist/esm/web/index.d.ts +6 -9
  66. package/dist/esm/web/index.js +1 -590
  67. package/dist/esm/web/index.js.map +1 -1
  68. package/dist/esm/{wrappers-registry-C1oK8Bi6.js → wrappers-registry-xZWzyAi4.js} +2 -2
  69. package/dist/esm/wrappers-registry-xZWzyAi4.js.map +1 -0
  70. package/dist/esm/{index-C1Mtc8Rw.d.ts → zama-sdk-q4_qt64Q.d.ts} +1471 -1102
  71. package/package.json +6 -2
  72. package/dist/cjs/assertions.cjs +0 -2
  73. package/dist/cjs/assertions.cjs.map +0 -1
  74. package/dist/cjs/encryption.cjs +0 -2
  75. package/dist/cjs/encryption.cjs.map +0 -1
  76. package/dist/cjs/relayer-cleartext.cjs +0 -2
  77. package/dist/cjs/relayer-cleartext.cjs.map +0 -1
  78. package/dist/cjs/relayer-sdk.worker.js +0 -589
  79. package/dist/cjs/timeout.cjs +0 -2
  80. package/dist/cjs/timeout.cjs.map +0 -1
  81. package/dist/cjs/validation.cjs +0 -2
  82. package/dist/cjs/validation.cjs.map +0 -1
  83. package/dist/esm/assertions-zYseN5Xz.js +0 -2
  84. package/dist/esm/assertions-zYseN5Xz.js.map +0 -1
  85. package/dist/esm/base-signer-DjytqPkd.js +0 -2
  86. package/dist/esm/base-signer-DjytqPkd.js.map +0 -1
  87. package/dist/esm/chains-CXcO1DBP.js +0 -2
  88. package/dist/esm/chains-CXcO1DBP.js.map +0 -1
  89. package/dist/esm/cleartext-DAkOTlrE.d.ts +0 -19
  90. package/dist/esm/cleartext-rTWFctyd.js +0 -2
  91. package/dist/esm/cleartext-rTWFctyd.js.map +0 -1
  92. package/dist/esm/encryption-x4Z_Icqk.js +0 -2
  93. package/dist/esm/encryption-x4Z_Icqk.js.map +0 -1
  94. package/dist/esm/hex-A72GrTf9.js +0 -2
  95. package/dist/esm/hex-A72GrTf9.js.map +0 -1
  96. package/dist/esm/indexeddb-storage-Mi-fCWN3.js +0 -2
  97. package/dist/esm/indexeddb-storage-Mi-fCWN3.js.map +0 -1
  98. package/dist/esm/memory-storage-fp9RY5BQ.js +0 -2
  99. package/dist/esm/memory-storage-fp9RY5BQ.js.map +0 -1
  100. package/dist/esm/node/relayer-sdk.node-worker.d.ts +0 -1
  101. package/dist/esm/node/relayer-sdk.node-worker.js +0 -2
  102. package/dist/esm/node/relayer-sdk.node-worker.js.map +0 -1
  103. package/dist/esm/relayer-cleartext-Bp6jtxDd.js +0 -2
  104. package/dist/esm/relayer-cleartext-Bp6jtxDd.js.map +0 -1
  105. package/dist/esm/relayer-cleartext-CSeMlmGO.d.ts +0 -844
  106. package/dist/esm/relayer-eavK5bfZ.js +0 -2
  107. package/dist/esm/relayer-eavK5bfZ.js.map +0 -1
  108. package/dist/esm/relayer-sdk.worker.js +0 -589
  109. package/dist/esm/timeout-CNVfiaJD.js +0 -2
  110. package/dist/esm/timeout-CNVfiaJD.js.map +0 -1
  111. package/dist/esm/token-Bt33g0zQ.js +0 -2
  112. package/dist/esm/token-Bt33g0zQ.js.map +0 -1
  113. package/dist/esm/types-BgczXqW2.d.ts +0 -49
  114. package/dist/esm/types-Gn5MeDsr.d.ts +0 -669
  115. package/dist/esm/validation-DLszOweh.js +0 -2
  116. package/dist/esm/validation-DLszOweh.js.map +0 -1
  117. package/dist/esm/worker.base-client-BVnT4yJa.js +0 -2
  118. package/dist/esm/worker.base-client-BVnT4yJa.js.map +0 -1
  119. package/dist/esm/wrappers-registry-C1oK8Bi6.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"relayer.cjs","names":[],"sources":["../../src/errors/base.ts","../../src/errors/relayer.ts"],"sourcesContent":["/**\n * Typed error codes thrown by the SDK.\n * Use `error.code` or `instanceof` to programmatically handle specific failure modes.\n *\n * @example\n * ```ts\n * try {\n * await token.confidentialTransfer(\"0xTo\", 100n);\n * } catch (e) {\n * if (e instanceof SigningRejectedError) {\n * // User rejected the wallet signature\n * }\n * }\n * ```\n */\nexport const ZamaErrorCode = {\n /** User rejected the wallet signature prompt. */\n SigningRejected: \"SIGNING_REJECTED\",\n /** Wallet signature failed for a reason other than rejection. */\n SigningFailed: \"SIGNING_FAILED\",\n /** FHE encryption failed. */\n EncryptionFailed: \"ENCRYPTION_FAILED\",\n /** FHE decryption failed. */\n DecryptionFailed: \"DECRYPTION_FAILED\",\n /** On-chain transaction reverted. */\n TransactionReverted: \"TRANSACTION_REVERTED\",\n /** Transport key pair has expired and needs regeneration. */\n TransportKeyPairExpired: \"KEYPAIR_EXPIRED\",\n /** Relayer rejected transport key pair (stale, expired, or malformed). */\n InvalidTransportKeyPair: \"INVALID_KEYPAIR\",\n /** No FHE ciphertext exists for this account (never shielded). */\n NoCiphertext: \"NO_CIPHERTEXT\",\n /** Relayer HTTP request failed. */\n RelayerRequestFailed: \"RELAYER_REQUEST_FAILED\",\n /** The configured signer/account is not entitled (ACL) to decrypt this encrypted value. Don't retry — wait for a grant. */\n NotEntitled: \"NOT_ENTITLED\",\n /** The consumer's RPC provider rate-limited an on-chain read (e.g. HTTP 429 / JSON-RPC -32005). Retryable. */\n RpcRateLimited: \"RPC_RATE_LIMITED\",\n /** A worker operation exceeded its configured timeout; the worker is recycled by default. Retryable. */\n OperationTimeout: \"OPERATION_TIMEOUT\",\n /** An in-flight worker operation was aborted as collateral of another operation's timeout recycle. Retryable. */\n WorkerRecycled: \"WORKER_RECYCLED\",\n /** SDK configuration is invalid (e.g. forbidden chain ID, unsupported type). */\n Configuration: \"CONFIGURATION\",\n /** Delegation cannot target self (delegate === msg.sender). */\n DelegationSelfNotAllowed: \"DELEGATION_SELF_NOT_ALLOWED\",\n /** Only one delegate/revoke per (delegator, delegate, contract) per block. */\n DelegationCooldown: \"DELEGATION_COOLDOWN\",\n /** No active delegation found for this (delegator, delegate, contract) tuple. */\n DelegationNotFound: \"DELEGATION_NOT_FOUND\",\n /** The delegation has expired. */\n DelegationExpired: \"DELEGATION_EXPIRED\",\n /** Confidential (cToken) balance is insufficient for the requested operation. */\n InsufficientConfidentialBalance: \"INSUFFICIENT_CONFIDENTIAL_BALANCE\",\n /** ERC-20 balance is insufficient for the requested shield amount. */\n InsufficientERC20Balance: \"INSUFFICIENT_ERC20_BALANCE\",\n /** Balance validation could not be performed (no cached credentials and decryption not possible). */\n BalanceCheckUnavailable: \"BALANCE_CHECK_UNAVAILABLE\",\n /** Public ERC-20 read (e.g. balanceOf) failed due to a network or contract error. */\n ERC20ReadFailed: \"ERC20_READ_FAILED\",\n /** The new expiration date equals the current one — no on-chain change needed. */\n DelegationExpiryUnchanged: \"DELEGATION_EXPIRY_UNCHANGED\",\n /** Delegate address cannot be the contract address. */\n DelegationDelegateEqualsContract: \"DELEGATION_DELEGATE_EQUALS_CONTRACT\",\n /** Contract address cannot be the sender address. */\n DelegationContractIsSelf: \"DELEGATION_CONTRACT_IS_SELF\",\n /** The ACL contract is paused. */\n AclPaused: \"ACL_PAUSED\",\n /** Expiration date is too soon (must be at least 1 hour in the future). */\n DelegationExpirationTooSoon: \"DELEGATION_EXPIRATION_TOO_SOON\",\n /** Delegation exists on-chain but hasn't propagated to the gateway yet. */\n DelegationNotPropagated: \"DELEGATION_NOT_PROPAGATED\",\n /** Signer and provider are connected to different chains. */\n ChainMismatch: \"CHAIN_MISMATCH\",\n /** Operation requires a signer but none is configured. */\n SignerNotConfigured: \"SIGNER_NOT_CONFIGURED\",\n /** Operation requires a connected wallet account. */\n WalletNotConnected: \"WALLET_NOT_CONNECTED\",\n /** Wallet account discovery is still resolving. */\n WalletAccountNotReady: \"WALLET_ACCOUNT_NOT_READY\",\n} as const;\n\n/** Union of all {@link ZamaErrorCode} string values. */\nexport type ZamaErrorCode = (typeof ZamaErrorCode)[keyof typeof ZamaErrorCode];\n\n/**\n * Base error thrown by all SDK operations.\n * Carries a {@link ZamaErrorCode} for programmatic error handling.\n * Prefer catching specific subclasses (e.g. {@link EncryptionFailedError}).\n */\nexport class ZamaError extends Error {\n /** Machine-readable error code. */\n readonly code: ZamaErrorCode;\n\n constructor(code: ZamaErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"ZamaError\";\n this.code = code;\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** Relayer HTTP request failed. */\nexport class RelayerRequestFailedError extends ZamaError {\n /** HTTP status code from the relayer, if available. */\n readonly statusCode: number | undefined;\n\n /**\n * Server-driven retry delay in **seconds** (the SDK's duration unit and the\n * header's own unit), from the relayer's `Retry-After` header. Set only on\n * back-pressure (HTTP 429) responses that carry the header; `undefined`\n * otherwise. Implies {@link retryable}.\n */\n readonly retryAfter: number | undefined;\n\n /**\n * Whether the request may be safely retried. `true` for relayer back-pressure\n * (HTTP 429); pair with {@link retryAfter} for the server's suggested delay.\n */\n readonly retryable: boolean;\n\n constructor(\n message: string,\n statusCode?: number,\n options?: ErrorOptions & { retryAfter?: number },\n ) {\n super(ZamaErrorCode.RelayerRequestFailed, message, options);\n this.name = \"RelayerRequestFailedError\";\n this.statusCode = statusCode;\n this.retryable = statusCode === 429;\n // Keep the two fields consistent: a delay only makes sense when retryable.\n this.retryAfter = this.retryable ? options?.retryAfter : undefined;\n }\n}\n\n/** SDK configuration is invalid (e.g. forbidden chain ID, unsupported type). */\nexport class ConfigurationError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.Configuration, message, options);\n this.name = \"ConfigurationError\";\n }\n}\n"],"mappings":"AAeA,MAAa,EAAgB,CAE3B,gBAAiB,mBAEjB,cAAe,iBAEf,iBAAkB,oBAElB,iBAAkB,oBAElB,oBAAqB,uBAErB,wBAAyB,kBAEzB,wBAAyB,kBAEzB,aAAc,gBAEd,qBAAsB,yBAEtB,YAAa,eAEb,eAAgB,mBAEhB,iBAAkB,oBAElB,eAAgB,kBAEhB,cAAe,gBAEf,yBAA0B,8BAE1B,mBAAoB,sBAEpB,mBAAoB,uBAEpB,kBAAmB,qBAEnB,gCAAiC,oCAEjC,yBAA0B,6BAE1B,wBAAyB,4BAEzB,gBAAiB,oBAEjB,0BAA2B,8BAE3B,iCAAkC,sCAElC,yBAA0B,8BAE1B,UAAW,aAEX,4BAA6B,iCAE7B,wBAAyB,4BAEzB,cAAe,iBAEf,oBAAqB,wBAErB,mBAAoB,uBAEpB,sBAAuB,0BACzB,EAUA,IAAa,EAAb,cAA+B,KAAM,CAEnC,KAEA,YAAY,EAAqB,EAAiB,EAAwB,CACxE,MAAM,EAAS,CAAO,EACtB,OAAO,eAAe,KAAM,IAAI,OAAO,SAAS,EAChD,KAAK,KAAO,YACZ,KAAK,KAAO,CACd,CACF,ECjGa,EAAb,cAA+C,CAAU,CAEvD,WAQA,WAMA,UAEA,YACE,EACA,EACA,EACA,CACA,MAAM,EAAc,qBAAsB,EAAS,CAAO,EAC1D,KAAK,KAAO,4BACZ,KAAK,WAAa,EAClB,KAAK,UAAY,IAAe,IAEhC,KAAK,WAAa,KAAK,UAAY,GAAS,WAAa,IAAA,EAC3D,CACF,EAGa,EAAb,cAAwC,CAAU,CAChD,YAAY,EAAiB,EAAwB,CACnD,MAAM,EAAc,cAAe,EAAS,CAAO,EACnD,KAAK,KAAO,oBACd,CACF"}
1
+ {"version":3,"file":"relayer.cjs","names":[],"sources":["../../src/errors/base.ts","../../src/errors/relayer.ts"],"sourcesContent":["/**\n * Typed error codes thrown by the SDK.\n * Use `error.code` or `instanceof` to programmatically handle specific failure modes.\n *\n * @example\n * ```ts\n * try {\n * await token.confidentialTransfer(\"0xTo\", 100n);\n * } catch (e) {\n * if (e instanceof SigningRejectedError) {\n * // User rejected the wallet signature\n * }\n * }\n * ```\n */\nexport const ZamaErrorCode = {\n /** User rejected the wallet signature prompt. */\n SigningRejected: \"SIGNING_REJECTED\",\n /** Wallet signature failed for a reason other than rejection. */\n SigningFailed: \"SIGNING_FAILED\",\n /** FHE encryption failed. */\n EncryptionFailed: \"ENCRYPTION_FAILED\",\n /** FHE decryption failed. */\n DecryptionFailed: \"DECRYPTION_FAILED\",\n /** On-chain transaction reverted. */\n TransactionReverted: \"TRANSACTION_REVERTED\",\n /** Transport key pair has expired and needs regeneration. */\n TransportKeyPairExpired: \"KEYPAIR_EXPIRED\",\n /** Relayer rejected transport key pair (stale, expired, or malformed). */\n InvalidTransportKeyPair: \"INVALID_KEYPAIR\",\n /** No FHE ciphertext exists for this account (never shielded). */\n NoCiphertext: \"NO_CIPHERTEXT\",\n /** Relayer HTTP request failed. */\n RelayerRequestFailed: \"RELAYER_REQUEST_FAILED\",\n /** The configured signer/account is not entitled (ACL) to decrypt this encrypted value. Don't retry — wait for a grant. */\n NotEntitled: \"NOT_ENTITLED\",\n /** The consumer's RPC provider rate-limited an on-chain read (e.g. HTTP 429 / JSON-RPC -32005). Retryable. */\n RpcRateLimited: \"RPC_RATE_LIMITED\",\n /** SDK configuration is invalid (e.g. forbidden chain ID, unsupported type). */\n Configuration: \"CONFIGURATION\",\n /** Delegation cannot target self (delegate === msg.sender). */\n DelegationSelfNotAllowed: \"DELEGATION_SELF_NOT_ALLOWED\",\n /** Only one delegate/revoke per (delegator, delegate, contract) per block. */\n DelegationCooldown: \"DELEGATION_COOLDOWN\",\n /** No active delegation found for this (delegator, delegate, contract) tuple. */\n DelegationNotFound: \"DELEGATION_NOT_FOUND\",\n /** The delegation has expired. */\n DelegationExpired: \"DELEGATION_EXPIRED\",\n /** Confidential (cToken) balance is insufficient for the requested operation. */\n InsufficientConfidentialBalance: \"INSUFFICIENT_CONFIDENTIAL_BALANCE\",\n /** ERC-20 balance is insufficient for the requested shield amount. */\n InsufficientERC20Balance: \"INSUFFICIENT_ERC20_BALANCE\",\n /** Balance validation could not be performed (no cached credentials and decryption not possible). */\n BalanceCheckUnavailable: \"BALANCE_CHECK_UNAVAILABLE\",\n /** Public ERC-20 read (e.g. balanceOf) failed due to a network or contract error. */\n ERC20ReadFailed: \"ERC20_READ_FAILED\",\n /** The new expiration date equals the current one — no on-chain change needed. */\n DelegationExpiryUnchanged: \"DELEGATION_EXPIRY_UNCHANGED\",\n /** Delegate address cannot be the contract address. */\n DelegationDelegateEqualsContract: \"DELEGATION_DELEGATE_EQUALS_CONTRACT\",\n /** Contract address cannot be the sender address. */\n DelegationContractIsSelf: \"DELEGATION_CONTRACT_IS_SELF\",\n /** The ACL contract is paused. */\n AclPaused: \"ACL_PAUSED\",\n /** Expiration date is too soon (must be at least 1 hour in the future). */\n DelegationExpirationTooSoon: \"DELEGATION_EXPIRATION_TOO_SOON\",\n /** Delegation exists on-chain but hasn't propagated to the gateway yet. */\n DelegationNotPropagated: \"DELEGATION_NOT_PROPAGATED\",\n /** Signer and provider are connected to different chains. */\n ChainMismatch: \"CHAIN_MISMATCH\",\n /** Operation requires a signer but none is configured. */\n SignerNotConfigured: \"SIGNER_NOT_CONFIGURED\",\n /** Operation requires a connected wallet account. */\n WalletNotConnected: \"WALLET_NOT_CONNECTED\",\n /** Wallet account discovery is still resolving. */\n WalletAccountNotReady: \"WALLET_ACCOUNT_NOT_READY\",\n} as const;\n\n/** Union of all {@link ZamaErrorCode} string values. */\nexport type ZamaErrorCode = (typeof ZamaErrorCode)[keyof typeof ZamaErrorCode];\n\n/**\n * Base error thrown by all SDK operations.\n * Carries a {@link ZamaErrorCode} for programmatic error handling.\n * Prefer catching specific subclasses (e.g. {@link EncryptionFailedError}).\n */\nexport class ZamaError extends Error {\n /** Machine-readable error code. */\n readonly code: ZamaErrorCode;\n\n constructor(code: ZamaErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"ZamaError\";\n this.code = code;\n }\n}\n","import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** Relayer HTTP request failed. */\nexport class RelayerRequestFailedError extends ZamaError {\n /** HTTP status code from the relayer, if available. */\n readonly statusCode: number | undefined;\n\n /**\n * Server-driven retry delay in **seconds** (the SDK's duration unit and the\n * header's own unit), from the relayer's `Retry-After` header. Set only on\n * back-pressure (HTTP 429) responses that carry the header; `undefined`\n * otherwise. Implies {@link retryable}.\n */\n readonly retryAfter: number | undefined;\n\n /**\n * Whether the request may be safely retried. `true` for relayer back-pressure\n * (HTTP 429) pair with {@link retryAfter} for the server's suggested delay —\n * and for a relayer timeout (which carries no status but is safe to retry, via\n * the `retryable` option). `false` for terminal failures (e.g. a 4xx/5xx).\n */\n readonly retryable: boolean;\n\n constructor(\n message: string,\n statusCode?: number,\n options?: ErrorOptions & { retryAfter?: number; retryable?: boolean },\n ) {\n super(ZamaErrorCode.RelayerRequestFailed, message, options);\n this.name = \"RelayerRequestFailedError\";\n this.statusCode = statusCode;\n // Retryable on relayer back-pressure (HTTP 429) by default, or when the\n // caller forces it (a relayer timeout has no status but is safe to retry).\n this.retryable = options?.retryable ?? statusCode === 429;\n // Keep the two fields consistent: a delay only makes sense when retryable,\n // and only a 429 actually carries a server-supplied `Retry-After`.\n this.retryAfter = this.retryable ? options?.retryAfter : undefined;\n }\n}\n\n/** SDK configuration is invalid (e.g. forbidden chain ID, unsupported type). */\nexport class ConfigurationError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.Configuration, message, options);\n this.name = \"ConfigurationError\";\n }\n}\n"],"mappings":"AAeA,MAAa,EAAgB,CAE3B,gBAAiB,mBAEjB,cAAe,iBAEf,iBAAkB,oBAElB,iBAAkB,oBAElB,oBAAqB,uBAErB,wBAAyB,kBAEzB,wBAAyB,kBAEzB,aAAc,gBAEd,qBAAsB,yBAEtB,YAAa,eAEb,eAAgB,mBAEhB,cAAe,gBAEf,yBAA0B,8BAE1B,mBAAoB,sBAEpB,mBAAoB,uBAEpB,kBAAmB,qBAEnB,gCAAiC,oCAEjC,yBAA0B,6BAE1B,wBAAyB,4BAEzB,gBAAiB,oBAEjB,0BAA2B,8BAE3B,iCAAkC,sCAElC,yBAA0B,8BAE1B,UAAW,aAEX,4BAA6B,iCAE7B,wBAAyB,4BAEzB,cAAe,iBAEf,oBAAqB,wBAErB,mBAAoB,uBAEpB,sBAAuB,0BACzB,EAUA,IAAa,EAAb,cAA+B,KAAM,CAEnC,KAEA,YAAY,EAAqB,EAAiB,EAAwB,CACxE,MAAM,EAAS,CAAO,EACtB,OAAO,eAAe,KAAM,IAAI,OAAO,SAAS,EAChD,KAAK,KAAO,YACZ,KAAK,KAAO,CACd,CACF,EC7Fa,EAAb,cAA+C,CAAU,CAEvD,WAQA,WAQA,UAEA,YACE,EACA,EACA,EACA,CACA,MAAM,EAAc,qBAAsB,EAAS,CAAO,EAC1D,KAAK,KAAO,4BACZ,KAAK,WAAa,EAGlB,KAAK,UAAY,GAAS,WAAa,IAAe,IAGtD,KAAK,WAAa,KAAK,UAAY,GAAS,WAAa,IAAA,EAC3D,CACF,EAGa,EAAb,cAAwC,CAAU,CAChD,YAAY,EAAiB,EAAwB,CACnD,MAAM,EAAc,cAAe,EAAS,CAAO,EACnD,KAAK,KAAO,oBACd,CACF"}
@@ -1,2 +1,2 @@
1
- const e=require("./relayer.cjs"),t=require("./wrappers-registry.cjs"),n=require("./encryption.cjs"),r=require("./assertions.cjs");let i=require("viem");var a=class extends e.r{constructor(t,n){super(e.i.TransactionReverted,t,n),this.name=`TransactionRevertedError`}},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{constructor(t,n){super(e.i.BalanceCheckUnavailable,t,n),this.name=`BalanceCheckUnavailableError`}},d=class extends e.r{constructor(t,n){super(e.i.ERC20ReadFailed,t,n),this.name=`ERC20ReadFailedError`}};function f(n){return n instanceof t.W||n instanceof t.U||n instanceof e.t||n instanceof o}const p=[{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 m(e,t,n,r){return{address:e,abi:p,functionName:`delegateForUserDecryption`,args:[t,n,r]}}function h(e,t,n){return{address:e,abi:p,functionName:`revokeDelegationForUserDecryption`,args:[t,n]}}function g(e,t,n,r){return{address:e,abi:p,functionName:`getUserDecryptionDelegationExpirationDate`,args:[t,n,r]}}function _(e,t,n,r,i){return{address:e,abi:p,functionName:`isHandleDelegatedForUserDecryption`,args:[t,n,r,i]}}const v=2n**64n-1n;async function y(e,n,r){if(!n)throw new t.R(e);let i;try{i=n.requireWalletAccount(e)}catch(r){if(!(r instanceof t.B)||!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 b(e,t,n){return(await y(e,t,n)).chainId}const x={EncryptStart:`encrypt:start`,EncryptEnd:`encrypt:end`,EncryptError:`encrypt:error`,DecryptStart:`decrypt:start`,DecryptEnd:`decrypt:end`,DecryptError:`decrypt:error`,TransactionError:`transaction:error`,ShieldSubmitted:`shield:submitted`,TransferSubmitted:`transfer:submitted`,TransferFromSubmitted:`transferFrom:submitted`,SetOperatorSubmitted:`setOperator:submitted`,ApproveUnderlyingSubmitted:`approveUnderlying:submitted`,UnwrapSubmitted:`unwrap:submitted`,FinalizeUnwrapSubmitted:`finalizeUnwrap:submitted`,DelegationSubmitted:`delegation:submitted`,RevokeDelegationSubmitted:`revokeDelegation:submitted`,UnshieldPhase1Submitted:`unshield:phase1_submitted`,UnshieldPhase2Started:`unshield:phase2_started`,UnshieldPhase2Submitted:`unshield:phase2_submitted`},S={approveUnderlying:{submittedEvent:e=>({type:x.ApproveUnderlyingSubmitted,txHash:e,step:`approve`})},"approveUnderlying:reset":{submittedEvent:e=>({type:x.ApproveUnderlyingSubmitted,txHash:e,step:`reset`})},delegateDecryption:{submittedEvent:e=>({type:x.DelegationSubmitted,txHash:e})},finalizeUnwrap:{submittedEvent:e=>({type:x.FinalizeUnwrapSubmitted,txHash:e})},revokeDelegation:{submittedEvent:e=>({type:x.RevokeDelegationSubmitted,txHash:e})},setOperator:{submittedEvent:e=>({type:x.SetOperatorSubmitted,txHash:e})},"shield:transferAndCall":{submittedEvent:e=>({type:x.ShieldSubmitted,txHash:e,shieldPath:`transferAndCall`})},"shield:approveAndWrap":{submittedEvent:e=>({type:x.ShieldSubmitted,txHash:e,shieldPath:`approveAndWrap`})},transfer:{submittedEvent:e=>({type:x.TransferSubmitted,txHash:e})},transferAndCall:{submittedEvent:e=>({type:x.TransferSubmitted,txHash:e})},transferFrom:{submittedEvent:e=>({type:x.TransferFromSubmitted,txHash:e})},transferFromAndCall:{submittedEvent:e=>({type:x.TransferFromSubmitted,txHash:e})},unwrap:{submittedEvent:e=>({type:x.UnwrapSubmitted,txHash:e})},unwrapAll:{submittedEvent:e=>({type:x.UnwrapSubmitted,txHash:e})}};async function C(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}function w(e){return e===`0x0000000000000000000000000000000000000000000000000000000000000000`||e===`0x`}async function T(n){let{operation:r,signer:i,provider:o,config:s,emit:c,onSubmitted:l,logger:u}=n,d=S[r];try{let e=await i.writeContract(s);return c(d.submittedEvent(e)),t.L(`${r}: onSubmitted`,()=>l?.(e),u),{txHash:e,receipt:await o.waitForTransactionReceipt(e)}}catch(t){let n=t instanceof e.r?t:new a(`Transaction failed during ${r}`,{cause:t});throw c({type:x.TransactionError,operation:r,error:n}),n}}var E=class a{sdk;address;constructor(e,t){this.sdk=e,this.address=(0,i.getAddress)(t)}#e(e){return t.H(this.sdk.signer,e)}async name(){return this.sdk.provider.readContract(t.b(this.address))}async symbol(){return this.sdk.provider.readContract(t.x(this.address))}async decimals(){return this.sdk.provider.readContract(t.v(this.address))}async isConfidential(){return this.sdk.provider.readContract(t.m(this.address,t.l))}async isWrapper(){return this.sdk.provider.readContract(t.m(this.address,t.u))}async balanceOf(e){let t=(0,i.getAddress)(e),a=await this.readConfidentialBalanceOf(t),o=(await this.sdk.decryption.decryptValues([{encryptedValue:a,contractAddress:this.address}]))[a];if(o===void 0)throw new n.t(`Decryption returned no value for ${a}`);return r.t(o,`balanceOf: result[encryptedValue]`),o}async confidentialBalanceOf(e){return this.readConfidentialBalanceOf((0,i.getAddress)(e))}async decryptBalanceAs({delegatorAddress:e,accountAddress:t}){await b(`decryptBalanceAs`,this.sdk.signer,this.sdk.provider);let a=(0,i.getAddress)(e),o=t?(0,i.getAddress)(t):a,s=await this.readConfidentialBalanceOf(o);if(w(s))return 0n;let c=(await this.sdk.decryption.delegatedDecryptValues([{encryptedValue:s,contractAddress:this.address}],a,o))[s];if(c===void 0)throw new n.t(`Delegated decryption returned no value for ${s}`);return r.t(c,`decryptBalanceAs: result[encryptedValue]`),c}static async batchBalancesOf(t,i){let o=new Map,s=new Map;if(t.length===0)return{results:o,errors:s};let c=a.assertSameSdk(t);await b(`batchBalancesOf`,c.signer,c.provider),await c.permits.grantPermit(t.map(e=>e.address));let l=await C(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.balanceOf(i)}}catch(e){return{status:`rejected`,reason:e}}}),5);for(let i=0;i<t.length;i++){let a=t[i].address,c=l[i];if(c.status===`fulfilled`)o.set(a,c.value);else{let t=c.reason;if(f(t))throw t;let i=t instanceof e.r?t:new n.t(r.h(t).message,{cause:t});s.set(a,i)}}if(s.size===t.length)throw s.values().next().value??new n.t(`All token balance decryptions failed`);return{results:o,errors:s}}static async batchDecryptBalancesAs(e,t){if(e.length===0)return new Map;let o=a.assertSameSdk(e),s=new Map,c=new Map,l=t.accountAddress?(0,i.getAddress)(t.accountAddress):(0,i.getAddress)(t.delegatorAddress),u=t.maxConcurrency??10;if(t.encryptedValues&&e.length!==t.encryptedValues.length)throw new n.t(`tokens.length (${e.length}) must equal encryptedValues.length (${t.encryptedValues.length})`);let d=t.encryptedValues??await a.readBalanceHandlesBatch(e,l,c,u),f=[];for(let[t,n]of e.entries()){let e=d[t];!e||c.has(n.address)||(w(e)?s.set(n.address,0n):f.push({token:n,encryptedValue:e}))}if(f.length>0){let e=await o.decryption.delegatedBatchDecryptValues({encryptedInputs:f.map(({token:e,encryptedValue:t})=>({encryptedValue:t,contractAddress:e.address})),delegatorAddress:t.delegatorAddress,accountAddress:t.accountAddress,maxConcurrency:u});for(let[t,i]of e.items.entries()){let e=f[t];if(!e)continue;if(i.error){c.set(e.token.address,i.error);continue}let a=i.value;if(a===void 0){c.set(e.token.address,new n.t(`Batch delegated decryption returned no value for ${i.encryptedValue} on token ${e.token.address}`));continue}r.t(a,`batchDecryptBalancesAs: result[encryptedValue]`),s.set(e.token.address,a)}}if(c.size===0)return s;if(t.onError){let e=[];for(let[n,i]of c)try{s.set(n,t.onError(i,n))}catch(t){e.push({address:n,error:r.h(t)})}if(e.length>0){let t=e.map(({address:e,error:t})=>`${e}: ${t.message}`).join(`; `);throw new n.t(`Batch delegated decryption onError callback failed for ${e.length} token(s): ${t}`,{cause:e[0]?.error})}return s}let p=Array.from(c.entries()),m=p.map(([e,t])=>`${e}: ${t.message}`).join(`; `);throw new n.t(`Batch delegated decryption failed for ${c.size} token(s): ${m}`,{cause:p[0]?.[1]})}static async readBalanceHandlesBatch(t,i,a,o){let s=await C(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.readConfidentialBalanceOf(i)}}catch(e){return{status:`rejected`,reason:e}}}),o),c=[];for(let[i,o]of t.entries()){let t=s[i];if(t){if(t.status===`fulfilled`){c[i]=t.value;continue}if(f(t.reason))throw t.reason;a.set(o.address,t.reason instanceof e.r?t.reason:new n.t(r.h(t.reason).message,{cause:t.reason}))}}return c}async confidentialTransfer(e,r,a){this.#e(`confidentialTransfer`);let o=await y(`confidentialTransfer`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:s=!1,onEncryptComplete:c,onTransferSubmitted:l}=a??{},u=(0,i.getAddress)(e);s||await this.assertConfidentialBalance(r);let{encryptedValues:d,inputProof:f}=await this.sdk.encrypt({values:[{value:r,type:`euint64`}],contractAddress:this.address,userAddress:(0,i.getAddress)(o.address)});if(t.L(`transfer: onEncryptComplete`,()=>c?.(),this.sdk.logger),d.length===0)throw new n.n(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transfer`,config:t.T(this.address,u,d[0],f),onSubmitted:l})}async confidentialTransferFrom(e,r,a,o){this.#e(`confidentialTransferFrom`),await y(`confidentialTransferFrom`,this.sdk.signer,this.sdk.provider);let s=(0,i.getAddress)(e),c=(0,i.getAddress)(r),{encryptedValues:l,inputProof:u}=await this.sdk.encrypt({values:[{value:a,type:`euint64`}],contractAddress:this.address,userAddress:s});if(t.L(`transferFrom: onEncryptComplete`,()=>o?.onEncryptComplete?.(),this.sdk.logger),l.length===0)throw new n.n(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFrom`,config:t.D(this.address,s,c,l[0],u),onSubmitted:o?.onTransferSubmitted})}async confidentialTransferAndCall(e,r,a,o){this.#e(`confidentialTransferAndCall`);let s=await y(`confidentialTransferAndCall`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:c=!1,onEncryptComplete:l,onTransferSubmitted:u}=o??{},d=(0,i.getAddress)(e);c||await this.assertConfidentialBalance(r);let{encryptedValues:f,inputProof:p}=await this.sdk.encrypt({values:[{value:r,type:`euint64`}],contractAddress:this.address,userAddress:(0,i.getAddress)(s.address)});if(t.L(`transferAndCall: onEncryptComplete`,()=>l?.(),this.sdk.logger),f.length===0)throw new n.n(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferAndCall`,config:t.w(this.address,d,f[0],p,a),onSubmitted:u})}async confidentialTransferFromAndCall(e,r,a,o,s){this.#e(`confidentialTransferFromAndCall`),await y(`confidentialTransferFromAndCall`,this.sdk.signer,this.sdk.provider);let c=(0,i.getAddress)(e),l=(0,i.getAddress)(r),{encryptedValues:u,inputProof:d}=await this.sdk.encrypt({values:[{value:a,type:`euint64`}],contractAddress:this.address,userAddress:c});if(t.L(`transferFromAndCall: onEncryptComplete`,()=>s?.onEncryptComplete?.(),this.sdk.logger),u.length===0)throw new n.n(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFromAndCall`,config:t.E(this.address,c,l,u[0],d,o),onSubmitted:s?.onTransferSubmitted})}async setOperator(e,n){this.#e(`setOperator`),await b(`setOperator`,this.sdk.signer,this.sdk.provider);let r=(0,i.getAddress)(e);return this.submitTransaction({operation:`setOperator`,config:t.M(this.address,r,n)})}async isOperator(e,n){return this.sdk.provider.readContract(t.A(this.address,(0,i.getAddress)(e),(0,i.getAddress)(n)))}async readConfidentialBalanceOf(e){return await this.sdk.provider.readContract(t.S(this.address,e))}async assertConfidentialBalance(t){if(t===0n)return;let n;try{let e=await y(`assertConfidentialBalance`,this.sdk.signer,this.sdk.provider);n=await this.balanceOf((0,i.getAddress)(e.address))}catch(t){throw t instanceof e.r?t:new u(`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 c}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return`0x0000000000000000000000000000000000000000000000000000000000000000`}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return s}});
1
+ const e=require("./relayer.cjs"),t=require("./wrappers-registry.cjs");let n=require("viem");var r=class extends e.r{constructor(t,n){super(e.i.EncryptionFailed,t,n),this.name=`EncryptionFailedError`}},i=class extends e.r{constructor(t,n){super(e.i.DecryptionFailed,t,n),this.name=`DecryptionFailedError`}},a=class extends e.r{constructor(t,n){super(e.i.TransactionReverted,t,n),this.name=`TransactionRevertedError`}},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{constructor(t,n){super(e.i.BalanceCheckUnavailable,t,n),this.name=`BalanceCheckUnavailableError`}},d=class extends e.r{constructor(t,n){super(e.i.ERC20ReadFailed,t,n),this.name=`ERC20ReadFailedError`}};function f(e){return e instanceof Error?e:typeof e==`object`&&e&&`message`in e?Error(String(e.message)):Error(String(e))}function p(e){if(!(e instanceof Error))return!1;if(e.name===`ContractFunctionExecutionError`||e.name===`ContractFunctionRevertedError`||`code`in e&&e.code===`CALL_EXCEPTION`)return!0;let t=e.message.toLowerCase();return t.includes(`execution reverted`)||t.includes(`call revert exception`)}const m=[`cause`,`error`,`info`];function h(e,t,n=6){if(n<0||typeof e!=`object`||!e)return;let r=e;if(t(r))return r;for(let e of m){let i=r[e];if(typeof i==`object`&&i){let e=h(i,t,n-1);if(e)return e}}}function g(e){if(e.code===-32005||e.status===429||e.code===429)return!0;if(e.code===`SERVER_ERROR`&&typeof e.info==`object`&&e.info!==null){let t=e.info.responseStatus;if(typeof t==`string`&&/^\s*429\b/.test(t))return!0}return!1}function _(e){if(g(e))return!0;if(typeof e.message==`string`){let t=e.message.toLowerCase();return t.includes(`too many requests`)||t.includes(`rate limit`)||t.includes(`rate-limit`)}return!1}function v(e){return h(e,e=>typeof e.name==`string`&&e.name.startsWith(`Relayer`))!==void 0}function y(e){return h(e,e=>e.name===`RelayerTimeoutError`)!==void 0}function b(e){return v(e)?!1:h(e,_)!==void 0}function x(e){return v(e)?!1:h(e,g)!==void 0}function S(e){return e.toLowerCase().includes(`is not authorized to decrypt handle`)}function C(e){return/handle (0x[0-9a-fA-F]{64})/.exec(e)?.[1]}function w(e){if(e==null)return;let t=e.trim();if(t!==``){if(/^\d+$/.test(t))return Number(t);if(/[a-zA-Z]/.test(t)){let e=Date.parse(t);if(!Number.isNaN(e))return Math.max(0,Math.round((e-Date.now())/1e3))}}}function T(e){if(typeof e!=`object`||!e)return;let t=e.get;if(typeof t==`function`)return w(t.call(e,`Retry-After`))}function E(e){let t=e.response;if(typeof t==`object`&&t)return T(t.headers)}function D(e){return typeof e.retryAfter==`number`&&Number.isFinite(e.retryAfter)&&e.retryAfter>0?e.retryAfter:E(e)}function O(e){let t=h(e,e=>D(e)!==void 0);return t?D(t):void 0}function k(e){let t=h(e,e=>typeof e.statusCode==`number`||typeof e.status==`number`);if(t)return typeof t.statusCode==`number`?t.statusCode:t.status}function A(n){return n instanceof t.W||n instanceof t.U||n instanceof e.t||n instanceof o}const j=[{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 M(e,t,n,r){return{address:e,abi:j,functionName:`delegateForUserDecryption`,args:[t,n,r]}}function N(e,t,n){return{address:e,abi:j,functionName:`revokeDelegationForUserDecryption`,args:[t,n]}}function P(e,t,n,r){return{address:e,abi:j,functionName:`getUserDecryptionDelegationExpirationDate`,args:[t,n,r]}}function F(e,t,n,r,i){return{address:e,abi:j,functionName:`isHandleDelegatedForUserDecryption`,args:[t,n,r,i]}}const I=2n**64n-1n;async function L(e,n,r){if(!n)throw new t.R(e);let i;try{i=n.requireWalletAccount(e)}catch(r){if(!(r instanceof t.B)||!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 R(e,t,n){return(await L(e,t,n)).chainId}function z(e,t){if(e==null)throw TypeError(`${t} must not be null or undefined`)}function B(e,t){if(typeof e!=`bigint`)throw TypeError(`${t} must be a bigint, got ${typeof e}`)}const V={EncryptStart:`encrypt:start`,EncryptEnd:`encrypt:end`,EncryptError:`encrypt:error`,DecryptStart:`decrypt:start`,DecryptEnd:`decrypt:end`,DecryptError:`decrypt:error`,TransactionError:`transaction:error`,ShieldSubmitted:`shield:submitted`,TransferSubmitted:`transfer:submitted`,TransferFromSubmitted:`transferFrom:submitted`,SetOperatorSubmitted:`setOperator:submitted`,ApproveUnderlyingSubmitted:`approveUnderlying:submitted`,UnwrapSubmitted:`unwrap:submitted`,FinalizeUnwrapSubmitted:`finalizeUnwrap:submitted`,DelegationSubmitted:`delegation:submitted`,RevokeDelegationSubmitted:`revokeDelegation:submitted`,UnshieldPhase1Submitted:`unshield:phase1_submitted`,UnshieldPhase2Started:`unshield:phase2_started`,UnshieldPhase2Submitted:`unshield:phase2_submitted`},H={approveUnderlying:{submittedEvent:e=>({type:V.ApproveUnderlyingSubmitted,txHash:e,step:`approve`})},"approveUnderlying:reset":{submittedEvent:e=>({type:V.ApproveUnderlyingSubmitted,txHash:e,step:`reset`})},delegateDecryption:{submittedEvent:e=>({type:V.DelegationSubmitted,txHash:e})},finalizeUnwrap:{submittedEvent:e=>({type:V.FinalizeUnwrapSubmitted,txHash:e})},revokeDelegation:{submittedEvent:e=>({type:V.RevokeDelegationSubmitted,txHash:e})},setOperator:{submittedEvent:e=>({type:V.SetOperatorSubmitted,txHash:e})},"shield:transferAndCall":{submittedEvent:e=>({type:V.ShieldSubmitted,txHash:e,shieldPath:`transferAndCall`})},"shield:approveAndWrap":{submittedEvent:e=>({type:V.ShieldSubmitted,txHash:e,shieldPath:`approveAndWrap`})},transfer:{submittedEvent:e=>({type:V.TransferSubmitted,txHash:e})},transferAndCall:{submittedEvent:e=>({type:V.TransferSubmitted,txHash:e})},transferFrom:{submittedEvent:e=>({type:V.TransferFromSubmitted,txHash:e})},transferFromAndCall:{submittedEvent:e=>({type:V.TransferFromSubmitted,txHash:e})},unwrap:{submittedEvent:e=>({type:V.UnwrapSubmitted,txHash:e})},unwrapAll:{submittedEvent:e=>({type:V.UnwrapSubmitted,txHash:e})}};async function U(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}function W(e){return e===`0x0000000000000000000000000000000000000000000000000000000000000000`||e===`0x`}async function G(n){let{operation:r,signer:i,provider:o,config:s,emit:c,onSubmitted:l,logger:u}=n,d=H[r];try{let e=await i.writeContract(s);return c(d.submittedEvent(e)),t.L(`${r}: onSubmitted`,()=>l?.(e),u),{txHash:e,receipt:await o.waitForTransactionReceipt(e)}}catch(t){let n=t instanceof e.r?t:new a(`Transaction failed during ${r}`,{cause:t});throw c({type:V.TransactionError,operation:r,error:n}),n}}var K=class a{sdk;address;constructor(e,t){this.sdk=e,this.address=(0,n.getAddress)(t)}#e(e){return t.H(this.sdk.signer,e)}async name(){return this.sdk.provider.readContract(t.b(this.address))}async symbol(){return this.sdk.provider.readContract(t.x(this.address))}async decimals(){return this.sdk.provider.readContract(t.v(this.address))}async isConfidential(){return this.sdk.provider.readContract(t.m(this.address,t.l))}async isWrapper(){return this.sdk.provider.readContract(t.m(this.address,t.u))}async balanceOf(e){let t=(0,n.getAddress)(e),r=await this.readConfidentialBalanceOf(t),a=(await this.sdk.decryption.decryptValues([{encryptedValue:r,contractAddress:this.address}]))[r];if(a===void 0)throw new i(`Decryption returned no value for ${r}`);return B(a,`balanceOf: result[encryptedValue]`),a}async confidentialBalanceOf(e){return this.readConfidentialBalanceOf((0,n.getAddress)(e))}async decryptBalanceAs({delegatorAddress:e,accountAddress:t}){await R(`decryptBalanceAs`,this.sdk.signer,this.sdk.provider);let r=(0,n.getAddress)(e),a=t?(0,n.getAddress)(t):r,o=await this.readConfidentialBalanceOf(a);if(W(o))return 0n;let s=(await this.sdk.decryption.delegatedDecryptValues([{encryptedValue:o,contractAddress:this.address}],r,a))[o];if(s===void 0)throw new i(`Delegated decryption returned no value for ${o}`);return B(s,`decryptBalanceAs: result[encryptedValue]`),s}static async batchBalancesOf(t,n){let r=new Map,o=new Map;if(t.length===0)return{results:r,errors:o};let s=a.assertSameSdk(t);await R(`batchBalancesOf`,s.signer,s.provider),await s.permits.grantPermit(t.map(e=>e.address));let c=await U(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 a=t[n].address,s=c[n];if(s.status===`fulfilled`)r.set(a,s.value);else{let t=s.reason;if(A(t))throw t;let n=t instanceof e.r?t:new i(f(t).message,{cause:t});o.set(a,n)}}if(o.size===t.length)throw o.values().next().value??new i(`All token balance decryptions failed`);return{results:r,errors:o}}static async batchDecryptBalancesAs(e,t){if(e.length===0)return new Map;let r=a.assertSameSdk(e),o=new Map,s=new Map,c=t.accountAddress?(0,n.getAddress)(t.accountAddress):(0,n.getAddress)(t.delegatorAddress),l=t.maxConcurrency??10;if(t.encryptedValues&&e.length!==t.encryptedValues.length)throw new i(`tokens.length (${e.length}) must equal encryptedValues.length (${t.encryptedValues.length})`);let u=t.encryptedValues??await a.readBalanceHandlesBatch(e,c,s,l),d=[];for(let[t,n]of e.entries()){let e=u[t];!e||s.has(n.address)||(W(e)?o.set(n.address,0n):d.push({token:n,encryptedValue:e}))}if(d.length>0){let e=await r.decryption.delegatedBatchDecryptValues({encryptedInputs:d.map(({token:e,encryptedValue:t})=>({encryptedValue:t,contractAddress:e.address})),delegatorAddress:t.delegatorAddress,accountAddress:t.accountAddress,maxConcurrency:l});for(let[t,n]of e.items.entries()){let e=d[t];if(!e)continue;if(n.error){s.set(e.token.address,n.error);continue}let r=n.value;if(r===void 0){s.set(e.token.address,new i(`Batch delegated decryption returned no value for ${n.encryptedValue} on token ${e.token.address}`));continue}B(r,`batchDecryptBalancesAs: result[encryptedValue]`),o.set(e.token.address,r)}}if(s.size===0)return o;if(t.onError){let e=[];for(let[n,r]of s)try{o.set(n,t.onError(r,n))}catch(t){e.push({address:n,error:f(t)})}if(e.length>0){let t=e.map(({address:e,error:t})=>`${e}: ${t.message}`).join(`; `);throw new i(`Batch delegated decryption onError callback failed for ${e.length} token(s): ${t}`,{cause:e[0]?.error})}return o}let p=Array.from(s.entries()),m=p.map(([e,t])=>`${e}: ${t.message}`).join(`; `);throw new i(`Batch delegated decryption failed for ${s.size} token(s): ${m}`,{cause:p[0]?.[1]})}static async readBalanceHandlesBatch(t,n,r,a){let o=await U(t.map(e=>async()=>{try{return{status:`fulfilled`,value:await e.readConfidentialBalanceOf(n)}}catch(e){return{status:`rejected`,reason:e}}}),a),s=[];for(let[n,a]of t.entries()){let t=o[n];if(t){if(t.status===`fulfilled`){s[n]=t.value;continue}if(A(t.reason))throw t.reason;r.set(a.address,t.reason instanceof e.r?t.reason:new i(f(t.reason).message,{cause:t.reason}))}}return s}async confidentialTransfer(e,i,a){this.#e(`confidentialTransfer`);let o=await L(`confidentialTransfer`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:s=!1,onEncryptComplete:c,onTransferSubmitted:l}=a??{},u=(0,n.getAddress)(e);s||await this.assertConfidentialBalance(i);let{encryptedValues:d,inputProof:f}=await this.sdk.encrypt({values:[{value:i,type:`euint64`}],contractAddress:this.address,userAddress:(0,n.getAddress)(o.address)});if(t.L(`transfer: onEncryptComplete`,()=>c?.(),this.sdk.logger),d.length===0)throw new r(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transfer`,config:t.T(this.address,u,d[0],f),onSubmitted:l})}async confidentialTransferFrom(e,i,a,o){this.#e(`confidentialTransferFrom`),await L(`confidentialTransferFrom`,this.sdk.signer,this.sdk.provider);let s=(0,n.getAddress)(e),c=(0,n.getAddress)(i),{encryptedValues:l,inputProof:u}=await this.sdk.encrypt({values:[{value:a,type:`euint64`}],contractAddress:this.address,userAddress:s});if(t.L(`transferFrom: onEncryptComplete`,()=>o?.onEncryptComplete?.(),this.sdk.logger),l.length===0)throw new r(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFrom`,config:t.D(this.address,s,c,l[0],u),onSubmitted:o?.onTransferSubmitted})}async confidentialTransferAndCall(e,i,a,o){this.#e(`confidentialTransferAndCall`);let s=await L(`confidentialTransferAndCall`,this.sdk.signer,this.sdk.provider),{skipBalanceCheck:c=!1,onEncryptComplete:l,onTransferSubmitted:u}=o??{},d=(0,n.getAddress)(e);c||await this.assertConfidentialBalance(i);let{encryptedValues:f,inputProof:p}=await this.sdk.encrypt({values:[{value:i,type:`euint64`}],contractAddress:this.address,userAddress:(0,n.getAddress)(s.address)});if(t.L(`transferAndCall: onEncryptComplete`,()=>l?.(),this.sdk.logger),f.length===0)throw new r(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferAndCall`,config:t.w(this.address,d,f[0],p,a),onSubmitted:u})}async confidentialTransferFromAndCall(e,i,a,o,s){this.#e(`confidentialTransferFromAndCall`),await L(`confidentialTransferFromAndCall`,this.sdk.signer,this.sdk.provider);let c=(0,n.getAddress)(e),l=(0,n.getAddress)(i),{encryptedValues:u,inputProof:d}=await this.sdk.encrypt({values:[{value:a,type:`euint64`}],contractAddress:this.address,userAddress:c});if(t.L(`transferFromAndCall: onEncryptComplete`,()=>s?.onEncryptComplete?.(),this.sdk.logger),u.length===0)throw new r(`Encryption returned no encrypted values`);return this.submitTransaction({operation:`transferFromAndCall`,config:t.E(this.address,c,l,u[0],d,o),onSubmitted:s?.onTransferSubmitted})}async setOperator(e,r){this.#e(`setOperator`),await R(`setOperator`,this.sdk.signer,this.sdk.provider);let i=(0,n.getAddress)(e);return this.submitTransaction({operation:`setOperator`,config:t.M(this.address,i,r)})}async isOperator(e,r){return this.sdk.provider.readContract(t.A(this.address,(0,n.getAddress)(e),(0,n.getAddress)(r)))}async readConfidentialBalanceOf(e){return await this.sdk.provider.readContract(t.S(this.address,e))}async assertConfidentialBalance(t){if(t===0n)return;let r;try{let e=await L(`assertConfidentialBalance`,this.sdk.signer,this.sdk.provider);r=await this.balanceOf((0,n.getAddress)(e.address))}catch(t){throw t instanceof e.r?t:new u(`Balance validation failed (token: ${this.address})`,{cause:t})}if(r<t)throw new c(`Insufficient confidential balance: requested ${t}, available ${r} (token: ${this.address})`,{requested:t,available:r,token:this.address})}emit(e){this.sdk.emitEvent(e,this.address)}async submitTransaction(e){let{operation:t,config:n,onSubmitted:r}=e;return G({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,"A",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"D",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"E",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"F",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"M",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"N",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"O",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"P",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"T",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"j",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"k",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return`0x0000000000000000000000000000000000000000000000000000000000000000`}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,"w",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return x}});
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","swallow","ZamaError","requireConfigured","nameContract","symbolContract","decimalsContract","supportsInterfaceContract","ERC7984_INTERFACE_ID","ERC7984_WRAPPER_INTERFACE_ID","DecryptionFailedError","ZamaError","toError","#requireSigner","swallow","EncryptionFailedError","confidentialTransferContract","confidentialTransferFromContract","confidentialTransferAndCallContract","confidentialTransferFromAndCallContract","setOperatorContract","isOperatorContract","confidentialBalanceOfContract","submitSdkTransaction","ConfigurationError"],"sources":["../../src/errors/transaction.ts","../../src/errors/rpc.ts","../../src/errors/chain.ts","../../src/errors/balance.ts","../../src/errors/fatal-batch.ts","../../src/abi/acl.abi.ts","../../src/contracts/acl.ts","../../src/contracts/constants.ts","../../src/utils/alignment.ts","../../src/events/sdk-events.ts","../../src/utils/concurrency.ts","../../src/utils/handles.ts","../../src/utils/submit-transaction.ts","../../src/token/token.ts"],"sourcesContent":["import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/** On-chain transaction reverted. */\nexport class TransactionRevertedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.TransactionReverted, message, options);\n this.name = \"TransactionRevertedError\";\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 readonly operation: string;\n readonly signerChainId: number;\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 readonly requested: bigint;\n readonly available: bigint;\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/** 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","// DO NOT EDIT: generated by `pnpm abi:build` from\n// contracts/out/Impl.sol/IACL.json.\n// Regenerate after `pnpm contracts:build`; `pnpm abi:check` enforces this in CI.\nexport const aclAbi = [\n {\n type: \"function\",\n name: \"allow\",\n inputs: [\n { name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"account\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"allowForDecryption\",\n inputs: [{ name: \"handlesList\", type: \"bytes32[]\", internalType: \"bytes32[]\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"allowTransient\",\n inputs: [\n { name: \"ciphertext\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"account\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"cleanTransientStorage\",\n inputs: [],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"delegateForUserDecryption\",\n inputs: [\n { name: \"delegate\", type: \"address\", internalType: \"address\" },\n { name: \"contractAddress\", type: \"address\", internalType: \"address\" },\n { name: \"expirationDate\", type: \"uint64\", internalType: \"uint64\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"getUserDecryptionDelegationExpirationDate\",\n inputs: [\n { name: \"delegator\", type: \"address\", internalType: \"address\" },\n { name: \"delegate\", type: \"address\", internalType: \"address\" },\n { name: \"contractAddress\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint64\", internalType: \"uint64\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isAccountDenied\",\n inputs: [{ name: \"account\", type: \"address\", internalType: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isAllowed\",\n inputs: [\n { name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"account\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isAllowedForDecryption\",\n inputs: [{ name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isHandleDelegatedForUserDecryption\",\n inputs: [\n { name: \"delegator\", type: \"address\", internalType: \"address\" },\n { name: \"delegate\", type: \"address\", internalType: \"address\" },\n { name: \"contractAddress\", type: \"address\", internalType: \"address\" },\n { name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" },\n ],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"multicall\",\n inputs: [{ name: \"data\", type: \"bytes[]\", internalType: \"bytes[]\" }],\n outputs: [{ name: \"results\", type: \"bytes[]\", internalType: \"bytes[]\" }],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"persistAllowed\",\n inputs: [\n { name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"account\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"revokeDelegationForUserDecryption\",\n inputs: [\n { name: \"delegate\", type: \"address\", internalType: \"address\" },\n { name: \"contractAddress\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","import type { Address } from \"viem\";\nimport { aclAbi } from \"../abi/acl.abi\";\n\n/**\n * Returns the contract config to delegate user decryption rights.\n *\n * @example\n * ```ts\n * const txHash = await signer.writeContract(\n * delegateForUserDecryptionContract(aclAddress, delegateAddress, contractAddress, expirationDate),\n * );\n * ```\n */\nexport function delegateForUserDecryptionContract(\n aclAddress: Address,\n delegateAddress: Address,\n contractAddress: Address,\n expirationDate: bigint,\n) {\n return {\n address: aclAddress,\n abi: aclAbi,\n functionName: \"delegateForUserDecryption\",\n args: [delegateAddress, contractAddress, expirationDate],\n } as const;\n}\n\n/**\n * Returns the contract config to revoke a user decryption delegation.\n *\n * @example\n * ```ts\n * const txHash = await signer.writeContract(\n * revokeDelegationContract(aclAddress, delegateAddress, contractAddress),\n * );\n * ```\n */\nexport function revokeDelegationContract(\n aclAddress: Address,\n delegateAddress: Address,\n contractAddress: Address,\n) {\n return {\n address: aclAddress,\n abi: aclAbi,\n functionName: \"revokeDelegationForUserDecryption\",\n args: [delegateAddress, contractAddress],\n } as const;\n}\n\n/**\n * Returns the contract config to read the delegation expiry date.\n *\n * @example\n * ```ts\n * const expiry = await provider.readContract(\n * getDelegationExpiryContract(aclAddress, delegatorAddress, delegateAddress, contractAddress),\n * );\n * ```\n */\nexport function getDelegationExpiryContract(\n aclAddress: Address,\n delegatorAddress: Address,\n delegateAddress: Address,\n contractAddress: Address,\n) {\n return {\n address: aclAddress,\n abi: aclAbi,\n functionName: \"getUserDecryptionDelegationExpirationDate\",\n args: [delegatorAddress, delegateAddress, contractAddress],\n } as const;\n}\n\n/**\n * Returns the contract config to check if a specific handle is delegated.\n *\n * @example\n * ```ts\n * const isDelegated = await provider.readContract(\n * isHandleDelegatedContract(aclAddress, delegatorAddress, delegateAddress, contractAddress, handle),\n * );\n * ```\n */\nexport function isHandleDelegatedContract(\n aclAddress: Address,\n delegatorAddress: Address,\n delegateAddress: Address,\n contractAddress: Address,\n handle: `0x${string}`,\n) {\n return {\n address: aclAddress,\n abi: aclAbi,\n functionName: \"isHandleDelegatedForUserDecryption\",\n args: [delegatorAddress, delegateAddress, contractAddress, handle],\n } as const;\n}\n","/** uint64 max — represents a permanent (no-expiry) delegation. */\nexport const MAX_UINT64 = 2n ** 64n - 1n;\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","import type { Address, Hex } from \"viem\";\nimport type { ClearValue, EncryptedValue } from \"../relayer/relayer-sdk.types\";\nimport type { ShieldPath } from \"../types/token\";\n\n/**\n * All SDK event keys, accessible as `ZamaSDKEvents.EncryptStart` etc.\n */\nexport const ZamaSDKEvents = {\n // FHE operations\n EncryptStart: \"encrypt:start\",\n EncryptEnd: \"encrypt:end\",\n EncryptError: \"encrypt:error\",\n DecryptStart: \"decrypt:start\",\n DecryptEnd: \"decrypt:end\",\n DecryptError: \"decrypt:error\",\n // Write operations\n TransactionError: \"transaction:error\",\n ShieldSubmitted: \"shield:submitted\",\n TransferSubmitted: \"transfer:submitted\",\n TransferFromSubmitted: \"transferFrom:submitted\",\n SetOperatorSubmitted: \"setOperator:submitted\",\n ApproveUnderlyingSubmitted: \"approveUnderlying:submitted\",\n UnwrapSubmitted: \"unwrap:submitted\",\n FinalizeUnwrapSubmitted: \"finalizeUnwrap:submitted\",\n // Delegation operations\n DelegationSubmitted: \"delegation:submitted\",\n RevokeDelegationSubmitted: \"revokeDelegation:submitted\",\n // Unshield orchestration\n UnshieldPhase1Submitted: \"unshield:phase1_submitted\",\n UnshieldPhase2Started: \"unshield:phase2_started\",\n UnshieldPhase2Submitted: \"unshield:phase2_submitted\",\n} as const;\n\n/** Union of all SDK event type strings. */\nexport type ZamaSDKEventType = (typeof ZamaSDKEvents)[keyof typeof ZamaSDKEvents];\n\n// -- Base fields present on every event --\n\nexport interface BaseEvent {\n tokenAddress?: Address;\n timestamp: number;\n /** Shared identifier linking related events in multi-phase operations (e.g. unshield). */\n operationId?: string;\n}\n\n// -- Per-event typed payloads --\n\nexport interface EncryptStartEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.EncryptStart;\n}\n\nexport interface EncryptEndEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.EncryptEnd;\n durationMs: number;\n}\n\nexport interface EncryptErrorEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.EncryptError;\n /** The error that caused the encryption to fail. */\n error: Error;\n durationMs: number;\n}\n\nexport interface DecryptStartEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.DecryptStart;\n /** Encrypted values being decrypted — correlate with matching DecryptEnd/DecryptError. */\n encryptedValues: EncryptedValue[];\n}\n\nexport interface DecryptEndEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.DecryptEnd;\n durationMs: number;\n /** Encrypted values that were decrypted. */\n encryptedValues: EncryptedValue[];\n /** Decrypted values keyed by encrypted value — use this to correlate events to specific entries. */\n result: Record<EncryptedValue, ClearValue>;\n}\n\nexport interface DecryptErrorEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.DecryptError;\n /** The error that caused the decryption to fail. */\n error: Error;\n durationMs: number;\n /** Encrypted values that were being decrypted when the error occurred. */\n encryptedValues: EncryptedValue[];\n}\n\nexport interface TransactionErrorEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.TransactionError;\n /** Which SDK operation failed. */\n operation: TransactionOperation;\n /** The error that caused the transaction to fail. */\n error: Error;\n}\n\nexport interface ShieldSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.ShieldSubmitted;\n txHash: Hex;\n /** Which execution path was used: single-tx `transferAndCall` or two-tx `approveAndWrap`. */\n shieldPath: ShieldPath;\n}\n\nexport interface TransferSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.TransferSubmitted;\n txHash: Hex;\n}\n\nexport interface TransferFromSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.TransferFromSubmitted;\n txHash: Hex;\n}\n\nexport interface SetOperatorSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.SetOperatorSubmitted;\n txHash: Hex;\n}\n\nexport interface ApproveUnderlyingSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.ApproveUnderlyingSubmitted;\n txHash: Hex;\n /** Which approval transaction was submitted. */\n step: \"reset\" | \"approve\";\n}\n\nexport interface UnwrapSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.UnwrapSubmitted;\n txHash: Hex;\n}\n\nexport interface FinalizeUnwrapSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.FinalizeUnwrapSubmitted;\n txHash: Hex;\n}\n\nexport interface DelegationSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.DelegationSubmitted;\n txHash: Hex;\n}\n\nexport interface RevokeDelegationSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.RevokeDelegationSubmitted;\n txHash: Hex;\n}\n\nexport interface UnshieldPhase1SubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.UnshieldPhase1Submitted;\n txHash: Hex;\n}\n\nexport interface UnshieldPhase2StartedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.UnshieldPhase2Started;\n}\n\nexport interface UnshieldPhase2SubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.UnshieldPhase2Submitted;\n txHash: Hex;\n}\n\n/**\n * Discriminated union of all SDK events.\n *\n * Decrypt events carry encrypted values and decrypted clear-text values so event\n * subscribers can correlate and bind them in UI layers. Events never carry\n * private keys, permit signatures, or ZK proofs.\n */\nexport type ZamaSDKEvent =\n | EncryptStartEvent\n | EncryptEndEvent\n | EncryptErrorEvent\n | DecryptStartEvent\n | DecryptEndEvent\n | DecryptErrorEvent\n | TransactionErrorEvent\n | ShieldSubmittedEvent\n | TransferSubmittedEvent\n | TransferFromSubmittedEvent\n | SetOperatorSubmittedEvent\n | ApproveUnderlyingSubmittedEvent\n | UnwrapSubmittedEvent\n | FinalizeUnwrapSubmittedEvent\n | DelegationSubmittedEvent\n | RevokeDelegationSubmittedEvent\n | UnshieldPhase1SubmittedEvent\n | UnshieldPhase2StartedEvent\n | UnshieldPhase2SubmittedEvent;\n\nexport type ZamaSDKEventListener = (event: ZamaSDKEvent) => void;\n\n/** Distributive Omit that preserves the discriminated union. */\nexport type ZamaSDKEventInput = ZamaSDKEvent extends infer E\n ? E extends ZamaSDKEvent\n ? Omit<E, \"timestamp\" | \"tokenAddress\">\n : never\n : never;\n\n/**\n * Single source of truth for each transaction operation's submitted-event payload.\n *\n * Adding a write op = adding one entry here. `TransactionOperation` is then\n * `keyof typeof transactionOperationMetadata`, so the dispatch table and the\n * operation union cannot drift.\n *\n * The `satisfies` check enforces that every entry produces a valid\n * {@link ZamaSDKEventInput}.\n */\nexport const transactionOperationMetadata = {\n approveUnderlying: {\n submittedEvent: (txHash: Hex) => ({\n type: ZamaSDKEvents.ApproveUnderlyingSubmitted,\n txHash,\n step: \"approve\" as const,\n }),\n },\n \"approveUnderlying:reset\": {\n submittedEvent: (txHash: Hex) => ({\n type: ZamaSDKEvents.ApproveUnderlyingSubmitted,\n txHash,\n step: \"reset\" as const,\n }),\n },\n delegateDecryption: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.DelegationSubmitted, txHash }),\n },\n finalizeUnwrap: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.FinalizeUnwrapSubmitted, txHash }),\n },\n revokeDelegation: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.RevokeDelegationSubmitted, txHash }),\n },\n setOperator: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.SetOperatorSubmitted, txHash }),\n },\n \"shield:transferAndCall\": {\n submittedEvent: (txHash: Hex) => ({\n type: ZamaSDKEvents.ShieldSubmitted,\n txHash,\n shieldPath: \"transferAndCall\" as const,\n }),\n },\n \"shield:approveAndWrap\": {\n submittedEvent: (txHash: Hex) => ({\n type: ZamaSDKEvents.ShieldSubmitted,\n txHash,\n shieldPath: \"approveAndWrap\" as const,\n }),\n },\n transfer: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.TransferSubmitted, txHash }),\n },\n transferAndCall: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.TransferSubmitted, txHash }),\n },\n transferFrom: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.TransferFromSubmitted, txHash }),\n },\n transferFromAndCall: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.TransferFromSubmitted, txHash }),\n },\n unwrap: { submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.UnwrapSubmitted, txHash }) },\n unwrapAll: { submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.UnwrapSubmitted, txHash }) },\n} satisfies Record<string, { submittedEvent: (txHash: Hex) => ZamaSDKEventInput }>;\n\n/**\n * SDK transaction operations that emit submitted/error lifecycle events.\n *\n * Operation strings encode the execution-path discriminator for flows that have\n * one (`shield:transferAndCall` vs. `shield:approveAndWrap`), routing both error\n * and success events on a single field — see {@link transactionOperationMetadata}.\n */\nexport type TransactionOperation = keyof typeof transactionOperationMetadata;\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","export 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","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 GenericProvider,\n GenericSigner,\n TransactionResult,\n WriteContractConfig,\n} from \"../types\";\nimport type { GenericLogger } from \"../worker/worker.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 { ClearValue, EncryptedValue } from \"../relayer/relayer-sdk.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 readonly sdk: ZamaSDK;\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\n/** @internal */\nexport type DecryptedHandlesMap = Map<EncryptedValue, ClearValue>;\n"],"mappings":"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"}
1
+ {"version":3,"file":"token.cjs","names":["ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","ZamaError","ZamaErrorCode","SigningRejectedError","SigningFailedError","ConfigurationError","SignerNotConfiguredError","WalletAccountNotReadyError","swallow","ZamaError","requireConfigured","nameContract","symbolContract","decimalsContract","supportsInterfaceContract","ERC7984_INTERFACE_ID","ERC7984_WRAPPER_INTERFACE_ID","ZamaError","#requireSigner","swallow","confidentialTransferContract","confidentialTransferFromContract","confidentialTransferAndCallContract","confidentialTransferFromAndCallContract","setOperatorContract","isOperatorContract","confidentialBalanceOfContract","submitSdkTransaction","ConfigurationError"],"sources":["../../src/errors/encryption.ts","../../src/errors/transaction.ts","../../src/errors/rpc.ts","../../src/errors/chain.ts","../../src/errors/balance.ts","../../src/utils/error.ts","../../src/errors/fatal-batch.ts","../../src/abi/acl.abi.ts","../../src/contracts/acl.ts","../../src/contracts/constants.ts","../../src/utils/alignment.ts","../../src/utils/assertions.ts","../../src/events/sdk-events.ts","../../src/utils/concurrency.ts","../../src/utils/handles.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/** On-chain transaction reverted. */\nexport class TransactionRevertedError extends ZamaError {\n constructor(message: string, options?: ErrorOptions) {\n super(ZamaErrorCode.TransactionReverted, message, options);\n this.name = \"TransactionRevertedError\";\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 readonly operation: string;\n readonly signerChainId: number;\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 readonly requested: bigint;\n readonly available: bigint;\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/** 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","/** Coerce an unknown caught value to an Error instance. */\nexport function toError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n return new Error(String(error.message));\n }\n return new Error(String(error));\n}\n\n/**\n * Returns true if the error is a contract call revert (as opposed to a network/transport error).\n * Detects viem's ContractFunctionExecutionError / ContractFunctionRevertedError\n * and ethers' CALL_EXCEPTION.\n */\nexport function isContractCallError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n // viem: ContractFunctionExecutionError, ContractFunctionRevertedError\n if (\n error.name === \"ContractFunctionExecutionError\" ||\n error.name === \"ContractFunctionRevertedError\"\n ) {\n return true;\n }\n // ethers: error.code === \"CALL_EXCEPTION\"\n if (\"code\" in error && error.code === \"CALL_EXCEPTION\") {\n return true;\n }\n // Fallback: common revert message patterns from various providers\n const msg = error.message.toLowerCase();\n return msg.includes(\"execution reverted\") || msg.includes(\"call revert exception\");\n}\n\n/** JSON-RPC error code providers use for rate limiting (\"limit exceeded\"). */\nconst JSON_RPC_LIMIT_EXCEEDED = -32005;\n\n/** Properties that may nest a lower-level cause across viem / ethers / fetch. */\nconst NESTED_ERROR_KEYS = [\"cause\", \"error\", \"info\"] as const;\n\n/**\n * Walk an error and its nested causes (`cause` / `error` / `info`, as used by\n * viem, ethers, and fetch wrappers), applying `predicate` to each object node.\n * Returns the first node for which `predicate` returns true, or `undefined`.\n * Depth-bounded to avoid pathological / cyclic structures.\n */\nfunction findInErrorChain(\n error: unknown,\n predicate: (node: Record<string, unknown>) => boolean,\n depth = 6,\n): Record<string, unknown> | undefined {\n if (depth < 0 || error === null || error === undefined || typeof error !== \"object\") {\n return undefined;\n }\n const node = error as Record<string, unknown>;\n if (predicate(node)) {\n return node;\n }\n for (const key of NESTED_ERROR_KEYS) {\n const next = node[key];\n if (next !== undefined && next !== null && typeof next === \"object\") {\n const found = findInErrorChain(next, predicate, depth - 1);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n}\n\n// ============================================================================\n// Classification detectors\n// ============================================================================\n\n/**\n * Structured (unambiguous) consumer rate-limit signal across the RPC providers\n * the SDK reads through:\n * - JSON-RPC `-32005` (\"limit exceeded\");\n * - viem-style numeric `status: 429`, and viem's own `shouldRetry` shape where\n * the JSON-RPC error `code` is `429`;\n * - ethers' 429, which surfaces as `code: \"SERVER_ERROR\"` with the status only\n * in `info.responseStatus` (a string like `\"429 Too Many Requests\"`) and no\n * numeric top-level status — the leading code is parsed out of it.\n *\n * Deliberately NOT `statusCode: 429` — that is the relayer / node-fetch HTTP\n * shape, which stays {@link RelayerRequestFailedError} (SDK-236), so a relayer\n * 429 is never mistaken for a consumer-RPC throttle.\n */\nfunction nodeHasStructuredRateLimit(node: Record<string, unknown>): boolean {\n if (node.code === JSON_RPC_LIMIT_EXCEEDED || node.status === 429 || node.code === 429) {\n return true;\n }\n // ethers: `code: \"SERVER_ERROR\"`, status lives in `info.responseStatus`.\n if (node.code === \"SERVER_ERROR\" && typeof node.info === \"object\" && node.info !== null) {\n const responseStatus = (node.info as Record<string, unknown>).responseStatus;\n if (typeof responseStatus === \"string\" && /^\\s*429\\b/.test(responseStatus)) {\n return true;\n }\n }\n return false;\n}\n\nfunction nodeIsRpcRateLimit(node: Record<string, unknown>): boolean {\n if (nodeHasStructuredRateLimit(node)) {\n return true;\n }\n // Message fallback for providers without a structured code. Deliberately\n // narrow (specific throttling phrases, no bare \"429\") to avoid false positives\n // that would turn a terminal error into a retryable one.\n if (typeof node.message === \"string\") {\n const msg = node.message.toLowerCase();\n return (\n msg.includes(\"too many requests\") || msg.includes(\"rate limit\") || msg.includes(\"rate-limit\")\n );\n }\n return false;\n}\n\n/**\n * True when a failure originates from `@fhevm/sdk`'s relayer transport. Every\n * relayer error it throws — `RelayerResponseStatusError`, `RelayerResponseApiError`,\n * `RelayerMaxRetryError`, `RelayerTimeoutError`, … — carries the `Relayer` `name`\n * prefix. Such errors stay the relayer's domain ({@link RelayerRequestFailedError}\n * / SDK-236), never {@link RpcRateLimitError}, even on a 429 (which `@fhevm/sdk`\n * retries internally, honoring `Retry-After`, before surfacing).\n */\nexport function isRelayerError(error: unknown): boolean {\n return (\n findInErrorChain(\n error,\n (node) => typeof node.name === \"string\" && node.name.startsWith(\"Relayer\"),\n ) !== undefined\n );\n}\n\n/**\n * True when the failure is an `@fhevm/sdk` relayer *timeout* (`RelayerTimeoutError`,\n * thrown when a request exceeds the relayer's global deadline without a verdict).\n * Unlike a terminal 4xx/5xx, the operation itself is safe to retry, so callers map\n * it to a {@link RelayerRequestFailedError} with `retryable: true` — mirroring the\n * former `WorkerTimeoutError`, which was likewise documented retryable.\n */\nexport function isRelayerTimeoutError(error: unknown): boolean {\n return findInErrorChain(error, (node) => node.name === \"RelayerTimeoutError\") !== undefined;\n}\n\n/**\n * True if the error is the consumer's RPC provider throttling an on-chain read\n * (HTTP 429 / JSON-RPC -32005). Relayer-originated 429s are excluded.\n */\nexport function isRpcRateLimitError(error: unknown): boolean {\n if (isRelayerError(error)) {\n return false;\n }\n return findInErrorChain(error, nodeIsRpcRateLimit) !== undefined;\n}\n\n/**\n * Like {@link isRpcRateLimitError} but only matches an unambiguous **structured**\n * signal (`-32005` or a viem `status: 429`), ignoring message text. The classifier\n * promotes this ahead of any HTTP status, while a message-only throttle is only\n * trusted when no status is present — so a relayer HTTP error whose body happens\n * to say \"rate limit\" still maps to {@link RelayerRequestFailedError}.\n */\nexport function hasStructuredRpcRateLimitSignal(error: unknown): boolean {\n if (isRelayerError(error)) {\n return false;\n }\n return findInErrorChain(error, nodeHasStructuredRateLimit) !== undefined;\n}\n\n/**\n * Transport-error signatures of the consumer's own RPC client (viem / ethers).\n * The SDK's on-chain reads (the ACL `persistAllowed` pre-check) go through that\n * client, which already retries transport faults internally — so a failure\n * carrying one of these shapes must NOT be retried again by the SDK on top.\n */\nfunction nodeHasConsumerRpcSignature(node: Record<string, unknown>): boolean {\n // ethers transient transport codes.\n const code = node.code;\n if (code === \"NETWORK_ERROR\" || code === \"SERVER_ERROR\" || code === \"TIMEOUT\") {\n return true;\n }\n // viem transport error classes, matched by `name`.\n const name = node.name;\n return (\n name === \"HttpRequestError\" ||\n name === \"RpcRequestError\" ||\n name === \"TimeoutError\" ||\n name === \"WebSocketRequestError\"\n );\n}\n\n/**\n * True when a failure originates from the **consumer's RPC provider** (viem /\n * ethers) rather than the relayer. Keeps the SDK's relayer retry from\n * double-retrying transport faults the integrator's client already retried.\n * A relayer error (`Relayer*`) is never consumer-RPC.\n */\nexport function isConsumerRpcError(error: unknown): boolean {\n if (isRelayerError(error)) {\n return false;\n }\n if (hasStructuredRpcRateLimitSignal(error)) {\n return true;\n }\n return findInErrorChain(error, nodeHasConsumerRpcSignature) !== undefined;\n}\n\n/**\n * `@fhevm/sdk`'s ACL gate (`checkPersistAllowed`) throws an `AclUserDecryptionError`\n * when the requesting actor isn't allowed: `User <a> is not authorized to decrypt\n * handle <h>!`. Matching that phrase is what lets {@link wrapDecryptError} surface\n * a typed NotEntitledError with the parsed handle.\n *\n * Deliberately excludes the sibling `Dapp contract <a> is not authorized to\n * **user** decrypt handle <h>!` — a dapp ACL misconfig, intentionally left to\n * DecryptionFailedError. The differentiator is the inserted \"user\": the actor\n * message reads \"…to decrypt handle\", the dapp message \"…to user decrypt handle\",\n * so keying on \"is not authorized to decrypt handle\" matches only the former.\n *\n * The `error.test.ts` drift guard reads the installed `@fhevm/sdk` source and\n * fails loudly if the message is reworded.\n */\nexport function isNotEntitledMessage(message: string): boolean {\n return message.toLowerCase().includes(\"is not authorized to decrypt handle\");\n}\n\n/** Parse the on-chain handle out of the not-entitled message. */\nexport function parseHandleFromMessage(message: string): string | undefined {\n return /handle (0x[0-9a-fA-F]{64})/.exec(message)?.[1];\n}\n\n/**\n * Parse an HTTP `Retry-After` header value into **seconds** (the SDK's duration\n * unit and the header's own unit), or `undefined` when absent/unparseable. Per\n * RFC 9110 the value is either a non-negative number of seconds (`\"120\"`) or an\n * HTTP-date; a past date floors to `0`.\n */\nexport function parseRetryAfterHeader(value: string | null | undefined): number | undefined {\n if (value === null || value === undefined) {\n return undefined;\n }\n const trimmed = value.trim();\n if (trimmed === \"\") {\n return undefined;\n }\n // delta-seconds: a non-negative integer (already the unit we want).\n if (/^\\d+$/.test(trimmed)) {\n return Number(trimmed);\n }\n // HTTP-date — an IMF-fixdate always carries alphabetic day/month names, so\n // require a letter before deferring to the lenient Date.parse.\n if (/[a-zA-Z]/.test(trimmed)) {\n const dateMs = Date.parse(trimmed);\n if (!Number.isNaN(dateMs)) {\n return Math.max(0, Math.round((dateMs - Date.now()) / 1000));\n }\n }\n return undefined;\n}\n\n/** Read a `Retry-After` header (→ seconds) off a `Headers`-like object, if present. */\nfunction readRetryAfterHeader(headers: unknown): number | undefined {\n if (headers === null || typeof headers !== \"object\") {\n return undefined;\n }\n const get = (headers as { get?: unknown }).get;\n if (typeof get !== \"function\") {\n return undefined;\n }\n return parseRetryAfterHeader(\n (get as (name: string) => string | null).call(headers, \"Retry-After\"),\n );\n}\n\n/**\n * A node's **relayer** `Retry-After` header (seconds), read from a wrapped fetch\n * `Response` (the relayer's `cause.response.headers`). The SDK owns the\n * relayer fetch, so parsing the header there is legitimate.\n *\n * The viem/chain side (`HttpRequestError.headers`) is deliberately **not** read:\n * for consumer RPC the integrator's viem/ethers transport already honors\n * `Retry-After` in its own retry loop (and retries) before the error ever\n * surfaces, so re-reading it here would re-implement a transport concern.\n * Chain-RPC backoff is configured on the consumer's transport (`chain.network`).\n */\nfunction retryAfterFromHeader(node: Record<string, unknown>): number | undefined {\n const response = node.response;\n if (response !== null && typeof response === \"object\") {\n return readRetryAfterHeader((response as Record<string, unknown>).headers);\n }\n return undefined;\n}\n\n/**\n * A single node's server-driven retry delay (seconds): a numeric `retryAfter`\n * (a non-positive synthetic value is ignored), else a `Retry-After` header.\n */\nfunction retryAfterFromNode(node: Record<string, unknown>): number | undefined {\n if (\n typeof node.retryAfter === \"number\" &&\n Number.isFinite(node.retryAfter) &&\n node.retryAfter > 0\n ) {\n return node.retryAfter;\n }\n return retryAfterFromHeader(node);\n}\n\n/**\n * Best-effort extraction of a server-driven retry delay, in **seconds**, from\n * anywhere in an error's cause chain. Reads a numeric `retryAfter` property and\n * the **relayer's** `Retry-After` header (`cause.response.headers`). The\n * consumer-RPC/chain side is intentionally not read — viem/ethers own that\n * backoff (see {@link retryAfterFromHeader}). `undefined` when absent.\n */\nexport function extractRetryAfter(error: unknown): number | undefined {\n const node = findInErrorChain(error, (n) => retryAfterFromNode(n) !== undefined);\n return node ? retryAfterFromNode(node) : undefined;\n}\n\n/**\n * Extract an HTTP status code from an error or anywhere in its cause chain.\n * Relayer SDK errors may carry a `status` or `statusCode` property; walking the\n * full chain (rather than just depth-1) keeps this in step with the other\n * chain-walking detectors and avoids a depth asymmetry between them.\n */\nexport function extractHttpStatus(error: unknown): number | undefined {\n const node = findInErrorChain(\n error,\n (n) => typeof n.statusCode === \"number\" || typeof n.status === \"number\",\n );\n if (!node) {\n return undefined;\n }\n return (typeof node.statusCode === \"number\" ? node.statusCode : node.status) as number;\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","// DO NOT EDIT: generated by `pnpm abi:build` from\n// contracts/out/Impl.sol/IACL.json.\n// Regenerate after `pnpm contracts:build`; `pnpm abi:check` enforces this in CI.\nexport const aclAbi = [\n {\n type: \"function\",\n name: \"allow\",\n inputs: [\n { name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"account\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"allowForDecryption\",\n inputs: [{ name: \"handlesList\", type: \"bytes32[]\", internalType: \"bytes32[]\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"allowTransient\",\n inputs: [\n { name: \"ciphertext\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"account\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"cleanTransientStorage\",\n inputs: [],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"delegateForUserDecryption\",\n inputs: [\n { name: \"delegate\", type: \"address\", internalType: \"address\" },\n { name: \"contractAddress\", type: \"address\", internalType: \"address\" },\n { name: \"expirationDate\", type: \"uint64\", internalType: \"uint64\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"getUserDecryptionDelegationExpirationDate\",\n inputs: [\n { name: \"delegator\", type: \"address\", internalType: \"address\" },\n { name: \"delegate\", type: \"address\", internalType: \"address\" },\n { name: \"contractAddress\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint64\", internalType: \"uint64\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isAccountDenied\",\n inputs: [{ name: \"account\", type: \"address\", internalType: \"address\" }],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isAllowed\",\n inputs: [\n { name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"account\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isAllowedForDecryption\",\n inputs: [{ name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"isHandleDelegatedForUserDecryption\",\n inputs: [\n { name: \"delegator\", type: \"address\", internalType: \"address\" },\n { name: \"delegate\", type: \"address\", internalType: \"address\" },\n { name: \"contractAddress\", type: \"address\", internalType: \"address\" },\n { name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" },\n ],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"multicall\",\n inputs: [{ name: \"data\", type: \"bytes[]\", internalType: \"bytes[]\" }],\n outputs: [{ name: \"results\", type: \"bytes[]\", internalType: \"bytes[]\" }],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"persistAllowed\",\n inputs: [\n { name: \"handle\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"account\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"bool\", internalType: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"revokeDelegationForUserDecryption\",\n inputs: [\n { name: \"delegate\", type: \"address\", internalType: \"address\" },\n { name: \"contractAddress\", type: \"address\", internalType: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","import type { Address } from \"viem\";\nimport { aclAbi } from \"../abi/acl.abi\";\n\n/**\n * Returns the contract config to delegate user decryption rights.\n *\n * @example\n * ```ts\n * const txHash = await signer.writeContract(\n * delegateForUserDecryptionContract(aclAddress, delegateAddress, contractAddress, expirationDate),\n * );\n * ```\n */\nexport function delegateForUserDecryptionContract(\n aclAddress: Address,\n delegateAddress: Address,\n contractAddress: Address,\n expirationDate: bigint,\n) {\n return {\n address: aclAddress,\n abi: aclAbi,\n functionName: \"delegateForUserDecryption\",\n args: [delegateAddress, contractAddress, expirationDate],\n } as const;\n}\n\n/**\n * Returns the contract config to revoke a user decryption delegation.\n *\n * @example\n * ```ts\n * const txHash = await signer.writeContract(\n * revokeDelegationContract(aclAddress, delegateAddress, contractAddress),\n * );\n * ```\n */\nexport function revokeDelegationContract(\n aclAddress: Address,\n delegateAddress: Address,\n contractAddress: Address,\n) {\n return {\n address: aclAddress,\n abi: aclAbi,\n functionName: \"revokeDelegationForUserDecryption\",\n args: [delegateAddress, contractAddress],\n } as const;\n}\n\n/**\n * Returns the contract config to read the delegation expiry date.\n *\n * @example\n * ```ts\n * const expiry = await provider.readContract(\n * getDelegationExpiryContract(aclAddress, delegatorAddress, delegateAddress, contractAddress),\n * );\n * ```\n */\nexport function getDelegationExpiryContract(\n aclAddress: Address,\n delegatorAddress: Address,\n delegateAddress: Address,\n contractAddress: Address,\n) {\n return {\n address: aclAddress,\n abi: aclAbi,\n functionName: \"getUserDecryptionDelegationExpirationDate\",\n args: [delegatorAddress, delegateAddress, contractAddress],\n } as const;\n}\n\n/**\n * Returns the contract config to check if a specific handle is delegated.\n *\n * @example\n * ```ts\n * const isDelegated = await provider.readContract(\n * isHandleDelegatedContract(aclAddress, delegatorAddress, delegateAddress, contractAddress, handle),\n * );\n * ```\n */\nexport function isHandleDelegatedContract(\n aclAddress: Address,\n delegatorAddress: Address,\n delegateAddress: Address,\n contractAddress: Address,\n handle: `0x${string}`,\n) {\n return {\n address: aclAddress,\n abi: aclAbi,\n functionName: \"isHandleDelegatedForUserDecryption\",\n args: [delegatorAddress, delegateAddress, contractAddress, handle],\n } as const;\n}\n","/** uint64 max — represents a permanent (no-expiry) delegation. */\nexport const MAX_UINT64 = 2n ** 64n - 1n;\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","export function assertNonNullable<T>(value: T, context: string): asserts value is NonNullable<T> {\n if (value === null || value === undefined) {\n throw new TypeError(`${context} must not be null or undefined`);\n }\n}\n\nexport function assertObject(\n value: unknown,\n context: string,\n): asserts value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${context} must be an object, got ${typeof value}`);\n }\n}\n\nexport function assertString(value: unknown, context: string): asserts value is string {\n if (typeof value !== \"string\") {\n throw new TypeError(`${context} must be a string, got ${typeof value}`);\n }\n}\n\nexport function assertArray(value: unknown, context: string): asserts value is unknown[] {\n if (!Array.isArray(value)) {\n throw new TypeError(`${context} must be an array, got ${typeof value}`);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function assertFunction(value: unknown, context: string): asserts value is Function {\n if (typeof value !== \"function\") {\n throw new TypeError(`${context} must be a function, got ${typeof value}`);\n }\n}\n\nexport function assertBigint(value: unknown, context: string): asserts value is bigint {\n if (typeof value !== \"bigint\") {\n throw new TypeError(`${context} must be a bigint, got ${typeof value}`);\n }\n}\n\n/** Assert that `obj[key]` is a string. Narrows `obj` to include `{ [key]: string }`. */\nexport function assertStringProp<\n K extends string,\n O extends Record<string, unknown> = Record<string, unknown>,\n>(obj: O, key: K, context: string): asserts obj is O & Record<K, string> {\n assertString(obj[key], context);\n}\n\n/** Assert that `obj[key]` is a function. Narrows `obj` to include `{ [key]: F }`. */\nexport function assertFunctionProp<\n K extends string,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n F extends Function,\n O extends Record<string, unknown> = Record<string, unknown>,\n>(obj: O, key: K, context: string): asserts obj is O & Record<K, F> {\n assertFunction(obj[key], context);\n}\n\nexport function assertCondition(condition: boolean, message: string): asserts condition {\n if (!condition) {\n throw new TypeError(message);\n }\n}\n","import type { Address, Hex } from \"viem\";\nimport type { ClearValue, EncryptedValue } from \"../relayer/types\";\nimport type { ShieldPath } from \"../types/token\";\n\n/**\n * All SDK event keys, accessible as `ZamaSDKEvents.EncryptStart` etc.\n */\nexport const ZamaSDKEvents = {\n // FHE operations\n EncryptStart: \"encrypt:start\",\n EncryptEnd: \"encrypt:end\",\n EncryptError: \"encrypt:error\",\n DecryptStart: \"decrypt:start\",\n DecryptEnd: \"decrypt:end\",\n DecryptError: \"decrypt:error\",\n // Write operations\n TransactionError: \"transaction:error\",\n ShieldSubmitted: \"shield:submitted\",\n TransferSubmitted: \"transfer:submitted\",\n TransferFromSubmitted: \"transferFrom:submitted\",\n SetOperatorSubmitted: \"setOperator:submitted\",\n ApproveUnderlyingSubmitted: \"approveUnderlying:submitted\",\n UnwrapSubmitted: \"unwrap:submitted\",\n FinalizeUnwrapSubmitted: \"finalizeUnwrap:submitted\",\n // Delegation operations\n DelegationSubmitted: \"delegation:submitted\",\n RevokeDelegationSubmitted: \"revokeDelegation:submitted\",\n // Unshield orchestration\n UnshieldPhase1Submitted: \"unshield:phase1_submitted\",\n UnshieldPhase2Started: \"unshield:phase2_started\",\n UnshieldPhase2Submitted: \"unshield:phase2_submitted\",\n} as const;\n\n/** Union of all SDK event type strings. */\nexport type ZamaSDKEventType = (typeof ZamaSDKEvents)[keyof typeof ZamaSDKEvents];\n\n// -- Base fields present on every event --\n\nexport interface BaseEvent {\n tokenAddress?: Address;\n timestamp: number;\n /** Shared identifier linking related events in multi-phase operations (e.g. unshield). */\n operationId?: string;\n}\n\n// -- Per-event typed payloads --\n\nexport interface EncryptStartEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.EncryptStart;\n}\n\nexport interface EncryptEndEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.EncryptEnd;\n durationMs: number;\n}\n\nexport interface EncryptErrorEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.EncryptError;\n /** The error that caused the encryption to fail. */\n error: Error;\n durationMs: number;\n}\n\nexport interface DecryptStartEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.DecryptStart;\n /** Encrypted values being decrypted — correlate with matching DecryptEnd/DecryptError. */\n encryptedValues: EncryptedValue[];\n}\n\nexport interface DecryptEndEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.DecryptEnd;\n durationMs: number;\n /** Encrypted values that were decrypted. */\n encryptedValues: EncryptedValue[];\n /** Decrypted values keyed by encrypted value — use this to correlate events to specific entries. */\n result: Record<EncryptedValue, ClearValue>;\n}\n\nexport interface DecryptErrorEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.DecryptError;\n /** The error that caused the decryption to fail. */\n error: Error;\n durationMs: number;\n /** Encrypted values that were being decrypted when the error occurred. */\n encryptedValues: EncryptedValue[];\n}\n\nexport interface TransactionErrorEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.TransactionError;\n /** Which SDK operation failed. */\n operation: TransactionOperation;\n /** The error that caused the transaction to fail. */\n error: Error;\n}\n\nexport interface ShieldSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.ShieldSubmitted;\n txHash: Hex;\n /** Which execution path was used: single-tx `transferAndCall` or two-tx `approveAndWrap`. */\n shieldPath: ShieldPath;\n}\n\nexport interface TransferSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.TransferSubmitted;\n txHash: Hex;\n}\n\nexport interface TransferFromSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.TransferFromSubmitted;\n txHash: Hex;\n}\n\nexport interface SetOperatorSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.SetOperatorSubmitted;\n txHash: Hex;\n}\n\nexport interface ApproveUnderlyingSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.ApproveUnderlyingSubmitted;\n txHash: Hex;\n /** Which approval transaction was submitted. */\n step: \"reset\" | \"approve\";\n}\n\nexport interface UnwrapSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.UnwrapSubmitted;\n txHash: Hex;\n}\n\nexport interface FinalizeUnwrapSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.FinalizeUnwrapSubmitted;\n txHash: Hex;\n}\n\nexport interface DelegationSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.DelegationSubmitted;\n txHash: Hex;\n}\n\nexport interface RevokeDelegationSubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.RevokeDelegationSubmitted;\n txHash: Hex;\n}\n\nexport interface UnshieldPhase1SubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.UnshieldPhase1Submitted;\n txHash: Hex;\n}\n\nexport interface UnshieldPhase2StartedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.UnshieldPhase2Started;\n}\n\nexport interface UnshieldPhase2SubmittedEvent extends BaseEvent {\n type: typeof ZamaSDKEvents.UnshieldPhase2Submitted;\n txHash: Hex;\n}\n\n/**\n * Discriminated union of all SDK events.\n *\n * Decrypt events carry encrypted values and decrypted clear-text values so event\n * subscribers can correlate and bind them in UI layers. Events never carry\n * private keys, permit signatures, or ZK proofs.\n */\nexport type ZamaSDKEvent =\n | EncryptStartEvent\n | EncryptEndEvent\n | EncryptErrorEvent\n | DecryptStartEvent\n | DecryptEndEvent\n | DecryptErrorEvent\n | TransactionErrorEvent\n | ShieldSubmittedEvent\n | TransferSubmittedEvent\n | TransferFromSubmittedEvent\n | SetOperatorSubmittedEvent\n | ApproveUnderlyingSubmittedEvent\n | UnwrapSubmittedEvent\n | FinalizeUnwrapSubmittedEvent\n | DelegationSubmittedEvent\n | RevokeDelegationSubmittedEvent\n | UnshieldPhase1SubmittedEvent\n | UnshieldPhase2StartedEvent\n | UnshieldPhase2SubmittedEvent;\n\nexport type ZamaSDKEventListener = (event: ZamaSDKEvent) => void;\n\n/** Distributive Omit that preserves the discriminated union. */\nexport type ZamaSDKEventInput = ZamaSDKEvent extends infer E\n ? E extends ZamaSDKEvent\n ? Omit<E, \"timestamp\" | \"tokenAddress\">\n : never\n : never;\n\n/**\n * Single source of truth for each transaction operation's submitted-event payload.\n *\n * Adding a write op = adding one entry here. `TransactionOperation` is then\n * `keyof typeof transactionOperationMetadata`, so the dispatch table and the\n * operation union cannot drift.\n *\n * The `satisfies` check enforces that every entry produces a valid\n * {@link ZamaSDKEventInput}.\n */\nexport const transactionOperationMetadata = {\n approveUnderlying: {\n submittedEvent: (txHash: Hex) => ({\n type: ZamaSDKEvents.ApproveUnderlyingSubmitted,\n txHash,\n step: \"approve\" as const,\n }),\n },\n \"approveUnderlying:reset\": {\n submittedEvent: (txHash: Hex) => ({\n type: ZamaSDKEvents.ApproveUnderlyingSubmitted,\n txHash,\n step: \"reset\" as const,\n }),\n },\n delegateDecryption: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.DelegationSubmitted, txHash }),\n },\n finalizeUnwrap: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.FinalizeUnwrapSubmitted, txHash }),\n },\n revokeDelegation: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.RevokeDelegationSubmitted, txHash }),\n },\n setOperator: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.SetOperatorSubmitted, txHash }),\n },\n \"shield:transferAndCall\": {\n submittedEvent: (txHash: Hex) => ({\n type: ZamaSDKEvents.ShieldSubmitted,\n txHash,\n shieldPath: \"transferAndCall\" as const,\n }),\n },\n \"shield:approveAndWrap\": {\n submittedEvent: (txHash: Hex) => ({\n type: ZamaSDKEvents.ShieldSubmitted,\n txHash,\n shieldPath: \"approveAndWrap\" as const,\n }),\n },\n transfer: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.TransferSubmitted, txHash }),\n },\n transferAndCall: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.TransferSubmitted, txHash }),\n },\n transferFrom: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.TransferFromSubmitted, txHash }),\n },\n transferFromAndCall: {\n submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.TransferFromSubmitted, txHash }),\n },\n unwrap: { submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.UnwrapSubmitted, txHash }) },\n unwrapAll: { submittedEvent: (txHash: Hex) => ({ type: ZamaSDKEvents.UnwrapSubmitted, txHash }) },\n} satisfies Record<string, { submittedEvent: (txHash: Hex) => ZamaSDKEventInput }>;\n\n/**\n * SDK transaction operations that emit submitted/error lifecycle events.\n *\n * Operation strings encode the execution-path discriminator for flows that have\n * one (`shield:transferAndCall` vs. `shield:approveAndWrap`), routing both error\n * and success events on a single field — see {@link transactionOperationMetadata}.\n */\nexport type TransactionOperation = keyof typeof transactionOperationMetadata;\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","export 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","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 readonly sdk: ZamaSDK;\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,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../wrappers-registry.cjs"),t=require("../base-signer.cjs"),n=require("../eip1193-subscribe.cjs");let r=require("viem");var i=class{#e;constructor(e){this.#e=e.publicClient}async getChainId(){return this.#e.getChainId()}async readContract(e){return this.#e.readContract(e)}async waitForTransactionReceipt(e){return this.#e.waitForTransactionReceipt({hash:e})}async getBlockTimestamp(){return(await this.#e.getBlock()).timestamp}};function a(e){if(!(!e.account||!e.chain))return{address:(0,r.getAddress)(e.account.address),chainId:e.chain.id}}var o=class extends t.t{#e;#t;#n;constructor(e){super(a(e.walletClient)),this.#e=e.walletClient,this.#t=e.ethereum,this.#n=this.#i()}#r(t){if(!this.#e.account)throw new e.V(t);return{walletClient:this.#e,account:this.#e.account}}async signTypedData(e){let{walletClient:t,account:n}=this.#r(`signTypedData`),{EIP712Domain:r,...i}=e.types;return t.signTypedData({account:n,primaryType:e.primaryType,types:i,domain:e.domain,message:{...e.message,startTimestamp:BigInt(e.message.startTimestamp),durationDays:BigInt(e.message.durationDays)}})}async writeContract(e){let{walletClient:t,account:n}=this.#r(`writeContract`);return t.writeContract({chain:t.chain,account:n,...e})}#i(){return this.#t?n.t({provider:this.#t,getInitialWalletAccount:()=>a(this.#e),onWalletAccountChange:({next:e})=>{this.walletAccount.setSnapshot(e)}}):()=>{}}onDispose(){this.#n()}};function s(e){return t.i(new o({walletClient:e.walletClient,ethereum:e.ethereum}),new i({publicClient:e.publicClient}),e)}function c(e){if(!e.account)throw TypeError(`WalletClient has no account`);return e.account}function l(t,n,r){return t.readContract(e.S(n,r))}function u(t,n){return t.readContract(e.N(n))}function d(t,n,r){return t.readContract(e.m(n,r))}function f(t,n,r,i,a){return t.writeContract({chain:t.chain,account:c(t),...e.T(n,r,i,a)})}function p(t,n,r,i,a,o){return t.writeContract({chain:t.chain,account:c(t),...e.P(n,r,i,a,o)})}function m(t,n,r,i,a){return t.writeContract({chain:t.chain,account:c(t),...e.F(n,r,i,a)})}function h(t,n,r,i,a){return t.writeContract({chain:t.chain,account:c(t),...e.O(n,r,i,a)})}function g(t,n,r,i){return t.writeContract({chain:t.chain,account:c(t),...e.M(n,r,i)})}function _(t,n,r,i){return t.writeContract({chain:t.chain,account:c(t),...e.I(n,r,i)})}function v(t,n){return t.readContract(e.i(n))}function y(t,n){return t.readContract(e.a(n))}function b(t,n,r,i){return t.readContract(e.o(n,r,i))}function x(t,n,r){return t.readContract(e.r(n,r))}function S(t,n,r){return t.readContract(e.t(n,r))}function C(t,n,r){return t.readContract(e.n(n,r))}function w(t,n,r){return t.readContract(e.s(n,r))}exports.ViemProvider=i,exports.ViemSigner=o,exports.createConfig=s,exports.readConfidentialBalanceOfContract=l,exports.readConfidentialTokenAddressContract=S,exports.readIsConfidentialTokenValidContract=w,exports.readSupportsInterfaceContract=d,exports.readTokenAddressContract=C,exports.readTokenPairContract=x,exports.readTokenPairsContract=v,exports.readTokenPairsLengthContract=y,exports.readTokenPairsSliceContract=b,exports.readUnderlyingTokenContract=u,exports.writeConfidentialTransferContract=f,exports.writeFinalizeUnwrapContract=h,exports.writeSetOperatorContract=g,exports.writeUnwrapContract=p,exports.writeUnwrapFromBalanceContract=m,exports.writeWrapContract=_;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../wrappers-registry.cjs"),t=require("../base-signer.cjs"),n=require("../eip1193-subscribe.cjs");let r=require("viem");var i=class{#e;constructor(e){this.#e=e.publicClient}async getChainId(){return this.#e.getChainId()}async readContract(e){return this.#e.readContract(e)}async waitForTransactionReceipt(e){return this.#e.waitForTransactionReceipt({hash:e})}async getBlockTimestamp(){return(await this.#e.getBlock()).timestamp}};function a(e){let t=(e.primaryType?e.types[e.primaryType]:void 0)??[],n={...e.message};for(let{name:e,type:r}of t)/^uint\d*$/.test(r)&&(n[e]=BigInt(n[e]));return n}function o(e){if(!(!e.account||!e.chain))return{address:(0,r.getAddress)(e.account.address),chainId:e.chain.id}}var s=class extends t.t{#e;#t;#n;constructor(e){super(o(e.walletClient)),this.#e=e.walletClient,this.#t=e.ethereum,this.#n=this.#i()}#r(t){if(!this.#e.account)throw new e.V(t);return{walletClient:this.#e,account:this.#e.account}}async signTypedData(e){let{walletClient:t,account:n}=this.#r(`signTypedData`),{EIP712Domain:r,...i}=e.types;return t.signTypedData({account:n,primaryType:e.primaryType,types:i,domain:e.domain,message:a(e)})}async writeContract(e){let{walletClient:t,account:n}=this.#r(`writeContract`);return t.writeContract({chain:t.chain,account:n,...e})}#i(){return this.#t?n.t({provider:this.#t,getInitialWalletAccount:()=>o(this.#e),onWalletAccountChange:({next:e})=>{this.walletAccount.setSnapshot(e)}}):()=>{}}onDispose(){this.#n()}};function c(e){return t.i(new s({walletClient:e.walletClient,ethereum:e.ethereum}),new i({publicClient:e.publicClient}),e)}function l(e){if(!e.account)throw TypeError(`WalletClient has no account`);return e.account}function u(t,n,r){return t.readContract(e.S(n,r))}function d(t,n){return t.readContract(e.N(n))}function f(t,n,r){return t.readContract(e.m(n,r))}function p(t,n,r,i,a){return t.writeContract({chain:t.chain,account:l(t),...e.T(n,r,i,a)})}function m(t,n,r,i,a,o){return t.writeContract({chain:t.chain,account:l(t),...e.P(n,r,i,a,o)})}function h(t,n,r,i,a){return t.writeContract({chain:t.chain,account:l(t),...e.F(n,r,i,a)})}function g(t,n,r,i,a){return t.writeContract({chain:t.chain,account:l(t),...e.O(n,r,i,a)})}function _(t,n,r,i){return t.writeContract({chain:t.chain,account:l(t),...e.M(n,r,i)})}function v(t,n,r,i){return t.writeContract({chain:t.chain,account:l(t),...e.I(n,r,i)})}function y(t,n){return t.readContract(e.i(n))}function b(t,n){return t.readContract(e.a(n))}function x(t,n,r,i){return t.readContract(e.o(n,r,i))}function S(t,n,r){return t.readContract(e.r(n,r))}function C(t,n,r){return t.readContract(e.t(n,r))}function w(t,n,r){return t.readContract(e.n(n,r))}function T(t,n,r){return t.readContract(e.s(n,r))}exports.ViemProvider=i,exports.ViemSigner=s,exports.createConfig=c,exports.readConfidentialBalanceOfContract=u,exports.readConfidentialTokenAddressContract=C,exports.readIsConfidentialTokenValidContract=T,exports.readSupportsInterfaceContract=f,exports.readTokenAddressContract=w,exports.readTokenPairContract=S,exports.readTokenPairsContract=y,exports.readTokenPairsLengthContract=b,exports.readTokenPairsSliceContract=x,exports.readUnderlyingTokenContract=d,exports.writeConfidentialTransferContract=p,exports.writeFinalizeUnwrapContract=g,exports.writeSetOperatorContract=_,exports.writeUnwrapContract=m,exports.writeUnwrapFromBalanceContract=h,exports.writeWrapContract=v;
2
2
  //# sourceMappingURL=index.cjs.map