@zama-fhe/sdk 3.0.0-alpha.30 → 3.0.0-alpha.31

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 (90) hide show
  1. package/dist/cjs/assertions.cjs +1 -1
  2. package/dist/cjs/assertions.cjs.map +1 -1
  3. package/dist/cjs/base-signer.cjs +2 -0
  4. package/dist/cjs/base-signer.cjs.map +1 -0
  5. package/dist/cjs/eip1193-subscribe.cjs +1 -1
  6. package/dist/cjs/eip1193-subscribe.cjs.map +1 -1
  7. package/dist/cjs/ethers/index.cjs +1 -1
  8. package/dist/cjs/ethers/index.cjs.map +1 -1
  9. package/dist/cjs/index.cjs +39 -1
  10. package/dist/cjs/index.cjs.map +1 -1
  11. package/dist/cjs/indexeddb-storage.cjs.map +1 -1
  12. package/dist/cjs/query/index.cjs +1 -1
  13. package/dist/cjs/query/index.cjs.map +1 -1
  14. package/dist/cjs/readonly-token.cjs +1 -1
  15. package/dist/cjs/readonly-token.cjs.map +1 -1
  16. package/dist/cjs/relayer.cjs +1 -1
  17. package/dist/cjs/relayer.cjs.map +1 -1
  18. package/dist/cjs/swallow.cjs +2 -0
  19. package/dist/cjs/swallow.cjs.map +1 -0
  20. package/dist/cjs/viem/index.cjs +1 -1
  21. package/dist/cjs/viem/index.cjs.map +1 -1
  22. package/dist/cjs/web/index.cjs +1 -1
  23. package/dist/esm/assertions-Cg0abMmQ.js +2 -0
  24. package/dist/esm/{assertions-DmKW7zPq.js.map → assertions-Cg0abMmQ.js.map} +1 -1
  25. package/dist/esm/base-signer-BCNOq8ML.d.ts +63 -0
  26. package/dist/esm/base-signer-Bg6f7lPK.js +2 -0
  27. package/dist/esm/base-signer-Bg6f7lPK.js.map +1 -0
  28. package/dist/esm/cleartext/index.d.ts +1 -1
  29. package/dist/esm/cleartext/index.js +1 -1
  30. package/dist/esm/{cleartext-BV_jxrwb.js → cleartext-BYuaZXRn.js} +2 -2
  31. package/dist/esm/{cleartext-BV_jxrwb.js.map → cleartext-BYuaZXRn.js.map} +1 -1
  32. package/dist/esm/{cleartext-D0fG1vxX.d.ts → cleartext-BgtYGip4.d.ts} +2 -2
  33. package/dist/esm/eip1193-subscribe-B7nvT1Mp.js +2 -0
  34. package/dist/esm/eip1193-subscribe-B7nvT1Mp.js.map +1 -0
  35. package/dist/esm/{encryption-DhFNrebM.js → encryption-DC0kFV8m.js} +2 -2
  36. package/dist/esm/{encryption-DhFNrebM.js.map → encryption-DC0kFV8m.js.map} +1 -1
  37. package/dist/esm/{error-BRHDbi2m.js → error-PQibCQ4e.js} +1 -1
  38. package/dist/esm/{error-BRHDbi2m.js.map → error-PQibCQ4e.js.map} +1 -1
  39. package/dist/esm/ethers/index.d.ts +11 -9
  40. package/dist/esm/ethers/index.js +1 -1
  41. package/dist/esm/ethers/index.js.map +1 -1
  42. package/dist/esm/{hex-B4YpGJec.js → hex-BNAF6olN.js} +2 -2
  43. package/dist/esm/{hex-B4YpGJec.js.map → hex-BNAF6olN.js.map} +1 -1
  44. package/dist/esm/{index-Djamp3vC.d.ts → index-QEd15Law.d.ts} +2243 -419
  45. package/dist/esm/index.d.ts +13 -12
  46. package/dist/esm/index.js +39 -1
  47. package/dist/esm/index.js.map +1 -1
  48. package/dist/esm/indexeddb-storage-Vy1KPGQW.js.map +1 -1
  49. package/dist/esm/node/index.d.ts +3 -3
  50. package/dist/esm/node/index.js +1 -1
  51. package/dist/esm/node/index.js.map +1 -1
  52. package/dist/esm/node/relayer-sdk.node-worker.js +1 -1
  53. package/dist/esm/query/index.d.ts +15 -13
  54. package/dist/esm/query/index.js +1 -1
  55. package/dist/esm/query/index.js.map +1 -1
  56. package/dist/esm/readonly-token-C9N5Hg1x.js +2 -0
  57. package/dist/esm/readonly-token-C9N5Hg1x.js.map +1 -0
  58. package/dist/esm/{relayer-DJI4oQ8o.js → relayer-Dkn4qy2c.js} +2 -2
  59. package/dist/esm/relayer-Dkn4qy2c.js.map +1 -0
  60. package/dist/esm/{relayer-cleartext-7rkHJT9l.d.ts → relayer-cleartext-BzpqI_BH.d.ts} +53 -53
  61. package/dist/esm/{relayer-cleartext-BCFRHdRV.js → relayer-cleartext-T0I-wWO6.js} +2 -2
  62. package/dist/esm/{relayer-cleartext-BCFRHdRV.js.map → relayer-cleartext-T0I-wWO6.js.map} +1 -1
  63. package/dist/esm/swallow-C7peBgYw.js +2 -0
  64. package/dist/esm/swallow-C7peBgYw.js.map +1 -0
  65. package/dist/esm/{types-CZTkF687.d.ts → types-COKsQVCF.d.ts} +2 -2
  66. package/dist/esm/{types-D-8TJ_H5.d.ts → types-Cq9xaH3t.d.ts} +2 -2
  67. package/dist/esm/{types-BnEKfr_J.d.ts → types-DF5sdue4.d.ts} +12 -71
  68. package/dist/esm/viem/index.d.ts +6 -7
  69. package/dist/esm/viem/index.js +1 -1
  70. package/dist/esm/viem/index.js.map +1 -1
  71. package/dist/esm/web/index.d.ts +2 -2
  72. package/dist/esm/web/index.js +1 -1
  73. package/dist/esm/web/index.js.map +1 -1
  74. package/dist/esm/{worker.base-client-ClMPyID1.js → worker.base-client-RFxWgUOc.js} +2 -2
  75. package/dist/esm/{worker.base-client-ClMPyID1.js.map → worker.base-client-RFxWgUOc.js.map} +1 -1
  76. package/package.json +4 -3
  77. package/dist/cjs/build.cjs +0 -2
  78. package/dist/cjs/build.cjs.map +0 -1
  79. package/dist/cjs/signer.cjs +0 -2
  80. package/dist/cjs/signer.cjs.map +0 -1
  81. package/dist/esm/assertions-DmKW7zPq.js +0 -2
  82. package/dist/esm/build-Bot28OYv.js +0 -2
  83. package/dist/esm/build-Bot28OYv.js.map +0 -1
  84. package/dist/esm/eip1193-subscribe-DDYcH5x3.js +0 -2
  85. package/dist/esm/eip1193-subscribe-DDYcH5x3.js.map +0 -1
  86. package/dist/esm/readonly-token-DKPwEVKl.js +0 -2
  87. package/dist/esm/readonly-token-DKPwEVKl.js.map +0 -1
  88. package/dist/esm/relayer-DJI4oQ8o.js.map +0 -1
  89. package/dist/esm/signer-BeScybq2.js +0 -2
  90. package/dist/esm/signer-BeScybq2.js.map +0 -1
@@ -1,2 +1,2 @@
1
- function e(e){return e instanceof Error?e:typeof e==`object`&&e&&`message`in e?Error(String(e.message)):Error(String(e))}function t(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`)}function n(e,t){if(e==null)throw TypeError(`${t} must not be null or undefined`)}function r(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(`${t} must be an object, got ${typeof e}`)}function i(e,t){if(typeof e!=`string`)throw TypeError(`${t} must be a string, got ${typeof e}`)}function a(e,t){if(!Array.isArray(e))throw TypeError(`${t} must be an array, got ${typeof e}`)}function o(e,t){if(typeof e!=`function`)throw TypeError(`${t} must be a function, got ${typeof e}`)}function s(e,t){if(typeof e!=`bigint`)throw TypeError(`${t} must be a bigint, got ${typeof e}`)}function c(e,t,n){i(e[t],n)}function l(e,t,n){o(e[t],n)}function u(e,t){if(!e)throw TypeError(t)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return e}});
1
+ function e(e){return e instanceof Error?e:typeof e==`object`&&e&&`message`in e?Error(String(e.message)):Error(String(e))}function t(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`)}function n(e,t){if(e==null)throw TypeError(`${t} must not be null or undefined`)}function r(e,t){if(typeof e!=`object`||!e||Array.isArray(e))throw TypeError(`${t} must be an object, got ${typeof e}`)}function i(e,t){if(typeof e!=`string`)throw TypeError(`${t} must be a string, got ${typeof e}`)}function a(e,t){if(typeof e!=`function`)throw TypeError(`${t} must be a function, got ${typeof e}`)}function o(e,t){if(typeof e!=`bigint`)throw TypeError(`${t} must be a bigint, got ${typeof e}`)}function s(e,t,n){i(e[t],n)}function c(e,t,n){a(e[t],n)}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
2
2
  //# sourceMappingURL=assertions.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"assertions.cjs","names":[],"sources":["../../src/utils/error.ts","../../src/utils/assertions.ts"],"sourcesContent":["/** 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","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"],"mappings":"AACA,SAAgB,EAAQ,EAAuB,CAO7C,OANI,aAAiB,MACZ,EAEL,OAAO,GAAU,UAAY,GAAkB,YAAa,EACnD,MAAM,OAAO,EAAM,QAAQ,CAAC,CAE9B,MAAM,OAAO,EAAM,CAAC,CAQjC,SAAgB,EAAoB,EAAyB,CAC3D,GAAI,EAAE,aAAiB,OACrB,MAAO,GAUT,GANE,EAAM,OAAS,kCACf,EAAM,OAAS,iCAKb,SAAU,GAAS,EAAM,OAAS,iBACpC,MAAO,GAGT,IAAM,EAAM,EAAM,QAAQ,aAAa,CACvC,OAAO,EAAI,SAAS,qBAAqB,EAAI,EAAI,SAAS,wBAAwB,CCjCpF,SAAgB,EAAqB,EAAU,EAAkD,CAC/F,GAAI,GAAU,KACZ,MAAU,UAAU,GAAG,EAAQ,gCAAgC,CAInE,SAAgB,EACd,EACA,EAC0C,CAC1C,GAAI,OAAO,GAAU,WAAY,GAAkB,MAAM,QAAQ,EAAM,CACrE,MAAU,UAAU,GAAG,EAAQ,0BAA0B,OAAO,IAAQ,CAI5E,SAAgB,EAAa,EAAgB,EAA0C,CACrF,GAAI,OAAO,GAAU,SACnB,MAAU,UAAU,GAAG,EAAQ,yBAAyB,OAAO,IAAQ,CAI3E,SAAgB,EAAY,EAAgB,EAA6C,CACvF,GAAI,CAAC,MAAM,QAAQ,EAAM,CACvB,MAAU,UAAU,GAAG,EAAQ,yBAAyB,OAAO,IAAQ,CAK3E,SAAgB,EAAe,EAAgB,EAA4C,CACzF,GAAI,OAAO,GAAU,WACnB,MAAU,UAAU,GAAG,EAAQ,2BAA2B,OAAO,IAAQ,CAI7E,SAAgB,EAAa,EAAgB,EAA0C,CACrF,GAAI,OAAO,GAAU,SACnB,MAAU,UAAU,GAAG,EAAQ,yBAAyB,OAAO,IAAQ,CAK3E,SAAgB,EAGd,EAAQ,EAAQ,EAAuD,CACvE,EAAa,EAAI,GAAM,EAAQ,CAIjC,SAAgB,EAKd,EAAQ,EAAQ,EAAkD,CAClE,EAAe,EAAI,GAAM,EAAQ,CAGnC,SAAgB,EAAgB,EAAoB,EAAoC,CACtF,GAAI,CAAC,EACH,MAAU,UAAU,EAAQ"}
1
+ {"version":3,"file":"assertions.cjs","names":[],"sources":["../../src/utils/error.ts","../../src/utils/assertions.ts"],"sourcesContent":["/** 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","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"],"mappings":"AACA,SAAgB,EAAQ,EAAuB,CAO7C,OANI,aAAiB,MACZ,EAEL,OAAO,GAAU,UAAY,GAAkB,YAAa,EACnD,MAAM,OAAO,EAAM,QAAQ,CAAC,CAE9B,MAAM,OAAO,EAAM,CAAC,CAQjC,SAAgB,EAAoB,EAAyB,CAC3D,GAAI,EAAE,aAAiB,OACrB,MAAO,GAUT,GANE,EAAM,OAAS,kCACf,EAAM,OAAS,iCAKb,SAAU,GAAS,EAAM,OAAS,iBACpC,MAAO,GAGT,IAAM,EAAM,EAAM,QAAQ,aAAa,CACvC,OAAO,EAAI,SAAS,qBAAqB,EAAI,EAAI,SAAS,wBAAwB,CCjCpF,SAAgB,EAAqB,EAAU,EAAkD,CAC/F,GAAI,GAAU,KACZ,MAAU,UAAU,GAAG,EAAQ,gCAAgC,CAInE,SAAgB,EACd,EACA,EAC0C,CAC1C,GAAI,OAAO,GAAU,WAAY,GAAkB,MAAM,QAAQ,EAAM,CACrE,MAAU,UAAU,GAAG,EAAQ,0BAA0B,OAAO,IAAQ,CAI5E,SAAgB,EAAa,EAAgB,EAA0C,CACrF,GAAI,OAAO,GAAU,SACnB,MAAU,UAAU,GAAG,EAAQ,yBAAyB,OAAO,IAAQ,CAW3E,SAAgB,EAAe,EAAgB,EAA4C,CACzF,GAAI,OAAO,GAAU,WACnB,MAAU,UAAU,GAAG,EAAQ,2BAA2B,OAAO,IAAQ,CAI7E,SAAgB,EAAa,EAAgB,EAA0C,CACrF,GAAI,OAAO,GAAU,SACnB,MAAU,UAAU,GAAG,EAAQ,yBAAyB,OAAO,IAAQ,CAK3E,SAAgB,EAGd,EAAQ,EAAQ,EAAuD,CACvE,EAAa,EAAI,GAAM,EAAQ,CAIjC,SAAgB,EAKd,EAAQ,EAAQ,EAAkD,CAClE,EAAe,EAAI,GAAM,EAAQ"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./relayer.cjs`),t=require(`./indexeddb-storage.cjs`),n=require(`./assertions.cjs`);var r=class extends e.r{operation;constructor(e,t,n,r){super(e,n,r),this.name=`SignerRequiredError`,this.operation=t}},i=class extends r{constructor(t,n){super(e.i.SignerNotConfigured,t,`Cannot ${t} without a signer. Configure one via ZamaSDKConfig.signer or <ZamaProvider config={createConfig({ signer: ... })}>.`,n),this.name=`SignerNotConfiguredError`}},a=class extends r{constructor(t,n){super(e.i.WalletNotConnected,t,`Cannot ${t} without a connected wallet account.`,n),this.name=`WalletNotConnectedError`}},o=class extends r{constructor(t,n){super(e.i.WalletAccountNotReady,t,`Cannot ${t} before the wallet account is ready.`,n),this.name=`WalletAccountNotReadyError`}},s=class{#e=new Map;async get(e){return this.#e.get(e)??null}async set(e,t){this.#e.set(e,t)}async delete(e){this.#e.delete(e)}};const c=new s;function l(){return typeof window<`u`?new t.t(`CredentialStore`):new s}function u(e=l(),t=e){return{storage:e,permitStorage:t}}function d(t,n){let r=new Map(t.map(e=>[e.id,e]));if(r.size!==t.length){let n=t.map(e=>e.id);throw new e.t(`Duplicate chain id(s) [${[...new Set(n.filter((e,t)=>n.indexOf(e)!==t))].join(`, `)}] in the chains array. Each chain id must appear only once. Note: hardhat and anvil are aliases (both use 31337).`)}let i=new Map(Object.entries(n)),a=new Map;for(let t of r.keys()){let n=r.get(t),o=i.get(String(t));if(!o)throw new e.t(`Chain ${t} has no relayer configured. Add a relayer entry: relayers: { [${t}]: web() }`);if(!n)throw new e.t(`Chain ${t} has a relayer configured but no entry in the chains array. Add the chain config to the chains array.`);a.set(t,{chain:n,relayer:o})}let o=new Set(Object.keys(n).map(Number)),s=new Set([...o].filter(e=>!r.has(e)));if(s.size>0)throw new e.t(`Relayer entries for chain(s) [${[...s].join(`, `)}] have no matching entry in the chains array. Remove them or add the corresponding chain config.`);return a}var f=class{#e;#t;#n;#r;constructor(t,n){if(t.length===0)throw new e.t(`At least one chain is required.`);this.#e=new Map(t.map(e=>[e.id,e])),this.#r=t[0].id;let r=d(t,n),i=new Map;for(let[e,t]of r){let n=t.relayer,r=i.get(n);r||(r=[],i.set(n,r)),r.push([e,t.chain])}let a=new Map,o=[];try{for(let[e,t]of i){let n=t.map(([,e])=>e),r=e.createWorker?.(n);r&&o.push(r);for(let[n,i]of t)a.set(n,e.createRelayer(i,r))}}catch(e){for(let e of o)try{e.terminate()}catch{}throw e}this.#t=a,this.#n=o}get chains(){return[...this.#e.values()]}get chain(){let e=this.#e.get(this.#r);return n.r(e,`RelayerDispatcher: chain`),e}switchChain(t){if(!this.#e.has(t))throw new e.t(`No relayer configured for chain ${t}. Add it to the chains array.`);this.#r=t}get#i(){let e=this.#t.get(this.#r);return n.r(e,`RelayerDispatcher: relayer`),e}generateKeypair(){return this.#i.generateKeypair()}createEIP712(e,t,n,r){return this.#i.createEIP712(e,t,n,r)}encrypt(e){return this.#i.encrypt(e)}userDecrypt(e){return this.#i.userDecrypt(e)}publicDecrypt(e){return this.#i.publicDecrypt(e)}createDelegatedUserDecryptEIP712(e,t,n,r,i){return this.#i.createDelegatedUserDecryptEIP712(e,t,n,r,i)}delegatedUserDecrypt(e){return this.#i.delegatedUserDecrypt(e)}requestZKProofVerification(e){return this.#i.requestZKProofVerification(e)}getPublicKey(){return this.#i.getPublicKey()}getPublicParams(e){return this.#i.getPublicParams(e)}getAclAddress(){return this.#i.getAclAddress()}terminate(){let e=[];for(let t of new Set(this.#t.values()))try{t.terminate()}catch(t){e.push(n.s(t))}for(let t of new Set(this.#n))try{t.terminate()}catch(t){e.push(n.s(t))}if(e.length>0)throw AggregateError(e,`Failed to terminate relayer resources`)}[Symbol.dispose](){this.terminate()}};function p(e,t,n){let{storage:r,permitStorage:i}=u(n.storage,n.permitStorage),a=new f(n.chains,n.relayers);return{chains:n.chains,relayer:a,provider:t,signer:e,storage:r,permitStorage:i,keypairTTL:n.keypairTTL,permitTTL:n.permitTTL,registryTTL:n.registryTTL,onEvent:n.onEvent}}function m(e,t){return e?.address===t?.address&&e?.chainId===t?.chainId}var h=class{#e=new Set;#t;#n;constructor(e){this.#t=e,this.#n=e!==void 0}getSnapshot(){return this.#t}isReady(){return this.#n}setSnapshot(e){this.#n=!0;let t=this.#t;m(t,e)||(this.#t=e,this.#r({previous:t,next:e}))}subscribe(e){this.#e.add(e);let t=this.#t;return t&&e({previous:void 0,next:t}),()=>{this.#e.delete(e)}}#r(e){for(let t of this.#e)t(e)}};function g(e){return new h(e)}var _=class{walletAccount;#e=!1;constructor(e){this.walletAccount=new h(e)}requireWalletAccount(e){let t=this.walletAccount.getSnapshot();if(!t)throw new a(e);return t}dispose(){this.#e||(this.#e=!0,this.onDispose())}[Symbol.dispose](){this.dispose()}onDispose(){}};Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return r}});
2
+ //# sourceMappingURL=base-signer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-signer.cjs","names":["ZamaError","ZamaErrorCode","#map","IndexedDBStorage","ConfigurationError","#chains","#relayers","#workers","ConfigurationError","#chainId","#active","toError","#listeners","#snapshot","#resolved","#emit","#disposed"],"sources":["../../src/errors/signer.ts","../../src/storage/memory-storage.ts","../../src/config/resolve.ts","../../src/relayer/relayer-dispatcher.ts","../../src/config/build.ts","../../src/signer/wallet-account-store.ts","../../src/signer/base-signer.ts"],"sourcesContent":["import { ZamaError, ZamaErrorCode } from \"./base\";\n\n/**\n * Base class for signer/account readiness failures.\n */\nexport class SignerRequiredError extends ZamaError {\n readonly operation: string;\n\n constructor(code: ZamaErrorCode, operation: string, message: string, options?: ErrorOptions) {\n super(code, message, options);\n this.name = \"SignerRequiredError\";\n this.operation = operation;\n }\n}\n\n/**\n * Thrown when an operation requires a signer but none is configured.\n *\n * The SDK can be constructed without a signer. Operations that need wallet\n * authority throw this before probing wallet state.\n *\n * @example\n * ```ts\n * try {\n * await token.confidentialTransfer(\"0xTo\", 100n);\n * } catch (e) {\n * if (e instanceof SignerNotConfiguredError) {\n * // Fix SDK/provider configuration.\n * }\n * }\n * ```\n */\nexport class SignerNotConfiguredError extends SignerRequiredError {\n constructor(operation: string, options?: ErrorOptions) {\n super(\n ZamaErrorCode.SignerNotConfigured,\n operation,\n `Cannot ${operation} without a signer. Configure one via ZamaSDKConfig.signer or <ZamaProvider config={createConfig({ signer: ... })}>.`,\n options,\n );\n this.name = \"SignerNotConfiguredError\";\n }\n}\n\n/** Thrown when a signer exists but no wallet account is currently connected. */\nexport class WalletNotConnectedError extends SignerRequiredError {\n constructor(operation: string, options?: ErrorOptions) {\n super(\n ZamaErrorCode.WalletNotConnected,\n operation,\n `Cannot ${operation} without a connected wallet account.`,\n options,\n );\n this.name = \"WalletNotConnectedError\";\n }\n}\n\n/** Thrown when an async adapter has not resolved its initial wallet account yet. */\nexport class WalletAccountNotReadyError extends SignerRequiredError {\n constructor(operation: string, options?: ErrorOptions) {\n super(\n ZamaErrorCode.WalletAccountNotReady,\n operation,\n `Cannot ${operation} before the wallet account is ready.`,\n options,\n );\n this.name = \"WalletAccountNotReadyError\";\n }\n}\n","import type { GenericStorage } from \"../types\";\n\n/** In-memory credential store. Credentials are lost on page reload. */\nexport class MemoryStorage implements GenericStorage {\n #map = new Map<string, unknown>();\n\n async get<T = unknown>(key: string): Promise<T | null> {\n return (this.#map.get(key) as T) ?? null;\n }\n\n async set<T = unknown>(key: string, value: T): Promise<void> {\n this.#map.set(key, value);\n }\n\n async delete(key: string): Promise<void> {\n this.#map.delete(key);\n }\n}\n\n/** Default singleton for application-wide use. */\nexport const memoryStorage = new MemoryStorage();\n","import type { FheChain } from \"../chains\";\nimport { ConfigurationError } from \"../errors\";\nimport { IndexedDBStorage } from \"../storage/indexeddb-storage\";\nimport { MemoryStorage } from \"../storage/memory-storage\";\nimport type { GenericStorage } from \"../types\";\nimport type { RelayerConfig } from \"./types\";\n\n// ── Storage defaults ─────────────────────────────────────────────────────────\n\nfunction getDefaultStorage(): GenericStorage {\n return typeof window !== \"undefined\"\n ? new IndexedDBStorage(\"CredentialStore\")\n : new MemoryStorage();\n}\n\nexport function resolveStorage(\n storage: GenericStorage | undefined = getDefaultStorage(),\n permitStorage: GenericStorage | undefined = storage,\n): { storage: GenericStorage; permitStorage: GenericStorage } {\n return { storage, permitStorage };\n}\n\n// ── Chain relayer resolution ────────────────────────────────────────────────\n\nexport interface ResolvedChainRelayer {\n chain: FheChain;\n relayer: RelayerConfig;\n}\n\nexport function resolveChainRelayers(\n chains: readonly FheChain[],\n relayers: Readonly<Record<number, RelayerConfig>>,\n): Map<number, ResolvedChainRelayer> {\n const chainMap = new Map(chains.map((c) => [c.id, c]));\n if (chainMap.size !== chains.length) {\n const ids = chains.map((c) => c.id);\n const dupes = [...new Set(ids.filter((id, i) => ids.indexOf(id) !== i))];\n throw new ConfigurationError(\n `Duplicate chain id(s) [${dupes.join(\", \")}] in the chains array. ` +\n `Each chain id must appear only once. Note: hardhat and anvil are aliases (both use 31337).`,\n );\n }\n const relayerMap = new Map(Object.entries(relayers));\n const result = new Map<number, ResolvedChainRelayer>();\n\n for (const id of chainMap.keys()) {\n const chainConfig = chainMap.get(id);\n const relayerConfig = relayerMap.get(String(id));\n\n if (!relayerConfig) {\n throw new ConfigurationError(\n `Chain ${id} has no relayer configured. ` +\n `Add a relayer entry: relayers: { [${id}]: web() }`,\n );\n }\n\n if (!chainConfig) {\n throw new ConfigurationError(\n `Chain ${id} has a relayer configured but no entry in the chains array. ` +\n `Add the chain config to the chains array.`,\n );\n }\n\n result.set(id, {\n chain: chainConfig,\n relayer: relayerConfig,\n });\n }\n\n const relayerIdSet = new Set(Object.keys(relayers).map(Number));\n const orphaned = new Set([...relayerIdSet].filter((id) => !chainMap.has(id)));\n if (orphaned.size > 0) {\n throw new ConfigurationError(\n `Relayer entries for chain(s) [${[...orphaned].join(\", \")}] have no matching entry ` +\n `in the chains array. Remove them or add the corresponding chain config.`,\n );\n }\n\n return result;\n}\n","import type {\n InputProofBytesType,\n KeypairType,\n KmsDelegatedUserDecryptEIP712Type,\n ZKProofLike,\n} from \"@zama-fhe/relayer-sdk/bundle\";\nimport type { Address, Hex } from \"viem\";\nimport type { FheChain } from \"../chains/types\";\nimport type { RelayerConfig } from \"../config/types\";\nimport { resolveChainRelayers } from \"../config/resolve\";\nimport { ConfigurationError } from \"../errors\";\nimport { assertNonNullable, toError } from \"../utils\";\nimport type { RelayerSDK } from \"./relayer-sdk\";\nimport type {\n ClearValueType,\n DelegatedUserDecryptParams,\n EIP712TypedData,\n EncryptParams,\n EncryptResult,\n Handle,\n PublicDecryptResult,\n PublicKeyData,\n PublicParamsData,\n UserDecryptParams,\n} from \"./relayer-sdk.types\";\n\n/** Anything with a synchronous `terminate()` method (workers, pools). */\nexport interface WorkerLike {\n terminate(): void;\n}\n\n/**\n * Owns chain management (chains / activeChain / switchChain) and delegates\n * every {@link RelayerSDK} operation to the relayer for the currently active\n * chain.\n *\n * Groups chains by relayer config reference identity, calls `createWorker`\n * once per group with all chain configs, then calls `createRelayer`\n * per chain with the shared worker.\n *\n * Workers/pools are held separately from relayers so the dispatcher can\n * terminate them directly — relayers never own worker lifecycle.\n */\nexport class RelayerDispatcher implements RelayerSDK, Disposable {\n readonly #chains: Map<number, FheChain>;\n readonly #relayers: Map<number, RelayerSDK>;\n readonly #workers: readonly WorkerLike[];\n #chainId: number;\n\n constructor(\n chains: readonly [FheChain, ...FheChain[]],\n configs: Readonly<Record<number, RelayerConfig>>,\n ) {\n if (chains.length === 0) {\n throw new ConfigurationError(\"At least one chain is required.\");\n }\n this.#chains = new Map(chains.map((c) => [c.id, c]));\n this.#chainId = chains[0].id;\n\n const chainRelayers = resolveChainRelayers(chains, configs);\n\n // Group chains by relayer config reference — same object = same group = shared worker.\n const groups = new Map<RelayerConfig, Array<[number, FheChain]>>();\n for (const [chainId, config] of chainRelayers) {\n const key = config.relayer;\n let group = groups.get(key);\n if (!group) {\n group = [];\n groups.set(key, group);\n }\n group.push([chainId, config.chain]);\n }\n\n // For each group: create shared worker once, then create per-chain relayers.\n const relayers = new Map<number, RelayerSDK>();\n const workers: WorkerLike[] = [];\n try {\n for (const [relayerCfg, groupChains] of groups) {\n const allChainConfigs = groupChains.map(([, chain]) => chain);\n const worker = relayerCfg.createWorker?.(allChainConfigs);\n if (worker) {\n workers.push(worker);\n }\n for (const [chainId, chain] of groupChains) {\n relayers.set(chainId, relayerCfg.createRelayer(chain, worker));\n }\n }\n } catch (error) {\n for (const w of workers) {\n try {\n w.terminate();\n } catch {\n /* best-effort cleanup */\n }\n }\n throw error;\n }\n\n this.#relayers = relayers;\n this.#workers = workers;\n }\n\n get chains(): readonly FheChain[] {\n return [...this.#chains.values()];\n }\n\n get chain(): FheChain {\n const chain = this.#chains.get(this.#chainId);\n assertNonNullable(chain, \"RelayerDispatcher: chain\");\n return chain;\n }\n\n switchChain(chainId: number): void {\n if (!this.#chains.has(chainId)) {\n throw new ConfigurationError(\n `No relayer configured for chain ${chainId}. Add it to the chains array.`,\n );\n }\n this.#chainId = chainId;\n }\n\n get #active(): RelayerSDK {\n const relayer = this.#relayers.get(this.#chainId);\n assertNonNullable(relayer, \"RelayerDispatcher: relayer\");\n return relayer;\n }\n\n generateKeypair(): Promise<KeypairType<Hex>> {\n return this.#active.generateKeypair();\n }\n\n createEIP712(\n publicKey: Hex,\n contractAddresses: Address[],\n startTimestamp: number,\n durationDays?: number,\n ): Promise<EIP712TypedData> {\n return this.#active.createEIP712(publicKey, contractAddresses, startTimestamp, durationDays);\n }\n\n encrypt(params: EncryptParams): Promise<EncryptResult> {\n return this.#active.encrypt(params);\n }\n\n userDecrypt(params: UserDecryptParams): Promise<Readonly<Record<Handle, ClearValueType>>> {\n return this.#active.userDecrypt(params);\n }\n\n publicDecrypt(handles: Handle[]): Promise<PublicDecryptResult> {\n return this.#active.publicDecrypt(handles);\n }\n\n createDelegatedUserDecryptEIP712(\n publicKey: Hex,\n contractAddresses: Address[],\n delegatorAddress: Address,\n startTimestamp: number,\n durationDays?: number,\n ): Promise<KmsDelegatedUserDecryptEIP712Type> {\n return this.#active.createDelegatedUserDecryptEIP712(\n publicKey,\n contractAddresses,\n delegatorAddress,\n startTimestamp,\n durationDays,\n );\n }\n\n delegatedUserDecrypt(\n params: DelegatedUserDecryptParams,\n ): Promise<Readonly<Record<Handle, ClearValueType>>> {\n return this.#active.delegatedUserDecrypt(params);\n }\n\n requestZKProofVerification(zkProof: ZKProofLike): Promise<InputProofBytesType> {\n return this.#active.requestZKProofVerification(zkProof);\n }\n\n getPublicKey(): Promise<PublicKeyData | null> {\n return this.#active.getPublicKey();\n }\n\n getPublicParams(bits: number): Promise<PublicParamsData | null> {\n return this.#active.getPublicParams(bits);\n }\n\n getAclAddress(): Promise<Address> {\n return this.#active.getAclAddress();\n }\n\n terminate(): void {\n const errors: Error[] = [];\n\n // Clean up relayer-owned caches (no worker termination).\n for (const r of new Set(this.#relayers.values())) {\n try {\n r.terminate();\n } catch (e) {\n errors.push(toError(e));\n }\n }\n\n // Terminate the actual workers/pools (deduplicated).\n for (const w of new Set(this.#workers)) {\n try {\n w.terminate();\n } catch (e) {\n errors.push(toError(e));\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, \"Failed to terminate relayer resources\");\n }\n }\n\n [Symbol.dispose](): void {\n this.terminate();\n }\n}\n","import { RelayerDispatcher } from \"../relayer/relayer-dispatcher\";\nimport type { GenericProvider, GenericSigner } from \"../types\";\nimport { resolveStorage } from \"./resolve\";\nimport type { ZamaConfig, ZamaConfigBase } from \"./types\";\n\n/**\n * @internal Shared config builder — not part of the public API.\n */\nexport function buildZamaConfig(\n signer: GenericSigner | undefined,\n provider: GenericProvider,\n params: ZamaConfigBase,\n): ZamaConfig {\n const { storage, permitStorage } = resolveStorage(params.storage, params.permitStorage);\n\n const relayer = new RelayerDispatcher(params.chains, params.relayers);\n\n return {\n chains: params.chains,\n relayer,\n provider,\n signer,\n storage,\n permitStorage,\n keypairTTL: params.keypairTTL,\n permitTTL: params.permitTTL,\n registryTTL: params.registryTTL,\n onEvent: params.onEvent,\n };\n}\n","import type {\n WalletAccount,\n WalletAccountChange,\n WalletAccountListener,\n WalletAccountStore,\n} from \"../types\";\n\nexport function walletAccountsEqual(\n a: WalletAccount | undefined,\n b: WalletAccount | undefined,\n): boolean {\n return a?.address === b?.address && a?.chainId === b?.chainId;\n}\n\n/**\n * Writable {@link WalletAccountStore} for custom signer adapters. Adapters call\n * {@link MutableWalletAccountStore.setSnapshot} when their underlying wallet\n * provider notifies of a connect, disconnect, account change, or chain change.\n *\n * Most custom adapters should use the {@link createWalletAccountStore} factory\n * rather than instantiating this class directly.\n */\nexport class MutableWalletAccountStore implements WalletAccountStore {\n readonly #listeners = new Set<WalletAccountListener>();\n #snapshot: WalletAccount | undefined;\n #resolved: boolean;\n\n constructor(initial?: WalletAccount) {\n this.#snapshot = initial;\n this.#resolved = initial !== undefined;\n }\n\n getSnapshot(): WalletAccount | undefined {\n return this.#snapshot;\n }\n\n /**\n * Whether the store has received at least one snapshot (via the constructor\n * or {@link setSnapshot}). Adapters whose initial account is only available\n * asynchronously start unresolved; callers can distinguish \"still loading\"\n * from \"wallet not connected\".\n */\n isReady(): boolean {\n return this.#resolved;\n }\n\n /**\n * Push a new wallet account snapshot. No-op when the next value is\n * value-equal to the current one. Emits `{ previous, next }` to every\n * subscriber otherwise.\n */\n setSnapshot(next: WalletAccount | undefined): void {\n this.#resolved = true;\n const previous = this.#snapshot;\n if (walletAccountsEqual(previous, next)) {\n return;\n }\n this.#snapshot = next;\n this.#emit({ previous, next });\n }\n\n subscribe(listener: WalletAccountListener): () => void {\n this.#listeners.add(listener);\n const snapshot = this.#snapshot;\n if (snapshot) {\n listener({ previous: undefined, next: snapshot });\n }\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n #emit(change: WalletAccountChange): void {\n for (const listener of this.#listeners) {\n listener(change);\n }\n }\n}\n\n/**\n * Create a {@link MutableWalletAccountStore} for a custom {@link GenericSigner}\n * adapter.\n *\n * @param initial - Optional initial wallet account snapshot.\n */\nexport function createWalletAccountStore(initial?: WalletAccount): MutableWalletAccountStore {\n return new MutableWalletAccountStore(initial);\n}\n","import type { Hex } from \"viem\";\nimport { WalletNotConnectedError } from \"../errors\";\nimport type { EIP712TypedData } from \"../relayer/relayer-sdk.types\";\nimport type {\n ContractAbi,\n GenericSigner,\n WalletAccount,\n WriteContractArgs,\n WriteContractConfig,\n WriteFunctionName,\n} from \"../types\";\nimport { MutableWalletAccountStore } from \"./wallet-account-store\";\n\n/**\n * Abstract base class that implements the shared {@link GenericSigner}\n * boilerplate: wallet-account store, `requireWalletAccount`, idempotent\n * `dispose` / `Disposable`. Subclasses provide `signTypedData`,\n * `writeContract`, and optionally override `onDispose` for cleanup.\n *\n * Using this class is optional — implementing {@link GenericSigner} directly\n * with {@link createWalletAccountStore} remains fully supported.\n */\nexport abstract class BaseSigner implements GenericSigner, Disposable {\n readonly walletAccount: MutableWalletAccountStore;\n #disposed = false;\n\n constructor(initial?: WalletAccount) {\n this.walletAccount = new MutableWalletAccountStore(initial);\n }\n\n requireWalletAccount(operation: string): WalletAccount {\n const account = this.walletAccount.getSnapshot();\n if (!account) {\n throw new WalletNotConnectedError(operation);\n }\n return account;\n }\n\n abstract signTypedData(typedData: EIP712TypedData): Promise<Hex>;\n\n abstract writeContract<\n const TAbi extends ContractAbi,\n TFunctionName extends WriteFunctionName<TAbi>,\n const TArgs extends WriteContractArgs<TAbi, TFunctionName>,\n >(config: WriteContractConfig<TAbi, TFunctionName, TArgs>): Promise<Hex>;\n\n dispose(): void {\n if (this.#disposed) {\n return;\n }\n this.#disposed = true;\n this.onDispose();\n }\n\n [Symbol.dispose](): void {\n this.dispose();\n }\n\n protected onDispose(): void {}\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- let e=require(`viem`);function t(t){if(t)try{return(0,e.getAddress)(t)}catch{return}}function n(e){let t=Number(e);return Number.isSafeInteger(t)&&t>0?t:void 0}function r({provider:e,getInitialIdentity:r,onIdentityChange:i}){if(!e)return()=>{};let a,o,s,c=!0,l=0;function u(){l+=1}function d(){if(!c)return;let e=o&&s!==void 0?{address:o,chainId:s}:void 0;if(a?.address===e?.address&&a?.chainId===e?.chainId)return;let t=a;a=e,i({previous:t,next:e})}let f=e=>{if(u(),e.length===0||!e[0]){o=void 0,s=void 0,d();return}let n=t(e[0]);n&&(o=n,d())},p=()=>{u(),o=void 0,s=void 0,d()},m=e=>{u();let t=n(e);t&&(s=t,d())};if(e.on(`accountsChanged`,f),e.on(`disconnect`,p),e.on(`chainChanged`,m),r){let e=l;Promise.resolve().then(r).then(t=>{!c||l!==e||(a=t,o=t?.address,s=t?.chainId)}).catch(e=>{console.warn(`[zama-sdk] initial identity load failed:`,e)})}return()=>{c=!1,e.removeListener(`accountsChanged`,f),e.removeListener(`disconnect`,p),e.removeListener(`chainChanged`,m)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
1
+ let e=require(`viem`);function t(t){if(t)try{return(0,e.getAddress)(t)}catch{return}}function n(e){let t=Number(e);return Number.isSafeInteger(t)&&t>0?t:void 0}function r({provider:e,getInitialWalletAccount:r,onWalletAccountChange:i}){if(!e)return()=>{};let a,o,s,c=!0,l=0;function u(){l+=1}function d(){if(!c)return;let e=o&&s!==void 0?{address:o,chainId:s}:void 0;if(a?.address===e?.address&&a?.chainId===e?.chainId)return;let t=a;a=e,i({previous:t,next:e})}let f=e=>{if(u(),e.length===0||!e[0]){o=void 0,s=void 0,d();return}let n=t(e[0]);n&&(o=n,d())},p=()=>{u(),o=void 0,s=void 0,d()},m=e=>{u();let t=n(e);t&&(s=t,d())};if(e.on(`accountsChanged`,f),e.on(`disconnect`,p),e.on(`chainChanged`,m),r){let e=l;Promise.resolve().then(r).then(t=>{!c||l!==e||(a=t,o=t?.address,s=t?.chainId,i({previous:void 0,next:t}))}).catch(e=>{console.warn(`[zama-sdk] initial identity load failed:`,e)})}return()=>{c=!1,e.removeListener(`accountsChanged`,f),e.removeListener(`disconnect`,p),e.removeListener(`chainChanged`,m)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
2
2
  //# sourceMappingURL=eip1193-subscribe.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"eip1193-subscribe.cjs","names":[],"sources":["../../src/signer/eip1193-subscribe.ts"],"sourcesContent":["import {\n getAddress as checksumAddress,\n type Address,\n type EIP1193EventMap,\n type EIP1193Provider,\n} from \"viem\";\nimport type { SignerIdentity, SignerIdentityListener } from \"../types\";\n\ntype MinimalProvider = Pick<EIP1193Provider, \"on\" | \"removeListener\">;\n\nexport interface Eip1193SubscribeConfig {\n provider: MinimalProvider | undefined;\n getInitialIdentity?: () => SignerIdentity | undefined | Promise<SignerIdentity | undefined>;\n onIdentityChange: SignerIdentityListener;\n}\n\nfunction normalizeAddress(address: Address | undefined): Address | undefined {\n if (!address) {\n return undefined;\n }\n try {\n return checksumAddress(address);\n } catch {\n return undefined;\n }\n}\n\nfunction parseChainId(chainId: string): number | undefined {\n const parsed = Number(chainId);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;\n}\n\n/**\n * Subscribe to EIP-1193 wallet events and translate them into\n * {@link SignerIdentityChange} transitions.\n *\n * Shared by `ViemSigner` and `EthersSigner`. Listeners are attached before the\n * adapter's initial identity loader runs; if any real provider event arrives\n * first, the stale loader result is ignored.\n */\nexport function eip1193Subscribe({\n provider,\n getInitialIdentity,\n onIdentityChange,\n}: Eip1193SubscribeConfig): () => void {\n if (!provider) {\n return () => {};\n }\n\n let current: SignerIdentity | undefined;\n let observedAddress: Address | undefined;\n let observedChainId: number | undefined;\n let active = true;\n let eventVersion = 0;\n\n function markEvent(): void {\n eventVersion += 1;\n }\n\n function reconcile(): void {\n if (!active) {\n return;\n }\n const next =\n observedAddress && observedChainId !== undefined\n ? { address: observedAddress, chainId: observedChainId }\n : undefined;\n if (current?.address === next?.address && current?.chainId === next?.chainId) {\n return;\n }\n const previous = current;\n current = next;\n onIdentityChange({ previous, next });\n }\n\n const handleAccountsChanged: EIP1193EventMap[\"accountsChanged\"] = (accounts) => {\n markEvent();\n if (accounts.length === 0 || !accounts[0]) {\n observedAddress = undefined;\n observedChainId = undefined;\n reconcile();\n return;\n }\n\n const nextAddress = normalizeAddress(accounts[0]);\n if (!nextAddress) {\n return;\n }\n\n observedAddress = nextAddress;\n reconcile();\n };\n\n const handleDisconnect: EIP1193EventMap[\"disconnect\"] = () => {\n markEvent();\n observedAddress = undefined;\n observedChainId = undefined;\n reconcile();\n };\n\n const handleChainChanged: EIP1193EventMap[\"chainChanged\"] = (chainId) => {\n markEvent();\n const nextChainId = parseChainId(chainId);\n if (!nextChainId) {\n return;\n }\n\n observedChainId = nextChainId;\n reconcile();\n };\n\n provider.on(\"accountsChanged\", handleAccountsChanged);\n provider.on(\"disconnect\", handleDisconnect);\n provider.on(\"chainChanged\", handleChainChanged);\n\n if (getInitialIdentity) {\n const initialEventVersion = eventVersion;\n Promise.resolve()\n .then(getInitialIdentity)\n .then((identity) => {\n if (!active || eventVersion !== initialEventVersion) {\n return;\n }\n current = identity;\n observedAddress = identity?.address;\n observedChainId = identity?.chainId;\n })\n .catch((error) => {\n // oxlint-disable-next-line no-console\n console.warn(\"[zama-sdk] initial identity load failed:\", error);\n });\n }\n\n return () => {\n active = false;\n provider.removeListener(\"accountsChanged\", handleAccountsChanged);\n provider.removeListener(\"disconnect\", handleDisconnect);\n provider.removeListener(\"chainChanged\", handleChainChanged);\n };\n}\n"],"mappings":"sBAgBA,SAAS,EAAiB,EAAmD,CACtE,KAGL,GAAI,CACF,OAAA,EAAA,EAAA,YAAuB,EAAQ,MACzB,CACN,QAIJ,SAAS,EAAa,EAAqC,CACzD,IAAM,EAAS,OAAO,EAAQ,CAC9B,OAAO,OAAO,cAAc,EAAO,EAAI,EAAS,EAAI,EAAS,IAAA,GAW/D,SAAgB,EAAiB,CAC/B,WACA,qBACA,oBACqC,CACrC,GAAI,CAAC,EACH,UAAa,GAGf,IAAI,EACA,EACA,EACA,EAAS,GACT,EAAe,EAEnB,SAAS,GAAkB,CACzB,GAAgB,EAGlB,SAAS,GAAkB,CACzB,GAAI,CAAC,EACH,OAEF,IAAM,EACJ,GAAmB,IAAoB,IAAA,GACnC,CAAE,QAAS,EAAiB,QAAS,EAAiB,CACtD,IAAA,GACN,GAAI,GAAS,UAAY,GAAM,SAAW,GAAS,UAAY,GAAM,QACnE,OAEF,IAAM,EAAW,EACjB,EAAU,EACV,EAAiB,CAAE,WAAU,OAAM,CAAC,CAGtC,IAAM,EAA6D,GAAa,CAE9E,GADA,GAAW,CACP,EAAS,SAAW,GAAK,CAAC,EAAS,GAAI,CACzC,EAAkB,IAAA,GAClB,EAAkB,IAAA,GAClB,GAAW,CACX,OAGF,IAAM,EAAc,EAAiB,EAAS,GAAG,CAC5C,IAIL,EAAkB,EAClB,GAAW,GAGP,MAAwD,CAC5D,GAAW,CACX,EAAkB,IAAA,GAClB,EAAkB,IAAA,GAClB,GAAW,EAGP,EAAuD,GAAY,CACvE,GAAW,CACX,IAAM,EAAc,EAAa,EAAQ,CACpC,IAIL,EAAkB,EAClB,GAAW,GAOb,GAJA,EAAS,GAAG,kBAAmB,EAAsB,CACrD,EAAS,GAAG,aAAc,EAAiB,CAC3C,EAAS,GAAG,eAAgB,EAAmB,CAE3C,EAAoB,CACtB,IAAM,EAAsB,EAC5B,QAAQ,SAAS,CACd,KAAK,EAAmB,CACxB,KAAM,GAAa,CACd,CAAC,GAAU,IAAiB,IAGhC,EAAU,EACV,EAAkB,GAAU,QAC5B,EAAkB,GAAU,UAC5B,CACD,MAAO,GAAU,CAEhB,QAAQ,KAAK,2CAA4C,EAAM,EAC/D,CAGN,UAAa,CACX,EAAS,GACT,EAAS,eAAe,kBAAmB,EAAsB,CACjE,EAAS,eAAe,aAAc,EAAiB,CACvD,EAAS,eAAe,eAAgB,EAAmB"}
1
+ {"version":3,"file":"eip1193-subscribe.cjs","names":[],"sources":["../../src/signer/eip1193-subscribe.ts"],"sourcesContent":["import {\n getAddress as checksumAddress,\n type Address,\n type EIP1193EventMap,\n type EIP1193Provider,\n} from \"viem\";\nimport type { WalletAccount, WalletAccountListener } from \"../types\";\n\ntype MinimalProvider = Pick<EIP1193Provider, \"on\" | \"removeListener\">;\n\nexport interface Eip1193SubscribeConfig {\n provider: MinimalProvider | undefined;\n getInitialWalletAccount?: () => WalletAccount | undefined | Promise<WalletAccount | undefined>;\n onWalletAccountChange: WalletAccountListener;\n}\n\nfunction normalizeAddress(address: Address | undefined): Address | undefined {\n if (!address) {\n return undefined;\n }\n try {\n return checksumAddress(address);\n } catch {\n return undefined;\n }\n}\n\nfunction parseChainId(chainId: string): number | undefined {\n const parsed = Number(chainId);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;\n}\n\n/**\n * Subscribe to EIP-1193 wallet events and translate them into\n * {@link WalletAccountChange} transitions.\n *\n * Shared by `ViemSigner` and `EthersSigner`. Listeners are attached before the\n * adapter's initial identity loader runs; if any real provider event arrives\n * first, the stale loader result is ignored.\n */\nexport function eip1193Subscribe({\n provider,\n getInitialWalletAccount,\n onWalletAccountChange,\n}: Eip1193SubscribeConfig): () => void {\n if (!provider) {\n return () => {};\n }\n\n let current: WalletAccount | undefined;\n let observedAddress: Address | undefined;\n let observedChainId: number | undefined;\n let active = true;\n let eventVersion = 0;\n\n function markEvent(): void {\n eventVersion += 1;\n }\n\n function reconcile(): void {\n if (!active) {\n return;\n }\n const next =\n observedAddress && observedChainId !== undefined\n ? { address: observedAddress, chainId: observedChainId }\n : undefined;\n if (current?.address === next?.address && current?.chainId === next?.chainId) {\n return;\n }\n const previous = current;\n current = next;\n onWalletAccountChange({ previous, next });\n }\n\n const handleAccountsChanged: EIP1193EventMap[\"accountsChanged\"] = (accounts) => {\n markEvent();\n if (accounts.length === 0 || !accounts[0]) {\n observedAddress = undefined;\n observedChainId = undefined;\n reconcile();\n return;\n }\n\n const nextAddress = normalizeAddress(accounts[0]);\n if (!nextAddress) {\n return;\n }\n\n observedAddress = nextAddress;\n reconcile();\n };\n\n const handleDisconnect: EIP1193EventMap[\"disconnect\"] = () => {\n markEvent();\n observedAddress = undefined;\n observedChainId = undefined;\n reconcile();\n };\n\n const handleChainChanged: EIP1193EventMap[\"chainChanged\"] = (chainId) => {\n markEvent();\n const nextChainId = parseChainId(chainId);\n if (!nextChainId) {\n return;\n }\n\n observedChainId = nextChainId;\n reconcile();\n };\n\n provider.on(\"accountsChanged\", handleAccountsChanged);\n provider.on(\"disconnect\", handleDisconnect);\n provider.on(\"chainChanged\", handleChainChanged);\n\n if (getInitialWalletAccount) {\n const initialEventVersion = eventVersion;\n Promise.resolve()\n .then(getInitialWalletAccount)\n .then((account) => {\n if (!active || eventVersion !== initialEventVersion) {\n return;\n }\n current = account;\n observedAddress = account?.address;\n observedChainId = account?.chainId;\n onWalletAccountChange({ previous: undefined, next: account });\n })\n .catch((error) => {\n // oxlint-disable-next-line no-console\n console.warn(\"[zama-sdk] initial identity load failed:\", error);\n });\n }\n\n return () => {\n active = false;\n provider.removeListener(\"accountsChanged\", handleAccountsChanged);\n provider.removeListener(\"disconnect\", handleDisconnect);\n provider.removeListener(\"chainChanged\", handleChainChanged);\n };\n}\n"],"mappings":"sBAgBA,SAAS,EAAiB,EAAmD,CACtE,KAGL,GAAI,CACF,OAAA,EAAA,EAAA,YAAuB,EAAQ,MACzB,CACN,QAIJ,SAAS,EAAa,EAAqC,CACzD,IAAM,EAAS,OAAO,EAAQ,CAC9B,OAAO,OAAO,cAAc,EAAO,EAAI,EAAS,EAAI,EAAS,IAAA,GAW/D,SAAgB,EAAiB,CAC/B,WACA,0BACA,yBACqC,CACrC,GAAI,CAAC,EACH,UAAa,GAGf,IAAI,EACA,EACA,EACA,EAAS,GACT,EAAe,EAEnB,SAAS,GAAkB,CACzB,GAAgB,EAGlB,SAAS,GAAkB,CACzB,GAAI,CAAC,EACH,OAEF,IAAM,EACJ,GAAmB,IAAoB,IAAA,GACnC,CAAE,QAAS,EAAiB,QAAS,EAAiB,CACtD,IAAA,GACN,GAAI,GAAS,UAAY,GAAM,SAAW,GAAS,UAAY,GAAM,QACnE,OAEF,IAAM,EAAW,EACjB,EAAU,EACV,EAAsB,CAAE,WAAU,OAAM,CAAC,CAG3C,IAAM,EAA6D,GAAa,CAE9E,GADA,GAAW,CACP,EAAS,SAAW,GAAK,CAAC,EAAS,GAAI,CACzC,EAAkB,IAAA,GAClB,EAAkB,IAAA,GAClB,GAAW,CACX,OAGF,IAAM,EAAc,EAAiB,EAAS,GAAG,CAC5C,IAIL,EAAkB,EAClB,GAAW,GAGP,MAAwD,CAC5D,GAAW,CACX,EAAkB,IAAA,GAClB,EAAkB,IAAA,GAClB,GAAW,EAGP,EAAuD,GAAY,CACvE,GAAW,CACX,IAAM,EAAc,EAAa,EAAQ,CACpC,IAIL,EAAkB,EAClB,GAAW,GAOb,GAJA,EAAS,GAAG,kBAAmB,EAAsB,CACrD,EAAS,GAAG,aAAc,EAAiB,CAC3C,EAAS,GAAG,eAAgB,EAAmB,CAE3C,EAAyB,CAC3B,IAAM,EAAsB,EAC5B,QAAQ,SAAS,CACd,KAAK,EAAwB,CAC7B,KAAM,GAAY,CACb,CAAC,GAAU,IAAiB,IAGhC,EAAU,EACV,EAAkB,GAAS,QAC3B,EAAkB,GAAS,QAC3B,EAAsB,CAAE,SAAU,IAAA,GAAW,KAAM,EAAS,CAAC,GAC7D,CACD,MAAO,GAAU,CAEhB,QAAQ,KAAK,2CAA4C,EAAM,EAC/D,CAGN,UAAa,CACX,EAAS,GACT,EAAS,eAAe,kBAAmB,EAAsB,CACjE,EAAS,eAAe,aAAc,EAAiB,CACvD,EAAS,eAAe,eAAgB,EAAmB"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../build.cjs`),t=require(`../wrappers-registry.cjs`),n=require(`../eip1193-subscribe.cjs`);let r=require(`viem`),i=require(`ethers`);var a=class{#e;constructor(e){`ethereum`in e?this.#e=new i.BrowserProvider(e.ethereum):this.#e=e.provider}async getChainId(){let e=await this.#e.getNetwork();return Number(e.chainId)}async readContract(e){return new i.ethers.Contract(e.address,e.abi,this.#e).getFunction(e.functionName)(...e.args)}async getBlockTimestamp(){let e=await this.#e.getBlock(`latest`);if(!e)throw Error(`Failed to fetch latest block`);if(e.timestamp===null)throw Error(`Latest block has no timestamp`);return BigInt(e.timestamp)}async waitForTransactionReceipt(e){let t=await this.#e.waitForTransaction(e);if(!t)throw Error(`Transaction receipt not found`);return{logs:t.logs.map(e=>({topics:e.topics.filter(e=>e!==null),data:e.data}))}}},o=class{#e;#t;constructor(e){`ethereum`in e?(this.#e=new i.BrowserProvider(e.ethereum).getSigner(),this.#t=e.ethereum):this.#e=Promise.resolve(e.signer)}async getChainId(){let e=(await this.#e).provider;if(!e)throw TypeError(`Signer has no provider cannot read chain ID`);let t=await e.getNetwork();return Number(t.chainId)}async getAddress(){return(0,r.getAddress)(await(await this.#e).getAddress())}async signTypedData(e){let t=await this.#e,{domain:n,types:i,message:a}=e,{EIP712Domain:o,...s}=i,c=Object.fromEntries(Object.entries(s).map(([e,t])=>[e,[...t]])),l=await t.signTypedData(n,c,a);if(!(0,r.isHex)(l))throw TypeError(`Expected hex string, got: ${l}`);return l}async writeContract(e){let t=await this.#e,n=new i.ethers.Contract(e.address,e.abi,t),a={};e.value!==void 0&&(a.value=e.value),e.gas!==void 0&&(a.gasLimit=e.gas);let o=await n[e.functionName](...e.args,a);if(!(0,r.isHex)(o.hash))throw TypeError(`Expected hex string, got: ${o.hash}`);return o.hash}subscribe(e){return n.t({provider:this.#t,getInitialIdentity:async()=>{let e=await this.#e,t=e.provider;if(!t)return;let[n,i]=await Promise.all([e.getAddress(),t.getNetwork()]),a=Number(i.chainId);return{address:(0,r.getAddress)(n),chainId:a}},onIdentityChange:e})}};function s(t){if(`signer`in t&&t.signer){let n=new o({signer:t.signer});if(!t.signer.provider)throw Error(`createConfig requires a Signer with an attached provider for chain reads`);return e.t(n,new a({provider:t.signer.provider}),t)}return e.t(new o({ethereum:t.ethereum}),`provider`in t&&t.provider?new a({provider:t.provider}):new a({ethereum:t.ethereum}),t)}function c(e){return{to:e.address,data:(0,r.encodeFunctionData)({abi:e.abi,functionName:e.functionName,args:e.args}),...e.gas===void 0?{}:{gasLimit:e.gas},...e.value===void 0?{}:{value:e.value}}}async function l(e,t){let n=await e.call(c(t));if(!(0,r.isHex)(n))throw TypeError(`Expected hex string, got: ${n}`);return(0,r.decodeFunctionResult)({abi:t.abi,functionName:t.functionName,data:n})}async function u(e,t){let n=await e.sendTransaction(c(t));if(!(0,r.isHex)(n.hash))throw TypeError(`Expected hex string, got: ${n.hash}`);return n.hash}function d(e,n,r){return l(e,t.v(n,r))}function f(e,n){return l(e,t.g(n))}function p(e,n,r){return l(e,t.p(n,r))}function m(e,n,r,i,a){return u(e,t.b(n,r,i,a))}function h(e,n,r,i,a,o){return u(e,t.E(n,r,i,a,o))}function g(e,n,r,i,a){return u(e,t.D(n,r,i,a))}function _(e,n,r,i,a){return u(e,t.m(n,r,i,a))}function v(e,n,r,i){return u(e,t.w(n,r,i))}function y(e,n,r,i){return u(e,t._(n,r,i))}function b(e,n){return l(e,t.i(n))}function x(e,n){return l(e,t.a(n))}function S(e,n,r,i){return l(e,t.o(n,r,i))}function C(e,n,r){return l(e,t.r(n,r))}function w(e,n,r){return l(e,t.t(n,r))}function T(e,n,r){return l(e,t.n(n,r))}function E(e,n,r){return l(e,t.s(n,r))}exports.EthersProvider=a,exports.EthersSigner=o,Object.defineProperty(exports,`ProviderRpcError`,{enumerable:!0,get:function(){return r.ProviderRpcError}}),exports.createConfig=s,exports.readConfidentialBalanceOfContract=d,exports.readConfidentialTokenAddressContract=w,exports.readIsConfidentialTokenValidContract=E,exports.readSupportsInterfaceContract=p,exports.readTokenAddressContract=T,exports.readTokenPairContract=C,exports.readTokenPairsContract=b,exports.readTokenPairsLengthContract=x,exports.readTokenPairsSliceContract=S,exports.readUnderlyingTokenContract=f,exports.writeConfidentialTransferContract=m,exports.writeFinalizeUnwrapContract=_,exports.writeSetOperatorContract=v,exports.writeUnwrapContract=h,exports.writeUnwrapFromBalanceContract=g,exports.writeWrapContract=y;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../base-signer.cjs`),t=require(`../swallow.cjs`),n=require(`../wrappers-registry.cjs`),r=require(`../eip1193-subscribe.cjs`);let i=require(`viem`),a=require(`ethers`);var o=class{#e;constructor(e){`ethereum`in e?this.#e=new a.BrowserProvider(e.ethereum):this.#e=e.provider}async getChainId(){let e=await this.#e.getNetwork();return Number(e.chainId)}async readContract(e){return new a.ethers.Contract(e.address,e.abi,this.#e).getFunction(e.functionName)(...e.args)}async getBlockTimestamp(){let e=await this.#e.getBlock(`latest`);if(!e)throw Error(`Failed to fetch latest block`);if(e.timestamp===null)throw Error(`Latest block has no timestamp`);return BigInt(e.timestamp)}async waitForTransactionReceipt(e){let t=await this.#e.waitForTransaction(e);if(!t)throw Error(`Transaction receipt not found`);return{logs:t.logs.map(e=>({topics:e.topics.filter(e=>e!==null),data:e.data}))}}},s=class extends e.t{#e;#t;#n;#r;#i;constructor(e){super(),`ethereum`in e?(this.#e=new a.BrowserProvider(e.ethereum),this.#n=e.ethereum,this.#r=r.t({provider:e.ethereum,getInitialWalletAccount:()=>this.#l(),onWalletAccountChange:({next:e})=>{this.walletAccount.setSnapshot(e)}})):(this.#t=e.signer,this.#r=()=>{},t.t(`refresh wallet account`,async()=>{await this.refreshWalletAccount()}))}requireWalletAccount(t){let n=this.walletAccount.getSnapshot();if(!n&&!this.walletAccount.isReady())throw new e.d(t);if(!n)throw new e.f(t);return n}refreshWalletAccount(){return this.#n?this.#c():this.#t?this.#s(this.#t):Promise.resolve(void 0)}onDispose(){this.#r()}async#a(){if(this.#t)return this.#t;if(!this.#e)throw new e.l(`resolveSigner`);return this.#e.getSigner()}async#o(e){let t=e.provider;if(!t)return;let[n,r]=await Promise.all([e.getAddress(),t.getNetwork()]);return{address:(0,i.getAddress)(n),chainId:Number(r.chainId)}}async signTypedData(e){let t=await this.#a(),{domain:n,types:r,message:a}=e,{EIP712Domain:o,...s}=r,c=Object.fromEntries(Object.entries(s).map(([e,t])=>[e,[...t]])),l=await t.signTypedData(n,c,a);if(!(0,i.isHex)(l))throw TypeError(`Expected hex string, got: ${l}`);return l}async writeContract(e){let t=await this.#a(),n=new a.Contract(e.address,e.abi,t),r={};e.value!==void 0&&(r.value=e.value),e.gas!==void 0&&(r.gasLimit=e.gas);let o=await n.getFunction(e.functionName)(...e.args,r);if(!(0,i.isHex)(o.hash))throw TypeError(`Expected hex string, got: ${o.hash}`);return o.hash}async#s(e){return this.#i??=this.#o(e).then(e=>(this.walletAccount.setSnapshot(e),e)).finally(()=>{this.#i=void 0}),this.#i}async#c(){let e=await this.#l();return this.walletAccount.setSnapshot(e),e}async#l(){let e=this.#n;if(!e)return;let[t,n]=await Promise.all([e.request({method:`eth_accounts`}),e.request({method:`eth_chainId`})]);if(!Array.isArray(t)||typeof t[0]!=`string`)return;let r=Number(n);if(!(!Number.isSafeInteger(r)||r<=0))return{address:(0,i.getAddress)(t[0]),chainId:r}}};function c(t){if(`signer`in t&&t.signer){let n=new s({signer:t.signer});if(!t.signer.provider)throw Error(`createConfig requires a Signer with an attached provider for chain reads`);return e.i(n,new o({provider:t.signer.provider}),t)}return e.i(new s({ethereum:t.ethereum}),`provider`in t&&t.provider?new o({provider:t.provider}):new o({ethereum:t.ethereum}),t)}function l(e){return{to:e.address,data:(0,i.encodeFunctionData)({abi:e.abi,functionName:e.functionName,args:e.args}),...e.gas===void 0?{}:{gasLimit:e.gas},...e.value===void 0?{}:{value:e.value}}}async function u(e,t){let n=await e.call(l(t));if(!(0,i.isHex)(n))throw TypeError(`Expected hex string, got: ${n}`);return(0,i.decodeFunctionResult)({abi:t.abi,functionName:t.functionName,data:n})}async function d(e,t){let n=await e.sendTransaction(l(t));if(!(0,i.isHex)(n.hash))throw TypeError(`Expected hex string, got: ${n.hash}`);return n.hash}function f(e,t,r){return u(e,n.v(t,r))}function p(e,t){return u(e,n.g(t))}function m(e,t,r){return u(e,n.p(t,r))}function h(e,t,r,i,a){return d(e,n.b(t,r,i,a))}function g(e,t,r,i,a,o){return d(e,n.E(t,r,i,a,o))}function _(e,t,r,i,a){return d(e,n.D(t,r,i,a))}function v(e,t,r,i,a){return d(e,n.m(t,r,i,a))}function y(e,t,r,i){return d(e,n.w(t,r,i))}function b(e,t,r,i){return d(e,n._(t,r,i))}function x(e,t){return u(e,n.i(t))}function S(e,t){return u(e,n.a(t))}function C(e,t,r,i){return u(e,n.o(t,r,i))}function w(e,t,r){return u(e,n.r(t,r))}function T(e,t,r){return u(e,n.t(t,r))}function E(e,t,r){return u(e,n.n(t,r))}function D(e,t,r){return u(e,n.s(t,r))}exports.EthersProvider=o,exports.EthersSigner=s,Object.defineProperty(exports,`ProviderRpcError`,{enumerable:!0,get:function(){return i.ProviderRpcError}}),exports.createConfig=c,exports.readConfidentialBalanceOfContract=f,exports.readConfidentialTokenAddressContract=T,exports.readIsConfidentialTokenValidContract=D,exports.readSupportsInterfaceContract=m,exports.readTokenAddressContract=E,exports.readTokenPairContract=w,exports.readTokenPairsContract=x,exports.readTokenPairsLengthContract=S,exports.readTokenPairsSliceContract=C,exports.readUnderlyingTokenContract=p,exports.writeConfidentialTransferContract=h,exports.writeFinalizeUnwrapContract=v,exports.writeSetOperatorContract=y,exports.writeUnwrapContract=g,exports.writeUnwrapFromBalanceContract=_,exports.writeWrapContract=b;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["#readProvider","BrowserProvider","#signerPromise","#eip1193","BrowserProvider","eip1193Subscribe","buildZamaConfig","confidentialBalanceOfContract","underlyingContract","supportsInterfaceContract","confidentialTransferContract","unwrapContract","unwrapFromBalanceContract","finalizeUnwrapContract","setOperatorContract","wrapContract","getTokenPairsContract","getTokenPairsLengthContract","getTokenPairsSliceContract","getTokenPairContract","getConfidentialTokenAddressContract","getTokenAddressContract","isConfidentialTokenValidContract"],"sources":["../../../src/ethers/ethers-provider.ts","../../../src/ethers/ethers-signer.ts","../../../src/ethers/config.ts","../../../src/ethers/contracts.ts"],"sourcesContent":["import { ethers, BrowserProvider } from \"ethers\";\nimport type {\n Abi,\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionReturnType,\n EIP1193Provider,\n Hex,\n} from \"viem\";\nimport type { GenericProvider, ReadContractConfig, TransactionReceipt } from \"../types\";\n\n/**\n * Configuration for {@link EthersProvider}.\n *\n * Two variants:\n *\n * - **EIP-1193** — `{ ethereum }`: pass the raw EIP-1193 provider (e.g. `window.ethereum`).\n * A `BrowserProvider` is created internally.\n *\n * - **Pre-built** — `{ provider }`: pass any ethers `Provider`\n * (e.g. `JsonRpcProvider`, `WebSocketProvider`).\n */\nexport type EthersProviderConfig = { ethereum: EIP1193Provider } | { provider: ethers.Provider };\n\n/**\n * Read-only {@link GenericProvider} backed by ethers v6.\n *\n * Use this for integrations that only need public chain reads before the user has connected their\n * wallet.\n *\n * @example\n * ```ts\n * // Dedicated RPC\n * const provider = new EthersProvider({\n * provider: new ethers.JsonRpcProvider(ALCHEMY_URL),\n * });\n *\n * // Wallet-sourced RPC (shares transport with EthersSigner)\n * const provider = new EthersProvider({ ethereum: window.ethereum });\n * ```\n */\nexport class EthersProvider implements GenericProvider {\n readonly #readProvider: ethers.Provider;\n\n constructor(config: EthersProviderConfig) {\n if (\"ethereum\" in config) {\n this.#readProvider = new BrowserProvider(config.ethereum);\n } else {\n this.#readProvider = config.provider;\n }\n }\n\n async getChainId(): Promise<number> {\n const network = await this.#readProvider.getNetwork();\n return Number(network.chainId);\n }\n\n async readContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n const TArgs extends ContractFunctionArgs<TAbi, \"pure\" | \"view\", TFunctionName>,\n >(\n config: ReadContractConfig<TAbi, TFunctionName, TArgs>,\n ): Promise<ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName, TArgs>> {\n const contract = new ethers.Contract(\n config.address,\n config.abi as ethers.InterfaceAbi,\n this.#readProvider,\n );\n const fn = contract.getFunction(config.functionName);\n return fn(...(config.args as readonly unknown[])) as Promise<\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName, TArgs>\n >;\n }\n\n async getBlockTimestamp(): Promise<bigint> {\n const block = await this.#readProvider.getBlock(\"latest\");\n if (!block) {\n throw new Error(\"Failed to fetch latest block\");\n }\n if (block.timestamp === null) {\n throw new Error(\"Latest block has no timestamp\");\n }\n return BigInt(block.timestamp);\n }\n\n async waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt> {\n const receipt = await this.#readProvider.waitForTransaction(hash);\n if (!receipt) {\n throw new Error(\"Transaction receipt not found\");\n }\n return {\n logs: receipt.logs.map((log) => ({\n topics: log.topics.filter((t): t is Hex => t !== null),\n data: log.data as Hex,\n })),\n };\n }\n}\n","import { ethers, BrowserProvider, type Signer } from \"ethers\";\nimport {\n getAddress,\n isHex,\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type EIP1193Provider,\n type Hex,\n} from \"viem\";\nimport type { EIP712TypedData } from \"../relayer/relayer-sdk.types\";\nimport type { GenericSigner, SignerIdentityListener, WriteContractConfig } from \"../types\";\nimport { eip1193Subscribe } from \"../signer/eip1193-subscribe\";\n\n/**\n * Configuration for {@link EthersSigner}.\n *\n * Two variants:\n *\n * - **Browser** — `{ ethereum }`: pass the raw EIP-1193 provider (e.g. `window.ethereum`).\n * A `BrowserProvider` is created internally and `subscribe()` works automatically.\n *\n * - **Node / direct signer** — `{ signer }`: pass an ethers `Signer` (e.g. `Wallet`).\n * `subscribe()` is not available since there is no EIP-1193 provider.\n *\n * For public chain reads, construct a separate {@link EthersProvider}.\n */\nexport type EthersSignerConfig = { ethereum: EIP1193Provider } | { signer: Signer };\n\n/**\n * GenericSigner backed by ethers.\n *\n * Accepts either a raw EIP-1193 provider (`{ ethereum }`) which creates a\n * `BrowserProvider` internally, or a `Signer` directly (`{ signer }`)\n * for Node.js scripts.\n *\n * @param config - {@link EthersSignerConfig}\n */\nexport class EthersSigner implements GenericSigner {\n readonly #signerPromise: Promise<Signer>;\n readonly #eip1193?: EIP1193Provider;\n\n constructor(config: EthersSignerConfig) {\n if (\"ethereum\" in config) {\n const browserProvider = new BrowserProvider(config.ethereum);\n this.#signerPromise = browserProvider.getSigner();\n this.#eip1193 = config.ethereum;\n } else {\n this.#signerPromise = Promise.resolve(config.signer);\n }\n }\n\n async getChainId(): Promise<number> {\n const signer = await this.#signerPromise;\n const provider = signer.provider;\n if (!provider) {\n throw new TypeError(\"Signer has no provider — cannot read chain ID\");\n }\n const network = await provider.getNetwork();\n return Number(network.chainId);\n }\n\n async getAddress(): Promise<Address> {\n const signer = await this.#signerPromise;\n return getAddress(await signer.getAddress());\n }\n\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.#signerPromise;\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const mutableSigTypes = Object.fromEntries(\n Object.entries(sigTypes).map(([key, fields]) => [key, [...fields]]),\n );\n const sig = await signer.signTypedData(domain, mutableSigTypes, message);\n if (!isHex(sig)) {\n throw new TypeError(`Expected hex string, got: ${sig}`);\n }\n return sig;\n }\n\n async writeContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n const TArgs extends ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\", TFunctionName>,\n >(config: WriteContractConfig<TAbi, TFunctionName, TArgs>): Promise<Hex> {\n const signer = await this.#signerPromise;\n const contract = new ethers.Contract(config.address, config.abi as ethers.InterfaceAbi, signer);\n const overrides: { gasLimit?: bigint; value?: bigint } = {};\n if (config.value !== undefined) {\n overrides.value = config.value;\n }\n if (config.gas !== undefined) {\n overrides.gasLimit = config.gas;\n }\n const tx = await contract[config.functionName]!(\n ...(config.args as readonly unknown[]),\n overrides,\n );\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n }\n\n subscribe(onIdentityChange: SignerIdentityListener): () => void {\n return eip1193Subscribe({\n provider: this.#eip1193,\n getInitialIdentity: async () => {\n const signer = await this.#signerPromise;\n const provider = signer.provider;\n if (!provider) {\n return undefined;\n }\n const [address, network] = await Promise.all([signer.getAddress(), provider.getNetwork()]);\n const chainId = Number(network.chainId);\n return { address: getAddress(address), chainId };\n },\n onIdentityChange,\n });\n }\n}\n","import type { FheChain } from \"../chains\";\nimport { buildZamaConfig } from \"../config/build\";\nimport type { ZamaConfig } from \"../config/types\";\nimport { EthersProvider } from \"./ethers-provider\";\nimport { EthersSigner } from \"./ethers-signer\";\nimport type { ZamaConfigEthers } from \"./types\";\n\n/** Create a {@link ZamaConfig} from ethers types. */\nexport function createConfig<const TChains extends readonly [FheChain, ...FheChain[]]>(\n params: ZamaConfigEthers<TChains>,\n): ZamaConfig {\n if (\"signer\" in params && params.signer) {\n const signer = new EthersSigner({ signer: params.signer });\n if (!params.signer.provider) {\n throw new Error(\"createConfig requires a Signer with an attached provider for chain reads\");\n }\n const provider = new EthersProvider({ provider: params.signer.provider });\n return buildZamaConfig(signer, provider, params);\n }\n\n const signer = new EthersSigner({ ethereum: params.ethereum });\n const provider =\n \"provider\" in params && params.provider\n ? new EthersProvider({ provider: params.provider })\n : new EthersProvider({ ethereum: params.ethereum });\n return buildZamaConfig(signer, provider, params);\n}\n","import {\n decodeFunctionResult,\n encodeFunctionData,\n isHex,\n type Abi,\n type Address,\n type Hex,\n} from \"viem\";\n\nimport type { Handle } from \"../relayer/relayer-sdk.types\";\n\nimport {\n confidentialBalanceOfContract,\n confidentialTransferContract,\n finalizeUnwrapContract,\n setOperatorContract,\n supportsInterfaceContract,\n underlyingContract,\n unwrapContract,\n unwrapFromBalanceContract,\n wrapContract,\n getTokenPairsContract,\n getTokenPairsLengthContract,\n getTokenPairsSliceContract,\n getTokenPairContract,\n getConfidentialTokenAddressContract,\n getTokenAddressContract,\n isConfidentialTokenValidContract,\n} from \"../contracts\";\n\ninterface TransactionRequestConfig {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n gas?: bigint;\n value?: bigint;\n}\n\ninterface EthersTransactionRequest {\n to: Address;\n data: Hex;\n gasLimit?: bigint;\n value?: bigint;\n}\n\ninterface EthersTransactionResponse {\n hash: string;\n}\n\ninterface EthersCallProvider {\n call(tx: EthersTransactionRequest): Promise<string>;\n}\n\ninterface EthersTransactionSigner extends EthersCallProvider {\n sendTransaction(tx: EthersTransactionRequest): Promise<EthersTransactionResponse>;\n}\n\nfunction toTransactionRequest(config: TransactionRequestConfig): EthersTransactionRequest {\n return {\n to: config.address,\n data: encodeFunctionData({\n abi: config.abi as Abi,\n functionName: config.functionName as never,\n args: config.args as never,\n }),\n ...(config.gas !== undefined ? { gasLimit: config.gas } : {}),\n ...(config.value !== undefined ? { value: config.value } : {}),\n };\n}\n\nasync function ethersRead<T>(\n provider: EthersCallProvider,\n config: TransactionRequestConfig,\n): Promise<T> {\n const data = await provider.call(toTransactionRequest(config));\n if (!isHex(data)) {\n throw new TypeError(`Expected hex string, got: ${data}`);\n }\n return decodeFunctionResult({\n abi: config.abi as Abi,\n functionName: config.functionName as never,\n data,\n }) as T;\n}\n\nasync function ethersWrite(\n signer: EthersTransactionSigner,\n config: TransactionRequestConfig,\n): Promise<Hex> {\n const tx = await signer.sendTransaction(toTransactionRequest(config));\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n}\n\n// ── Read helpers ────────────────────────────────────────────\n\nexport function readConfidentialBalanceOfContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\nexport function readUnderlyingTokenContract(provider: EthersCallProvider, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\nexport function readSupportsInterfaceContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n interfaceId: Address,\n) {\n return ethersRead(provider, supportsInterfaceContract(tokenAddress, interfaceId));\n}\n\n// ── Write helpers ───────────────────────────────────────────\n\nexport function writeConfidentialTransferContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n to: Address,\n handle: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, confidentialTransferContract(tokenAddress, to, handle, inputProof));\n}\n\nexport function writeUnwrapContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\nexport function writeUnwrapFromBalanceContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: Handle,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\nexport function writeFinalizeUnwrapContract(\n signer: EthersTransactionSigner,\n wrapper: Address,\n unwrapRequestId: Handle,\n burntAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, unwrapRequestId, burntAmountCleartext, decryptionProof),\n );\n}\n\nexport function writeSetOperatorContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n operator: Address,\n until?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, operator, until));\n}\n\nexport function writeWrapContract(\n signer: EthersTransactionSigner,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n) {\n return ethersWrite(signer, wrapContract(wrapperAddress, to, amount));\n}\n\n// ── Registry read helpers ──────────────────────────────────\n\nexport function readTokenPairsContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsContract(registry));\n}\n\nexport function readTokenPairsLengthContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsLengthContract(registry));\n}\n\nexport function readTokenPairsSliceContract(\n provider: EthersCallProvider,\n registry: Address,\n fromIndex: bigint,\n toIndex: bigint,\n) {\n return ethersRead(provider, getTokenPairsSliceContract(registry, fromIndex, toIndex));\n}\n\nexport function readTokenPairContract(\n provider: EthersCallProvider,\n registry: Address,\n index: bigint,\n) {\n return ethersRead(provider, getTokenPairContract(registry, index));\n}\n\nexport function readConfidentialTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\nexport function readTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\nexport function readIsConfidentialTokenValidContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, isConfidentialTokenValidContract(registry, confidentialTokenAddress));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["#readProvider","BrowserProvider","BaseSigner","#browserProvider","#directSigner","#eip1193","#unsubscribeProvider","BrowserProvider","eip1193Subscribe","#loadBrowserWalletAccount","swallow","WalletAccountNotReadyError","WalletNotConnectedError","#refreshFromEthereum","#refreshFromSigner","#resolveSigner","SignerNotConfiguredError","#walletAccountFromSigner","Contract","#accountPromise","buildZamaConfig","confidentialBalanceOfContract","underlyingContract","supportsInterfaceContract","confidentialTransferContract","unwrapContract","unwrapFromBalanceContract","finalizeUnwrapContract","setOperatorContract","wrapContract","getTokenPairsContract","getTokenPairsLengthContract","getTokenPairsSliceContract","getTokenPairContract","getConfidentialTokenAddressContract","getTokenAddressContract","isConfidentialTokenValidContract"],"sources":["../../../src/ethers/ethers-provider.ts","../../../src/ethers/ethers-signer.ts","../../../src/ethers/config.ts","../../../src/ethers/contracts.ts"],"sourcesContent":["import { ethers, BrowserProvider } from \"ethers\";\nimport type {\n Abi,\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionReturnType,\n EIP1193Provider,\n Hex,\n} from \"viem\";\nimport type { GenericProvider, ReadContractConfig, TransactionReceipt } from \"../types\";\n\n/**\n * Configuration for {@link EthersProvider}.\n *\n * Two variants:\n *\n * - **EIP-1193** — `{ ethereum }`: pass the raw EIP-1193 provider (e.g. `window.ethereum`).\n * A `BrowserProvider` is created internally.\n *\n * - **Pre-built** — `{ provider }`: pass any ethers `Provider`\n * (e.g. `JsonRpcProvider`, `WebSocketProvider`).\n */\nexport type EthersProviderConfig = { ethereum: EIP1193Provider } | { provider: ethers.Provider };\n\n/**\n * Read-only {@link GenericProvider} backed by ethers v6.\n *\n * Use this for integrations that only need public chain reads before the user has connected their\n * wallet.\n *\n * @example\n * ```ts\n * // Dedicated RPC\n * const provider = new EthersProvider({\n * provider: new ethers.JsonRpcProvider(ALCHEMY_URL),\n * });\n *\n * // Wallet-sourced RPC (shares transport with EthersSigner)\n * const provider = new EthersProvider({ ethereum: window.ethereum });\n * ```\n */\nexport class EthersProvider implements GenericProvider {\n readonly #readProvider: ethers.Provider;\n\n constructor(config: EthersProviderConfig) {\n if (\"ethereum\" in config) {\n this.#readProvider = new BrowserProvider(config.ethereum);\n } else {\n this.#readProvider = config.provider;\n }\n }\n\n async getChainId(): Promise<number> {\n const network = await this.#readProvider.getNetwork();\n return Number(network.chainId);\n }\n\n async readContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n const TArgs extends ContractFunctionArgs<TAbi, \"pure\" | \"view\", TFunctionName>,\n >(\n config: ReadContractConfig<TAbi, TFunctionName, TArgs>,\n ): Promise<ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName, TArgs>> {\n const contract = new ethers.Contract(\n config.address,\n config.abi as ethers.InterfaceAbi,\n this.#readProvider,\n );\n const fn = contract.getFunction(config.functionName);\n return fn(...(config.args as readonly unknown[])) as Promise<\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName, TArgs>\n >;\n }\n\n async getBlockTimestamp(): Promise<bigint> {\n const block = await this.#readProvider.getBlock(\"latest\");\n if (!block) {\n throw new Error(\"Failed to fetch latest block\");\n }\n if (block.timestamp === null) {\n throw new Error(\"Latest block has no timestamp\");\n }\n return BigInt(block.timestamp);\n }\n\n async waitForTransactionReceipt(hash: Hex): Promise<TransactionReceipt> {\n const receipt = await this.#readProvider.waitForTransaction(hash);\n if (!receipt) {\n throw new Error(\"Transaction receipt not found\");\n }\n return {\n logs: receipt.logs.map((log) => ({\n topics: log.topics.filter((t): t is Hex => t !== null),\n data: log.data as Hex,\n })),\n };\n }\n}\n","import { BrowserProvider, Contract, type InterfaceAbi, type Signer } from \"ethers\";\nimport {\n getAddress,\n isHex,\n type Abi,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type EIP1193Provider,\n type Hex,\n} from \"viem\";\nimport {\n SignerNotConfiguredError,\n WalletAccountNotReadyError,\n WalletNotConnectedError,\n} from \"../errors\";\nimport type { EIP712TypedData } from \"../relayer/relayer-sdk.types\";\nimport { BaseSigner } from \"../signer/base-signer\";\nimport { eip1193Subscribe } from \"../signer/eip1193-subscribe\";\nimport type { WalletAccount, WriteContractConfig } from \"../types\";\nimport { swallow } from \"../utils\";\n\n/**\n * Configuration for {@link EthersSigner}.\n *\n * Two variants:\n *\n * - **Browser** — `{ ethereum }`: pass the raw EIP-1193 provider (e.g. `window.ethereum`).\n * A `BrowserProvider` is created internally and wallet events update `walletAccount`.\n *\n * - **Node / direct signer** — `{ signer }`: pass an ethers `Signer` (e.g. `Wallet`).\n * The initial wallet account is discovered asynchronously and emitted through\n * `walletAccount` once available.\n *\n * For public chain reads, construct a separate {@link EthersProvider}.\n */\nexport type EthersSignerConfig = { ethereum: EIP1193Provider } | { signer: Signer };\n\n/**\n * GenericSigner backed by ethers.\n *\n * Accepts either a raw EIP-1193 provider (`{ ethereum }`) which creates a\n * `BrowserProvider` internally, or a `Signer` directly (`{ signer }`)\n * for Node.js scripts.\n *\n * @param config - {@link EthersSignerConfig}\n */\nexport class EthersSigner extends BaseSigner {\n readonly #browserProvider?: BrowserProvider;\n readonly #directSigner?: Signer;\n readonly #eip1193?: EIP1193Provider;\n readonly #unsubscribeProvider: () => void;\n #accountPromise: Promise<WalletAccount | undefined> | undefined;\n\n constructor(config: EthersSignerConfig) {\n super();\n if (\"ethereum\" in config) {\n this.#browserProvider = new BrowserProvider(config.ethereum);\n this.#eip1193 = config.ethereum;\n this.#unsubscribeProvider = eip1193Subscribe({\n provider: config.ethereum,\n getInitialWalletAccount: () => this.#loadBrowserWalletAccount(),\n onWalletAccountChange: ({ next }) => {\n this.walletAccount.setSnapshot(next);\n },\n });\n } else {\n this.#directSigner = config.signer;\n this.#unsubscribeProvider = () => {};\n void swallow(\"refresh wallet account\", async () => {\n await this.refreshWalletAccount();\n });\n }\n }\n\n override requireWalletAccount(operation: string): WalletAccount {\n const account = this.walletAccount.getSnapshot();\n if (!account && !this.walletAccount.isReady()) {\n throw new WalletAccountNotReadyError(operation);\n }\n if (!account) {\n throw new WalletNotConnectedError(operation);\n }\n return account;\n }\n\n refreshWalletAccount(): Promise<WalletAccount | undefined> {\n if (this.#eip1193) {\n return this.#refreshFromEthereum();\n }\n if (this.#directSigner) {\n return this.#refreshFromSigner(this.#directSigner);\n }\n return Promise.resolve(undefined);\n }\n\n protected override onDispose(): void {\n this.#unsubscribeProvider();\n }\n\n async #resolveSigner(): Promise<Signer> {\n if (this.#directSigner) {\n return this.#directSigner;\n }\n if (!this.#browserProvider) {\n throw new SignerNotConfiguredError(\"resolveSigner\");\n }\n return this.#browserProvider.getSigner();\n }\n\n async #walletAccountFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n const provider = signer.provider;\n if (!provider) {\n return undefined;\n }\n const [address, network] = await Promise.all([signer.getAddress(), provider.getNetwork()]);\n return { address: getAddress(address), chainId: Number(network.chainId) };\n }\n\n async signTypedData(typedData: EIP712TypedData): Promise<Hex> {\n const signer = await this.#resolveSigner();\n const { domain, types, message } = typedData;\n const { EIP712Domain: _, ...sigTypes } = types;\n const mutableSigTypes = Object.fromEntries(\n Object.entries(sigTypes).map(([key, fields]) => [key, [...fields]]),\n );\n const sig = await signer.signTypedData(domain, mutableSigTypes, message);\n if (!isHex(sig)) {\n throw new TypeError(`Expected hex string, got: ${sig}`);\n }\n return sig;\n }\n\n async writeContract<\n const TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n const TArgs extends ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\", TFunctionName>,\n >(config: WriteContractConfig<TAbi, TFunctionName, TArgs>): Promise<Hex> {\n const signer = await this.#resolveSigner();\n const contract = new Contract(config.address, config.abi as InterfaceAbi, signer);\n const overrides: { gasLimit?: bigint; value?: bigint } = {};\n if (config.value !== undefined) {\n overrides.value = config.value;\n }\n if (config.gas !== undefined) {\n overrides.gasLimit = config.gas;\n }\n const fn = contract.getFunction(config.functionName);\n const tx = await fn(...(config.args as readonly unknown[]), overrides);\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n }\n\n async #refreshFromSigner(signer: Signer): Promise<WalletAccount | undefined> {\n this.#accountPromise ??= this.#walletAccountFromSigner(signer)\n .then((account) => {\n this.walletAccount.setSnapshot(account);\n return account;\n })\n .finally(() => {\n this.#accountPromise = undefined;\n });\n return this.#accountPromise;\n }\n\n async #refreshFromEthereum(): Promise<WalletAccount | undefined> {\n const account = await this.#loadBrowserWalletAccount();\n this.walletAccount.setSnapshot(account);\n return account;\n }\n\n async #loadBrowserWalletAccount(): Promise<WalletAccount | undefined> {\n const ethereum = this.#eip1193;\n if (!ethereum) {\n return undefined;\n }\n const [accounts, chainIdValue] = await Promise.all([\n ethereum.request({ method: \"eth_accounts\" }),\n ethereum.request({ method: \"eth_chainId\" }),\n ]);\n if (!Array.isArray(accounts) || typeof accounts[0] !== \"string\") {\n return undefined;\n }\n const chainId = Number(chainIdValue);\n if (!Number.isSafeInteger(chainId) || chainId <= 0) {\n return undefined;\n }\n return { address: getAddress(accounts[0]), chainId };\n }\n}\n","import type { FheChain } from \"../chains\";\nimport { buildZamaConfig } from \"../config/build\";\nimport type { ZamaConfig } from \"../config/types\";\nimport { EthersProvider } from \"./ethers-provider\";\nimport { EthersSigner } from \"./ethers-signer\";\nimport type { ZamaConfigEthers } from \"./types\";\n\n/** Create a {@link ZamaConfig} from ethers types. */\nexport function createConfig<const TChains extends readonly [FheChain, ...FheChain[]]>(\n params: ZamaConfigEthers<TChains>,\n): ZamaConfig {\n if (\"signer\" in params && params.signer) {\n const signer = new EthersSigner({ signer: params.signer });\n if (!params.signer.provider) {\n throw new Error(\"createConfig requires a Signer with an attached provider for chain reads\");\n }\n const provider = new EthersProvider({ provider: params.signer.provider });\n return buildZamaConfig(signer, provider, params);\n }\n\n const signer = new EthersSigner({ ethereum: params.ethereum });\n const provider =\n \"provider\" in params && params.provider\n ? new EthersProvider({ provider: params.provider })\n : new EthersProvider({ ethereum: params.ethereum });\n return buildZamaConfig(signer, provider, params);\n}\n","import {\n decodeFunctionResult,\n encodeFunctionData,\n isHex,\n type Abi,\n type Address,\n type Hex,\n} from \"viem\";\n\nimport type { Handle } from \"../relayer/relayer-sdk.types\";\n\nimport {\n confidentialBalanceOfContract,\n confidentialTransferContract,\n finalizeUnwrapContract,\n setOperatorContract,\n supportsInterfaceContract,\n underlyingContract,\n unwrapContract,\n unwrapFromBalanceContract,\n wrapContract,\n getTokenPairsContract,\n getTokenPairsLengthContract,\n getTokenPairsSliceContract,\n getTokenPairContract,\n getConfidentialTokenAddressContract,\n getTokenAddressContract,\n isConfidentialTokenValidContract,\n} from \"../contracts\";\n\ninterface TransactionRequestConfig {\n address: Address;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n gas?: bigint;\n value?: bigint;\n}\n\ninterface EthersTransactionRequest {\n to: Address;\n data: Hex;\n gasLimit?: bigint;\n value?: bigint;\n}\n\ninterface EthersTransactionResponse {\n hash: string;\n}\n\ninterface EthersCallProvider {\n call(tx: EthersTransactionRequest): Promise<string>;\n}\n\ninterface EthersTransactionSigner extends EthersCallProvider {\n sendTransaction(tx: EthersTransactionRequest): Promise<EthersTransactionResponse>;\n}\n\nfunction toTransactionRequest(config: TransactionRequestConfig): EthersTransactionRequest {\n return {\n to: config.address,\n data: encodeFunctionData({\n abi: config.abi as Abi,\n functionName: config.functionName as never,\n args: config.args as never,\n }),\n ...(config.gas !== undefined ? { gasLimit: config.gas } : {}),\n ...(config.value !== undefined ? { value: config.value } : {}),\n };\n}\n\nasync function ethersRead<T>(\n provider: EthersCallProvider,\n config: TransactionRequestConfig,\n): Promise<T> {\n const data = await provider.call(toTransactionRequest(config));\n if (!isHex(data)) {\n throw new TypeError(`Expected hex string, got: ${data}`);\n }\n return decodeFunctionResult({\n abi: config.abi as Abi,\n functionName: config.functionName as never,\n data,\n }) as T;\n}\n\nasync function ethersWrite(\n signer: EthersTransactionSigner,\n config: TransactionRequestConfig,\n): Promise<Hex> {\n const tx = await signer.sendTransaction(toTransactionRequest(config));\n if (!isHex(tx.hash)) {\n throw new TypeError(`Expected hex string, got: ${tx.hash}`);\n }\n return tx.hash;\n}\n\n// ── Read helpers ────────────────────────────────────────────\n\nexport function readConfidentialBalanceOfContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n userAddress: Address,\n) {\n return ethersRead(provider, confidentialBalanceOfContract(tokenAddress, userAddress));\n}\n\nexport function readUnderlyingTokenContract(provider: EthersCallProvider, wrapperAddress: Address) {\n return ethersRead(provider, underlyingContract(wrapperAddress));\n}\n\nexport function readSupportsInterfaceContract(\n provider: EthersCallProvider,\n tokenAddress: Address,\n interfaceId: Address,\n) {\n return ethersRead(provider, supportsInterfaceContract(tokenAddress, interfaceId));\n}\n\n// ── Write helpers ───────────────────────────────────────────\n\nexport function writeConfidentialTransferContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n to: Address,\n handle: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, confidentialTransferContract(tokenAddress, to, handle, inputProof));\n}\n\nexport function writeUnwrapContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedAmount: Uint8Array,\n inputProof: Uint8Array,\n) {\n return ethersWrite(signer, unwrapContract(encryptedErc20, from, to, encryptedAmount, inputProof));\n}\n\nexport function writeUnwrapFromBalanceContract(\n signer: EthersTransactionSigner,\n encryptedErc20: Address,\n from: Address,\n to: Address,\n encryptedBalance: Handle,\n) {\n return ethersWrite(signer, unwrapFromBalanceContract(encryptedErc20, from, to, encryptedBalance));\n}\n\nexport function writeFinalizeUnwrapContract(\n signer: EthersTransactionSigner,\n wrapper: Address,\n unwrapRequestId: Handle,\n burntAmountCleartext: bigint,\n decryptionProof: Hex,\n) {\n return ethersWrite(\n signer,\n finalizeUnwrapContract(wrapper, unwrapRequestId, burntAmountCleartext, decryptionProof),\n );\n}\n\nexport function writeSetOperatorContract(\n signer: EthersTransactionSigner,\n tokenAddress: Address,\n operator: Address,\n until?: number,\n) {\n return ethersWrite(signer, setOperatorContract(tokenAddress, operator, until));\n}\n\nexport function writeWrapContract(\n signer: EthersTransactionSigner,\n wrapperAddress: Address,\n to: Address,\n amount: bigint,\n) {\n return ethersWrite(signer, wrapContract(wrapperAddress, to, amount));\n}\n\n// ── Registry read helpers ──────────────────────────────────\n\nexport function readTokenPairsContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsContract(registry));\n}\n\nexport function readTokenPairsLengthContract(provider: EthersCallProvider, registry: Address) {\n return ethersRead(provider, getTokenPairsLengthContract(registry));\n}\n\nexport function readTokenPairsSliceContract(\n provider: EthersCallProvider,\n registry: Address,\n fromIndex: bigint,\n toIndex: bigint,\n) {\n return ethersRead(provider, getTokenPairsSliceContract(registry, fromIndex, toIndex));\n}\n\nexport function readTokenPairContract(\n provider: EthersCallProvider,\n registry: Address,\n index: bigint,\n) {\n return ethersRead(provider, getTokenPairContract(registry, index));\n}\n\nexport function readConfidentialTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n tokenAddress: Address,\n) {\n return ethersRead(provider, getConfidentialTokenAddressContract(registry, tokenAddress));\n}\n\nexport function readTokenAddressContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, getTokenAddressContract(registry, confidentialTokenAddress));\n}\n\nexport function readIsConfidentialTokenValidContract(\n provider: EthersCallProvider,\n registry: Address,\n confidentialTokenAddress: Address,\n) {\n return ethersRead(provider, isConfidentialTokenValidContract(registry, confidentialTokenAddress));\n}\n"],"mappings":"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"}