@inco/lightning-js 0.0.0-bootstrap.0

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 (283) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +587 -0
  3. package/dist/cjs/advancedacl/index.d.ts +2 -0
  4. package/dist/cjs/advancedacl/index.js +19 -0
  5. package/dist/cjs/advancedacl/session-key.d.ts +95 -0
  6. package/dist/cjs/advancedacl/session-key.js +376 -0
  7. package/dist/cjs/advancedacl/types.d.ts +16 -0
  8. package/dist/cjs/advancedacl/types.js +3 -0
  9. package/dist/cjs/attestedcompute/attested-compute.d.ts +65 -0
  10. package/dist/cjs/attestedcompute/attested-compute.js +80 -0
  11. package/dist/cjs/attestedcompute/types.d.ts +35 -0
  12. package/dist/cjs/attestedcompute/types.js +46 -0
  13. package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +61 -0
  14. package/dist/cjs/attesteddecrypt/attested-decrypt.js +118 -0
  15. package/dist/cjs/attesteddecrypt/index.d.ts +1 -0
  16. package/dist/cjs/attesteddecrypt/index.js +18 -0
  17. package/dist/cjs/attesteddecrypt/types.d.ts +27 -0
  18. package/dist/cjs/attesteddecrypt/types.js +16 -0
  19. package/dist/cjs/attestedreveal/attested-reveal.d.ts +21 -0
  20. package/dist/cjs/attestedreveal/attested-reveal.js +31 -0
  21. package/dist/cjs/attestedreveal/index.d.ts +2 -0
  22. package/dist/cjs/attestedreveal/index.js +21 -0
  23. package/dist/cjs/attestedreveal/types.d.ts +4 -0
  24. package/dist/cjs/attestedreveal/types.js +13 -0
  25. package/dist/cjs/binary.d.ts +104 -0
  26. package/dist/cjs/binary.js +171 -0
  27. package/dist/cjs/chain.d.ts +50 -0
  28. package/dist/cjs/chain.js +62 -0
  29. package/dist/cjs/eip712/eip712.d.ts +18 -0
  30. package/dist/cjs/eip712/eip712.js +51 -0
  31. package/dist/cjs/eip712/index.d.ts +1 -0
  32. package/dist/cjs/eip712/index.js +8 -0
  33. package/dist/cjs/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
  34. package/dist/cjs/elistattesteddecrypt/elist-attested-decrypt.js +94 -0
  35. package/dist/cjs/elistattesteddecrypt/index.d.ts +2 -0
  36. package/dist/cjs/elistattesteddecrypt/index.js +22 -0
  37. package/dist/cjs/elistattesteddecrypt/types.d.ts +31 -0
  38. package/dist/cjs/elistattesteddecrypt/types.js +16 -0
  39. package/dist/cjs/encryption/encryption.d.ts +235 -0
  40. package/dist/cjs/encryption/encryption.js +226 -0
  41. package/dist/cjs/encryption/index.d.ts +1 -0
  42. package/dist/cjs/encryption/index.js +19 -0
  43. package/dist/cjs/generated/abis/add-two.d.ts +117 -0
  44. package/dist/cjs/generated/abis/add-two.js +80 -0
  45. package/dist/cjs/generated/abis/lightning.d.ts +3362 -0
  46. package/dist/cjs/generated/abis/lightning.js +2445 -0
  47. package/dist/cjs/generated/abis/test-elist.d.ts +276 -0
  48. package/dist/cjs/generated/abis/test-elist.js +168 -0
  49. package/dist/cjs/generated/abis/verifier.d.ts +1353 -0
  50. package/dist/cjs/generated/abis/verifier.js +954 -0
  51. package/dist/cjs/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
  52. package/dist/cjs/generated/es/inco/covalidator/compute/v1/server_pb.js +395 -0
  53. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
  54. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.js +80 -0
  55. package/dist/cjs/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
  56. package/dist/cjs/generated/es/inco/helioswrapper/v1/helioswrapper_pb.js +28 -0
  57. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
  58. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +100 -0
  59. package/dist/cjs/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
  60. package/dist/cjs/generated/es/inco/kms/lite/v1/types_pb.js +136 -0
  61. package/dist/cjs/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
  62. package/dist/cjs/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.js +88 -0
  63. package/dist/cjs/generated/lightning.d.ts +830 -0
  64. package/dist/cjs/generated/lightning.js +872 -0
  65. package/dist/cjs/generated/local-node.d.ts +50 -0
  66. package/dist/cjs/generated/local-node.js +107 -0
  67. package/dist/cjs/handle.d.ts +123 -0
  68. package/dist/cjs/handle.js +221 -0
  69. package/dist/cjs/index.d.ts +5 -0
  70. package/dist/cjs/index.js +31 -0
  71. package/dist/cjs/kms/client.d.ts +12 -0
  72. package/dist/cjs/kms/client.js +47 -0
  73. package/dist/cjs/kms/quorumClient.d.ts +65 -0
  74. package/dist/cjs/kms/quorumClient.js +463 -0
  75. package/dist/cjs/kms/quorumConsistency.d.ts +82 -0
  76. package/dist/cjs/kms/quorumConsistency.js +269 -0
  77. package/dist/cjs/kms/signatureVerification.d.ts +35 -0
  78. package/dist/cjs/kms/signatureVerification.js +88 -0
  79. package/dist/cjs/kms/thresholdPromises.d.ts +8 -0
  80. package/dist/cjs/kms/thresholdPromises.js +62 -0
  81. package/dist/cjs/lite/attested-compute.d.ts +6 -0
  82. package/dist/cjs/lite/attested-compute.js +8 -0
  83. package/dist/cjs/lite/attested-decrypt.d.ts +4 -0
  84. package/dist/cjs/lite/attested-decrypt.js +6 -0
  85. package/dist/cjs/lite/deployments.d.ts +24 -0
  86. package/dist/cjs/lite/deployments.js +21 -0
  87. package/dist/cjs/lite/hadu.d.ts +4 -0
  88. package/dist/cjs/lite/hadu.js +28 -0
  89. package/dist/cjs/lite/index.d.ts +13 -0
  90. package/dist/cjs/lite/index.js +31 -0
  91. package/dist/cjs/lite/lightning.d.ts +459 -0
  92. package/dist/cjs/lite/lightning.js +696 -0
  93. package/dist/cjs/lite/types.d.ts +47 -0
  94. package/dist/cjs/lite/types.js +3 -0
  95. package/dist/cjs/lite/xwing.d.ts +154 -0
  96. package/dist/cjs/lite/xwing.js +326 -0
  97. package/dist/cjs/local/index.d.ts +1 -0
  98. package/dist/cjs/local/index.js +18 -0
  99. package/dist/cjs/local/local-node.d.ts +37 -0
  100. package/dist/cjs/local/local-node.js +80 -0
  101. package/dist/cjs/reencryption/eip712.d.ts +56 -0
  102. package/dist/cjs/reencryption/eip712.js +90 -0
  103. package/dist/cjs/reencryption/index.d.ts +2 -0
  104. package/dist/cjs/reencryption/index.js +19 -0
  105. package/dist/cjs/reencryption/types.d.ts +48 -0
  106. package/dist/cjs/reencryption/types.js +3 -0
  107. package/dist/cjs/retry.d.ts +30 -0
  108. package/dist/cjs/retry.js +87 -0
  109. package/dist/cjs/schema.d.ts +4 -0
  110. package/dist/cjs/schema.js +19 -0
  111. package/dist/cjs/test/mocks.d.ts +20 -0
  112. package/dist/cjs/test/mocks.js +72 -0
  113. package/dist/cjs/viem.d.ts +1141 -0
  114. package/dist/cjs/viem.js +36 -0
  115. package/dist/esm/advancedacl/index.d.ts +2 -0
  116. package/dist/esm/advancedacl/index.js +3 -0
  117. package/dist/esm/advancedacl/session-key.d.ts +95 -0
  118. package/dist/esm/advancedacl/session-key.js +367 -0
  119. package/dist/esm/advancedacl/types.d.ts +16 -0
  120. package/dist/esm/advancedacl/types.js +2 -0
  121. package/dist/esm/attestedcompute/attested-compute.d.ts +65 -0
  122. package/dist/esm/attestedcompute/attested-compute.js +76 -0
  123. package/dist/esm/attestedcompute/types.d.ts +35 -0
  124. package/dist/esm/attestedcompute/types.js +42 -0
  125. package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +61 -0
  126. package/dist/esm/attesteddecrypt/attested-decrypt.js +112 -0
  127. package/dist/esm/attesteddecrypt/index.d.ts +1 -0
  128. package/dist/esm/attesteddecrypt/index.js +2 -0
  129. package/dist/esm/attesteddecrypt/types.d.ts +27 -0
  130. package/dist/esm/attesteddecrypt/types.js +12 -0
  131. package/dist/esm/attestedreveal/attested-reveal.d.ts +21 -0
  132. package/dist/esm/attestedreveal/attested-reveal.js +28 -0
  133. package/dist/esm/attestedreveal/index.d.ts +2 -0
  134. package/dist/esm/attestedreveal/index.js +3 -0
  135. package/dist/esm/attestedreveal/types.d.ts +4 -0
  136. package/dist/esm/attestedreveal/types.js +9 -0
  137. package/dist/esm/binary.d.ts +104 -0
  138. package/dist/esm/binary.js +155 -0
  139. package/dist/esm/chain.d.ts +50 -0
  140. package/dist/esm/chain.js +58 -0
  141. package/dist/esm/eip712/eip712.d.ts +18 -0
  142. package/dist/esm/eip712/eip712.js +46 -0
  143. package/dist/esm/eip712/index.d.ts +1 -0
  144. package/dist/esm/eip712/index.js +2 -0
  145. package/dist/esm/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
  146. package/dist/esm/elistattesteddecrypt/elist-attested-decrypt.js +89 -0
  147. package/dist/esm/elistattesteddecrypt/index.d.ts +2 -0
  148. package/dist/esm/elistattesteddecrypt/index.js +3 -0
  149. package/dist/esm/elistattesteddecrypt/types.d.ts +31 -0
  150. package/dist/esm/elistattesteddecrypt/types.js +12 -0
  151. package/dist/esm/encryption/encryption.d.ts +235 -0
  152. package/dist/esm/encryption/encryption.js +214 -0
  153. package/dist/esm/encryption/index.d.ts +1 -0
  154. package/dist/esm/encryption/index.js +2 -0
  155. package/dist/esm/generated/abis/add-two.d.ts +117 -0
  156. package/dist/esm/generated/abis/add-two.js +77 -0
  157. package/dist/esm/generated/abis/lightning.d.ts +3362 -0
  158. package/dist/esm/generated/abis/lightning.js +2442 -0
  159. package/dist/esm/generated/abis/test-elist.d.ts +276 -0
  160. package/dist/esm/generated/abis/test-elist.js +165 -0
  161. package/dist/esm/generated/abis/verifier.d.ts +1353 -0
  162. package/dist/esm/generated/abis/verifier.js +951 -0
  163. package/dist/esm/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
  164. package/dist/esm/generated/es/inco/covalidator/compute/v1/server_pb.js +392 -0
  165. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
  166. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.js +77 -0
  167. package/dist/esm/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
  168. package/dist/esm/generated/es/inco/helioswrapper/v1/helioswrapper_pb.js +25 -0
  169. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
  170. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +97 -0
  171. package/dist/esm/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
  172. package/dist/esm/generated/es/inco/kms/lite/v1/types_pb.js +133 -0
  173. package/dist/esm/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
  174. package/dist/esm/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.js +85 -0
  175. package/dist/esm/generated/lightning.d.ts +830 -0
  176. package/dist/esm/generated/lightning.js +869 -0
  177. package/dist/esm/generated/local-node.d.ts +50 -0
  178. package/dist/esm/generated/local-node.js +104 -0
  179. package/dist/esm/handle.d.ts +123 -0
  180. package/dist/esm/handle.js +212 -0
  181. package/dist/esm/index.d.ts +5 -0
  182. package/dist/esm/index.js +6 -0
  183. package/dist/esm/kms/client.d.ts +12 -0
  184. package/dist/esm/kms/client.js +40 -0
  185. package/dist/esm/kms/quorumClient.d.ts +65 -0
  186. package/dist/esm/kms/quorumClient.js +459 -0
  187. package/dist/esm/kms/quorumConsistency.d.ts +82 -0
  188. package/dist/esm/kms/quorumConsistency.js +260 -0
  189. package/dist/esm/kms/signatureVerification.d.ts +35 -0
  190. package/dist/esm/kms/signatureVerification.js +84 -0
  191. package/dist/esm/kms/thresholdPromises.d.ts +8 -0
  192. package/dist/esm/kms/thresholdPromises.js +59 -0
  193. package/dist/esm/lite/attested-compute.d.ts +6 -0
  194. package/dist/esm/lite/attested-compute.js +4 -0
  195. package/dist/esm/lite/attested-decrypt.d.ts +4 -0
  196. package/dist/esm/lite/attested-decrypt.js +3 -0
  197. package/dist/esm/lite/deployments.d.ts +24 -0
  198. package/dist/esm/lite/deployments.js +17 -0
  199. package/dist/esm/lite/hadu.d.ts +4 -0
  200. package/dist/esm/lite/hadu.js +24 -0
  201. package/dist/esm/lite/index.d.ts +13 -0
  202. package/dist/esm/lite/index.js +10 -0
  203. package/dist/esm/lite/lightning.d.ts +459 -0
  204. package/dist/esm/lite/lightning.js +692 -0
  205. package/dist/esm/lite/types.d.ts +47 -0
  206. package/dist/esm/lite/types.js +2 -0
  207. package/dist/esm/lite/xwing.d.ts +154 -0
  208. package/dist/esm/lite/xwing.js +311 -0
  209. package/dist/esm/local/index.d.ts +1 -0
  210. package/dist/esm/local/index.js +2 -0
  211. package/dist/esm/local/local-node.d.ts +37 -0
  212. package/dist/esm/local/local-node.js +76 -0
  213. package/dist/esm/reencryption/eip712.d.ts +56 -0
  214. package/dist/esm/reencryption/eip712.js +87 -0
  215. package/dist/esm/reencryption/index.d.ts +2 -0
  216. package/dist/esm/reencryption/index.js +3 -0
  217. package/dist/esm/reencryption/types.d.ts +48 -0
  218. package/dist/esm/reencryption/types.js +2 -0
  219. package/dist/esm/retry.d.ts +30 -0
  220. package/dist/esm/retry.js +82 -0
  221. package/dist/esm/schema.d.ts +4 -0
  222. package/dist/esm/schema.js +15 -0
  223. package/dist/esm/test/mocks.d.ts +20 -0
  224. package/dist/esm/test/mocks.js +64 -0
  225. package/dist/esm/viem.d.ts +1141 -0
  226. package/dist/esm/viem.js +32 -0
  227. package/dist/types/advancedacl/index.d.ts +2 -0
  228. package/dist/types/advancedacl/session-key.d.ts +95 -0
  229. package/dist/types/advancedacl/types.d.ts +16 -0
  230. package/dist/types/attestedcompute/attested-compute.d.ts +65 -0
  231. package/dist/types/attestedcompute/types.d.ts +35 -0
  232. package/dist/types/attesteddecrypt/attested-decrypt.d.ts +61 -0
  233. package/dist/types/attesteddecrypt/index.d.ts +1 -0
  234. package/dist/types/attesteddecrypt/types.d.ts +27 -0
  235. package/dist/types/attestedreveal/attested-reveal.d.ts +21 -0
  236. package/dist/types/attestedreveal/index.d.ts +2 -0
  237. package/dist/types/attestedreveal/types.d.ts +4 -0
  238. package/dist/types/binary.d.ts +104 -0
  239. package/dist/types/chain.d.ts +50 -0
  240. package/dist/types/eip712/eip712.d.ts +18 -0
  241. package/dist/types/eip712/index.d.ts +1 -0
  242. package/dist/types/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
  243. package/dist/types/elistattesteddecrypt/index.d.ts +2 -0
  244. package/dist/types/elistattesteddecrypt/types.d.ts +31 -0
  245. package/dist/types/encryption/encryption.d.ts +235 -0
  246. package/dist/types/encryption/index.d.ts +1 -0
  247. package/dist/types/generated/abis/add-two.d.ts +117 -0
  248. package/dist/types/generated/abis/lightning.d.ts +3362 -0
  249. package/dist/types/generated/abis/test-elist.d.ts +276 -0
  250. package/dist/types/generated/abis/verifier.d.ts +1353 -0
  251. package/dist/types/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
  252. package/dist/types/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
  253. package/dist/types/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
  254. package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
  255. package/dist/types/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
  256. package/dist/types/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
  257. package/dist/types/generated/lightning.d.ts +830 -0
  258. package/dist/types/generated/local-node.d.ts +50 -0
  259. package/dist/types/handle.d.ts +123 -0
  260. package/dist/types/index.d.ts +5 -0
  261. package/dist/types/kms/client.d.ts +12 -0
  262. package/dist/types/kms/quorumClient.d.ts +65 -0
  263. package/dist/types/kms/quorumConsistency.d.ts +82 -0
  264. package/dist/types/kms/signatureVerification.d.ts +35 -0
  265. package/dist/types/kms/thresholdPromises.d.ts +8 -0
  266. package/dist/types/lite/attested-compute.d.ts +6 -0
  267. package/dist/types/lite/attested-decrypt.d.ts +4 -0
  268. package/dist/types/lite/deployments.d.ts +24 -0
  269. package/dist/types/lite/hadu.d.ts +4 -0
  270. package/dist/types/lite/index.d.ts +13 -0
  271. package/dist/types/lite/lightning.d.ts +459 -0
  272. package/dist/types/lite/types.d.ts +47 -0
  273. package/dist/types/lite/xwing.d.ts +154 -0
  274. package/dist/types/local/index.d.ts +1 -0
  275. package/dist/types/local/local-node.d.ts +37 -0
  276. package/dist/types/reencryption/eip712.d.ts +56 -0
  277. package/dist/types/reencryption/index.d.ts +2 -0
  278. package/dist/types/reencryption/types.d.ts +48 -0
  279. package/dist/types/retry.d.ts +30 -0
  280. package/dist/types/schema.d.ts +4 -0
  281. package/dist/types/test/mocks.d.ts +20 -0
  282. package/dist/types/viem.d.ts +1141 -0
  283. package/package.json +129 -0
@@ -0,0 +1,696 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Lightning = void 0;
4
+ const viem_1 = require("viem");
5
+ const chains_1 = require("viem/chains");
6
+ const session_key_js_1 = require("../advancedacl/session-key.js");
7
+ const attested_compute_js_1 = require("../attestedcompute/attested-compute.js");
8
+ const attested_decrypt_js_1 = require("../attesteddecrypt/attested-decrypt.js");
9
+ const attested_reveal_js_1 = require("../attestedreveal/attested-reveal.js");
10
+ const binary_js_1 = require("../binary.js");
11
+ const chain_js_1 = require("../chain.js");
12
+ const elist_attested_decrypt_js_1 = require("../elistattesteddecrypt/elist-attested-decrypt.js");
13
+ const encryption_js_1 = require("../encryption/encryption.js");
14
+ const lightning_js_1 = require("../generated/abis/lightning.js");
15
+ const verifier_js_1 = require("../generated/abis/verifier.js");
16
+ const lightning_js_2 = require("../generated/lightning.js");
17
+ const local_node_js_1 = require("../generated/local-node.js");
18
+ const handle_js_1 = require("../handle.js");
19
+ const index_js_1 = require("../index.js");
20
+ const quorumClient_js_1 = require("../kms/quorumClient.js");
21
+ const index_js_2 = require("../local/index.js");
22
+ const schema_js_1 = require("../schema.js");
23
+ const xwing_js_1 = require("./xwing.js");
24
+ const DefaultPepper = 'testnet';
25
+ function isLocalNodeEnvFileSource(value) {
26
+ return (!!value &&
27
+ typeof value === 'object' &&
28
+ 'filePath' in value &&
29
+ typeof value.filePath === 'string');
30
+ }
31
+ /**
32
+ * Builds a viem Transport from a list of RPC URLs.
33
+ * - No URLs: uses viem's default public RPC endpoint.
34
+ * - One URL: uses a single http() transport.
35
+ * - Multiple URLs: uses viem's fallback() transport (rank: false by default),
36
+ * which tries providers in order and falls back to the next on failure.
37
+ */
38
+ function buildTransport(rpcUrls) {
39
+ if (!rpcUrls || rpcUrls.length === 0)
40
+ return (0, viem_1.http)();
41
+ if (rpcUrls.length === 1)
42
+ return (0, viem_1.http)(rpcUrls[0]);
43
+ return (0, viem_1.fallback)(rpcUrls.map((url) => (0, viem_1.http)(url)));
44
+ }
45
+ /**
46
+ * The Lightning class provides a convenient way to interact with the Inco Lightning contract by binding to a specific
47
+ * deployment.
48
+ */
49
+ class Lightning {
50
+ _deployment;
51
+ covalidatorUrls;
52
+ signers;
53
+ threshold;
54
+ networkPubkey;
55
+ publicClient;
56
+ executorAddress;
57
+ chainId;
58
+ kmsQuorumClient;
59
+ encryptor = null;
60
+ encryptionScheme = null;
61
+ constructor(_deployment, covalidatorUrls, signers, threshold, networkPubkey, publicClient) {
62
+ this._deployment = _deployment;
63
+ this.covalidatorUrls = covalidatorUrls;
64
+ this.signers = signers;
65
+ this.threshold = threshold;
66
+ this.networkPubkey = networkPubkey;
67
+ this.publicClient = publicClient;
68
+ this.executorAddress = (0, binary_js_1.parseAddress)(_deployment.executorAddress);
69
+ this.chainId = BigInt(_deployment.chainId);
70
+ this.kmsQuorumClient = quorumClient_js_1.KmsQuorumClient.fromUrls(this.covalidatorUrls, this.signers, this.threshold);
71
+ }
72
+ async getEncryptor() {
73
+ if (!this.encryptor || !this.encryptionScheme) {
74
+ const pubKeyBytes = (0, viem_1.hexToBytes)((0, schema_js_1.parse)(binary_js_1.HexString, this.networkPubkey));
75
+ // Detect encryption scheme based on public key length
76
+ if (pubKeyBytes.length === xwing_js_1.XWING_PUBLIC_KEY_SIZE) {
77
+ // X-Wing encryption
78
+ const pubKeyA = await (0, xwing_js_1.decodeXwingPublicKey)(pubKeyBytes);
79
+ // Safe cast: X-Wing encryptor processes plaintexts with scheme=2,
80
+ // and we ensure scheme matches when calling encrypt()
81
+ this.encryptor = (0, xwing_js_1.getXwingEncryptor)({ pubKeyA });
82
+ this.encryptionScheme = encryption_js_1.encryptionSchemes.xwing;
83
+ }
84
+ else {
85
+ throw new Error(`Invalid network public key length: expected ${xwing_js_1.XWING_PUBLIC_KEY_SIZE} (X-Wing), got ${pubKeyBytes.length}`);
86
+ }
87
+ }
88
+ return { encryptor: this.encryptor, scheme: this.encryptionScheme };
89
+ }
90
+ /**
91
+ * Get the encryption scheme version used by this Lightning instance.
92
+ * Returns the X-Wing encryption scheme identifier.
93
+ * This is a convenience method to get the encryption scheme used by this Lightning instance.
94
+ */
95
+ async getEncryptionScheme() {
96
+ const { scheme } = await this.getEncryptor();
97
+ return scheme;
98
+ }
99
+ /**
100
+ * Get a Lightning instance bound to the latest Lightning deployment for Base mainnet.
101
+ *
102
+ * @param options.hostChainRpcUrls optional list of RPC URLs for the host chain. When multiple URLs are
103
+ * provided, viem's fallback transport is used and providers are tried in order on failure.
104
+ */
105
+ static async baseMainnet(options) {
106
+ return Lightning.latest('mainnet', chains_1.base.id, options);
107
+ }
108
+ /**
109
+ * Get a Lightning instance bound to the latest Lightning deployment for the Base Sepolia testnet.
110
+ *
111
+ * @param options.hostChainRpcUrls optional list of RPC URLs for the host chain. When multiple URLs are
112
+ * provided, viem's fallback transport is used and providers are tried in order on failure.
113
+ */
114
+ static async baseSepoliaTestnet(options) {
115
+ return Lightning.latest('mainnet', chains_1.baseSepolia.id, options);
116
+ }
117
+ /**
118
+ * Get a Lightning instance bound to our canonical Anvil-based test node and test Covalidator node
119
+ *
120
+ * These can be run in docker-compose using images pushed to dockerhub as:
121
+ * - inconetwork/local-node-anvil
122
+ * - inconetwork/local-node-covalidator
123
+ *
124
+ * See the sample docker-compose file here: https://github.com/Inco-fhevm/lightning-rod/blob/main/docker-compose.yaml
125
+ *
126
+ * @param env either a Pepper such as 'testnet', 'devnet', 'alphanet' or a LocalNodeEnv object containing the
127
+ * executorAddress, networkPubkey, chainId, covalidatorUrl and senderPrivateKey. If none is provided, it defaults to
128
+ * the 'testnet' Pepper. This produces allows connection to a local node running against a state dump of the
129
+ * corresponding Pepper.
130
+ *
131
+ */
132
+ static async localNode(env) {
133
+ if (!env) {
134
+ const config = local_node_js_1.localNodeLightningConfig[DefaultPepper];
135
+ return Lightning.custom({
136
+ ...config,
137
+ covalidatorUrls: [...config.covalidatorUrls],
138
+ signers: config.signers.map((s) => (0, binary_js_1.parseAddress)(s)),
139
+ hostChainRpcUrls: config.hostChainRpcUrls ?? ['http://localhost:8545'],
140
+ });
141
+ }
142
+ if (typeof env === 'string') {
143
+ const config = local_node_js_1.localNodeLightningConfig[env];
144
+ return Lightning.custom({
145
+ ...config,
146
+ covalidatorUrls: [...config.covalidatorUrls],
147
+ signers: config.signers.map((s) => (0, binary_js_1.parseAddress)(s)),
148
+ hostChainRpcUrls: config.hostChainRpcUrls ?? ['http://localhost:8545'],
149
+ });
150
+ }
151
+ const conf = local_node_js_1.localNodeLightningConfig[DefaultPepper];
152
+ return Lightning.custom({
153
+ // We assume that we always run a local node as the default anvil node
154
+ chainId: env.COVALIDATOR_HOST_CHAIN_ID
155
+ ? Number(env.COVALIDATOR_HOST_CHAIN_ID)
156
+ : conf.chainId,
157
+ covalidatorUrls: env.COVALIDATOR_URL
158
+ ? env.COVALIDATOR_URL.split(',')
159
+ : [...conf.covalidatorUrls],
160
+ signers: env.EIP712_SIGNER_ADDRESS
161
+ ? env.EIP712_SIGNER_ADDRESS.split(',').map((address) => (0, binary_js_1.parseAddress)(address))
162
+ : conf.signers.map((s) => (0, binary_js_1.parseAddress)(s)),
163
+ hostChainRpcUrls: env.COVALIDATOR_HOST_CHAIN_RPC_URL
164
+ ? env.COVALIDATOR_HOST_CHAIN_RPC_URL.split(',')
165
+ : (conf.hostChainRpcUrls ?? ['http://localhost:8545']),
166
+ // These variables vary per environment
167
+ executorAddress: env.EXECUTOR_ADDRESS,
168
+ senderPrivateKey: env.SENDER_PRIVATE_KEY,
169
+ });
170
+ }
171
+ /**
172
+ * Get a Lightning instance bound to a local node from a file containing a LocalNodeEnv environment .
173
+ *
174
+ * @param filePath the path to the file containing the environment variables in dotenv format
175
+ */
176
+ static async localNodeFromEnv(source) {
177
+ let envContent;
178
+ if (isLocalNodeEnvFileSource(source)) {
179
+ if (typeof process === 'undefined' || !process.versions?.node) {
180
+ throw new Error('Lightning.localNodeFromEnv with a file path is only available in Node environments.');
181
+ }
182
+ const { readFile } = await Promise.resolve().then(() => require('fs/promises'));
183
+ envContent = await readFile(source.filePath);
184
+ }
185
+ else {
186
+ envContent = source;
187
+ }
188
+ const env = (0, index_js_2.parseLocalEnv)(envContent);
189
+ return await Lightning.localNode(env);
190
+ }
191
+ /**
192
+ * Get a Lightning deployment by name or executor address on a particular chain.
193
+ *
194
+ * @param id this is an object containing either the pair of name and chainId or the executorAddress and chainId
195
+ * @param options.hostChainRpcUrls optional list of RPC URLs for the host chain. When multiple URLs are
196
+ * provided, viem's fallback transport is used and providers are tried in order on failure.
197
+ */
198
+ static async at(id, options) {
199
+ const deployment = this.isIdByName(id)
200
+ ? lightning_js_2.lightningDeployments.find((d) => d.name === id.name && d.chainId === id.chainId)
201
+ : lightning_js_2.lightningDeployments.find((d) => d.executorAddress === id.executorAddress &&
202
+ d.chainId === id.chainId);
203
+ if (!deployment) {
204
+ throw new Error(`No deployment found for ${JSON.stringify(id)}`);
205
+ }
206
+ const chain = (0, index_js_1.getViemChain)({ id: deployment.chainId });
207
+ const client = (0, viem_1.createPublicClient)({
208
+ chain,
209
+ transport: buildTransport(options?.hostChainRpcUrls),
210
+ });
211
+ const { threshold, signers, networkPubkey } = await Lightning.getChainConfig(deployment, client);
212
+ return new Lightning(deployment, Lightning.getCovalidatorUrls(deployment, signers), signers, threshold, networkPubkey, client);
213
+ }
214
+ /**
215
+ * Get a Lightning deployment for a local or custom node
216
+ *
217
+ * @param config this is an object containing the executorAddress, networkPubkey, chainId and covalidatorUrl.
218
+ * additional fields past will be made available as part of the `deployment` property.
219
+ */
220
+ static async custom(config) {
221
+ const chain = (0, index_js_1.getViemChain)({ id: config.chainId });
222
+ const client = (0, viem_1.createPublicClient)({
223
+ chain,
224
+ transport: buildTransport(config.hostChainRpcUrls),
225
+ });
226
+ const { threshold, signers, networkPubkey } = await Lightning.getVerifierContractDetails(config.executorAddress, client);
227
+ return new Lightning(config, config.covalidatorUrls, signers, threshold, networkPubkey, client);
228
+ }
229
+ /**
230
+ * Get the latest deployment for a given pepper, which usually denotes a family of deployments distinct from their
231
+ * version such as 'devnet', 'testnet', 'mainnet', etc.
232
+ *
233
+ * @param pepper the pepper to use to filter the deployments
234
+ * @param chainId the chainId to use to filter the deployments
235
+ */
236
+ static latestDeployment(pepper, chainId) {
237
+ // Deployments are sorted so we are guaranteed to get the latest first
238
+ const latestByPepper = lightning_js_2.lightningDeployments.find((d) => d.pepper === pepper && d.chainId === chainId);
239
+ if (!latestByPepper) {
240
+ // This should not actually happen provided this file compiles since we are extracting the available peppers
241
+ // from the const itself
242
+ throw new Error(`No deployment found for pepper ${pepper}`);
243
+ }
244
+ return latestByPepper;
245
+ }
246
+ /**
247
+ * Get the latest Lightning deployment for a given pepper amd chainId unconditionally.
248
+ * Note that if you upgrade the library the latest deployment may change and contracts deployed to a previous version
249
+ * will not be compatible with the new version.
250
+ *
251
+ * @param pepper the pepper to use to filter the deployments
252
+ * @param chainId the chainId to use to filter the deployments
253
+ * @param options.hostChainRpcUrls optional list of RPC URLs for the host chain. When multiple URLs are
254
+ * provided, viem's fallback transport is used and providers are tried in order on failure.
255
+ */
256
+ static async latest(pepper, chainId, options) {
257
+ return Lightning.at(Lightning.latestDeployment(pepper, chainId), options);
258
+ }
259
+ /** Returns a shallow copy of the deployment configuration this Lightning instance is bound to. */
260
+ get deployment() {
261
+ return { ...this._deployment };
262
+ }
263
+ /**
264
+ * Encrypt a value using the network's public key (X-Wing).
265
+ * The encryption scheme is automatically detected based on the public key length.
266
+ *
267
+ * @param value a boolean or numeric value to encrypt
268
+ * @param accountAddress the address of the account interacting with the dapp contract, normally an Externally Owned Account (EOA)
269
+ * @param dappAddress the address of the dapp contract that interacts with the Inco Lightning contract or library
270
+ * @param handleType (optional) the handle type to be used for encrypting the value - this is required in case of non-default handle types
271
+ * default handle types:
272
+ * - boolean -> handleTypes.ebool
273
+ * - number | bigint -> handleTypes.euint256
274
+ * @returns a promise that resolves to the encrypted value as a HexString
275
+ */
276
+ async encrypt(value, { accountAddress, dappAddress, handleType }) {
277
+ const { encryptor, scheme } = await this.getEncryptor();
278
+ const plaintext = Lightning.plaintextFromValue(value, handleType, scheme);
279
+ const { ciphertext } = await encryptor({
280
+ plaintext,
281
+ context: {
282
+ hostChainId: this.chainId,
283
+ aclAddress: this.executorAddress,
284
+ userAddress: (0, binary_js_1.parseAddress)(accountAddress),
285
+ contractAddress: (0, binary_js_1.parseAddress)(dappAddress),
286
+ version: scheme,
287
+ inputType: plaintext.type,
288
+ },
289
+ });
290
+ return ciphertext.value;
291
+ }
292
+ /**
293
+ * Grants a session key allowance voucher for secure reencryption operations.
294
+ *
295
+ * This method creates a signed allowance voucher that authorizes a specific requester address
296
+ * to perform reencryption operations using session keys. The voucher includes an expiration time
297
+ * and can optionally specify a custom session verifier contract address.
298
+ *
299
+ * @param walletClient - The wallet client used for signing the allowance voucher
300
+ * @param granteeAddress - The address of the entity requesting the session key allowance
301
+ * @param expiresAt - The timestamp when the allowance voucher expires (as a bigint)
302
+ * @param sessionVerifierAddress - Optional custom session verifier contract address. If not provided, uses the executor address
303
+ * @returns A promise that resolves to an AllowanceVoucherWithSig containing the signed allowance voucher
304
+ *
305
+ * @example
306
+ * ```typescript
307
+ * const voucher = await lightning.grantSessionKeyAllowanceVoucher(
308
+ * walletClient,
309
+ * "0x1234...",
310
+ * BigInt(Date.now() + 3600000), // 1 hour from now
311
+ * "0x5678..." // optional custom verifier
312
+ * );
313
+ * ```
314
+ */
315
+ grantSessionKeyAllowanceVoucher(walletClient, granteeAddress, expiresAt, sessionVerifierAddress) {
316
+ return (0, session_key_js_1.grantSessionKey)({
317
+ chainId: this.chainId,
318
+ incoLiteAddress: this.executorAddress,
319
+ sessionVerifierContractAddress: (0, binary_js_1.parseAddress)(sessionVerifierAddress),
320
+ granteeAddress: (0, binary_js_1.parseAddress)(granteeAddress),
321
+ sharerWalletClient: walletClient,
322
+ expiresAt,
323
+ });
324
+ }
325
+ /**
326
+ * Grants a session key allowance voucher using a custom session verifier contract.
327
+ *
328
+ * This method creates a signed allowance voucher that authorizes reencryption operations
329
+ * using a custom session verifier. Unlike `grantSessionKeyAllowanceVoucher`, this method
330
+ * allows specifying custom `sharerArgData` for use with custom verifier contracts that
331
+ * require additional authorization parameters.
332
+ *
333
+ * @param walletClient - The wallet client used for signing the allowance voucher
334
+ * @param sessionVerifierAddress - The address of the custom session verifier contract
335
+ * @param sharerArgData - Custom encoded arguments for the session verifier's `canUseSession` function
336
+ * @returns A promise that resolves to an AllowanceVoucherWithSig containing the signed allowance voucher
337
+ *
338
+ * @example
339
+ * ```typescript
340
+ * const sharerArgData = encodeAbiParameters(
341
+ * [{ type: 'address' }, { type: 'uint256' }],
342
+ * [granteeAddress, expiresAt]
343
+ * );
344
+ * const voucher = await lightning.grantCustomSessionKeyAllowanceVoucher(
345
+ * walletClient,
346
+ * "0x5678...", // custom verifier address
347
+ * sharerArgData
348
+ * );
349
+ * ```
350
+ */
351
+ grantCustomSessionKeyAllowanceVoucher(walletClient, sessionVerifierAddress, sharerArgData) {
352
+ return (0, session_key_js_1.grantSessionKeyCustomVerifier)({
353
+ chainId: this.chainId,
354
+ incoLiteAddress: this.executorAddress,
355
+ sessionVerifierContractAddress: (0, binary_js_1.parseAddress)(sessionVerifierAddress),
356
+ sharerWalletClient: walletClient,
357
+ sharerArgData: sharerArgData,
358
+ });
359
+ }
360
+ /**
361
+ * Updates the active session nonce for the given wallet client.
362
+ *
363
+ * This method updates the active session nonce for the given wallet client.
364
+ * It nullifies all the previous shared addresses accessing the voucher.
365
+ *
366
+ * @param walletClient - The wallet client used for updating the session nonce
367
+ * @returns The transaction hash of the updateActiveVouchersSessionNonce transaction
368
+ */
369
+ updateActiveVouchersSessionNonce(walletClient) {
370
+ return (0, session_key_js_1.updateActiveVouchersSessionNonce)(this.executorAddress, walletClient);
371
+ }
372
+ async attestedDecrypt(walletClient, handles, opts) {
373
+ const { reencryptPubKey: inputPubKey, reencryptKeypair: inputKeypair, backoffConfig, } = opts ?? {};
374
+ const common = {
375
+ handles,
376
+ backoffConfig,
377
+ chainId: Number(this.chainId),
378
+ walletClient,
379
+ kmsQuorumClient: this.kmsQuorumClient,
380
+ executorAddress: this.executorAddress,
381
+ };
382
+ if (inputPubKey) {
383
+ if (inputKeypair) {
384
+ return (0, attested_decrypt_js_1.attestedDecrypt)({
385
+ ...common,
386
+ reencryptPubKey: inputPubKey,
387
+ reencryptKeypair: inputKeypair,
388
+ });
389
+ }
390
+ return (0, attested_decrypt_js_1.attestedDecrypt)({
391
+ ...common,
392
+ reencryptPubKey: inputPubKey,
393
+ });
394
+ }
395
+ const keypair = await (0, xwing_js_1.generateXwingKeypair)();
396
+ const pubKey = keypair.encodePublicKey();
397
+ return (0, attested_decrypt_js_1.attestedDecrypt)({
398
+ ...common,
399
+ reencryptPubKey: pubKey,
400
+ reencryptKeypair: keypair,
401
+ });
402
+ }
403
+ async attestedDecryptWithVoucher(ephemeralAccount, allowanceVoucherWithSig, handles, opts) {
404
+ const { reencryptPubKey: inputPubKey, reencryptKeypair: inputKeypair, requesterArgData, backoffConfig, } = opts ?? {};
405
+ const common = {
406
+ backoffConfig,
407
+ chainId: Number(this.chainId),
408
+ kmsQuorumClient: this.kmsQuorumClient,
409
+ ephemeralAccount,
410
+ allowanceVoucherWithSig,
411
+ handles,
412
+ requesterArgData,
413
+ ethClient: this.publicClient,
414
+ executorAddress: this.executorAddress,
415
+ };
416
+ if (inputPubKey) {
417
+ if (inputKeypair) {
418
+ return (0, session_key_js_1.sessionKeyAttestedDecrypt)({
419
+ ...common,
420
+ reencryptPubKey: inputPubKey,
421
+ reencryptKeypair: inputKeypair,
422
+ });
423
+ }
424
+ return (0, session_key_js_1.sessionKeyAttestedDecrypt)({
425
+ ...common,
426
+ reencryptPubKey: inputPubKey,
427
+ });
428
+ }
429
+ const keypair = await (0, xwing_js_1.generateXwingKeypair)();
430
+ const pubKey = keypair.encodePublicKey();
431
+ return (0, session_key_js_1.sessionKeyAttestedDecrypt)({
432
+ ...common,
433
+ reencryptPubKey: pubKey,
434
+ reencryptKeypair: keypair,
435
+ });
436
+ }
437
+ async eListAttestedDecrypt(walletClient, handle, opts) {
438
+ const { reencryptPubKey: inputPubKey, reencryptKeypair: inputKeypair, backoffConfig, } = opts ?? {};
439
+ const common = {
440
+ handle,
441
+ backoffConfig,
442
+ chainId: Number(this.chainId),
443
+ walletClient,
444
+ kmsQuorumClient: this.kmsQuorumClient,
445
+ executorAddress: this.executorAddress,
446
+ };
447
+ if (inputPubKey) {
448
+ if (inputKeypair) {
449
+ return (0, elist_attested_decrypt_js_1.eListAttestedDecrypt)({
450
+ ...common,
451
+ reencryptPubKey: inputPubKey,
452
+ reencryptKeypair: inputKeypair,
453
+ });
454
+ }
455
+ return (0, elist_attested_decrypt_js_1.eListAttestedDecrypt)({
456
+ ...common,
457
+ reencryptPubKey: inputPubKey,
458
+ });
459
+ }
460
+ const keypair = await (0, xwing_js_1.generateXwingKeypair)();
461
+ const pubKey = keypair.encodePublicKey();
462
+ return (0, elist_attested_decrypt_js_1.eListAttestedDecrypt)({
463
+ ...common,
464
+ reencryptPubKey: pubKey,
465
+ reencryptKeypair: keypair,
466
+ });
467
+ }
468
+ /**
469
+ * Reveal a single elist handle without wallet authentication.
470
+ * Returns plaintext values along with an attestation of the checksum.
471
+ *
472
+ * @param handle - The elist handle to reveal
473
+ * @param opts - Optional backoff configuration
474
+ * @returns The elist decryption attestation with plaintext values
475
+ */
476
+ eListAttestedReveal(handle, opts) {
477
+ const { backoffConfig } = opts ?? {};
478
+ return (0, elist_attested_decrypt_js_1.eListAttestedReveal)({
479
+ handle,
480
+ backoffConfig,
481
+ kmsQuorumClient: this.kmsQuorumClient,
482
+ executorAddress: this.executorAddress,
483
+ publicClient: this.publicClient,
484
+ });
485
+ }
486
+ async attestedCompute(walletClient, lhsHandle, op, rhsPlaintext, opts) {
487
+ const { reencryptPubKey: inputPubKey, reencryptKeypair: inputKeypair, backoffConfig, } = opts ?? {};
488
+ const common = {
489
+ executorAddress: this.executorAddress,
490
+ walletClient,
491
+ kmsQuorumClient: this.kmsQuorumClient,
492
+ chainId: Number(this.chainId),
493
+ lhsHandle,
494
+ op,
495
+ rhsPlaintext,
496
+ backoffConfig,
497
+ };
498
+ if (inputPubKey) {
499
+ if (inputKeypair) {
500
+ return (0, attested_compute_js_1.attestedCompute)({
501
+ ...common,
502
+ reencryptPubKey: inputPubKey,
503
+ reencryptKeypair: inputKeypair,
504
+ });
505
+ }
506
+ return (0, attested_compute_js_1.attestedCompute)({
507
+ ...common,
508
+ reencryptPubKey: inputPubKey,
509
+ });
510
+ }
511
+ const keypair = await (0, xwing_js_1.generateXwingKeypair)();
512
+ const pubKey = keypair.encodePublicKey();
513
+ return (0, attested_compute_js_1.attestedCompute)({
514
+ ...common,
515
+ reencryptPubKey: pubKey,
516
+ reencryptKeypair: keypair,
517
+ });
518
+ }
519
+ async attestedComputeWithVoucher(ephemeralAccount, allowanceVoucherWithSig, lhsHandle, op, rhsPlaintext, opts) {
520
+ const { reencryptPubKey: inputPubKey, reencryptKeypair: inputKeypair, requesterArgData, backoffConfig, } = opts ?? {};
521
+ const common = {
522
+ chainId: Number(this.chainId),
523
+ kmsQuorumClient: this.kmsQuorumClient,
524
+ ephemeralAccount,
525
+ allowanceVoucherWithSig,
526
+ lhsHandle,
527
+ op,
528
+ rhsPlaintext,
529
+ requesterArgData,
530
+ ethClient: this.publicClient,
531
+ executorAddress: this.executorAddress,
532
+ backoffConfig,
533
+ };
534
+ if (inputPubKey) {
535
+ if (inputKeypair) {
536
+ return (0, session_key_js_1.sessionKeyAttestedCompute)({
537
+ ...common,
538
+ reencryptPubKey: inputPubKey,
539
+ reencryptKeypair: inputKeypair,
540
+ });
541
+ }
542
+ return (0, session_key_js_1.sessionKeyAttestedCompute)({
543
+ ...common,
544
+ reencryptPubKey: inputPubKey,
545
+ });
546
+ }
547
+ const keypair = await (0, xwing_js_1.generateXwingKeypair)();
548
+ const pubKey = keypair.encodePublicKey();
549
+ return (0, session_key_js_1.sessionKeyAttestedCompute)({
550
+ ...common,
551
+ reencryptPubKey: pubKey,
552
+ reencryptKeypair: keypair,
553
+ });
554
+ }
555
+ /**
556
+ * Get an decryption of publicly revealed handles.
557
+ *
558
+ * @param handles - The handles to decrypt
559
+ * @param backoffConfig - The backoff configuration for the attested decrypt request
560
+ * @returns The decryption attestations
561
+ *
562
+ * @example
563
+ * ```typescript
564
+ * const response = await lightning.attestedReveal([handle1, handle2]);
565
+ * const { plaintext, covalidatorSignature } = response[0];
566
+ * ```
567
+ */
568
+ attestedReveal(handles, opts) {
569
+ const { backoffConfig } = opts ?? {};
570
+ return (0, attested_reveal_js_1.attestedReveal)({
571
+ executorAddress: this.executorAddress,
572
+ handles,
573
+ backoffConfig,
574
+ kmsQuorumClient: this.kmsQuorumClient,
575
+ publicClient: this.publicClient,
576
+ });
577
+ }
578
+ /**
579
+ * Get the GRPC endpoint for the covalidator that services this deployment.
580
+ */
581
+ static getCovalidatorUrls(deployment, signers) {
582
+ const { chainId, pepper, majorVersion } = deployment;
583
+ const chainShortName = chain_js_1.chainShortNames[chainId];
584
+ if (!chainShortName) {
585
+ throw new Error(`Unsupported chainId ${chainId} for covalidator URL generation`);
586
+ }
587
+ return signers.map((signer) => {
588
+ return `https://${signer.toLowerCase()}.${majorVersion}.covalidator.${chainShortName}.${pepper}.inco.org`;
589
+ });
590
+ }
591
+ static isIdByName(id) {
592
+ return id.name !== undefined;
593
+ }
594
+ static plaintextFromValue(value, type, scheme) {
595
+ if (typeof value === 'boolean') {
596
+ return {
597
+ scheme,
598
+ type: handle_js_1.handleTypes.ebool,
599
+ value: value,
600
+ };
601
+ }
602
+ else if (typeof value === 'bigint' || typeof value === 'number') {
603
+ return {
604
+ scheme,
605
+ type: type ?? handle_js_1.handleTypes.euint256,
606
+ value: BigInt(value),
607
+ };
608
+ }
609
+ else {
610
+ throw new Error(`Unsupported type ${typeof value}`);
611
+ }
612
+ }
613
+ /**
614
+ * Reads the network public key from the on-chain Inco Verifier contract.
615
+ *
616
+ * Falls back to the legacy `eciesPubkey()` getter for older contract versions.
617
+ *
618
+ * @param client - A viem public client connected to the host chain.
619
+ * @param executorAddress - The address of the Inco Lightning executor contract.
620
+ * @returns The network public key as a hex string.
621
+ */
622
+ static async getNetworkPubkey(client, executorAddress) {
623
+ const incoVerifier = await Lightning.getIncoVerifierContract(client, executorAddress);
624
+ // TODO: Switch to use a version check instead of a try/catch
625
+ // See https://github.com/Inco-fhevm/inco-monorepo/blob/e17d940a6720d94c53e6b0bf12704b6097116821/js/src/lite/lightning.ts#L1164
626
+ // for now it's done.
627
+ try {
628
+ return await incoVerifier.read.networkPubkey();
629
+ }
630
+ catch (error) {
631
+ throw new Error('Network public key not found most probably you are using an old deployment or a wrong pepper', { cause: error });
632
+ }
633
+ }
634
+ /**
635
+ * Resolves the Inco Verifier contract instance associated with a Lightning executor.
636
+ *
637
+ * Reads the `incoVerifier` address from the executor contract and returns a typed contract handle.
638
+ *
639
+ * @param client - A viem public client connected to the host chain.
640
+ * @param executorAddress - The address of the Inco Lightning executor contract.
641
+ * @returns A viem contract instance bound to the Inco Verifier ABI.
642
+ */
643
+ static async getIncoVerifierContract(client, executorAddress) {
644
+ const incoLightningContract = (0, viem_1.getContract)({
645
+ abi: lightning_js_1.incoLightningAbi,
646
+ address: executorAddress,
647
+ client,
648
+ });
649
+ const incoVerifierAddress = await incoLightningContract.read.incoVerifier();
650
+ const incoVerifier = (0, viem_1.getContract)({
651
+ abi: verifier_js_1.incoVerifierAbi,
652
+ address: incoVerifierAddress,
653
+ client,
654
+ });
655
+ return incoVerifier;
656
+ }
657
+ /**
658
+ * Retrieves the verifier contract details including threshold, signers, and XWING public key from the Inco Verifier contract.
659
+ *
660
+ * @param executorAddress The address of the Inco Lightning executor contract.
661
+ * @param client The public client to interact with the blockchain.
662
+ * @returns An object containing the threshold, signers, and XWING public key.
663
+ */
664
+ static async getVerifierContractDetails(executorAddress, client) {
665
+ const incoVerifier = await Lightning.getIncoVerifierContract(client, executorAddress);
666
+ const threshold = await incoVerifier.read.getThreshold();
667
+ const networkPubkey = await Lightning.getNetworkPubkey(client, executorAddress);
668
+ const signersCount = await incoVerifier.read.getSignersCount();
669
+ const signersPromises = [];
670
+ for (let i = BigInt(0); i < signersCount; i++) {
671
+ signersPromises.push(incoVerifier.read.getSignerAtIndex([i]));
672
+ }
673
+ const signers = await Promise.all(signersPromises);
674
+ return {
675
+ threshold: Number(threshold),
676
+ signers: signers.map(binary_js_1.parseAddress),
677
+ networkPubkey,
678
+ };
679
+ }
680
+ static async getChainConfig(deployment, client) {
681
+ if (this.supportsThresholdRetrieval(deployment)) {
682
+ return await this.getVerifierContractDetails(deployment.executorAddress, client);
683
+ }
684
+ throw new Error('Threshold retrieval not supported for this deployment');
685
+ }
686
+ // Check if the deployment supports threshold retrieval based on its version
687
+ static supportsThresholdRetrieval(deployment) {
688
+ // Assumes that the threshold retrieval is supported if the smart contract / deployment version is greater than or equal to 1.1.0
689
+ if (!deployment.version)
690
+ throw new Error('Deployment version is undefined');
691
+ const { major, minor } = deployment.version;
692
+ return major > 1 || (major === 1 && minor >= 1);
693
+ }
694
+ }
695
+ exports.Lightning = Lightning;
696
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQVljO0FBRWQsd0NBQWdEO0FBQ2hELGtFQU11QztBQUV2QyxnRkFBbUc7QUFFbkcsZ0ZBQXlFO0FBS3pFLDZFQUErRjtBQUMvRiw0Q0FBZ0U7QUFDaEUsMENBQWdFO0FBQ2hFLGlHQUcyRDtBQUszRCwrREFNcUM7QUFDckMsaUVBQWtFO0FBQ2xFLCtEQUFnRTtBQUNoRSw0REFBaUU7QUFDakUsOERBQXNFO0FBQ3RFLDRDQUFvRDtBQUNwRCwwQ0FBMkM7QUFDM0MsNERBQXlEO0FBQ3pELGdEQUFnRTtBQUNoRSw0Q0FBcUM7QUFVckMseUNBS29CO0FBNEJwQixNQUFNLGFBQWEsR0FBb0IsU0FBUyxDQUFDO0FBd0NqRCxTQUFTLHdCQUF3QixDQUMvQixLQUEyRDtJQUUzRCxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUs7UUFDUCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLFVBQVUsSUFBSSxLQUFLO1FBQ25CLE9BQVEsS0FBaUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUNoRSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQXNDO0lBQzVELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFBLFdBQUksR0FBRSxDQUFDO0lBQ3BELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFBLFdBQUksRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxPQUFPLElBQUEsZUFBUSxFQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUEsV0FBSSxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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