@fhevm/sdk 1.1.0-alpha.7 → 1.1.0-alpha.8

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 (259) hide show
  1. package/README.md +5 -5
  2. package/_cjs/core/_version.js +1 -1
  3. package/_cjs/core/actions/encrypt/encryptValue.js +2 -1
  4. package/_cjs/core/actions/encrypt/encryptValue.js.map +1 -1
  5. package/_cjs/core/actions/encrypt/encryptValues.js +2 -1
  6. package/_cjs/core/actions/encrypt/encryptValues.js.map +1 -1
  7. package/_cjs/core/actions/encrypt/generateZkProof.js +2 -1
  8. package/_cjs/core/actions/encrypt/generateZkProof.js.map +1 -1
  9. package/_cjs/core/actions/host/readKmsVerifierContractData.js +1 -1
  10. package/_cjs/core/actions/host/readKmsVerifierContractData.js.map +1 -1
  11. package/_cjs/core/base/cachedFetch.js +1 -1
  12. package/_cjs/core/base/cachedFetch.js.map +1 -1
  13. package/_cjs/core/handle/FheType.js +4 -0
  14. package/_cjs/core/handle/FheType.js.map +1 -1
  15. package/_cjs/core/host-contracts/HostContractVersion-p.js +4 -0
  16. package/_cjs/core/host-contracts/HostContractVersion-p.js.map +1 -1
  17. package/_cjs/core/host-contracts/KmsSignersContext-p.js +15 -25
  18. package/_cjs/core/host-contracts/KmsSignersContext-p.js.map +1 -1
  19. package/_cjs/core/host-contracts/getKmsContextSignersAndThreshold-p.js.map +1 -1
  20. package/_cjs/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.js +7 -6
  21. package/_cjs/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.js.map +1 -1
  22. package/_cjs/core/host-contracts/readKmsSignersContext-p.js +54 -66
  23. package/_cjs/core/host-contracts/readKmsSignersContext-p.js.map +1 -1
  24. package/_cjs/core/kms/KmsSigncryptedShares-p.js +40 -4
  25. package/_cjs/core/kms/KmsSigncryptedShares-p.js.map +1 -1
  26. package/_cjs/core/kms/PublicDecryptionProof-p.js +4 -3
  27. package/_cjs/core/kms/PublicDecryptionProof-p.js.map +1 -1
  28. package/_cjs/core/kms/SignedDecryptionPermitV1-p.js +1 -14
  29. package/_cjs/core/kms/SignedDecryptionPermitV1-p.js.map +1 -1
  30. package/_cjs/core/kms/SignedDecryptionPermitV2-p.js +3 -15
  31. package/_cjs/core/kms/SignedDecryptionPermitV2-p.js.map +1 -1
  32. package/_cjs/core/kms/createKmsDelegatedUserDecryptEip712V1.js +3 -4
  33. package/_cjs/core/kms/createKmsDelegatedUserDecryptEip712V1.js.map +1 -1
  34. package/_cjs/core/kms/createKmsUserDecryptEip712V1.js +6 -5
  35. package/_cjs/core/kms/createKmsUserDecryptEip712V1.js.map +1 -1
  36. package/_cjs/core/kms/createKmsUserDecryptEip712V2.js +4 -5
  37. package/_cjs/core/kms/createKmsUserDecryptEip712V2.js.map +1 -1
  38. package/_cjs/core/kms/fetchKmsSigncryptedSharesV1-p.js +1 -1
  39. package/_cjs/core/kms/fetchKmsSigncryptedSharesV1-p.js.map +1 -1
  40. package/_cjs/core/kms/fetchKmsSigncryptedSharesV2-p.js +1 -1
  41. package/_cjs/core/kms/fetchKmsSigncryptedSharesV2-p.js.map +1 -1
  42. package/_cjs/core/kms/kmsExtraData-p.js +234 -0
  43. package/_cjs/core/kms/kmsExtraData-p.js.map +1 -0
  44. package/_cjs/core/kms/publicDecrypt.js +4 -4
  45. package/_cjs/core/kms/publicDecrypt.js.map +1 -1
  46. package/_cjs/core/kms/verifyKmsPublicDecryptEip712-p.js +5 -4
  47. package/_cjs/core/kms/verifyKmsPublicDecryptEip712-p.js.map +1 -1
  48. package/_cjs/core/modules/decrypt/mock.js +6 -6
  49. package/_cjs/core/modules/decrypt/mock.js.map +1 -1
  50. package/_cjs/core/modules/decrypt/module/api-p.js +7 -7
  51. package/_cjs/core/modules/decrypt/module/api-p.js.map +1 -1
  52. package/_cjs/core/modules/relayer/cleartext/fetchCoprocessorSignatures.js +53 -3
  53. package/_cjs/core/modules/relayer/cleartext/fetchCoprocessorSignatures.js.map +1 -1
  54. package/_cjs/core/modules/relayer/cleartext/{fetchDelegatedUserDecrypt.js → fetchDelegatedUserDecryptV1.js} +67 -21
  55. package/_cjs/core/modules/relayer/cleartext/fetchDelegatedUserDecryptV1.js.map +1 -0
  56. package/_cjs/core/modules/relayer/cleartext/fetchPublicDecrypt.js +61 -4
  57. package/_cjs/core/modules/relayer/cleartext/fetchPublicDecrypt.js.map +1 -1
  58. package/_cjs/core/modules/relayer/cleartext/fetchUserDecrypt.js +9 -108
  59. package/_cjs/core/modules/relayer/cleartext/fetchUserDecrypt.js.map +1 -1
  60. package/_cjs/core/modules/relayer/cleartext/fetchUserDecryptV1.js +163 -0
  61. package/_cjs/core/modules/relayer/cleartext/fetchUserDecryptV1.js.map +1 -0
  62. package/_cjs/core/modules/relayer/cleartext/fetchUserDecryptV2.js +7 -0
  63. package/_cjs/core/modules/relayer/cleartext/fetchUserDecryptV2.js.map +1 -0
  64. package/_cjs/core/modules/relayer/cleartext/forgeFhevmV1.js +83 -0
  65. package/_cjs/core/modules/relayer/cleartext/forgeFhevmV1.js.map +1 -0
  66. package/_cjs/core/modules/relayer/cleartext/mock.js +2 -2
  67. package/_cjs/core/modules/relayer/cleartext/mock.js.map +1 -1
  68. package/_cjs/core/modules/relayer/cleartext/signers.js +14 -0
  69. package/_cjs/core/modules/relayer/cleartext/signers.js.map +1 -1
  70. package/_cjs/ethers/internal/ethereum-ct.js +11 -0
  71. package/_cjs/ethers/internal/ethereum-ct.js.map +1 -1
  72. package/_cjs/ethers/internal/runtime-ct.js +9 -7
  73. package/_cjs/ethers/internal/runtime-ct.js.map +1 -1
  74. package/_cjs/viem/internal/ethereum-ct.js +8 -0
  75. package/_cjs/viem/internal/ethereum-ct.js.map +1 -1
  76. package/_cjs/viem/internal/runtime-ct.js +9 -7
  77. package/_cjs/viem/internal/runtime-ct.js.map +1 -1
  78. package/_cjs/wasm/tfhe/loadTfheLib.js.map +1 -1
  79. package/_cjs/wasm/tkms/loadKmsLib.js.map +1 -1
  80. package/_esm/core/_version.js +1 -1
  81. package/_esm/core/actions/encrypt/encryptValue.js +2 -1
  82. package/_esm/core/actions/encrypt/encryptValue.js.map +1 -1
  83. package/_esm/core/actions/encrypt/encryptValues.js +2 -1
  84. package/_esm/core/actions/encrypt/encryptValues.js.map +1 -1
  85. package/_esm/core/actions/encrypt/generateZkProof.js +2 -1
  86. package/_esm/core/actions/encrypt/generateZkProof.js.map +1 -1
  87. package/_esm/core/actions/host/readKmsVerifierContractData.js +2 -2
  88. package/_esm/core/actions/host/readKmsVerifierContractData.js.map +1 -1
  89. package/_esm/core/base/cachedFetch.js +1 -1
  90. package/_esm/core/base/cachedFetch.js.map +1 -1
  91. package/_esm/core/handle/FheType.js +10 -0
  92. package/_esm/core/handle/FheType.js.map +1 -1
  93. package/_esm/core/host-contracts/HostContractVersion-p.js +6 -0
  94. package/_esm/core/host-contracts/HostContractVersion-p.js.map +1 -1
  95. package/_esm/core/host-contracts/KmsSignersContext-p.js +16 -25
  96. package/_esm/core/host-contracts/KmsSignersContext-p.js.map +1 -1
  97. package/_esm/core/host-contracts/getKmsContextSignersAndThreshold-p.js.map +1 -1
  98. package/_esm/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.js +6 -5
  99. package/_esm/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.js.map +1 -1
  100. package/_esm/core/host-contracts/readKmsSignersContext-p.js +132 -68
  101. package/_esm/core/host-contracts/readKmsSignersContext-p.js.map +1 -1
  102. package/_esm/core/kms/KmsSigncryptedShares-p.js +70 -4
  103. package/_esm/core/kms/KmsSigncryptedShares-p.js.map +1 -1
  104. package/_esm/core/kms/PublicDecryptionProof-p.js +4 -3
  105. package/_esm/core/kms/PublicDecryptionProof-p.js.map +1 -1
  106. package/_esm/core/kms/SignedDecryptionPermitV1-p.js +2 -32
  107. package/_esm/core/kms/SignedDecryptionPermitV1-p.js.map +1 -1
  108. package/_esm/core/kms/SignedDecryptionPermitV2-p.js +4 -16
  109. package/_esm/core/kms/SignedDecryptionPermitV2-p.js.map +1 -1
  110. package/_esm/core/kms/createKmsDelegatedUserDecryptEip712V1.js +3 -4
  111. package/_esm/core/kms/createKmsDelegatedUserDecryptEip712V1.js.map +1 -1
  112. package/_esm/core/kms/createKmsUserDecryptEip712V1.js +7 -6
  113. package/_esm/core/kms/createKmsUserDecryptEip712V1.js.map +1 -1
  114. package/_esm/core/kms/createKmsUserDecryptEip712V2.js +4 -5
  115. package/_esm/core/kms/createKmsUserDecryptEip712V2.js.map +1 -1
  116. package/_esm/core/kms/fetchKmsSigncryptedSharesV1-p.js +26 -2
  117. package/_esm/core/kms/fetchKmsSigncryptedSharesV1-p.js.map +1 -1
  118. package/_esm/core/kms/fetchKmsSigncryptedSharesV2-p.js +2 -2
  119. package/_esm/core/kms/fetchKmsSigncryptedSharesV2-p.js.map +1 -1
  120. package/_esm/core/kms/kmsExtraData-p.js +298 -0
  121. package/_esm/core/kms/kmsExtraData-p.js.map +1 -0
  122. package/_esm/core/kms/publicDecrypt.js +5 -5
  123. package/_esm/core/kms/publicDecrypt.js.map +1 -1
  124. package/_esm/core/kms/verifyKmsPublicDecryptEip712-p.js +5 -4
  125. package/_esm/core/kms/verifyKmsPublicDecryptEip712-p.js.map +1 -1
  126. package/_esm/core/modules/decrypt/mock.js +6 -6
  127. package/_esm/core/modules/decrypt/mock.js.map +1 -1
  128. package/_esm/core/modules/decrypt/module/api-p.js +7 -7
  129. package/_esm/core/modules/decrypt/module/api-p.js.map +1 -1
  130. package/_esm/core/modules/relayer/cleartext/fetchCoprocessorSignatures.js +69 -12
  131. package/_esm/core/modules/relayer/cleartext/fetchCoprocessorSignatures.js.map +1 -1
  132. package/_esm/core/modules/relayer/cleartext/{fetchDelegatedUserDecrypt.js → fetchDelegatedUserDecryptV1.js} +76 -22
  133. package/_esm/core/modules/relayer/cleartext/fetchDelegatedUserDecryptV1.js.map +1 -0
  134. package/_esm/core/modules/relayer/cleartext/fetchPublicDecrypt.js +77 -4
  135. package/_esm/core/modules/relayer/cleartext/fetchPublicDecrypt.js.map +1 -1
  136. package/_esm/core/modules/relayer/cleartext/fetchUserDecrypt.js +13 -114
  137. package/_esm/core/modules/relayer/cleartext/fetchUserDecrypt.js.map +1 -1
  138. package/_esm/core/modules/relayer/cleartext/fetchUserDecryptV1.js +173 -0
  139. package/_esm/core/modules/relayer/cleartext/fetchUserDecryptV1.js.map +1 -0
  140. package/_esm/core/modules/relayer/cleartext/fetchUserDecryptV2.js +6 -0
  141. package/_esm/core/modules/relayer/cleartext/fetchUserDecryptV2.js.map +1 -0
  142. package/_esm/core/modules/relayer/cleartext/forgeFhevmV1.js +140 -0
  143. package/_esm/core/modules/relayer/cleartext/forgeFhevmV1.js.map +1 -0
  144. package/_esm/core/modules/relayer/cleartext/mock.js +1 -1
  145. package/_esm/core/modules/relayer/cleartext/mock.js.map +1 -1
  146. package/_esm/core/modules/relayer/cleartext/signers.js +26 -0
  147. package/_esm/core/modules/relayer/cleartext/signers.js.map +1 -1
  148. package/_esm/ethers/internal/ethereum-ct.js +12 -1
  149. package/_esm/ethers/internal/ethereum-ct.js.map +1 -1
  150. package/_esm/ethers/internal/runtime-ct.js +9 -7
  151. package/_esm/ethers/internal/runtime-ct.js.map +1 -1
  152. package/_esm/viem/internal/ethereum-ct.js +10 -2
  153. package/_esm/viem/internal/ethereum-ct.js.map +1 -1
  154. package/_esm/viem/internal/runtime-ct.js +9 -7
  155. package/_esm/viem/internal/runtime-ct.js.map +1 -1
  156. package/_types/core/actions/encrypt/encryptValue.d.ts.map +1 -1
  157. package/_types/core/actions/encrypt/encryptValues.d.ts.map +1 -1
  158. package/_types/core/actions/encrypt/generateZkProof.d.ts.map +1 -1
  159. package/_types/core/base/cachedFetch.d.ts.map +1 -1
  160. package/_types/core/handle/FheType.d.ts +8 -0
  161. package/_types/core/handle/FheType.d.ts.map +1 -1
  162. package/_types/core/host-contracts/HostContractVersion-p.d.ts +8 -0
  163. package/_types/core/host-contracts/HostContractVersion-p.d.ts.map +1 -1
  164. package/_types/core/host-contracts/KmsSignersContext-p.d.ts +3 -2
  165. package/_types/core/host-contracts/KmsSignersContext-p.d.ts.map +1 -1
  166. package/_types/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.d.ts +3 -2
  167. package/_types/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.d.ts.map +1 -1
  168. package/_types/core/host-contracts/readKmsSignersContext-p.d.ts +43 -26
  169. package/_types/core/host-contracts/readKmsSignersContext-p.d.ts.map +1 -1
  170. package/_types/core/kms/KmsSigncryptedShares-p.d.ts +18 -0
  171. package/_types/core/kms/KmsSigncryptedShares-p.d.ts.map +1 -1
  172. package/_types/core/kms/PublicDecryptionProof-p.d.ts.map +1 -1
  173. package/_types/core/kms/SignedDecryptionPermitV1-p.d.ts.map +1 -1
  174. package/_types/core/kms/SignedDecryptionPermitV2-p.d.ts.map +1 -1
  175. package/_types/core/kms/createKmsDelegatedUserDecryptEip712V1.d.ts +2 -1
  176. package/_types/core/kms/createKmsDelegatedUserDecryptEip712V1.d.ts.map +1 -1
  177. package/_types/core/kms/createKmsUserDecryptEip712V1.d.ts +2 -1
  178. package/_types/core/kms/createKmsUserDecryptEip712V1.d.ts.map +1 -1
  179. package/_types/core/kms/createKmsUserDecryptEip712V2.d.ts +2 -1
  180. package/_types/core/kms/createKmsUserDecryptEip712V2.d.ts.map +1 -1
  181. package/_types/core/kms/fetchKmsSigncryptedSharesV1-p.d.ts.map +1 -1
  182. package/_types/core/kms/kmsExtraData-p.d.ts +66 -0
  183. package/_types/core/kms/kmsExtraData-p.d.ts.map +1 -0
  184. package/_types/core/kms/publicDecrypt.d.ts.map +1 -1
  185. package/_types/core/kms/verifyKmsPublicDecryptEip712-p.d.ts.map +1 -1
  186. package/_types/core/modules/ethereum/types-ct.d.ts +20 -2
  187. package/_types/core/modules/ethereum/types-ct.d.ts.map +1 -1
  188. package/_types/core/modules/relayer/cleartext/fetchCoprocessorSignatures.d.ts.map +1 -1
  189. package/_types/core/modules/relayer/cleartext/{fetchDelegatedUserDecrypt.d.ts → fetchDelegatedUserDecryptV1.d.ts} +1 -1
  190. package/_types/core/modules/relayer/cleartext/fetchDelegatedUserDecryptV1.d.ts.map +1 -0
  191. package/_types/core/modules/relayer/cleartext/fetchPublicDecrypt.d.ts.map +1 -1
  192. package/_types/core/modules/relayer/cleartext/fetchUserDecrypt.d.ts +2 -2
  193. package/_types/core/modules/relayer/cleartext/fetchUserDecrypt.d.ts.map +1 -1
  194. package/_types/core/modules/relayer/cleartext/fetchUserDecryptV1.d.ts +3 -0
  195. package/_types/core/modules/relayer/cleartext/fetchUserDecryptV1.d.ts.map +1 -0
  196. package/_types/core/modules/relayer/cleartext/fetchUserDecryptV2.d.ts +3 -0
  197. package/_types/core/modules/relayer/cleartext/fetchUserDecryptV2.d.ts.map +1 -0
  198. package/_types/core/modules/relayer/cleartext/forgeFhevmV1.d.ts +29 -0
  199. package/_types/core/modules/relayer/cleartext/forgeFhevmV1.d.ts.map +1 -0
  200. package/_types/core/modules/relayer/cleartext/signers.d.ts +1 -0
  201. package/_types/core/modules/relayer/cleartext/signers.d.ts.map +1 -1
  202. package/_types/core/types/kms-p.d.ts +7 -1
  203. package/_types/core/types/kms-p.d.ts.map +1 -1
  204. package/_types/ethers/internal/ethereum-ct.d.ts.map +1 -1
  205. package/_types/ethers/internal/runtime-ct.d.ts.map +1 -1
  206. package/_types/viem/internal/ethereum-ct.d.ts.map +1 -1
  207. package/_types/viem/internal/runtime-ct.d.ts.map +1 -1
  208. package/core/_version.ts +1 -1
  209. package/core/actions/encrypt/encryptValue.ts +4 -1
  210. package/core/actions/encrypt/encryptValues.ts +5 -1
  211. package/core/actions/encrypt/generateZkProof.ts +2 -1
  212. package/core/actions/host/readKmsVerifierContractData.ts +2 -2
  213. package/core/base/cachedFetch.ts +1 -1
  214. package/core/handle/FheType.ts +11 -0
  215. package/core/host-contracts/HostContractVersion-p.ts +12 -0
  216. package/core/host-contracts/KmsSignersContext-p.ts +29 -36
  217. package/core/host-contracts/getKmsContextSignersAndThreshold-p.ts +1 -0
  218. package/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.ts +10 -7
  219. package/core/host-contracts/readKmsSignersContext-p.ts +156 -115
  220. package/core/kms/KmsSigncryptedShares-p.ts +87 -4
  221. package/core/kms/PublicDecryptionProof-p.ts +6 -4
  222. package/core/kms/SignedDecryptionPermitV1-p.ts +5 -47
  223. package/core/kms/SignedDecryptionPermitV2-p.ts +8 -25
  224. package/core/kms/createKmsDelegatedUserDecryptEip712V1.ts +5 -5
  225. package/core/kms/createKmsUserDecryptEip712V1.ts +9 -7
  226. package/core/kms/createKmsUserDecryptEip712V2.ts +6 -6
  227. package/core/kms/fetchKmsSigncryptedSharesV1-p.ts +27 -15
  228. package/core/kms/fetchKmsSigncryptedSharesV2-p.ts +2 -2
  229. package/core/kms/kmsExtraData-p.ts +374 -0
  230. package/core/kms/publicDecrypt.ts +8 -7
  231. package/core/kms/verifyKmsPublicDecryptEip712-p.ts +7 -5
  232. package/core/modules/decrypt/mock.ts +6 -6
  233. package/core/modules/decrypt/module/api-p.ts +7 -7
  234. package/core/modules/ethereum/types-ct.ts +25 -2
  235. package/core/modules/relayer/cleartext/fetchCoprocessorSignatures.ts +98 -15
  236. package/core/modules/relayer/cleartext/{fetchDelegatedUserDecrypt.ts → fetchDelegatedUserDecryptV1.ts} +115 -27
  237. package/core/modules/relayer/cleartext/fetchPublicDecrypt.ts +112 -6
  238. package/core/modules/relayer/cleartext/fetchUserDecrypt.ts +24 -132
  239. package/core/modules/relayer/cleartext/fetchUserDecryptV1.ts +229 -0
  240. package/core/modules/relayer/cleartext/fetchUserDecryptV2.ts +11 -0
  241. package/core/modules/relayer/cleartext/forgeFhevmV1.ts +185 -0
  242. package/core/modules/relayer/cleartext/mock.ts +1 -1
  243. package/core/modules/relayer/cleartext/signers.ts +35 -0
  244. package/core/types/kms-p.ts +16 -1
  245. package/ethers/internal/ethereum-ct.ts +15 -1
  246. package/ethers/internal/runtime-ct.ts +9 -7
  247. package/package.json +1 -1
  248. package/viem/internal/ethereum-ct.ts +14 -2
  249. package/viem/internal/runtime-ct.ts +9 -7
  250. package/_cjs/core/kms/kmsExtraData.js +0 -82
  251. package/_cjs/core/kms/kmsExtraData.js.map +0 -1
  252. package/_cjs/core/modules/relayer/cleartext/fetchDelegatedUserDecrypt.js.map +0 -1
  253. package/_esm/core/kms/kmsExtraData.js +0 -99
  254. package/_esm/core/kms/kmsExtraData.js.map +0 -1
  255. package/_esm/core/modules/relayer/cleartext/fetchDelegatedUserDecrypt.js.map +0 -1
  256. package/_types/core/kms/kmsExtraData.d.ts +0 -25
  257. package/_types/core/kms/kmsExtraData.d.ts.map +0 -1
  258. package/_types/core/modules/relayer/cleartext/fetchDelegatedUserDecrypt.d.ts.map +0 -1
  259. package/core/kms/kmsExtraData.ts +0 -127
@@ -0,0 +1,229 @@
1
+ import type { BytesHex, ChecksummedAddress, Uint32BigInt } from '../../../types/primitives.js';
2
+ import type { FetchUserDecryptResultItem } from '../../../types/relayer.js';
3
+ import type { CleartextEthereumModule } from '../../ethereum/types-ct.js';
4
+ import type { FetchUserDecryptParametersV1, FetchUserDecryptReturnType, RelayerClientWithRuntime } from '../types.js';
5
+ import type { KmsSignersContext } from '../../../types/kmsSignersContext.js';
6
+ import { remove0x } from '../../../base/string.js';
7
+ import { asUint32BigInt, tryParseUintBigIntString, randomUniqueUints } from '../../../base/uint.js';
8
+ import { getTrustedClient } from '../../../runtime/CoreFhevm-p.js';
9
+ import { userDecryptResultToKmsSigncryptedShares } from '../utils.js';
10
+ import { getKmsSignersPrivateKeyMap } from './signers.js';
11
+ import { readCurrentKmsSignersContext } from '../../../host-contracts/readKmsSignersContext-p.js';
12
+ import { isForgeFhevmV1, readPlaintexts, xorMaskWithPublicKey } from './forgeFhevmV1.js';
13
+
14
+ ////////////////////////////////////////////////////////////////////////////////
15
+ // runUserDecryptOffChain
16
+ ////////////////////////////////////////////////////////////////////////////////
17
+
18
+ async function runUserDecryptOffChain(
19
+ relayerClient: RelayerClientWithRuntime,
20
+ payload: FetchUserDecryptParametersV1['payload'],
21
+ ): Promise<{
22
+ readonly commonKmsSigncryptedSharePayload: BytesHex;
23
+ readonly signersAddress: readonly ChecksummedAddress[];
24
+ readonly threshold: Uint32BigInt;
25
+ readonly extraData: BytesHex;
26
+ }> {
27
+ const { kmsDecryptEip712Message } = payload;
28
+ const pairs = payload.handleContractPairs;
29
+ const trustedClient = getTrustedClient(relayerClient);
30
+
31
+ const rawCleartexts = await readPlaintexts(
32
+ relayerClient,
33
+ trustedClient,
34
+ pairs.map((p) => p.handle),
35
+ );
36
+
37
+ const currentKmsSignersContext: KmsSignersContext = await readCurrentKmsSignersContext(relayerClient, {
38
+ kmsVerifierAddress: relayerClient.chain.fhevm.contracts.kmsVerifier.address as ChecksummedAddress,
39
+ protocolConfigAddress: relayerClient.chain.fhevm.contracts.protocolConfig?.address as
40
+ | ChecksummedAddress
41
+ | undefined,
42
+ });
43
+ const signersAddress = currentKmsSignersContext.signers;
44
+ const threshold = currentKmsSignersContext.threshold;
45
+
46
+ const maskedCleartexts = xorMaskWithPublicKey(kmsDecryptEip712Message.publicKey, rawCleartexts);
47
+
48
+ // extraData: the permit's message.extraData is already asserted equal to the
49
+ // current KmsSignersContext extraData by the caller (fetchKmsSigncryptedSharesV1
50
+ // step 9), so reusing it keeps the shares consistent with that context.
51
+ const extraData = kmsDecryptEip712Message.extraData;
52
+
53
+ const commonKmsSigncryptedSharePayload = relayerClient.runtime.ethereum.encode({
54
+ types: ['uint256[]', 'bytes'],
55
+ values: [maskedCleartexts, extraData],
56
+ });
57
+
58
+ return {
59
+ signersAddress,
60
+ threshold: BigInt(threshold) as Uint32BigInt,
61
+ commonKmsSigncryptedSharePayload,
62
+ extraData,
63
+ };
64
+ }
65
+
66
+ ////////////////////////////////////////////////////////////////////////////////
67
+ // runUserDecryptOnChain
68
+ ////////////////////////////////////////////////////////////////////////////////
69
+
70
+ const userDecryptAbi = [
71
+ {
72
+ type: 'function',
73
+ name: 'userDecrypt',
74
+ inputs: [
75
+ {
76
+ name: 'pairs',
77
+ type: 'tuple[]',
78
+ internalType: 'struct HandleContractPair[]',
79
+ components: [
80
+ { name: 'handle', type: 'bytes32', internalType: 'bytes32' },
81
+ {
82
+ name: 'contractAddress',
83
+ type: 'address',
84
+ internalType: 'address',
85
+ },
86
+ ],
87
+ },
88
+ { name: 'userAddress', type: 'address', internalType: 'address' },
89
+ { name: 'publicKey', type: 'bytes', internalType: 'bytes' },
90
+ {
91
+ name: 'contractAddresses',
92
+ type: 'address[]',
93
+ internalType: 'address[]',
94
+ },
95
+ {
96
+ name: 'startTimestamp',
97
+ type: 'uint256',
98
+ internalType: 'uint256',
99
+ },
100
+ {
101
+ name: 'durationDays',
102
+ type: 'uint256',
103
+ internalType: 'uint256',
104
+ },
105
+ { name: 'userSignature', type: 'bytes', internalType: 'bytes' },
106
+ ],
107
+ outputs: [
108
+ { name: 'payload', type: 'bytes', internalType: 'bytes' },
109
+ { name: 'signers', type: 'address[]', internalType: 'address[]' },
110
+ { name: 'threshold', type: 'uint256', internalType: 'uint256' },
111
+ { name: 'extraData', type: 'bytes', internalType: 'bytes' },
112
+ ],
113
+ stateMutability: 'view',
114
+ },
115
+ ] as const;
116
+
117
+ async function runUserDecryptOnChain(
118
+ relayerClient: RelayerClientWithRuntime,
119
+ payload: FetchUserDecryptParametersV1['payload'],
120
+ ): Promise<{
121
+ readonly commonKmsSigncryptedSharePayload: BytesHex;
122
+ readonly signersAddress: readonly ChecksummedAddress[];
123
+ readonly threshold: Uint32BigInt;
124
+ readonly extraData: BytesHex;
125
+ }> {
126
+ const { kmsDecryptEip712Message, kmsDecryptEip712Signer, kmsDecryptEip712Signature } = payload;
127
+ const pairs = payload.handleContractPairs;
128
+ const trustedClient = getTrustedClient(relayerClient);
129
+ const res = (await relayerClient.runtime.ethereum.readContract(trustedClient, {
130
+ abi: userDecryptAbi,
131
+ address: relayerClient.chain.fhevm.contracts.kmsVerifier.address as ChecksummedAddress,
132
+ args: [
133
+ pairs.map((p) => ({
134
+ handle: p.handle.bytes32Hex,
135
+ contractAddress: p.contractAddress,
136
+ })),
137
+ kmsDecryptEip712Signer,
138
+ kmsDecryptEip712Message.publicKey,
139
+ kmsDecryptEip712Message.contractAddresses,
140
+ _parseUintBigIntString('kmsDecryptEip712Message.startTimestamp', kmsDecryptEip712Message.startTimestamp),
141
+ _parseUintBigIntString('kmsDecryptEip712Message.durationDays', kmsDecryptEip712Message.durationDays),
142
+ kmsDecryptEip712Signature,
143
+ ],
144
+ functionName: userDecryptAbi[0].name,
145
+ })) as unknown[];
146
+
147
+ const commonKmsSigncryptedSharePayload = res[0] as BytesHex;
148
+ const signersAddress = res[1] as readonly ChecksummedAddress[];
149
+ const threshold = asUint32BigInt(res[2]);
150
+ const extraData = res[3] as BytesHex;
151
+
152
+ return {
153
+ commonKmsSigncryptedSharePayload,
154
+ signersAddress,
155
+ threshold,
156
+ extraData,
157
+ };
158
+ }
159
+
160
+ ////////////////////////////////////////////////////////////////////////////////
161
+
162
+ export async function fetchUserDecryptV1(
163
+ relayerClient: RelayerClientWithRuntime,
164
+ parameters: FetchUserDecryptParametersV1,
165
+ ): Promise<FetchUserDecryptReturnType> {
166
+ const cleartextEthereumModule = relayerClient.runtime.ethereum as CleartextEthereumModule;
167
+ const { payload } = parameters;
168
+ const pairs = payload.handleContractPairs;
169
+ const contractAddresses = payload.kmsDecryptEip712Message.contractAddresses;
170
+
171
+ const authCount = contractAddresses.length;
172
+ for (const { contractAddress: c } of pairs) {
173
+ let authorized: boolean = false;
174
+ for (let i = 0; i < authCount; ++i) {
175
+ if (contractAddresses[i] == c) {
176
+ authorized = true;
177
+ break;
178
+ }
179
+ }
180
+ if (!authorized) {
181
+ throw new Error(`ContractAddressNotAuthorized: ${c} is not in the EIP-712 authorized contractAddresses list.`);
182
+ }
183
+ }
184
+
185
+ const offChain = await isForgeFhevmV1(relayerClient);
186
+
187
+ let res;
188
+ if (offChain) {
189
+ res = await runUserDecryptOffChain(relayerClient, payload);
190
+ } else {
191
+ res = await runUserDecryptOnChain(relayerClient, payload);
192
+ }
193
+
194
+ const commonKmsSigncryptedSharePayload = res.commonKmsSigncryptedSharePayload;
195
+ const extraData = res.extraData;
196
+ const threshold = res.threshold;
197
+ const signersAddress = res.signersAddress;
198
+
199
+ const signers = getKmsSignersPrivateKeyMap(relayerClient);
200
+
201
+ const randomSignersAddress = randomUniqueUints(signersAddress.length, Number(threshold)).map(
202
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
203
+ (i) => signersAddress[i]!,
204
+ );
205
+
206
+ const result: FetchUserDecryptResultItem[] = [];
207
+
208
+ for (const signerAddress of randomSignersAddress) {
209
+ const privateKey = signers.get(signerAddress);
210
+ if (privateKey === undefined) {
211
+ throw new Error(`Unable to find KMS signer for address ${signerAddress}`);
212
+ }
213
+
214
+ const signature = await cleartextEthereumModule.sign({ hash: commonKmsSigncryptedSharePayload, privateKey });
215
+ result.push({ signature: remove0x(signature), payload: remove0x(commonKmsSigncryptedSharePayload), extraData });
216
+ }
217
+
218
+ return userDecryptResultToKmsSigncryptedShares(result);
219
+ }
220
+
221
+ ////////////////////////////////////////////////////////////////////////////////
222
+
223
+ function _parseUintBigIntString(label: string, value: string): bigint {
224
+ const bn = tryParseUintBigIntString(value);
225
+ if (bn === undefined) {
226
+ throw new Error(`${label} is not a valid uint string, got ${JSON.stringify(value)}`);
227
+ }
228
+ return bn;
229
+ }
@@ -0,0 +1,11 @@
1
+ import type { FetchUserDecryptParametersV2, FetchUserDecryptReturnType, RelayerClientWithRuntime } from '../types.js';
2
+
3
+ ////////////////////////////////////////////////////////////////////////////////
4
+
5
+ // eslint-disable-next-line @typescript-eslint/require-await
6
+ export async function fetchUserDecryptV2(
7
+ _relayerClient: RelayerClientWithRuntime,
8
+ _parameters: FetchUserDecryptParametersV2,
9
+ ): Promise<FetchUserDecryptReturnType> {
10
+ throw new Error('Not yet implemented');
11
+ }
@@ -0,0 +1,185 @@
1
+ import type { Address, BytesHex, ChecksummedAddress } from '../../../types/primitives.js';
2
+ import type { Handle } from '../../../types/encryptedTypes-p.js';
3
+ import type { CleartextEthereumModule } from '../../ethereum/types-ct.js';
4
+ import type { TrustedClient } from '../../ethereum/types.js';
5
+ import type { RelayerClientWithRuntime } from '../types.js';
6
+ import type { KmsSignersContext } from '../../../types/kmsSignersContext.js';
7
+ import { remove0x } from '../../../base/string.js';
8
+ import { addressToChecksummedAddress } from '../../../base/address.js';
9
+ import { createCachedFetch } from '../../../base/cachedFetch.js';
10
+ import { getFHEVMExecutorAddressAbi } from '../../../host-contracts/abi-fragments/fragments.js';
11
+ import { readCurrentKmsSignersContext } from '../../../host-contracts/readKmsSignersContext-p.js';
12
+ import { isForgeFhevmV1KmsSigner } from './signers.js';
13
+
14
+ ////////////////////////////////////////////////////////////////////////////////
15
+ //
16
+ // Option B — cleartext "disabled KMSVerifier" plaintext source.
17
+ //
18
+ // The cleartext mock relayer used to read masked cleartexts + the KMS payload
19
+ // from the `Cleartext*KMSVerifier` view. That view required the full `Cleartext*`
20
+ // host set, which partners deploying only forge-fhevm do not have. Instead we
21
+ // read the raw plaintext straight from `CleartextFHEVMExecutor.plaintexts` (the
22
+ // mapping forge-fhevm populates) and rebuild the KMS wire format off-chain,
23
+ // reusing the already-local KMS signing. Only the *plaintext source* moves;
24
+ // everything downstream (masking, signing, reconstruct) is unchanged.
25
+ //
26
+ ////////////////////////////////////////////////////////////////////////////////
27
+
28
+ // CleartextFHEVMExecutor.plaintexts(bytes32) — the handle→cleartext mirror.
29
+ const plaintextsAbi = [
30
+ {
31
+ type: 'function',
32
+ name: 'plaintexts',
33
+ inputs: [{ name: 'handle', type: 'bytes32', internalType: 'bytes32' }],
34
+ outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
35
+ stateMutability: 'view',
36
+ },
37
+ ] as const;
38
+
39
+ ////////////////////////////////////////////////////////////////////////////////
40
+
41
+ export async function isForgeFhevmV1(relayerClient: RelayerClientWithRuntime): Promise<boolean> {
42
+ const currentKmsSignersContext: KmsSignersContext = await readCurrentKmsSignersContext(relayerClient, {
43
+ kmsVerifierAddress: relayerClient.chain.fhevm.contracts.kmsVerifier.address as ChecksummedAddress,
44
+ protocolConfigAddress: relayerClient.chain.fhevm.contracts.protocolConfig?.address as
45
+ | ChecksummedAddress
46
+ | undefined,
47
+ });
48
+ return currentKmsSignersContext.signers.length === 1 && isForgeFhevmV1KmsSigner(currentKmsSignersContext.signers[0]);
49
+ }
50
+
51
+ ////////////////////////////////////////////////////////////////////////////////
52
+
53
+ type ReadCleartextExecutorAddressContext = {
54
+ readonly relayerClient: RelayerClientWithRuntime;
55
+ readonly trustedClient: TrustedClient;
56
+ };
57
+
58
+ // ACL → FHEVMExecutor is immutable per deployment, so the lookup is cached
59
+ // permanently (no TTL). Keyed by ACL address (lowercase) + chainId so distinct
60
+ // deployments/chains never collide, and concurrent callers share one in-flight read.
61
+ const cachedReadCleartextExecutorAddress = createCachedFetch<
62
+ ReadCleartextExecutorAddressContext,
63
+ Record<string, never>,
64
+ ChecksummedAddress
65
+ >({
66
+ executeFn: async ({ relayerClient, trustedClient }) => {
67
+ const res = await relayerClient.runtime.ethereum.readContract(trustedClient, {
68
+ abi: getFHEVMExecutorAddressAbi,
69
+ address: relayerClient.chain.fhevm.contracts.acl.address as ChecksummedAddress,
70
+ args: [],
71
+ functionName: getFHEVMExecutorAddressAbi[0].name,
72
+ });
73
+ return addressToChecksummedAddress(res as Address);
74
+ },
75
+ cacheKeyFn: ({ relayerClient }) =>
76
+ `${(relayerClient.chain.fhevm.contracts.acl.address as string).toLowerCase()}:${relayerClient.chain.id}`,
77
+ });
78
+
79
+ async function readCleartextExecutorAddress(
80
+ relayerClient: RelayerClientWithRuntime,
81
+ trustedClient: TrustedClient,
82
+ ): Promise<ChecksummedAddress> {
83
+ return cachedReadCleartextExecutorAddress.execute({ relayerClient, trustedClient }, {});
84
+ }
85
+
86
+ /**
87
+ * Reads the cleartext uint256 recorded for each handle from
88
+ * `CleartextFHEVMExecutor.plaintexts`. Authorization (ACL) is enforced by the
89
+ * decrypt caller before the relayer is invoked, matching the on-chain view which
90
+ * gated reads through `CleartextACL`.
91
+ */
92
+ export async function readPlaintexts(
93
+ relayerClient: RelayerClientWithRuntime,
94
+ trustedClient: TrustedClient,
95
+ handles: readonly Handle[],
96
+ ): Promise<bigint[]> {
97
+ const executorAddress = await readCleartextExecutorAddress(relayerClient, trustedClient);
98
+
99
+ const cleartexts: bigint[] = [];
100
+ for (const handle of handles) {
101
+ const res = await relayerClient.runtime.ethereum.readContract(trustedClient, {
102
+ abi: plaintextsAbi,
103
+ address: executorAddress,
104
+ args: [handle.bytes32Hex],
105
+ functionName: plaintextsAbi[0].name,
106
+ });
107
+ cleartexts.push(res as bigint);
108
+ }
109
+ return cleartexts;
110
+ }
111
+
112
+ // /**
113
+ // * Reads the registered KMS signer set and threshold from the standard KMSVerifier
114
+ // * (which forge-fhevm implements). These replace the `signers` / `threshold` the
115
+ // * `Cleartext*KMSVerifier` view used to return.
116
+ // */
117
+ // export async function readKmsSignersAndThreshold(
118
+ // relayerClient: RelayerClientWithRuntime,
119
+ // trustedClient: TrustedClient,
120
+ // ): Promise<{ signers: readonly ChecksummedAddress[]; threshold: bigint }> {
121
+ // const kmsVerifierAddress = relayerClient.chain.fhevm.contracts.kmsVerifier.address as ChecksummedAddress;
122
+
123
+ // const signersRes = await relayerClient.runtime.ethereum.readContract(trustedClient, {
124
+ // abi: getKmsSignersAbi,
125
+ // address: kmsVerifierAddress,
126
+ // args: [],
127
+ // functionName: getKmsSignersAbi[0].name,
128
+ // });
129
+
130
+ // const thresholdRes = await relayerClient.runtime.ethereum.readContract(trustedClient, {
131
+ // abi: getThresholdAbi,
132
+ // address: kmsVerifierAddress,
133
+ // args: [],
134
+ // functionName: getThresholdAbi[0].name,
135
+ // });
136
+
137
+ // const signers = (signersRes as readonly Address[]).map(addressToChecksummedAddress);
138
+ // return { signers, threshold: asUint32BigInt(thresholdRes) };
139
+ // }
140
+
141
+ /**
142
+ * Reversible mask that replicates `CleartextKMSVerifier._xorMaskWithPublicKey`:
143
+ * XORs each cleartext with the first 32 bytes of the user's public key. The
144
+ * client reverses it in `decrypt/mock.ts:_xorUnmaskWithPublicKey` with the same
145
+ * 32 bytes. NOT real encryption — only the cleartext wire format.
146
+ */
147
+ export function xorMaskWithPublicKey(publicKey: BytesHex, cleartexts: readonly bigint[]): bigint[] {
148
+ const hex = remove0x(publicKey);
149
+ if (hex.length < 64) {
150
+ throw new Error(`PublicKeyTooShort: publicKey has ${hex.length / 2} bytes, need >= 32`);
151
+ }
152
+ const mask = BigInt('0x' + hex.slice(0, 64));
153
+ return cleartexts.map((c) => c ^ mask);
154
+ }
155
+
156
+ /**
157
+ * Replicates `CleartextKMSVerifier._encodeTypedCleartexts`: each cleartext is cast
158
+ * to its FHE-natural type (bool → 0/1, address → uint160, else uint256) and packed
159
+ * into a 32-byte word. For these static value types `abi.encode(v0, …, vn)` is
160
+ * byte-identical to the packed layout, and it round-trips through the proof's
161
+ * `decode(handle.solidityPrimitiveTypeName[], …)`.
162
+ */
163
+ export function encodeTypedCleartexts(
164
+ ethereumModule: CleartextEthereumModule,
165
+ handles: readonly Handle[],
166
+ cleartexts: readonly bigint[],
167
+ ): BytesHex {
168
+ const words = handles.map((handle, i) => {
169
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
170
+ const value = cleartexts[i]!;
171
+ switch (handle.solidityPrimitiveTypeName) {
172
+ case 'bool':
173
+ return value !== 0n ? 1n : 0n;
174
+ case 'address':
175
+ return value & ((1n << 160n) - 1n);
176
+ case 'uint256':
177
+ return value;
178
+ }
179
+ });
180
+
181
+ return ethereumModule.encode({
182
+ types: words.map(() => 'uint256'),
183
+ values: words,
184
+ });
185
+ }
@@ -9,7 +9,7 @@ import type {
9
9
  import { createDeadbeefBytes } from '../../../base/bytes.js';
10
10
  import { fetchUserDecrypt } from './fetchUserDecrypt.js';
11
11
  import { fetchPublicDecrypt } from './fetchPublicDecrypt.js';
12
- import { fetchDelegatedUserDecrypt } from './fetchDelegatedUserDecrypt.js';
12
+ import { fetchDelegatedUserDecrypt } from './fetchDelegatedUserDecryptV1.js';
13
13
  import { fetchCoprocessorSignatures } from './fetchCoprocessorSignatures.js';
14
14
 
15
15
  ////////////////////////////////////////////////////////////////////////////////
@@ -8,6 +8,36 @@ const FHEVM_TEST_MNEMONIC = 'test test test test test test test future home engi
8
8
  const COPROCESSOR_PATH = "0'/2/";
9
9
  const KMS_PATH = "0'/3/";
10
10
 
11
+ ////////////////////////////////////////////////////////////////////////////////
12
+ //
13
+ // forge-fhevm v1
14
+ // --------------
15
+ //
16
+ // forge-fhevm v1 registers a single KMS signer and a single coprocessor signer from
17
+ // these deploy-default private keys (`KMS_SIGNER_PRIVATE_KEY_0` /
18
+ // `COPROCESSOR_SIGNER_PRIVATE_KEY_0` in `deploy-local.sh`). They are NOT derivable
19
+ // from `FHEVM_TEST_MNEMONIC`, so a cleartext client running against a forge-fhevm v1
20
+ // deployment must know them explicitly: the on-chain `getKmsSigners()` returns
21
+ // these addresses and the cleartext relayer signs shares with `map.get(address)`.
22
+ //
23
+ ////////////////////////////////////////////////////////////////////////////////
24
+
25
+ const FORGE_FHEVM_V1_COPROCESSOR_SIGNER: { readonly address: ChecksummedAddress; readonly privateKey: BytesHex } = {
26
+ address: '0xc9990FEfE0c27D31D0C2aa36196b085c0c4d456c' as ChecksummedAddress,
27
+ privateKey: '0x7ec8ada6642fc4ccfb7729bc29c17cf8d21b61abd5642d1db992c0b8672ab901' as BytesHex,
28
+ };
29
+
30
+ const FORGE_FHEVM_V1_KMS_SIGNER: { readonly address: ChecksummedAddress; readonly privateKey: BytesHex } = {
31
+ address: '0x0971C80fF03B428fD2094dd5354600ab103201C5' as ChecksummedAddress,
32
+ privateKey: '0x388b7680e4e1afa06efbfd45cdd1fe39f3c6af381df6555a19661f283b97de91' as BytesHex,
33
+ };
34
+
35
+ export function isForgeFhevmV1KmsSigner(signerAddress: string | undefined): boolean {
36
+ return signerAddress?.toLowerCase() === FORGE_FHEVM_V1_KMS_SIGNER.address.toLowerCase();
37
+ }
38
+
39
+ ////////////////////////////////////////////////////////////////////////////////
40
+
11
41
  type PrivateKeyMap = Map<ChecksummedAddress, BytesHex>;
12
42
 
13
43
  const signersPrivateKeyMap: { readonly coprocessor: PrivateKeyMap; readonly kms: PrivateKeyMap } = {
@@ -20,6 +50,10 @@ const signersPrivateKeyMap: { readonly coprocessor: PrivateKeyMap; readonly kms:
20
50
  export function getCoprocessorSignersPrivateKeyMap(relayerClient: RelayerClientWithRuntime): PrivateKeyMap {
21
51
  if (signersPrivateKeyMap.coprocessor.size === 0) {
22
52
  _fillSignersPrivateKey(relayerClient, COPROCESSOR_PATH, 20, signersPrivateKeyMap.coprocessor);
53
+ signersPrivateKeyMap.coprocessor.set(
54
+ FORGE_FHEVM_V1_COPROCESSOR_SIGNER.address,
55
+ FORGE_FHEVM_V1_COPROCESSOR_SIGNER.privateKey,
56
+ );
23
57
  }
24
58
  return signersPrivateKeyMap.coprocessor;
25
59
  }
@@ -29,6 +63,7 @@ export function getCoprocessorSignersPrivateKeyMap(relayerClient: RelayerClientW
29
63
  export function getKmsSignersPrivateKeyMap(relayerClient: RelayerClientWithRuntime): PrivateKeyMap {
30
64
  if (signersPrivateKeyMap.kms.size === 0) {
31
65
  _fillSignersPrivateKey(relayerClient, KMS_PATH, 20, signersPrivateKeyMap.kms);
66
+ signersPrivateKeyMap.kms.set(FORGE_FHEVM_V1_KMS_SIGNER.address, FORGE_FHEVM_V1_KMS_SIGNER.privateKey);
32
67
  }
33
68
  return signersPrivateKeyMap.kms;
34
69
  }
@@ -2,7 +2,15 @@ import type { TkmsVersion } from '../../wasm/tkms/KmsLibApi.js';
2
2
  import type { Handle } from './encryptedTypes-p.js';
3
3
  import type { KmsEip712Domain } from './kms.js';
4
4
  import type { KmsSignersContext } from './kmsSignersContext.js';
5
- import type { Bytes65Hex, Bytes65HexNo0x, BytesHexNo0x, ChecksummedAddress } from './primitives.js';
5
+ import type {
6
+ Bytes65Hex,
7
+ Bytes65HexNo0x,
8
+ BytesHex,
9
+ BytesHexNo0x,
10
+ ChecksummedAddress,
11
+ Uint256BigInt,
12
+ Uint8Number,
13
+ } from './primitives.js';
6
14
 
7
15
  export interface KmsSigncryptedSharesMetadata {
8
16
  readonly kmsSignersContext: KmsSignersContext;
@@ -18,3 +26,10 @@ export interface KmsSigncryptedShare {
18
26
  readonly signature: Bytes65HexNo0x;
19
27
  readonly extraData: BytesHexNo0x;
20
28
  }
29
+
30
+ export interface KmsExtraData {
31
+ readonly version: Uint8Number;
32
+ readonly kmsContextId: Uint256BigInt;
33
+ readonly kmsEpochId: Uint256BigInt;
34
+ toBytesHex(): BytesHex;
35
+ }
@@ -3,6 +3,8 @@ import type {
3
3
  GeneratePrivateKeyReturnType,
4
4
  GetPublicKeyParameters,
5
5
  GetPublicKeyReturnType,
6
+ HashTypedDataParameters,
7
+ HashTypedDataReturnType,
6
8
  MnemonicToAccountParameters,
7
9
  MnemonicToAccountReturnType,
8
10
  RecoverAddressParameters,
@@ -11,6 +13,7 @@ import type {
11
13
  SignReturnType,
12
14
  } from '../../core/modules/ethereum/types-ct.js';
13
15
  import type { BytesHex, ChecksummedAddress } from '../../core/types/primitives.js';
16
+ import type { TypedDataField } from 'ethers';
14
17
  import {
15
18
  decode,
16
19
  encode,
@@ -20,8 +23,9 @@ import {
20
23
  recoverTypedDataAddress,
21
24
  signTypedData,
22
25
  } from './ethereum.js';
23
- import { SigningKey, HDNodeWallet, Wallet } from 'ethers';
26
+ import { SigningKey, HDNodeWallet, Wallet, TypedDataEncoder } from 'ethers';
24
27
  import { sign, recoverAddress } from '../../core/base/sign.js';
28
+ import { asBytes32Hex } from '../../core/base/bytes.js';
25
29
 
26
30
  ////////////////////////////////////////////////////////////////////////////////
27
31
 
@@ -56,6 +60,16 @@ export const cleartextEthereumModule: CleartextEthereumModuleFactory = () => {
56
60
  const recoveredAddress = recoverAddress(parameters);
57
61
  return Promise.resolve(recoveredAddress);
58
62
  },
63
+ hashTypedData: (parameters: HashTypedDataParameters): HashTypedDataReturnType => {
64
+ const primaryTypeFields = parameters.types[parameters.primaryType];
65
+ if (primaryTypeFields === undefined) {
66
+ throw new Error(`Primary type "${parameters.primaryType}" not found in types`);
67
+ }
68
+ const typesToHash: Record<string, TypedDataField[]> = {
69
+ [parameters.primaryType]: [...primaryTypeFields],
70
+ };
71
+ return asBytes32Hex(TypedDataEncoder.hash(parameters.domain, typesToHash, parameters.message));
72
+ },
59
73
  }),
60
74
  });
61
75
  };
@@ -15,14 +15,16 @@ export function getCleartextEthersRuntime(): FhevmRuntime {
15
15
  throw new Error('Call setFhevmRuntimeConfig first.');
16
16
  }
17
17
 
18
- const em = cleartextEthereumModule();
19
- const rm = cleartextRelayerModule();
18
+ if (ethersFhevmRuntime === undefined) {
19
+ const em = cleartextEthereumModule();
20
+ const rm = cleartextRelayerModule();
20
21
 
21
- ethersFhevmRuntime ??= createFhevmRuntime({
22
- ethereum: em.ethereum,
23
- relayer: rm.relayer,
24
- config: getFhevmRuntimeConfig(),
25
- });
22
+ ethersFhevmRuntime = createFhevmRuntime({
23
+ ethereum: em.ethereum,
24
+ relayer: rm.relayer,
25
+ config: getFhevmRuntimeConfig(),
26
+ });
27
+ }
26
28
 
27
29
  return ethersFhevmRuntime;
28
30
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fhevm/sdk",
3
3
  "description": "TypeScript Interface for FHEVM",
4
- "version": "1.1.0-alpha.7",
4
+ "version": "1.1.0-alpha.8",
5
5
  "type": "module",
6
6
  "main": "./_cjs/index.js",
7
7
  "module": "./_esm/index.js",
@@ -3,6 +3,8 @@ import type {
3
3
  GeneratePrivateKeyReturnType,
4
4
  GetPublicKeyParameters,
5
5
  GetPublicKeyReturnType,
6
+ HashTypedDataParameters,
7
+ HashTypedDataReturnType,
6
8
  MnemonicToAccountParameters,
7
9
  MnemonicToAccountReturnType,
8
10
  RecoverAddressParameters,
@@ -21,8 +23,8 @@ import {
21
23
  recoverTypedDataAddress,
22
24
  signTypedData,
23
25
  } from './ethereum.js';
24
- import { bytesToHex } from '../../core/base/bytes.js';
25
- import { recoverAddress } from 'viem';
26
+ import { asBytes32Hex, bytesToHex } from '../../core/base/bytes.js';
27
+ import { hashTypedData, recoverAddress } from 'viem';
26
28
 
27
29
  ////////////////////////////////////////////////////////////////////////////////
28
30
 
@@ -56,6 +58,16 @@ export const cleartextEthereumModule: CleartextEthereumModuleFactory = () => {
56
58
  recoverAddress: (parameters: RecoverAddressParameters): Promise<RecoverAddressReturnType> => {
57
59
  return recoverAddress(parameters) as Promise<ChecksummedAddress>;
58
60
  },
61
+ hashTypedData: (parameters: HashTypedDataParameters): HashTypedDataReturnType => {
62
+ return asBytes32Hex(
63
+ hashTypedData({
64
+ domain: parameters.domain,
65
+ types: parameters.types as Record<string, Array<{ name: string; type: string }>>,
66
+ primaryType: parameters.primaryType,
67
+ message: parameters.message,
68
+ }),
69
+ );
70
+ },
59
71
  }),
60
72
  });
61
73
  };
@@ -15,14 +15,16 @@ export function getCleartextViemRuntime(): FhevmRuntime {
15
15
  throw new Error('Call setFhevmRuntimeConfig first.');
16
16
  }
17
17
 
18
- const em = cleartextEthereumModule();
19
- const rm = cleartextRelayerModule();
18
+ if (viemFhevmRuntime === undefined) {
19
+ const em = cleartextEthereumModule();
20
+ const rm = cleartextRelayerModule();
20
21
 
21
- viemFhevmRuntime ??= createFhevmRuntime({
22
- ethereum: em.ethereum,
23
- relayer: rm.relayer,
24
- config: getFhevmRuntimeConfig(),
25
- });
22
+ viemFhevmRuntime = createFhevmRuntime({
23
+ ethereum: em.ethereum,
24
+ relayer: rm.relayer,
25
+ config: getFhevmRuntimeConfig(),
26
+ });
27
+ }
26
28
 
27
29
  return viemFhevmRuntime;
28
30
  }