@fhevm/sdk 0.13.2 → 0.14.0-12

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 (322) hide show
  1. package/_cjs/core/_version.js +1 -1
  2. package/_cjs/core/_version.js.map +1 -1
  3. package/_cjs/core/actions/base/canUseUnifiedDecryptionPermit.js +11 -0
  4. package/_cjs/core/actions/base/canUseUnifiedDecryptionPermit.js.map +1 -0
  5. package/_cjs/core/actions/base/createUnsignedUnifiedDecryptionPermitEip712.js +0 -4
  6. package/_cjs/core/actions/base/createUnsignedUnifiedDecryptionPermitEip712.js.map +1 -1
  7. package/_cjs/core/actions/base/index.js +7 -1
  8. package/_cjs/core/actions/base/index.js.map +1 -1
  9. package/_cjs/core/actions/base/signUnifiedDecryptionPermit.js +10 -0
  10. package/_cjs/core/actions/base/signUnifiedDecryptionPermit.js.map +1 -0
  11. package/_cjs/core/actions/host/resolveChainId.js +3 -1
  12. package/_cjs/core/actions/host/resolveChainId.js.map +1 -1
  13. package/_cjs/core/clients/decorators/base.js +2 -0
  14. package/_cjs/core/clients/decorators/base.js.map +1 -1
  15. package/_cjs/core/errors/Erc1271Error.js +48 -0
  16. package/_cjs/core/errors/Erc1271Error.js.map +1 -0
  17. package/_cjs/core/frozenContext/fhevmClientFrozenContext-p.js.map +1 -1
  18. package/_cjs/core/frozenContext/resolveFhevmClientFrozenContext-p.js +11 -1
  19. package/_cjs/core/frozenContext/resolveFhevmClientFrozenContext-p.js.map +1 -1
  20. package/_cjs/core/host-contracts/readKmsSignersContext-p.js +0 -7
  21. package/_cjs/core/host-contracts/readKmsSignersContext-p.js.map +1 -1
  22. package/_cjs/core/key/FheEncryptionKeyCache-p.js +3 -0
  23. package/_cjs/core/key/FheEncryptionKeyCache-p.js.map +1 -1
  24. package/_cjs/core/key/fetchFheEncryptionKey.js +13 -1
  25. package/_cjs/core/key/fetchFheEncryptionKey.js.map +1 -1
  26. package/_cjs/core/kms/SignedDecryptionPermit-p.js +1 -27
  27. package/_cjs/core/kms/SignedDecryptionPermit-p.js.map +1 -1
  28. package/_cjs/core/kms/SignedDecryptionPermitV2-p.js +22 -14
  29. package/_cjs/core/kms/SignedDecryptionPermitV2-p.js.map +1 -1
  30. package/_cjs/core/kms/decryptValuesFromPairs.js +5 -14
  31. package/_cjs/core/kms/decryptValuesFromPairs.js.map +1 -1
  32. package/_cjs/core/kms/fetchKmsSigncryptedSharesV2-p.js +8 -0
  33. package/_cjs/core/kms/fetchKmsSigncryptedSharesV2-p.js.map +1 -1
  34. package/_cjs/core/modules/decrypt/module/api-p.js +1 -1
  35. package/_cjs/core/modules/decrypt/module/api-p.js.map +1 -1
  36. package/_cjs/core/modules/decrypt/module/init-p.js +7 -1
  37. package/_cjs/core/modules/decrypt/module/init-p.js.map +1 -1
  38. package/_cjs/core/modules/encrypt/module/init-p.js +14 -2
  39. package/_cjs/core/modules/encrypt/module/init-p.js.map +1 -1
  40. package/_cjs/core/modules/relayer/cleartext/mock.js +5 -0
  41. package/_cjs/core/modules/relayer/cleartext/mock.js.map +1 -1
  42. package/_cjs/core/modules/relayer/module/RelayerAsyncRequest.js +20 -0
  43. package/_cjs/core/modules/relayer/module/RelayerAsyncRequest.js.map +1 -1
  44. package/_cjs/core/modules/relayer/module/fetchCoprocessorSignatures.js +1 -0
  45. package/_cjs/core/modules/relayer/module/fetchCoprocessorSignatures.js.map +1 -1
  46. package/_cjs/core/modules/relayer/module/fetchDelegatedUserDecryptV1.js +1 -0
  47. package/_cjs/core/modules/relayer/module/fetchDelegatedUserDecryptV1.js.map +1 -1
  48. package/_cjs/core/modules/relayer/module/fetchFeatures.js +35 -0
  49. package/_cjs/core/modules/relayer/module/fetchFeatures.js.map +1 -0
  50. package/_cjs/core/modules/relayer/module/fetchPublicDecrypt.js +1 -0
  51. package/_cjs/core/modules/relayer/module/fetchPublicDecrypt.js.map +1 -1
  52. package/_cjs/core/modules/relayer/module/fetchUserDecryptV1.js +1 -0
  53. package/_cjs/core/modules/relayer/module/fetchUserDecryptV1.js.map +1 -1
  54. package/_cjs/core/modules/relayer/module/fetchUserDecryptV2.js +1 -0
  55. package/_cjs/core/modules/relayer/module/fetchUserDecryptV2.js.map +1 -1
  56. package/_cjs/core/modules/relayer/module/index.js +2 -0
  57. package/_cjs/core/modules/relayer/module/index.js.map +1 -1
  58. package/_cjs/core/relayerFeatures/ensureRelayerFeatures-p.js +25 -0
  59. package/_cjs/core/relayerFeatures/ensureRelayerFeatures-p.js.map +1 -0
  60. package/_cjs/core/relayerFeatures/resolveRelayerFeatures-p.js +7 -0
  61. package/_cjs/core/relayerFeatures/resolveRelayerFeatures-p.js.map +1 -0
  62. package/_cjs/core/runtime/CoreFhevm-p.js +58 -2
  63. package/_cjs/core/runtime/CoreFhevm-p.js.map +1 -1
  64. package/_cjs/core/runtime/HyperWasmSolver-p.js +44 -4
  65. package/_cjs/core/runtime/HyperWasmSolver-p.js.map +1 -1
  66. package/_cjs/core/runtime/ProtocolVersionResolver-p.js +10 -4
  67. package/_cjs/core/runtime/ProtocolVersionResolver-p.js.map +1 -1
  68. package/_cjs/core/runtime/initFhevmDecryptRuntime-p.js +1 -1
  69. package/_cjs/core/runtime/initFhevmDecryptRuntime-p.js.map +1 -1
  70. package/_cjs/core/runtime/initFhevmRuntime-p.js +1 -1
  71. package/_cjs/core/runtime/initFhevmRuntime-p.js.map +1 -1
  72. package/_cjs/core/runtime/sdkProtocolApiVersion.js +1 -1
  73. package/_cjs/core/runtime/sdkProtocolApiVersion.js.map +1 -1
  74. package/_cjs/core/utils-p/decrypt/verifyErc1271UserDecrypt-p.js +73 -0
  75. package/_cjs/core/utils-p/decrypt/verifyErc1271UserDecrypt-p.js.map +1 -0
  76. package/_cjs/ethers/internal/ethereum-ct.js +2 -11
  77. package/_cjs/ethers/internal/ethereum-ct.js.map +1 -1
  78. package/_cjs/ethers/internal/ethereum.js +33 -0
  79. package/_cjs/ethers/internal/ethereum.js.map +1 -1
  80. package/_cjs/ethers/internal/utils.js +17 -0
  81. package/_cjs/ethers/internal/utils.js.map +1 -1
  82. package/_cjs/viem/internal/ethereum-ct.js +2 -8
  83. package/_cjs/viem/internal/ethereum-ct.js.map +1 -1
  84. package/_cjs/viem/internal/ethereum.js +34 -4
  85. package/_cjs/viem/internal/ethereum.js.map +1 -1
  86. package/_cjs/wasm/tfhe/loadTfheLib.js.map +1 -1
  87. package/_cjs/wasm/tkms/KmsLibApi.d.ts +1 -1
  88. package/_cjs/wasm/tkms/loadKmsLib.js +13 -4
  89. package/_cjs/wasm/tkms/loadKmsLib.js.map +3 -3
  90. package/_cjs/wasm/tkms/v0.14.0-1/kms_lib.d.ts +598 -0
  91. package/_cjs/wasm/tkms/v0.14.0-1/kms_lib.js +1887 -0
  92. package/_cjs/wasm/tkms/v0.14.0-1/kms_lib.js.map +7 -0
  93. package/_cjs/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm +0 -0
  94. package/_cjs/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm.base64.d.ts +3 -0
  95. package/_cjs/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm.base64.js +35 -0
  96. package/_cjs/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm.base64.js.map +7 -0
  97. package/_esm/core/_version.js +1 -1
  98. package/_esm/core/_version.js.map +1 -1
  99. package/_esm/core/actions/base/canUseUnifiedDecryptionPermit.js +21 -0
  100. package/_esm/core/actions/base/canUseUnifiedDecryptionPermit.js.map +1 -0
  101. package/_esm/core/actions/base/createUnsignedUnifiedDecryptionPermitEip712.js +0 -4
  102. package/_esm/core/actions/base/createUnsignedUnifiedDecryptionPermitEip712.js.map +1 -1
  103. package/_esm/core/actions/base/index.js +9 -2
  104. package/_esm/core/actions/base/index.js.map +1 -1
  105. package/_esm/core/actions/base/signUnifiedDecryptionPermit.js +7 -0
  106. package/_esm/core/actions/base/signUnifiedDecryptionPermit.js.map +1 -0
  107. package/_esm/core/actions/host/resolveChainId.js +3 -1
  108. package/_esm/core/actions/host/resolveChainId.js.map +1 -1
  109. package/_esm/core/clients/decorators/base.js +2 -0
  110. package/_esm/core/clients/decorators/base.js.map +1 -1
  111. package/_esm/core/errors/Erc1271Error.js +45 -0
  112. package/_esm/core/errors/Erc1271Error.js.map +1 -0
  113. package/_esm/core/frozenContext/fhevmClientFrozenContext-p.js.map +1 -1
  114. package/_esm/core/frozenContext/resolveFhevmClientFrozenContext-p.js +12 -1
  115. package/_esm/core/frozenContext/resolveFhevmClientFrozenContext-p.js.map +1 -1
  116. package/_esm/core/host-contracts/readKmsSignersContext-p.js +9 -40
  117. package/_esm/core/host-contracts/readKmsSignersContext-p.js.map +1 -1
  118. package/_esm/core/key/FheEncryptionKeyCache-p.js +3 -0
  119. package/_esm/core/key/FheEncryptionKeyCache-p.js.map +1 -1
  120. package/_esm/core/key/fetchFheEncryptionKey.js +13 -1
  121. package/_esm/core/key/fetchFheEncryptionKey.js.map +1 -1
  122. package/_esm/core/kms/SignedDecryptionPermit-p.js +6 -47
  123. package/_esm/core/kms/SignedDecryptionPermit-p.js.map +1 -1
  124. package/_esm/core/kms/SignedDecryptionPermitV2-p.js +35 -21
  125. package/_esm/core/kms/SignedDecryptionPermitV2-p.js.map +1 -1
  126. package/_esm/core/kms/decryptValuesFromPairs.js +14 -32
  127. package/_esm/core/kms/decryptValuesFromPairs.js.map +1 -1
  128. package/_esm/core/kms/fetchKmsSigncryptedSharesV2-p.js +11 -0
  129. package/_esm/core/kms/fetchKmsSigncryptedSharesV2-p.js.map +1 -1
  130. package/_esm/core/modules/decrypt/module/api-p.js +5 -3
  131. package/_esm/core/modules/decrypt/module/api-p.js.map +1 -1
  132. package/_esm/core/modules/decrypt/module/init-p.js +7 -1
  133. package/_esm/core/modules/decrypt/module/init-p.js.map +1 -1
  134. package/_esm/core/modules/encrypt/module/init-p.js +14 -2
  135. package/_esm/core/modules/encrypt/module/init-p.js.map +1 -1
  136. package/_esm/core/modules/relayer/cleartext/mock.js +5 -0
  137. package/_esm/core/modules/relayer/cleartext/mock.js.map +1 -1
  138. package/_esm/core/modules/relayer/module/RelayerAsyncRequest.js +20 -0
  139. package/_esm/core/modules/relayer/module/RelayerAsyncRequest.js.map +1 -1
  140. package/_esm/core/modules/relayer/module/fetchCoprocessorSignatures.js +1 -0
  141. package/_esm/core/modules/relayer/module/fetchCoprocessorSignatures.js.map +1 -1
  142. package/_esm/core/modules/relayer/module/fetchDelegatedUserDecryptV1.js +1 -0
  143. package/_esm/core/modules/relayer/module/fetchDelegatedUserDecryptV1.js.map +1 -1
  144. package/_esm/core/modules/relayer/module/fetchFeatures.js +68 -0
  145. package/_esm/core/modules/relayer/module/fetchFeatures.js.map +1 -0
  146. package/_esm/core/modules/relayer/module/fetchPublicDecrypt.js +1 -0
  147. package/_esm/core/modules/relayer/module/fetchPublicDecrypt.js.map +1 -1
  148. package/_esm/core/modules/relayer/module/fetchUserDecryptV1.js +1 -0
  149. package/_esm/core/modules/relayer/module/fetchUserDecryptV1.js.map +1 -1
  150. package/_esm/core/modules/relayer/module/fetchUserDecryptV2.js +1 -0
  151. package/_esm/core/modules/relayer/module/fetchUserDecryptV2.js.map +1 -1
  152. package/_esm/core/modules/relayer/module/index.js +2 -0
  153. package/_esm/core/modules/relayer/module/index.js.map +1 -1
  154. package/_esm/core/relayerFeatures/ensureRelayerFeatures-p.js +61 -0
  155. package/_esm/core/relayerFeatures/ensureRelayerFeatures-p.js.map +1 -0
  156. package/_esm/core/relayerFeatures/resolveRelayerFeatures-p.js +15 -0
  157. package/_esm/core/relayerFeatures/resolveRelayerFeatures-p.js.map +1 -0
  158. package/_esm/core/runtime/CoreFhevm-p.js +61 -2
  159. package/_esm/core/runtime/CoreFhevm-p.js.map +1 -1
  160. package/_esm/core/runtime/HyperWasmSolver-p.js +51 -6
  161. package/_esm/core/runtime/HyperWasmSolver-p.js.map +1 -1
  162. package/_esm/core/runtime/ProtocolVersionResolver-p.js +10 -4
  163. package/_esm/core/runtime/ProtocolVersionResolver-p.js.map +1 -1
  164. package/_esm/core/runtime/initFhevmDecryptRuntime-p.js +1 -1
  165. package/_esm/core/runtime/initFhevmDecryptRuntime-p.js.map +1 -1
  166. package/_esm/core/runtime/initFhevmRuntime-p.js +1 -1
  167. package/_esm/core/runtime/initFhevmRuntime-p.js.map +1 -1
  168. package/_esm/core/runtime/sdkProtocolApiVersion.js +8 -9
  169. package/_esm/core/runtime/sdkProtocolApiVersion.js.map +1 -1
  170. package/_esm/core/utils-p/decrypt/verifyErc1271UserDecrypt-p.js +118 -0
  171. package/_esm/core/utils-p/decrypt/verifyErc1271UserDecrypt-p.js.map +1 -0
  172. package/_esm/ethers/internal/ethereum-ct.js +4 -13
  173. package/_esm/ethers/internal/ethereum-ct.js.map +1 -1
  174. package/_esm/ethers/internal/ethereum.js +45 -2
  175. package/_esm/ethers/internal/ethereum.js.map +1 -1
  176. package/_esm/ethers/internal/utils.js +20 -0
  177. package/_esm/ethers/internal/utils.js.map +1 -1
  178. package/_esm/viem/internal/ethereum-ct.js +5 -11
  179. package/_esm/viem/internal/ethereum-ct.js.map +1 -1
  180. package/_esm/viem/internal/ethereum.js +37 -0
  181. package/_esm/viem/internal/ethereum.js.map +1 -1
  182. package/_esm/wasm/tkms/KmsLibApi.d.ts +1 -1
  183. package/_esm/wasm/tkms/loadKmsLib.js +11 -2
  184. package/_esm/wasm/tkms/v0.14.0-1/kms_lib.d.ts +598 -0
  185. package/_esm/wasm/tkms/v0.14.0-1/kms_lib.js +2055 -0
  186. package/_esm/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm +0 -0
  187. package/_esm/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm.base64.d.ts +3 -0
  188. package/_esm/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm.base64.js +7 -0
  189. package/_types/core/_version.d.ts.map +1 -1
  190. package/_types/core/actions/base/canUseUnifiedDecryptionPermit.d.ts +23 -0
  191. package/_types/core/actions/base/canUseUnifiedDecryptionPermit.d.ts.map +1 -0
  192. package/_types/core/actions/base/createUnsignedUnifiedDecryptionPermitEip712.d.ts.map +1 -1
  193. package/_types/core/actions/base/index.d.ts +3 -0
  194. package/_types/core/actions/base/index.d.ts.map +1 -1
  195. package/_types/core/actions/base/signUnifiedDecryptionPermit.d.ts +17 -0
  196. package/_types/core/actions/base/signUnifiedDecryptionPermit.d.ts.map +1 -0
  197. package/_types/core/actions/host/resolveChainId.d.ts.map +1 -1
  198. package/_types/core/clients/decorators/base.d.ts +14 -0
  199. package/_types/core/clients/decorators/base.d.ts.map +1 -1
  200. package/_types/core/errors/Erc1271Error.d.ts +46 -0
  201. package/_types/core/errors/Erc1271Error.d.ts.map +1 -0
  202. package/_types/core/frozenContext/fhevmClientFrozenContext-p.d.ts.map +1 -1
  203. package/_types/core/frozenContext/resolveFhevmClientFrozenContext-p.d.ts.map +1 -1
  204. package/_types/core/host-contracts/readKmsSignersContext-p.d.ts +9 -14
  205. package/_types/core/host-contracts/readKmsSignersContext-p.d.ts.map +1 -1
  206. package/_types/core/key/FheEncryptionKeyCache-p.d.ts.map +1 -1
  207. package/_types/core/key/fetchFheEncryptionKey.d.ts.map +1 -1
  208. package/_types/core/kms/SignedDecryptionPermit-p.d.ts.map +1 -1
  209. package/_types/core/kms/SignedDecryptionPermitV2-p.d.ts.map +1 -1
  210. package/_types/core/kms/decryptValuesFromPairs.d.ts.map +1 -1
  211. package/_types/core/kms/fetchKmsSigncryptedSharesV2-p.d.ts.map +1 -1
  212. package/_types/core/modules/decrypt/module/api-p.d.ts.map +1 -1
  213. package/_types/core/modules/decrypt/module/init-p.d.ts.map +1 -1
  214. package/_types/core/modules/encrypt/module/init-p.d.ts.map +1 -1
  215. package/_types/core/modules/ethereum/types.d.ts +47 -2
  216. package/_types/core/modules/ethereum/types.d.ts.map +1 -1
  217. package/_types/core/modules/relayer/cleartext/mock.d.ts.map +1 -1
  218. package/_types/core/modules/relayer/module/RelayerAsyncRequest.d.ts +3 -0
  219. package/_types/core/modules/relayer/module/RelayerAsyncRequest.d.ts.map +1 -1
  220. package/_types/core/modules/relayer/module/fetchCoprocessorSignatures.d.ts.map +1 -1
  221. package/_types/core/modules/relayer/module/fetchDelegatedUserDecryptV1.d.ts.map +1 -1
  222. package/_types/core/modules/relayer/module/fetchFeatures.d.ts +26 -0
  223. package/_types/core/modules/relayer/module/fetchFeatures.d.ts.map +1 -0
  224. package/_types/core/modules/relayer/module/fetchPublicDecrypt.d.ts.map +1 -1
  225. package/_types/core/modules/relayer/module/fetchUserDecryptV1.d.ts.map +1 -1
  226. package/_types/core/modules/relayer/module/fetchUserDecryptV2.d.ts.map +1 -1
  227. package/_types/core/modules/relayer/module/index.d.ts.map +1 -1
  228. package/_types/core/modules/relayer/types.d.ts +14 -2
  229. package/_types/core/modules/relayer/types.d.ts.map +1 -1
  230. package/_types/core/relayerFeatures/ensureRelayerFeatures-p.d.ts +55 -0
  231. package/_types/core/relayerFeatures/ensureRelayerFeatures-p.d.ts.map +1 -0
  232. package/_types/core/relayerFeatures/resolveRelayerFeatures-p.d.ts +39 -0
  233. package/_types/core/relayerFeatures/resolveRelayerFeatures-p.d.ts.map +1 -0
  234. package/_types/core/runtime/CoreFhevm-p.d.ts +5 -0
  235. package/_types/core/runtime/CoreFhevm-p.d.ts.map +1 -1
  236. package/_types/core/runtime/HyperWasmSolver-p.d.ts +1 -0
  237. package/_types/core/runtime/HyperWasmSolver-p.d.ts.map +1 -1
  238. package/_types/core/runtime/ProtocolVersionResolver-p.d.ts.map +1 -1
  239. package/_types/core/runtime/sdkProtocolApiVersion.d.ts +7 -8
  240. package/_types/core/runtime/sdkProtocolApiVersion.d.ts.map +1 -1
  241. package/_types/core/types/kms-p.d.ts +2 -2
  242. package/_types/core/types/kms-p.d.ts.map +1 -1
  243. package/_types/core/types/relayer-p.d.ts +1 -1
  244. package/_types/core/types/relayer-p.d.ts.map +1 -1
  245. package/_types/core/types/signedDecryptionPermit.d.ts +10 -3
  246. package/_types/core/types/signedDecryptionPermit.d.ts.map +1 -1
  247. package/_types/core/utils-p/decrypt/verifyErc1271UserDecrypt-p.d.ts +49 -0
  248. package/_types/core/utils-p/decrypt/verifyErc1271UserDecrypt-p.d.ts.map +1 -0
  249. package/_types/ethers/internal/ethereum-ct.d.ts.map +1 -1
  250. package/_types/ethers/internal/ethereum.d.ts +3 -1
  251. package/_types/ethers/internal/ethereum.d.ts.map +1 -1
  252. package/_types/ethers/internal/utils.d.ts +5 -0
  253. package/_types/ethers/internal/utils.d.ts.map +1 -1
  254. package/_types/viem/internal/ethereum-ct.d.ts.map +1 -1
  255. package/_types/viem/internal/ethereum.d.ts +3 -1
  256. package/_types/viem/internal/ethereum.d.ts.map +1 -1
  257. package/_types/wasm/tkms/KmsLibApi.d.ts +1 -1
  258. package/_types/wasm/tkms/v0.14.0-1/kms_lib.d.ts +598 -0
  259. package/_types/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm.base64.d.ts +3 -0
  260. package/core/_version.ts +1 -1
  261. package/core/actions/base/canUseUnifiedDecryptionPermit.ts +38 -0
  262. package/core/actions/base/createUnsignedUnifiedDecryptionPermitEip712.ts +0 -6
  263. package/core/actions/base/index.ts +24 -2
  264. package/core/actions/base/signUnifiedDecryptionPermit.ts +27 -0
  265. package/core/actions/host/resolveChainId.ts +3 -1
  266. package/core/clients/decorators/base.ts +21 -0
  267. package/core/errors/Erc1271Error.ts +85 -0
  268. package/core/frozenContext/fhevmClientFrozenContext-p.ts +1 -0
  269. package/core/frozenContext/resolveFhevmClientFrozenContext-p.ts +21 -8
  270. package/core/host-contracts/readKmsSignersContext-p.ts +9 -45
  271. package/core/key/FheEncryptionKeyCache-p.ts +6 -0
  272. package/core/key/fetchFheEncryptionKey.ts +17 -1
  273. package/core/kms/SignedDecryptionPermit-p.ts +6 -60
  274. package/core/kms/SignedDecryptionPermitV2-p.ts +54 -41
  275. package/core/kms/decryptValuesFromPairs.ts +14 -33
  276. package/core/kms/fetchKmsSigncryptedSharesV2-p.ts +15 -0
  277. package/core/modules/decrypt/module/api-p.ts +5 -3
  278. package/core/modules/decrypt/module/init-p.ts +6 -1
  279. package/core/modules/encrypt/module/init-p.ts +15 -2
  280. package/core/modules/ethereum/types.ts +55 -1
  281. package/core/modules/relayer/cleartext/mock.ts +11 -0
  282. package/core/modules/relayer/module/RelayerAsyncRequest.ts +55 -0
  283. package/core/modules/relayer/module/fetchCoprocessorSignatures.ts +1 -0
  284. package/core/modules/relayer/module/fetchDelegatedUserDecryptV1.ts +1 -0
  285. package/core/modules/relayer/module/fetchFeatures.ts +75 -0
  286. package/core/modules/relayer/module/fetchPublicDecrypt.ts +1 -0
  287. package/core/modules/relayer/module/fetchUserDecryptV1.ts +1 -0
  288. package/core/modules/relayer/module/fetchUserDecryptV2.ts +1 -0
  289. package/core/modules/relayer/module/index.ts +2 -0
  290. package/core/modules/relayer/types.ts +26 -2
  291. package/core/relayerFeatures/ensureRelayerFeatures-p.ts +84 -0
  292. package/core/relayerFeatures/resolveRelayerFeatures-p.ts +47 -0
  293. package/core/runtime/CoreFhevm-p.ts +71 -0
  294. package/core/runtime/HyperWasmSolver-p.ts +57 -8
  295. package/core/runtime/ProtocolVersionResolver-p.ts +12 -4
  296. package/core/runtime/initFhevmDecryptRuntime-p.ts +1 -1
  297. package/core/runtime/initFhevmRuntime-p.ts +1 -1
  298. package/core/runtime/sdkProtocolApiVersion.ts +8 -9
  299. package/core/types/kms-p.ts +2 -2
  300. package/core/types/relayer-p.ts +4 -2
  301. package/core/types/signedDecryptionPermit.ts +10 -3
  302. package/core/utils-p/decrypt/verifyErc1271UserDecrypt-p.ts +164 -0
  303. package/ethers/internal/ethereum-ct.ts +5 -15
  304. package/ethers/internal/ethereum.ts +58 -3
  305. package/ethers/internal/utils.ts +27 -0
  306. package/package.json +2 -2
  307. package/viem/internal/ethereum-ct.ts +6 -14
  308. package/viem/internal/ethereum.ts +48 -1
  309. package/wasm/tkms/KmsLibApi.d.ts +1 -1
  310. package/wasm/tkms/loadKmsLib.js +11 -2
  311. package/wasm/tkms/v0.14.0-1/kms_lib.d.ts +598 -0
  312. package/wasm/tkms/v0.14.0-1/kms_lib.js +2055 -0
  313. package/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm +0 -0
  314. package/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm.base64.d.ts +3 -0
  315. package/wasm/tkms/v0.14.0-1/kms_lib_bg.wasm.base64.js +7 -0
  316. package/_cjs/core/utils-p/decrypt/verifyKmsUserDecryptEip712V2.js +0 -30
  317. package/_cjs/core/utils-p/decrypt/verifyKmsUserDecryptEip712V2.js.map +0 -1
  318. package/_esm/core/utils-p/decrypt/verifyKmsUserDecryptEip712V2.js +0 -27
  319. package/_esm/core/utils-p/decrypt/verifyKmsUserDecryptEip712V2.js.map +0 -1
  320. package/_types/core/utils-p/decrypt/verifyKmsUserDecryptEip712V2.d.ts +0 -14
  321. package/_types/core/utils-p/decrypt/verifyKmsUserDecryptEip712V2.d.ts.map +0 -1
  322. package/core/utils-p/decrypt/verifyKmsUserDecryptEip712V2.ts +0 -43
@@ -36,16 +36,38 @@ export {
36
36
  fetchEncryptedValues,
37
37
  } from './fetchEncryptedValues.js';
38
38
 
39
- // v13: Only the Legacy version is exported
39
+ // V1 permit (protocol v13 and below) kept for chains/relayers not yet on v14.
40
40
  export {
41
41
  type CreateUnsignedLegacyDecryptionPermitEip712Parameters,
42
42
  type CreateUnsignedLegacyDecryptionPermitEip712ReturnType,
43
43
  createUnsignedLegacyDecryptionPermitEip712,
44
44
  } from './createUnsignedLegacyDecryptionPermitEip712.js';
45
45
 
46
- // v13: Only the Legacy version is exported
46
+ export {
47
+ type CanUseUnifiedDecryptionPermitParameters,
48
+ type CanUseUnifiedDecryptionPermitReturnType,
49
+ canUseUnifiedDecryptionPermit,
50
+ } from './canUseUnifiedDecryptionPermit.js';
51
+
52
+ // V1 permit (protocol v13 and below) — kept for chains/relayers not yet on v14.
47
53
  export {
48
54
  type SignLegacyDecryptionPermitParameters,
49
55
  type SignLegacyDecryptionPermitReturnType,
50
56
  signLegacyDecryptionPermit,
51
57
  } from './signLegacyDecryptionPermit.js';
58
+
59
+ // V2 permit (protocol v14 and above) — requires an SDK on protocol API v0.14.0+
60
+ // and a chain whose KMSVerifier/ProtocolConfig support the unified extraData v2.
61
+ export {
62
+ type CreateUnsignedUnifiedDecryptionPermitEip712Parameters,
63
+ type CreateUnsignedUnifiedDecryptionPermitEip712ReturnType,
64
+ createUnsignedUnifiedDecryptionPermitEip712,
65
+ } from './createUnsignedUnifiedDecryptionPermitEip712.js';
66
+
67
+ // V2 permit (protocol v14 and above) — requires an SDK on protocol API v0.14.0+
68
+ // and a chain whose KMSVerifier/ProtocolConfig support the unified extraData v2.
69
+ export {
70
+ type SignUnifiedDecryptionPermitParameters,
71
+ type SignUnifiedDecryptionPermitReturnType,
72
+ signUnifiedDecryptionPermit,
73
+ } from './signUnifiedDecryptionPermit.js';
@@ -0,0 +1,27 @@
1
+ import type { Fhevm } from '../../types/coreFhevmClient.js';
2
+ import type { FhevmChain } from '../../types/fhevmChain.js';
3
+ import type { SignedDecryptionPermit } from '../../types/signedDecryptionPermit.js';
4
+ import type { NativeSigner } from '../../modules/ethereum/types.js';
5
+ import type { TransportKeyPair } from '../decrypt/index.js';
6
+ import { signDecryptionPermitV2 as signUnifiedDecryptionPermit_ } from '../../kms/SignedDecryptionPermitV2-p.js';
7
+ import { initPublicAction } from '../../runtime/CoreFhevm-p.js';
8
+
9
+ export type SignUnifiedDecryptionPermitParameters = {
10
+ readonly contractAddresses: readonly string[];
11
+ readonly startTimestamp: number;
12
+ readonly durationSeconds: number;
13
+ readonly signerAddress: string;
14
+ readonly signer: NativeSigner;
15
+ readonly delegatorAddress?: string | undefined;
16
+ readonly transportKeyPair: TransportKeyPair;
17
+ };
18
+
19
+ export type SignUnifiedDecryptionPermitReturnType = SignedDecryptionPermit;
20
+
21
+ export async function signUnifiedDecryptionPermit(
22
+ fhevm: Fhevm<FhevmChain>,
23
+ parameters: SignUnifiedDecryptionPermitParameters,
24
+ ): Promise<SignUnifiedDecryptionPermitReturnType> {
25
+ const fhevmContext = await initPublicAction(fhevm);
26
+ return signUnifiedDecryptionPermit_(fhevm, { ...parameters, fhevmContext });
27
+ }
@@ -38,7 +38,9 @@ export async function resolveChainId(
38
38
  const chainId = asUint64BigInt(await fhevm.runtime.ethereum.getChainId(trustedClient));
39
39
 
40
40
  if (resolvedId !== chainId) {
41
- throw new Error(`Chain id mismatch: connected to chain ${chainId}, but expected chain ${resolvedId}`);
41
+ const message = `Chain id mismatch: connected to chain ${chainId}, but expected chain ${resolvedId}`;
42
+ fhevm.runtime.config.logger?.error?.(message, undefined);
43
+ throw new Error(message);
42
44
  }
43
45
 
44
46
  return resolvedId;
@@ -49,6 +49,11 @@ import {
49
49
  type SignLegacyDecryptionPermitParameters,
50
50
  type SignLegacyDecryptionPermitReturnType,
51
51
  } from '../../actions/base/signLegacyDecryptionPermit.js';
52
+ import {
53
+ signUnifiedDecryptionPermit,
54
+ type SignUnifiedDecryptionPermitParameters,
55
+ type SignUnifiedDecryptionPermitReturnType,
56
+ } from '../../actions/base/signUnifiedDecryptionPermit.js';
52
57
 
53
58
  ////////////////////////////////////////////////////////////////////////////////
54
59
 
@@ -145,6 +150,21 @@ export type BaseActions = {
145
150
  readonly signLegacyDecryptionPermit: (
146
151
  parameters: SignLegacyDecryptionPermitParameters,
147
152
  ) => Promise<SignLegacyDecryptionPermitReturnType>;
153
+ /**
154
+ * Signs a unified decryption permit (V2).
155
+ *
156
+ * Requires an SDK on protocol API v0.14.0+ and a chain whose KMSVerifier/ProtocolConfig
157
+ * support the unified extraData v2 — throws if the connected chain has not yet upgraded.
158
+ *
159
+ * - Without `delegatorAddress`: Alice signs to decrypt her own encrypted values.
160
+ * - With `delegatorAddress`: Bob signs to decrypt values belonging to `delegatorAddress` (Alice),
161
+ * after Alice has granted permission via `FHE.delegateUserDecryption()` on-chain.
162
+ *
163
+ * Inspect `isDelegated` on the returned permit to distinguish the two cases.
164
+ */
165
+ readonly signUnifiedDecryptionPermit: (
166
+ parameters: SignUnifiedDecryptionPermitParameters,
167
+ ) => Promise<SignUnifiedDecryptionPermitReturnType>;
148
168
  /** Deserializes a previously serialized e2e transport key pair back into a usable key pair. */
149
169
  readonly parseTransportKeyPair: (
150
170
  parameters: ParseTransportKeyPairParameters,
@@ -176,6 +196,7 @@ function _baseActions(fhevm: Fhevm<FhevmChain>): BaseActions {
176
196
  decryptPublicValuesWithSignatures: (parameters) => decryptPublicValuesWithSignatures(fhevm, parameters),
177
197
  signDecryptionPermit: (parameters) => signDecryptionPermit(fhevm, parameters),
178
198
  signLegacyDecryptionPermit: (parameters) => signLegacyDecryptionPermit(fhevm, parameters),
199
+ signUnifiedDecryptionPermit: (parameters) => signUnifiedDecryptionPermit(fhevm, parameters),
179
200
  parseTransportKeyPair: (parameters) => parseTransportKeyPair(fhevm, parameters),
180
201
  serializeTransportKeyPair: (parameters) => serializeTransportKeyPair(fhevm, parameters),
181
202
  serializeSignedDecryptionPermit: (parameters) => serializeSignedDecryptionPermit(fhevm, parameters),
@@ -0,0 +1,85 @@
1
+ import type { FhevmErrorBaseParams } from './FhevmErrorBase.js';
2
+ import type { Prettify } from '../types/utils.js';
3
+ import { FhevmErrorBase } from './FhevmErrorBase.js';
4
+
5
+ ////////////////////////////////////////////////////////////////////////////////
6
+ // Erc1271VerificationError
7
+ //
8
+ // Definitive, client-side rejections of a user-decryption signature, mirroring
9
+ // the shared `user-decryption-signature` crate's error taxonomy. Thrown
10
+ // fail-fast (matching the relayer's sync 400). Only definitive failures throw;
11
+ // see `verifyErc1271UserDecrypt` for how inconclusive outcomes are handled.
12
+ ////////////////////////////////////////////////////////////////////////////////
13
+
14
+ export type Erc1271VerificationErrorParams = Prettify<Omit<FhevmErrorBaseParams, 'name' | 'message'>>;
15
+
16
+ /** Base class for all definitive ERC-1271 / EOA signature rejections. */
17
+ export abstract class Erc1271VerificationError extends FhevmErrorBase {}
18
+
19
+ ////////////////////////////////////////////////////////////////////////////////
20
+
21
+ export type Erc1271EoaMismatchNoCodeErrorType = Erc1271EoaMismatchNoCodeError & {
22
+ name: 'Erc1271EoaMismatchNoCodeError';
23
+ };
24
+
25
+ /** ecrecover did not match `userAddress` and `userAddress` has no contract code. */
26
+ export class Erc1271EoaMismatchNoCodeError extends Erc1271VerificationError {
27
+ constructor(params: Erc1271VerificationErrorParams & { userAddress: string }) {
28
+ super({
29
+ ...params,
30
+ name: 'Erc1271EoaMismatchNoCodeError',
31
+ message: `ecrecover signer mismatch and userAddress ${params.userAddress} has no contract code on the host chain`,
32
+ });
33
+ }
34
+ }
35
+
36
+ ////////////////////////////////////////////////////////////////////////////////
37
+
38
+ export type Erc1271EmptySigOnEoaErrorType = Erc1271EmptySigOnEoaError & {
39
+ name: 'Erc1271EmptySigOnEoaError';
40
+ };
41
+
42
+ /** An empty signature was supplied but `userAddress` has no contract code. */
43
+ export class Erc1271EmptySigOnEoaError extends Erc1271VerificationError {
44
+ constructor(params: Erc1271VerificationErrorParams & { userAddress: string }) {
45
+ super({
46
+ ...params,
47
+ name: 'Erc1271EmptySigOnEoaError',
48
+ message: `empty signature is only valid for contracts; userAddress ${params.userAddress} has no contract code`,
49
+ });
50
+ }
51
+ }
52
+
53
+ ////////////////////////////////////////////////////////////////////////////////
54
+
55
+ export type Erc1271WrongMagicErrorType = Erc1271WrongMagicError & {
56
+ name: 'Erc1271WrongMagicError';
57
+ };
58
+
59
+ /** `isValidSignature` returned a non-magic value. */
60
+ export class Erc1271WrongMagicError extends Erc1271VerificationError {
61
+ constructor(params: Erc1271VerificationErrorParams & { userAddress: string; magicValue: string }) {
62
+ super({
63
+ ...params,
64
+ name: 'Erc1271WrongMagicError',
65
+ message: `ERC-1271 isValidSignature returned non-magic value ${params.magicValue} for userAddress ${params.userAddress}`,
66
+ });
67
+ }
68
+ }
69
+
70
+ ////////////////////////////////////////////////////////////////////////////////
71
+
72
+ export type Erc1271RejectedErrorType = Erc1271RejectedError & {
73
+ name: 'Erc1271RejectedError';
74
+ };
75
+
76
+ /** `isValidSignature` reverted or returned malformed data. */
77
+ export class Erc1271RejectedError extends Erc1271VerificationError {
78
+ constructor(params: Erc1271VerificationErrorParams & { userAddress: string; detail: string }) {
79
+ super({
80
+ ...params,
81
+ name: 'Erc1271RejectedError',
82
+ message: `ERC-1271 isValidSignature reverted or returned malformed data for userAddress ${params.userAddress}: ${params.detail}`,
83
+ });
84
+ }
85
+ }
@@ -240,6 +240,7 @@ export function cloneFhevmClientFrozenContext(value: FhevmClientFrozenContext):
240
240
  readonly pubKeyCrsVersion?: PubKeyCrsVersionResolution | undefined;
241
241
  readonly tfheVersion?: TfheVersion | undefined;
242
242
  readonly tkmsVersion?: TkmsVersion | undefined;
243
+ readonly relayerSupportsV3UserDecryptRoute: boolean;
243
244
  };
244
245
 
245
246
  const hostContractVersions: Partial<Record<HostContractName, HostContractVersion>> = {};
@@ -56,6 +56,11 @@ export async function resolveFhevmClientFrozenContext(fhevm: FhevmBase<FhevmChai
56
56
  const kmsVerifierAddress: ChecksummedAddress = addressToChecksummedAddress(
57
57
  asAddress(fhevm.chain.fhevm.contracts.kmsVerifier.address),
58
58
  );
59
+ // ProtocolConfig only exists on v0.14+ deployments — absent on older chains.
60
+ const protocolConfigAddress: ChecksummedAddress | undefined =
61
+ fhevm.chain.fhevm.contracts.protocolConfig === undefined
62
+ ? undefined
63
+ : addressToChecksummedAddress(asAddress(fhevm.chain.fhevm.contracts.protocolConfig.address));
59
64
 
60
65
  // Design note — reads are intentionally NOT pinned to a block number.
61
66
  // All protocol contracts (ACL, KMSVerifier, InputVerifier, ProtocolConfig, …)
@@ -63,18 +68,25 @@ export async function resolveFhevmClientFrozenContext(fhevm: FhevmBase<FhevmChai
63
68
  // `getVersion()` in one step, so this batch either all observes the pre-upgrade
64
69
  // versions or all observes the post-upgrade ones — never a mixed, half-applied
65
70
  // state. Capturing the whole basis in one call is what keeps it coherent.
66
- const [aclVersion, inputVerifierVersion, kmsVerifierVersion] = (await executeWithBatching<unknown>(
67
- [
68
- () => getHostContractVersion(fhevm, { address: aclAddress }),
69
- () => getHostContractVersion(fhevm, { address: inputVerifierAddress }),
70
- () => getHostContractVersion(fhevm, { address: kmsVerifierAddress }),
71
- ],
72
- fhevm.options.batchRpcCalls,
73
- )) as [HostContractVersion, HostContractVersion, HostContractVersion];
71
+ const [aclVersion, inputVerifierVersion, kmsVerifierVersion, protocolConfigVersion] =
72
+ (await executeWithBatching<unknown>(
73
+ [
74
+ () => getHostContractVersion(fhevm, { address: aclAddress }),
75
+ () => getHostContractVersion(fhevm, { address: inputVerifierAddress }),
76
+ () => getHostContractVersion(fhevm, { address: kmsVerifierAddress }),
77
+ ...(protocolConfigAddress === undefined
78
+ ? []
79
+ : [() => getHostContractVersion(fhevm, { address: protocolConfigAddress })]),
80
+ ],
81
+ fhevm.options.batchRpcCalls,
82
+ )) as [HostContractVersion, HostContractVersion, HostContractVersion, HostContractVersion | undefined];
74
83
 
75
84
  assertIsHostContractVersionOf(aclVersion, 'ACL');
76
85
  assertIsHostContractVersionOf(inputVerifierVersion, 'InputVerifier');
77
86
  assertIsHostContractVersionOf(kmsVerifierVersion, 'KMSVerifier');
87
+ if (protocolConfigVersion !== undefined) {
88
+ assertIsHostContractVersionOf(protocolConfigVersion, 'ProtocolConfig');
89
+ }
78
90
 
79
91
  const protocolContext = protocolContextFromAclVersion(fhevm.chain, aclVersion);
80
92
 
@@ -86,6 +98,7 @@ export async function resolveFhevmClientFrozenContext(fhevm: FhevmBase<FhevmChai
86
98
  ACL: aclVersion,
87
99
  InputVerifier: inputVerifierVersion,
88
100
  KMSVerifier: kmsVerifierVersion,
101
+ ...(protocolConfigVersion === undefined ? {} : { ProtocolConfig: protocolConfigVersion }),
89
102
  },
90
103
  protocolVersion: protocolContext.protocolVersion,
91
104
  pubKeyCrsVersion: protocolContext.pubKeyCrsVersion,
@@ -15,7 +15,6 @@ import {
15
15
  } from '../kms/kmsExtraData-p.js';
16
16
  import { getKmsContextSignersAndThresholdFromExtraData } from './getKmsContextSignersAndThresholdFromExtraData-p.js';
17
17
  import { getKmsSignersAndThreshold } from './getKmsContextSignersAndThreshold-p.js';
18
- import { SDK_PROTOCOL_API_MAJOR_VERSION, SDK_PROTOCOL_API_MINOR_VERSION } from '../runtime/sdkProtocolApiVersion.js';
19
18
 
20
19
  ////////////////////////////////////////////////////////////////////////////////
21
20
 
@@ -42,15 +41,6 @@ type ReturnType = KmsSignersContext;
42
41
  //
43
42
  // Invariant — a KmsSignersContext carries the key it was indexed by.
44
43
  //
45
- // CRITICAL RULE — a v13-capped SDK must NEVER produce extraData v2.
46
- // The extraData version the SDK emits is gated by the RELAYER, not by the host
47
- // contracts: a v13 relayer rejects an unknown v2 `extraData` in its request
48
- // validation (HTTP 400 `validation_failed`), so the request never reaches the KMS.
49
- // This matters most during a v13 -> v14 rollout: the host contracts can already
50
- // support v2 while the relayer is still v13, so "the chain accepts v2" is NOT
51
- // sufficient — the SDK stays at v1 until the relayer is known to accept v2.
52
- // Hence the per-version cap enforced below.
53
- //
54
44
  ////////////////////////////////////////////////////////////////////////////////
55
45
 
56
46
  /**
@@ -58,25 +48,20 @@ type ReturnType = KmsSignersContext;
58
48
  * indexed on the **best `extraData` this SDK can produce** for that context.
59
49
  *
60
50
  * This is the read used when *creating* a permit: the returned context's `extraData`
61
- * is what the permit embeds and the user signs. So "best" is bounded by **two**
62
- * limits, not one:
63
- * - the on-chain KMSVerifier version (which encodings the contract supports), and
64
- * - this SDK's protocol-API cap ({@link SDK_PROTOCOL_API_MINOR_VERSION}) — the most
65
- * recent `extraData` version the SDK knows how to build and sign.
51
+ * is what the permit embeds and the user signs. "Best" is bounded by the on-chain
52
+ * KMSVerifier version — which encodings the contract supports.
66
53
  *
67
- * The returned encoding is therefore `min(chain capability, SDK capability)`:
54
+ * The returned encoding:
68
55
  * - v11 (KMSVerifier < 0.2.0) → v0 (no context concept)
69
- * - >= 0.2.0 but a v13-capped SDK, or KMSVerifier < 0.4.0,
56
+ * - >= 0.2.0 but KMSVerifier < 0.4.0,
70
57
  * or no `protocolConfigAddress` → v1 (`contextId` only)
71
58
  * - v14 chain (KMSVerifier >= 0.4.0, `protocolConfigAddress`
72
- * set) **and** a v14-capable SDK → v2 (`contextId` + `epochId`)
59
+ * set) → v2 (`contextId` + `epochId`)
73
60
  *
74
- * NOTE — the meaning is subtly different from a plain "read the current context at
75
- * full chain precision": a v13-capped SDK deliberately returns a **v1** context on a
76
- * **v14** chain (dropping the epoch), because it must produce a v1 permit. It also
77
- * differs from {@link readKmsSignersContextFromPermitExtraData}, which resolves an
78
- * *already-chosen* permit `extraData` to the most precise context available — here we
79
- * instead choose the most precise encoding we are *allowed to produce*.
61
+ * NOTE — this differs from {@link readKmsSignersContextFromPermitExtraData}, which
62
+ * resolves an *already-chosen* permit `extraData` to the most precise context
63
+ * available here we instead choose the most precise encoding we are *allowed to
64
+ * produce*.
80
65
  */
81
66
  export async function readCurrentKmsSignersContext(context: Context, parameters: Parameters): Promise<ReturnType> {
82
67
  // This version comes from the frozen context — a snapshot, NOT necessarily the
@@ -93,16 +78,6 @@ export async function readCurrentKmsSignersContext(context: Context, parameters:
93
78
  return _readCurrentKmsSignersContext_ProtocolApi_11(context, parameters);
94
79
  }
95
80
 
96
- // If SDK is restricted to protocol API v13 then the best extraData
97
- // we can get it must be v1
98
- // KMSVerifier.version >= 0.2.0, it supports at least API Protocol 13
99
- if (SDK_PROTOCOL_API_MAJOR_VERSION === 0 && SDK_PROTOCOL_API_MINOR_VERSION <= 13) {
100
- // -> KmsSignersContext.extraData.version == 1
101
- return _readCurrentKmsSignersContext_ProtocolApi_12_13(context, parameters);
102
- }
103
-
104
- // API Protocol 14+
105
-
106
81
  // KMSVerifier.version < 0.4.0, use only Protocol API v13
107
82
  if (
108
83
  isVersionStrictlyBefore(kmsVerifierVersion, { major: 0, minor: 4 }) ||
@@ -203,17 +178,6 @@ async function _readCurrentKmsSignersContext_ProtocolApi_14_or_higher(
203
178
  context: Context,
204
179
  parameters: Parameters,
205
180
  ): Promise<ReturnType> {
206
- // Defense-in-depth for the CRITICAL RULE above: this is the only function that
207
- // MINTS an extraData v2. It must never run under a v13-capped SDK. The caller
208
- // (readCurrentKmsSignersContext) already gates on SDK_PROTOCOL_API_MINOR_VERSION,
209
- // so reaching here with a capped SDK means that gate was bypassed/refactored away
210
- // — fail loudly rather than silently emit a v2 the relayer would reject.
211
- if (SDK_PROTOCOL_API_MAJOR_VERSION === 0 && SDK_PROTOCOL_API_MINOR_VERSION <= 13) {
212
- throw new Error(
213
- `Refusing to produce extraData v2: this SDK is capped at protocol API v0.${SDK_PROTOCOL_API_MINOR_VERSION} and must only emit extraData v1 (a v13 relayer rejects v2).`,
214
- );
215
- }
216
-
217
181
  if (parameters.protocolConfigAddress === undefined) {
218
182
  throw new Error('protocolConfigAddress is required on protocol v0.14.0+');
219
183
  }
@@ -314,6 +314,12 @@ export class FheEncryptionKeyCache {
314
314
  if (this.#cache.get(relayerUrl) === entry) {
315
315
  this.#cache.delete(relayerUrl);
316
316
  }
317
+ entry.owner
318
+ .deref()
319
+ ?.config.logger?.error?.(
320
+ `FheEncryptionKeyCache: ${resolvedKind === 'bytes' ? 'fetch' : 'conversion to wasm'} failed for relayerUrl="${relayerUrl}". Evicting cache entry; the next call will re-fetch.`,
321
+ err,
322
+ );
317
323
  throw err;
318
324
  },
319
325
  );
@@ -19,12 +19,28 @@ export async function fetchFheEncryptionKeyWasm(
19
19
  ): Promise<FheEncryptionKeyWasm> {
20
20
  const relayerUrl = context.chain.fhevm.relayerUrl;
21
21
  const runtime = context.runtime;
22
+ const logger = runtime.config.logger;
22
23
 
23
24
  // Ensure a bytes fetch is in-flight
24
25
  globalFheEncryptionKeyCache.ensureBytes({
25
26
  owner: runtime,
26
27
  relayerUrl,
27
- fetcher: () => runtime.relayer.fetchFheEncryptionKeyBytes({ relayerUrl, chainId: context.chain.id }, parameters),
28
+ fetcher: async () => {
29
+ logger?.debug?.(
30
+ `Fetching FHE encryption key/CRS bytes from relayer "${relayerUrl}" (chainId=${context.chain.id}).`,
31
+ );
32
+ try {
33
+ const bytes = await runtime.relayer.fetchFheEncryptionKeyBytes(
34
+ { relayerUrl, chainId: context.chain.id },
35
+ parameters,
36
+ );
37
+ logger?.debug?.(`Fetched FHE encryption key/CRS bytes from relayer "${relayerUrl}".`);
38
+ return bytes;
39
+ } catch (e) {
40
+ logger?.error?.(`Failed to fetch FHE encryption key/CRS bytes from relayer "${relayerUrl}".`, e);
41
+ throw e;
42
+ }
43
+ },
28
44
  metadata: { chainId: context.chain.id, relayerUrl },
29
45
  });
30
46
 
@@ -6,21 +6,14 @@ import type { ErrorMetadataParams } from '../base/errors/ErrorBase.js';
6
6
  import type { NativeSigner } from '../modules/ethereum/types.js';
7
7
  import type { TransportKeyPair } from './TransportKeyPair-p.js';
8
8
  import type { FhevmClientFrozenContext } from '../types/fhevmClientFrozenContext-p.js';
9
- import type { BytesHex } from '../types/primitives.js';
10
9
  import { InvalidTypeError } from '../base/errors/InvalidTypeError.js';
11
10
  import {
12
11
  isSignedDecryptionPermitV1,
13
12
  parseSignedDecryptionPermitV1,
14
13
  signDecryptionPermitV1,
15
14
  } from './SignedDecryptionPermitV1-p.js';
16
- import {
17
- isSignedDecryptionPermitV2,
18
- parseSignedDecryptionPermitV2,
19
- signDecryptionPermitV2,
20
- } from './SignedDecryptionPermitV2-p.js';
15
+ import { isSignedDecryptionPermitV2, parseSignedDecryptionPermitV2 } from './SignedDecryptionPermitV2-p.js';
21
16
  import { isRecordUintNumberProperty, isUintNumber } from '../base/uint.js';
22
- import { SDK_PROTOCOL_API_MAJOR_VERSION, SDK_PROTOCOL_API_MINOR_VERSION } from '../runtime/sdkProtocolApiVersion.js';
23
- import { createKmsExtraDataFromBytesHex, EXTRA_DATA_V2 } from './kmsExtraData-p.js';
24
17
 
25
18
  ////////////////////////////////////////////////////////////////////////////////
26
19
 
@@ -159,15 +152,11 @@ export async function signDecryptionPermit(
159
152
  context: KmsSignDecryptionPermitContext,
160
153
  parameters: KmsSignDecryptionPermitParameters,
161
154
  ): Promise<SignedDecryptionPermit> {
162
- // V1 permits are always created here: the current protocol API version this
163
- // SDK is using is 0.13.0, so the SDK does not know the 0.14.0 API (which is
164
- // what introduces V2 permits). Once the SDK adopts API 0.14.0, this branch
165
- // falls through to signDecryptionPermitV2 below.
166
- if (SDK_PROTOCOL_API_MAJOR_VERSION === 0 && SDK_PROTOCOL_API_MINOR_VERSION <= 13) {
167
- return await signDecryptionPermitV1(context, parameters);
168
- }
169
-
170
- return await signDecryptionPermitV2(context, parameters);
155
+ // `signDecryptionPermit` (the public action wrapping this) is deprecated in
156
+ // favor of `signLegacyDecryptionPermit`/`signUnifiedDecryptionPermit`, but we
157
+ // deliberately keep it pinned to V1 here for good compatibility with callers
158
+ // that haven't migrated yet.
159
+ return await signDecryptionPermitV1(context, parameters);
171
160
  }
172
161
 
173
162
  ////////////////////////////////////////////////////////////////////////////////
@@ -223,29 +212,6 @@ function _normalizeSerializedPermitDomainChainId(permit: unknown): unknown {
223
212
  };
224
213
  }
225
214
 
226
- /**
227
- * Reads the `extraData` version carried by a serialized permit, or `undefined` when
228
- * the permit exposes no decodable `extraData` (missing, wrong type, or malformed —
229
- * left to the downstream permit validation to report with proper context).
230
- *
231
- * Navigates `permit.eip712.message.extraData` defensively (the permit is untrusted
232
- * input). Used to enforce the SDK protocol-API cap at parse time — see the CRITICAL
233
- * RULE in `readKmsSignersContext-p.ts`.
234
- */
235
- function _parsePermitExtraDataVersion(permit: unknown): number | undefined {
236
- const extraData = (
237
- permit as { readonly eip712?: { readonly message?: { readonly extraData?: unknown } } } | null | undefined
238
- )?.eip712?.message?.extraData;
239
- if (typeof extraData !== 'string') {
240
- return undefined;
241
- }
242
- try {
243
- return createKmsExtraDataFromBytesHex(extraData as BytesHex).version;
244
- } catch {
245
- return undefined;
246
- }
247
- }
248
-
249
215
  export async function parseSignedDecryptionPermit(
250
216
  context: KmsSignDecryptionPermitContext,
251
217
  parameters: {
@@ -271,26 +237,6 @@ export async function parseSignedDecryptionPermit(
271
237
  // version is 1 or 2
272
238
  const version: 1 | 2 = sanitizedVersion as 1 | 2;
273
239
 
274
- // Enforce the SDK protocol-API cap (see the CRITICAL RULE in readKmsSignersContext-p.ts):
275
- // a v13-capped SDK must never accept a v2 permit, because a v13 relayer rejects it.
276
- // A v2 can arrive two independent ways; each is rejected here with its own message,
277
- // up front, instead of an opaque relayer 400 later (mirrors decryptValuesFromPairs).
278
- if (SDK_PROTOCOL_API_MAJOR_VERSION === 0 && SDK_PROTOCOL_API_MINOR_VERSION <= 13) {
279
- // (a) A V2-format permit.
280
- if (version > 1) {
281
- throw new Error(
282
- `Refusing to parse a V2-format decryption permit (version ${version}): this SDK is capped at protocol API v0.${SDK_PROTOCOL_API_MINOR_VERSION} and only supports V1 permits. V2 permits require an SDK on protocol API v0.14.0 or later.`,
283
- );
284
- }
285
- const extraDataVersion = _parsePermitExtraDataVersion(sanitizedPermit);
286
- // (b) A v2 extraData — including one carried inside a V1-format permit.
287
- if (extraDataVersion !== undefined && extraDataVersion >= EXTRA_DATA_V2) {
288
- throw new Error(
289
- `Refusing to parse a permit carrying extraData v2: this SDK is capped at protocol API v0.${SDK_PROTOCOL_API_MINOR_VERSION} and only accepts extraData v0/v1 (a v13 relayer rejects extraData v2). Use an SDK on protocol API v0.14.0 or later.`,
290
- );
291
- }
292
- }
293
-
294
240
  if (version === 1) {
295
241
  return await parseSignedDecryptionPermitV1(context, { transportKeyPair, permit: sanitizedPermit, fhevmContext });
296
242
  }