@inco/js 0.9.0-devnet-test-4 → 0.10.0-devnet-1

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 (226) hide show
  1. package/README.md +503 -47
  2. package/dist/cjs/advancedacl/session-key.d.ts +5 -5
  3. package/dist/cjs/advancedacl/session-key.js +33 -9
  4. package/dist/cjs/attestedcompute/attested-compute.d.ts +1 -2
  5. package/dist/cjs/attestedcompute/attested-compute.js +15 -7
  6. package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +5 -43
  7. package/dist/cjs/attesteddecrypt/attested-decrypt.js +33 -96
  8. package/dist/cjs/attestedreveal/attested-reveal.d.ts +21 -0
  9. package/dist/cjs/attestedreveal/attested-reveal.js +31 -0
  10. package/dist/cjs/attestedreveal/index.d.ts +2 -0
  11. package/dist/cjs/attestedreveal/index.js +21 -0
  12. package/dist/cjs/attestedreveal/types.d.ts +4 -0
  13. package/dist/cjs/attestedreveal/types.js +13 -0
  14. package/dist/cjs/binary.d.ts +82 -0
  15. package/dist/cjs/binary.js +87 -5
  16. package/dist/cjs/chain.d.ts +29 -4
  17. package/dist/cjs/chain.js +34 -6
  18. package/dist/cjs/eip712/eip712.d.ts +18 -0
  19. package/dist/cjs/eip712/eip712.js +51 -0
  20. package/dist/cjs/eip712/index.d.ts +1 -0
  21. package/dist/cjs/eip712/index.js +8 -0
  22. package/dist/cjs/elistattesteddecrypt/elist-attested-decrypt.d.ts +49 -0
  23. package/dist/cjs/elistattesteddecrypt/elist-attested-decrypt.js +94 -0
  24. package/dist/cjs/elistattesteddecrypt/index.d.ts +2 -0
  25. package/dist/cjs/elistattesteddecrypt/index.js +22 -0
  26. package/dist/cjs/elistattesteddecrypt/types.d.ts +31 -0
  27. package/dist/cjs/elistattesteddecrypt/types.js +16 -0
  28. package/dist/cjs/encryption/encryption.d.ts +115 -0
  29. package/dist/cjs/encryption/encryption.js +98 -7
  30. package/dist/cjs/encryption/index.d.ts +1 -1
  31. package/dist/cjs/encryption/index.js +17 -16
  32. package/dist/cjs/generated/abis/lightning.d.ts +1119 -107
  33. package/dist/cjs/generated/abis/lightning.js +762 -52
  34. package/dist/cjs/generated/abis/test-elist.d.ts +20 -2
  35. package/dist/cjs/generated/abis/test-elist.js +16 -3
  36. package/dist/cjs/generated/abis/verifier.d.ts +118 -15
  37. package/dist/cjs/generated/abis/verifier.js +71 -19
  38. package/dist/cjs/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +23 -37
  39. package/dist/cjs/generated/es/inco/covalidator/compute/v1/server_pb.js +36 -41
  40. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.js +1 -1
  41. package/dist/cjs/generated/es/inco/helioswrapper/v1/helioswrapper_pb.js +1 -1
  42. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +16 -0
  43. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +3 -3
  44. package/dist/cjs/generated/es/inco/kms/lite/v1/types_pb.js +1 -1
  45. package/dist/cjs/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +7 -0
  46. package/dist/cjs/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.js +3 -3
  47. package/dist/cjs/generated/lightning.d.ts +150 -0
  48. package/dist/cjs/generated/lightning.js +157 -1
  49. package/dist/cjs/generated/local-node.d.ts +9 -9
  50. package/dist/cjs/generated/local-node.js +37 -10
  51. package/dist/cjs/handle.d.ts +72 -0
  52. package/dist/cjs/handle.js +113 -9
  53. package/dist/cjs/index.d.ts +1 -1
  54. package/dist/cjs/index.js +11 -2
  55. package/dist/cjs/kms/client.d.ts +1 -1
  56. package/dist/cjs/kms/client.js +4 -3
  57. package/dist/cjs/kms/quorumClient.d.ts +18 -12
  58. package/dist/cjs/kms/quorumClient.js +212 -231
  59. package/dist/cjs/kms/quorumConsistency.d.ts +82 -0
  60. package/dist/cjs/kms/quorumConsistency.js +269 -0
  61. package/dist/cjs/kms/signatureVerification.d.ts +35 -0
  62. package/dist/cjs/kms/signatureVerification.js +88 -0
  63. package/dist/cjs/kms/thresholdPromises.d.ts +4 -3
  64. package/dist/cjs/kms/thresholdPromises.js +25 -15
  65. package/dist/cjs/lite/attested-compute.d.ts +2 -2
  66. package/dist/cjs/lite/attested-compute.js +2 -3
  67. package/dist/cjs/lite/attested-decrypt.d.ts +2 -2
  68. package/dist/cjs/lite/attested-decrypt.js +2 -3
  69. package/dist/cjs/lite/hadu.d.ts +1 -1
  70. package/dist/cjs/lite/hadu.js +3 -3
  71. package/dist/cjs/lite/index.d.ts +6 -2
  72. package/dist/cjs/lite/index.js +8 -14
  73. package/dist/cjs/lite/lightning.d.ts +96 -47
  74. package/dist/cjs/lite/lightning.js +221 -267
  75. package/dist/cjs/lite/types.d.ts +47 -0
  76. package/dist/cjs/lite/types.js +3 -0
  77. package/dist/cjs/lite/xwing.d.ts +33 -2
  78. package/dist/cjs/lite/xwing.js +62 -7
  79. package/dist/cjs/local/local-node.d.ts +18 -0
  80. package/dist/cjs/local/local-node.js +18 -3
  81. package/dist/cjs/reencryption/eip712.d.ts +27 -0
  82. package/dist/cjs/reencryption/eip712.js +20 -7
  83. package/dist/cjs/reencryption/types.d.ts +24 -0
  84. package/dist/cjs/retry.d.ts +14 -0
  85. package/dist/cjs/retry.js +58 -2
  86. package/dist/cjs/test/mocks.d.ts +6 -1
  87. package/dist/cjs/test/mocks.js +31 -6
  88. package/dist/cjs/viem.d.ts +361 -1
  89. package/dist/cjs/viem.js +14 -1
  90. package/dist/esm/advancedacl/session-key.d.ts +5 -5
  91. package/dist/esm/advancedacl/session-key.js +33 -9
  92. package/dist/esm/attestedcompute/attested-compute.d.ts +1 -2
  93. package/dist/esm/attestedcompute/attested-compute.js +13 -5
  94. package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +5 -43
  95. package/dist/esm/attesteddecrypt/attested-decrypt.js +34 -96
  96. package/dist/esm/attestedreveal/attested-reveal.d.ts +21 -0
  97. package/dist/esm/attestedreveal/attested-reveal.js +28 -0
  98. package/dist/esm/attestedreveal/index.d.ts +2 -0
  99. package/dist/esm/attestedreveal/index.js +3 -0
  100. package/dist/esm/attestedreveal/types.d.ts +4 -0
  101. package/dist/esm/attestedreveal/types.js +9 -0
  102. package/dist/esm/binary.d.ts +82 -0
  103. package/dist/esm/binary.js +87 -5
  104. package/dist/esm/chain.d.ts +29 -4
  105. package/dist/esm/chain.js +33 -5
  106. package/dist/esm/eip712/eip712.d.ts +18 -0
  107. package/dist/esm/eip712/eip712.js +46 -0
  108. package/dist/esm/eip712/index.d.ts +1 -0
  109. package/dist/esm/eip712/index.js +2 -0
  110. package/dist/esm/elistattesteddecrypt/elist-attested-decrypt.d.ts +49 -0
  111. package/dist/esm/elistattesteddecrypt/elist-attested-decrypt.js +89 -0
  112. package/dist/esm/elistattesteddecrypt/index.d.ts +2 -0
  113. package/dist/esm/elistattesteddecrypt/index.js +3 -0
  114. package/dist/esm/elistattesteddecrypt/types.d.ts +31 -0
  115. package/dist/esm/elistattesteddecrypt/types.js +12 -0
  116. package/dist/esm/encryption/encryption.d.ts +115 -0
  117. package/dist/esm/encryption/encryption.js +98 -7
  118. package/dist/esm/encryption/index.d.ts +1 -1
  119. package/dist/esm/encryption/index.js +2 -2
  120. package/dist/esm/generated/abis/lightning.d.ts +1119 -107
  121. package/dist/esm/generated/abis/lightning.js +761 -51
  122. package/dist/esm/generated/abis/test-elist.d.ts +20 -2
  123. package/dist/esm/generated/abis/test-elist.js +16 -3
  124. package/dist/esm/generated/abis/verifier.d.ts +118 -15
  125. package/dist/esm/generated/abis/verifier.js +71 -19
  126. package/dist/esm/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +23 -37
  127. package/dist/esm/generated/es/inco/covalidator/compute/v1/server_pb.js +35 -40
  128. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.js +1 -1
  129. package/dist/esm/generated/es/inco/helioswrapper/v1/helioswrapper_pb.js +1 -1
  130. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +16 -0
  131. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +3 -3
  132. package/dist/esm/generated/es/inco/kms/lite/v1/types_pb.js +1 -1
  133. package/dist/esm/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +7 -0
  134. package/dist/esm/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.js +3 -3
  135. package/dist/esm/generated/lightning.d.ts +150 -0
  136. package/dist/esm/generated/lightning.js +157 -1
  137. package/dist/esm/generated/local-node.d.ts +9 -9
  138. package/dist/esm/generated/local-node.js +37 -10
  139. package/dist/esm/handle.d.ts +72 -0
  140. package/dist/esm/handle.js +110 -8
  141. package/dist/esm/index.d.ts +1 -1
  142. package/dist/esm/index.js +2 -2
  143. package/dist/esm/kms/client.d.ts +1 -1
  144. package/dist/esm/kms/client.js +3 -2
  145. package/dist/esm/kms/quorumClient.d.ts +18 -12
  146. package/dist/esm/kms/quorumClient.js +213 -232
  147. package/dist/esm/kms/quorumConsistency.d.ts +82 -0
  148. package/dist/esm/kms/quorumConsistency.js +260 -0
  149. package/dist/esm/kms/signatureVerification.d.ts +35 -0
  150. package/dist/esm/kms/signatureVerification.js +84 -0
  151. package/dist/esm/kms/thresholdPromises.d.ts +4 -3
  152. package/dist/esm/kms/thresholdPromises.js +25 -15
  153. package/dist/esm/lite/attested-compute.d.ts +2 -2
  154. package/dist/esm/lite/attested-compute.js +3 -3
  155. package/dist/esm/lite/attested-decrypt.d.ts +2 -2
  156. package/dist/esm/lite/attested-decrypt.js +3 -3
  157. package/dist/esm/lite/hadu.d.ts +1 -1
  158. package/dist/esm/lite/hadu.js +2 -2
  159. package/dist/esm/lite/index.d.ts +6 -2
  160. package/dist/esm/lite/index.js +5 -3
  161. package/dist/esm/lite/lightning.d.ts +96 -47
  162. package/dist/esm/lite/lightning.js +217 -263
  163. package/dist/esm/lite/types.d.ts +47 -0
  164. package/dist/esm/lite/types.js +2 -0
  165. package/dist/esm/lite/xwing.d.ts +33 -2
  166. package/dist/esm/lite/xwing.js +59 -7
  167. package/dist/esm/local/local-node.d.ts +18 -0
  168. package/dist/esm/local/local-node.js +18 -3
  169. package/dist/esm/reencryption/eip712.d.ts +27 -0
  170. package/dist/esm/reencryption/eip712.js +20 -7
  171. package/dist/esm/reencryption/types.d.ts +24 -0
  172. package/dist/esm/retry.d.ts +14 -0
  173. package/dist/esm/retry.js +56 -2
  174. package/dist/esm/test/mocks.d.ts +6 -1
  175. package/dist/esm/test/mocks.js +31 -8
  176. package/dist/esm/viem.d.ts +361 -1
  177. package/dist/esm/viem.js +15 -2
  178. package/dist/types/advancedacl/session-key.d.ts +5 -5
  179. package/dist/types/attestedcompute/attested-compute.d.ts +1 -2
  180. package/dist/types/attesteddecrypt/attested-decrypt.d.ts +5 -43
  181. package/dist/types/attestedreveal/attested-reveal.d.ts +21 -0
  182. package/dist/types/attestedreveal/index.d.ts +2 -0
  183. package/dist/types/attestedreveal/types.d.ts +4 -0
  184. package/dist/types/binary.d.ts +82 -0
  185. package/dist/types/chain.d.ts +29 -4
  186. package/dist/types/eip712/eip712.d.ts +18 -0
  187. package/dist/types/eip712/index.d.ts +1 -0
  188. package/dist/types/elistattesteddecrypt/elist-attested-decrypt.d.ts +49 -0
  189. package/dist/types/elistattesteddecrypt/index.d.ts +2 -0
  190. package/dist/types/elistattesteddecrypt/types.d.ts +31 -0
  191. package/dist/types/encryption/encryption.d.ts +115 -0
  192. package/dist/types/encryption/index.d.ts +1 -1
  193. package/dist/types/generated/abis/lightning.d.ts +1119 -107
  194. package/dist/types/generated/abis/test-elist.d.ts +20 -2
  195. package/dist/types/generated/abis/verifier.d.ts +118 -15
  196. package/dist/types/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +23 -37
  197. package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +16 -0
  198. package/dist/types/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +7 -0
  199. package/dist/types/generated/lightning.d.ts +150 -0
  200. package/dist/types/generated/local-node.d.ts +9 -9
  201. package/dist/types/handle.d.ts +72 -0
  202. package/dist/types/index.d.ts +1 -1
  203. package/dist/types/kms/client.d.ts +1 -1
  204. package/dist/types/kms/quorumClient.d.ts +18 -12
  205. package/dist/types/kms/quorumConsistency.d.ts +82 -0
  206. package/dist/types/kms/signatureVerification.d.ts +35 -0
  207. package/dist/types/kms/thresholdPromises.d.ts +4 -3
  208. package/dist/types/lite/attested-compute.d.ts +2 -2
  209. package/dist/types/lite/attested-decrypt.d.ts +2 -2
  210. package/dist/types/lite/hadu.d.ts +1 -1
  211. package/dist/types/lite/index.d.ts +6 -2
  212. package/dist/types/lite/lightning.d.ts +96 -47
  213. package/dist/types/lite/types.d.ts +47 -0
  214. package/dist/types/lite/xwing.d.ts +33 -2
  215. package/dist/types/local/local-node.d.ts +18 -0
  216. package/dist/types/reencryption/eip712.d.ts +27 -0
  217. package/dist/types/reencryption/types.d.ts +24 -0
  218. package/dist/types/retry.d.ts +14 -0
  219. package/dist/types/test/mocks.d.ts +6 -1
  220. package/dist/types/viem.d.ts +361 -1
  221. package/package.json +19 -21
  222. package/dist/cjs/generated/abis/lightning-preview.d.ts +0 -1385
  223. package/dist/cjs/generated/abis/lightning-preview.js +0 -857
  224. package/dist/esm/generated/abis/lightning-preview.d.ts +0 -1385
  225. package/dist/esm/generated/abis/lightning-preview.js +0 -854
  226. package/dist/types/generated/abis/lightning-preview.d.ts +0 -1385
@@ -3,10 +3,28 @@ import { Schema } from 'effect';
3
3
  import { Keccak } from 'sha3';
4
4
  import { encodePacked, hexToBytes, toHex } from 'viem';
5
5
  import { HexString } from './binary.js';
6
+ /** Current handle version byte, appended as the last byte of every handle. */
6
7
  export const HANDLE_VERSION = 0;
7
- // This enum maps to FheType as defined in tfhe-rs in value, but the keys provide an additional interpretation over
8
- // the underlying integral FheType. For example, ebool interprets an uint16 as a boolean, ebytes64 interprets an uint512
9
- // as a 64-byte array, etc.
8
+ /**
9
+ * Domain separators for handle derivation. Must be kept in sync with Solidity
10
+ * (contracts/lightning/src/Types.sol) and Go (pkg/fhe/handle.go). Prefixing every
11
+ * keccak256 preimage with a unique constant string makes cross-derivation-path
12
+ * collision resistance structural rather than incidental.
13
+ */
14
+ export const SEP_INPUT_PREHANDLE = 'inco/handle/input-prehandle';
15
+ export const SEP_INPUT_HANDLE = 'inco/handle/input-handle';
16
+ export const SEP_INPUT_CONTEXT = 'inco/handle/input-context';
17
+ export const SEP_OP_RESULT = 'inco/handle/op-result';
18
+ export const SEP_ELIST_OP_RESULT = 'inco/handle/elist-result';
19
+ // The index of the byte in the handle where elist element type is stored
20
+ export const BYTE_ELIST_ELEMENT_TYPE_INDEX = 29;
21
+ /**
22
+ * Map of ENCRYPTION type names to their integer identifiers (matching tfhe-rs `FheType`).
23
+ *
24
+ * Keys provide a semantic interpretation over the underlying integral type.
25
+ * For example, `ebool` interprets a `uint16` as a boolean, `ebytes64` interprets
26
+ * a `uint512` as a 64-byte array, etc.
27
+ */
10
28
  export const handleTypes = Object.freeze({
11
29
  ebool: 0,
12
30
  euint4: 1,
@@ -22,10 +40,17 @@ export const handleTypes = Object.freeze({
22
40
  ebytes256: 11,
23
41
  });
24
42
  const handleNames = Object.keys(handleTypes);
43
+ /** Schema that validates a string is one of the known ENCRYPTION type names (e.g. `"ebool"`, `"euint256"`). */
25
44
  export const HandleTypeName = Schema.Literal(...handleNames);
45
+ /**
46
+ * Type guard that checks whether a number is a valid {@link FheType} identifier.
47
+ * @param value - The number to check.
48
+ * @returns `true` if `value` is a known ENCRYPTION type integer (0–11).
49
+ */
26
50
  export function isFheType(value) {
27
51
  return Object.values(handleTypes).includes(value);
28
52
  }
53
+ /** Schema for the context required to compute a deterministic ENCRYPTION handle from a prehandle. */
29
54
  export const InputContext = Schema.Struct({
30
55
  hostChainId: Schema.BigInt,
31
56
  aclAddress: HexString,
@@ -33,9 +58,40 @@ export const InputContext = Schema.Struct({
33
58
  contractAddress: HexString,
34
59
  version: Schema.Number,
35
60
  });
36
- // Returns the FheType of the handle. See:
37
- // https://github.com/Inco-fhevm/inco-monorepo/blob/636756f512ae16535bdcb9a43df76bf14fbd6ba7/pkg/fhe/handle.md
61
+ /**
62
+ * Expected length of a handle in bytes.
63
+ * Handle format: 29 bytes hash + 1 byte index + 1 byte type + 1 byte version = 32 bytes
64
+ */
65
+ export const HANDLE_LENGTH_BYTES = 32;
66
+ /**
67
+ * Validates handle integrity by checking format, length, and version.
68
+ * Matches the validation in Go's HandleFromBytes (pkg/fhe/handle.go).
69
+ * @param handle - The handle to validate
70
+ * @throws Error if handle is malformed (wrong format, length, or unsupported version)
71
+ */
72
+ export function validateHandle(handle) {
73
+ // Check format: must start with 0x prefix and have correct length
74
+ if (!handle.startsWith('0x') ||
75
+ handle.length !== 2 + 2 * HANDLE_LENGTH_BYTES) {
76
+ throw new Error(`Invalid handle format: must be a ${HANDLE_LENGTH_BYTES}-byte hex string with 0x prefix`);
77
+ }
78
+ const handleBytes = hexToBytes(handle);
79
+ // Validate handle version (byte 31 must match HANDLE_VERSION)
80
+ const handleVersion = handleBytes[31];
81
+ if (handleVersion !== HANDLE_VERSION) {
82
+ throw new Error(`Unsupported handle version: expected ${HANDLE_VERSION}, got ${handleVersion} for handle ${handle}`);
83
+ }
84
+ }
85
+ /**
86
+ * Extracts the {@link FheType} from byte 30 of a validated handle.
87
+ * @param handle - A 32-byte hex handle string.
88
+ * @returns The ENCRYPTION type identifier stored in the handle.
89
+ * @throws If the handle is malformed or contains an invalid ENCRYPTION type.
90
+ * @see {@link https://github.com/Inco-fhevm/inco-monorepo/blob/636756f512ae16535bdcb9a43df76bf14fbd6ba7/pkg/fhe/handle.md Handle format spec}
91
+ */
38
92
  export function getHandleType(handle) {
93
+ // Validate handle integrity before extracting type
94
+ validateHandle(handle);
39
95
  const handleBytes = hexToBytes(handle);
40
96
  const handleType = handleBytes[30];
41
97
  if (!isFheType(handleType)) {
@@ -43,6 +99,21 @@ export function getHandleType(handle) {
43
99
  }
44
100
  return handleType;
45
101
  }
102
+ /**
103
+ * Extracts the elist element {@link FheType} from byte 29 of a validated handle.
104
+ * @param handle - A 32-byte hex handle string for an elist.
105
+ * @returns The ENCRYPTION type identifier of the elist elements.
106
+ * @throws If the handle is malformed or contains an invalid ENCRYPTION type at byte 29.
107
+ */
108
+ export function getEListElementType(handle) {
109
+ validateHandle(handle);
110
+ const handleBytes = hexToBytes(handle);
111
+ const elementType = handleBytes[BYTE_ELIST_ELEMENT_TYPE_INDEX];
112
+ if (!isFheType(elementType)) {
113
+ throw new Error(`Invalid elist element type ${elementType} for handle ${handle}`);
114
+ }
115
+ return elementType;
116
+ }
46
117
  // A note from Solidity at https://github.com/Inco-fhevm/fhevm/blob/7952950243b144b1bbdfc30318412a2dc6b575fd/lib/TFHEExecutor.sol#L87-L89:
47
118
  /// @dev handle format for user inputs is: keccak256(keccak256(CiphertextFHEList)||index_handle)[0:29] || index_handle || handle_type || handle_version
48
119
  /// @dev other handles format (fhe ops results) is: keccak256(keccak256(rawCiphertextFHEList)||index_handle)[0:30] || handle_type || handle_versioreenctestn
@@ -63,6 +134,7 @@ export function computePrehandle({ ciphertext, indexHandle, handleType, handleVe
63
134
  .update(Buffer.from(ciphertext))
64
135
  .digest();
65
136
  const ciphertextIndexHash = new Keccak(256)
137
+ .update(Buffer.from(SEP_INPUT_PREHANDLE, 'utf8'))
66
138
  .update(Buffer.from(ciphertextHash))
67
139
  .update(Buffer.from([indexHandle]))
68
140
  .digest();
@@ -84,7 +156,28 @@ export function computeHandle({ prehandle, context, }) {
84
156
  if (prehandle.length !== 32) {
85
157
  throw new Error(`prehandle should be 32 bytes but is: ${prehandle.length}`);
86
158
  }
87
- const packed = encodePacked(['bytes32', 'string', 'uint256', 'address', 'address', 'address', 'int32'], [
159
+ // HANDLE_VERSION and inputType (extracted from prehandle bytes 30/31) are folded into the
160
+ // preimage so the handle is cryptographically bound to its claimed metadata.
161
+ const inputType = prehandle[30];
162
+ const handleVersion = prehandle[31];
163
+ if (handleVersion !== HANDLE_VERSION) {
164
+ throw new Error(`Unsupported prehandle version: expected ${HANDLE_VERSION}, got ${handleVersion}`);
165
+ }
166
+ const packed = encodePacked([
167
+ 'string',
168
+ 'uint8',
169
+ 'uint8',
170
+ 'bytes32',
171
+ 'string',
172
+ 'uint256',
173
+ 'address',
174
+ 'address',
175
+ 'address',
176
+ 'uint16',
177
+ ], [
178
+ SEP_INPUT_HANDLE,
179
+ handleVersion,
180
+ inputType,
88
181
  toHex(prehandle),
89
182
  // Note: The x/hostchain spec requires the chain ID to be prefixed with 'evm/' for EVM chains
90
183
  'evm/',
@@ -103,10 +196,19 @@ export function computeHandle({ prehandle, context, }) {
103
196
  prehandle.slice(29, 32),
104
197
  ]);
105
198
  }
199
+ /**
200
+ * Computes the Keccak-256 hash of an ABI-packed {@link InputContext}.
201
+ *
202
+ * The context is packed as: `SEP_INPUT_CONTEXT || "evm/" || chainId || aclAddress || userAddress || contractAddress || version`.
203
+ *
204
+ * @param context - The input context to hash.
205
+ * @returns A 32-byte `Buffer` containing the Keccak-256 digest.
206
+ */
106
207
  export function hashInputContext(context) {
107
- const packed = encodePacked(['string', 'uint256', 'address', 'address', 'address', 'int32'], [
208
+ const packed = encodePacked(['string', 'string', 'uint256', 'address', 'address', 'address', 'uint16'], [
108
209
  // Note: The x/hostchain spec requires the chain ID to be prefixed with 'evm/' for EVM chains
109
210
  'evm/',
211
+ SEP_INPUT_CONTEXT,
110
212
  context.hostChainId,
111
213
  context.aclAddress,
112
214
  context.userAddress,
@@ -120,4 +222,4 @@ function assertUint8(value) {
120
222
  throw new Error(`Invalid uint8 value: ${value}`);
121
223
  }
122
224
  }
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1SEFBdUg7QUFDdkgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUM7QUFFaEMsbUhBQW1IO0FBQ25ILHdIQUF3SDtBQUN4SCwyQkFBMkI7QUFDM0IsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkMsS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztJQUNULE1BQU0sRUFBRSxDQUFDO0lBQ1QsT0FBTyxFQUFFLENBQUM7SUFDVixPQUFPLEVBQUUsQ0FBQztJQUNWLE9BQU8sRUFBRSxDQUFDO0lBQ1YsUUFBUSxFQUFFLENBQUM7SUFDWCxRQUFRLEVBQUUsQ0FBQztJQUNYLFFBQVEsRUFBRSxDQUFDO0lBQ1gsUUFBUSxFQUFFLENBQUM7SUFDWCxTQUFTLEVBQUUsRUFBRTtJQUNiLFNBQVMsRUFBRSxFQUFFO0NBQ2QsQ0FBQyxDQUFDO0FBRUgsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQWlDLENBQUM7QUFFN0UsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztBQVE3RCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWE7SUFDckMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FB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
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hhbmRsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1SEFBdUg7QUFDdkgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRWhDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsNkJBQTZCLENBQUM7QUFDakUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUM7QUFDM0QsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsMkJBQTJCLENBQUM7QUFDN0QsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDO0FBQ3JELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLDBCQUEwQixDQUFDO0FBQzlELHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7QUFFaEQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkMsS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztJQUNULE1BQU0sRUFBRSxDQUFDO0lBQ1QsT0FBTyxFQUFFLENBQUM7SUFDVixPQUFPLEVBQUUsQ0FBQztJQUNWLE9BQU8sRUFBRSxDQUFDO0lBQ1YsUUFBUSxFQUFFLENBQUM7SUFDWCxRQUFRLEVBQUUsQ0FBQztJQUNYLFFBQVEsRUFBRSxDQUFDO0lBQ1gs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
@@ -1,5 +1,5 @@
1
1
  export * from './binary.js';
2
2
  export * from './chain.js';
3
- export * from './handle.js';
3
+ export { HANDLE_LENGTH_BYTES, HANDLE_VERSION, HandleTypeName, InputContext, getHandleType, handleTypes, isFheType, validateHandle, type FheType, type Handle, type HandleTypes, } from './handle.js';
4
4
  export * from './schema.js';
5
5
  export * from './viem.js';
package/dist/esm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export * from './binary.js';
2
2
  export * from './chain.js';
3
- export * from './handle.js';
3
+ export { HANDLE_LENGTH_BYTES, HANDLE_VERSION, HandleTypeName, InputContext, getHandleType, handleTypes, isFheType, validateHandle, } from './handle.js';
4
4
  export * from './schema.js';
5
5
  export * from './viem.js';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxXQUFXLENBQUMifQ==
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsY0FBYyxFQUNkLFlBQVksRUFDWixhQUFhLEVBQ2IsV0FBVyxFQUNYLFNBQVMsRUFDVCxjQUFjLEdBSWYsTUFBTSxhQUFhLENBQUM7QUFDckIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxXQUFXLENBQUMifQ==
@@ -2,7 +2,7 @@ import { type Client } from '@connectrpc/connect';
2
2
  import type { Address } from 'viem';
3
3
  import type { SupportedChain } from '../chain.js';
4
4
  import { KmsService } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
5
- export declare const DEFAULT_COVALIDATOR_SIGNER: Address;
5
+ export declare const TEST_DEFAULT_COVALIDATOR_SIGNER: Address;
6
6
  export type KmsClient = Client<typeof KmsService> & {
7
7
  signerAddress: Address;
8
8
  };
@@ -3,7 +3,8 @@ import { createConnectTransport } from '@connectrpc/connect-web';
3
3
  import { KmsService } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
4
4
  // anvil zeroth address, while there is only one signer,
5
5
  // this does not matter, as we use these addresses for signer ordering
6
- export const DEFAULT_COVALIDATOR_SIGNER = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
6
+ // [WARNING] This is the default signer for the Inco Lightning public testnet.
7
+ export const TEST_DEFAULT_COVALIDATOR_SIGNER = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
7
8
  // Helper function to get a KMS client from a string or a Client instance.
8
9
  export function getKmsClient(kmsConnectRpcEndpointOrClient, signerAddress) {
9
10
  if (typeof kmsConnectRpcEndpointOrClient === 'string') {
@@ -36,4 +37,4 @@ function camelToDashCase(str) {
36
37
  function getCovalidatorGrpcHelper(chain, network, cluster) {
37
38
  return `https://grpc.${camelToDashCase(chain.name)}.${cluster}.${network}.inco.org`;
38
39
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ttcy9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUVoRix3REFBd0Q7QUFDeEQsc0VBQXNFO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUNyQyw0Q0FBNEMsQ0FBQztBQUkvQywwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLFlBQVksQ0FDMUIsNkJBQWlELEVBQ2pELGFBQXNCO0lBRXRCLElBQUksT0FBTyw2QkFBNkIsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztZQUN2QyxPQUFPLEVBQUUsNkJBQTZCO1NBQ3ZDLENBQUMsQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyw2QkFBNkIsRUFBRSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLHNCQUFzQixDQUFDLEtBQXFCO0lBQzFELE9BQU8sK0JBQStCLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELHNGQUFzRjtBQUN0RixNQUFNLFVBQVUsOEJBQThCLENBQUMsS0FBcUI7SUFDbEUsT0FBTyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCx1RkFBdUY7QUFDdkYsTUFBTSxVQUFVLCtCQUErQixDQUFDLEtBQXFCO0lBQ25FLE9BQU8sd0JBQXdCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLFNBQVMsZUFBZSxDQUFDLEdBQVc7SUFDbEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQy9ELENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsU0FBUyx3QkFBd0IsQ0FDL0IsS0FBcUIsRUFDckIsT0FBNkIsRUFDN0IsT0FBb0I7SUFFcEIsT0FBTyxnQkFBZ0IsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxPQUFPLElBQUksT0FBTyxXQUFXLENBQUM7QUFDdEYsQ0FBQyJ9
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ttcy9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUVoRix3REFBd0Q7QUFDeEQsc0VBQXNFO0FBQ3RFLDhFQUE4RTtBQUM5RSxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FDMUMsNENBQTRDLENBQUM7QUFJL0MsMEVBQTBFO0FBQzFFLE1BQU0sVUFBVSxZQUFZLENBQzFCLDZCQUFpRCxFQUNqRCxhQUFzQjtJQUV0QixJQUFJLE9BQU8sNkJBQTZCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEQsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUM7WUFDdkMsT0FBTyxFQUFFLDZCQUE2QjtTQUN2QyxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsNkJBQTZCLEVBQUUsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCwyRUFBMkU7QUFDM0UsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFxQjtJQUMxRCxPQUFPLCtCQUErQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCxzRkFBc0Y7QUFDdEYsTUFBTSxVQUFVLDhCQUE4QixDQUFDLEtBQXFCO0lBQ2xFLE9BQU8sd0JBQXdCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsdUZBQXVGO0FBQ3ZGLE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxLQUFxQjtJQUNuRSxPQUFPLHdCQUF3QixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELGtDQUFrQztBQUNsQyxTQUFTLGVBQWUsQ0FBQyxHQUFXO0lBQ2xDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUMvRCxDQUFDO0FBRUQsc0VBQXNFO0FBQ3RFLFNBQVMsd0JBQXdCLENBQy9CLEtBQXFCLEVBQ3JCLE9BQTZCLEVBQzdCLE9BQW9CO0lBRXBCLE9BQU8sZ0JBQWdCLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksT0FBTyxJQUFJLE9BQU8sV0FBVyxDQUFDO0FBQ3RGLENBQUMifQ==
@@ -1,10 +1,12 @@
1
- import type { Address } from 'viem';
1
+ import { type Address } from 'viem';
2
2
  import type { DecryptionAttestation, EncryptedDecryptionAttestation } from '../attesteddecrypt/types.js';
3
+ import { type EListDecryptionAttestation, type EncryptedEListDecryptionAttestation } from '../elistattesteddecrypt/types.js';
3
4
  import type { EncryptionScheme, SupportedFheType } from '../encryption/encryption.js';
4
- import type { AttestedComputeRequest, AttestedDecryptRequest, AttestedRevealRequest } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
5
- import type { XwingKeypair } from '../lite/index.js';
5
+ import type { AttestedComputeRequest, AttestedDecryptRequest, AttestedRevealRequest, EListAttestedDecryptRequest, EListAttestedRevealRequest } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
6
+ import { type XwingKeypair } from '../lite/xwing.js';
6
7
  import type { BackoffConfig } from '../retry.js';
7
8
  import { type KmsClient } from './client.js';
9
+ import type { ViemClient } from '../viem.js';
8
10
  export declare class KmsQuorumClient {
9
11
  private readonly kmss;
10
12
  private readonly threshold;
@@ -29,9 +31,11 @@ export declare class KmsQuorumClient {
29
31
  * @throws {Error} If KMS clients array is empty or threshold is invalid
30
32
  */
31
33
  static fromKmsClients(kmsClients: KmsClient[], threshold: number): KmsQuorumClient;
32
- attestedDecrypt(request: AttestedDecryptRequest, backoffConfig?: Partial<BackoffConfig>, reencryptKeypair?: XwingKeypair): Promise<(DecryptionAttestation<EncryptionScheme, SupportedFheType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedFheType>)[]>;
33
- attestedCompute(request: AttestedComputeRequest, backoffConfig?: Partial<BackoffConfig>, reencryptKeypair?: XwingKeypair): Promise<DecryptionAttestation<EncryptionScheme, SupportedFheType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedFheType>>;
34
- attestedReveal(request: AttestedRevealRequest, backoffConfig?: Partial<BackoffConfig>): Promise<(DecryptionAttestation<EncryptionScheme, SupportedFheType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedFheType>)[]>;
34
+ attestedDecrypt(request: AttestedDecryptRequest, backoffConfig?: Partial<BackoffConfig>, reencryptKeypair?: XwingKeypair, executorAddress?: Address, client?: ViemClient): Promise<(DecryptionAttestation<EncryptionScheme, SupportedFheType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedFheType>)[]>;
35
+ attestedCompute(request: AttestedComputeRequest, backoffConfig?: Partial<BackoffConfig>, reencryptKeypair?: XwingKeypair, executorAddress?: Address, client?: ViemClient): Promise<DecryptionAttestation<EncryptionScheme, SupportedFheType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedFheType>>;
36
+ attestedReveal(request: AttestedRevealRequest, backoffConfig?: Partial<BackoffConfig>, executorAddress?: Address, client?: ViemClient): Promise<(DecryptionAttestation<EncryptionScheme, SupportedFheType> | EncryptedDecryptionAttestation<EncryptionScheme, SupportedFheType>)[]>;
37
+ eListAttestedDecrypt(request: EListAttestedDecryptRequest, backoffConfig?: Partial<BackoffConfig>, reencryptKeypair?: XwingKeypair, executorAddress?: Address, client?: ViemClient): Promise<EListDecryptionAttestation<EncryptionScheme, SupportedFheType> | EncryptedEListDecryptionAttestation<EncryptionScheme, SupportedFheType>>;
38
+ eListAttestedReveal(request: EListAttestedRevealRequest, backoffConfig?: Partial<BackoffConfig>, executorAddress?: Address, client?: ViemClient): Promise<EListDecryptionAttestation<EncryptionScheme, SupportedFheType>>;
35
39
  /**
36
40
  * Generic method to execute a KMS operation across all clients with retry and threshold logic.
37
41
  * Returns results with both the response and signer address.
@@ -48,12 +52,14 @@ export declare class KmsQuorumClient {
48
52
  private buildPlaintextAttestation;
49
53
  private buildAggregatedAttestations;
50
54
  private buildAggregatedComputeAttestation;
51
- private verifyResponseConsistency;
52
- private verifyComputeResponseConsistency;
55
+ private buildAggregatedEListAttestation;
53
56
  /**
54
- * Verifies that two plaintext byte arrays are identical.
57
+ * Verifies proof hashes at two levels:
58
+ * 1. Aggregate: keccak256(concat(proofHashes)) must equal the attested commitmentProof
59
+ * 2. Per-element:
60
+ * - For plaintext (reveal): proofHash[i] = keccak256(value[i])
61
+ * - For reencryption (decrypt): proofHash[i] = keccak256(commitment[i] || plaintext[i])
62
+ * — requires reencryptKeypair to decrypt the ciphertext first.
55
63
  */
56
- private verifyPlaintextBytesConsistency;
57
- private verifyPlaintextConsistency;
58
- private verifyCiphertextConsistency;
64
+ private verifyElementProofHashes;
59
65
  }