@enclave-e3/contracts 0.1.4 → 0.1.6

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 (467) hide show
  1. package/README.md +46 -2
  2. package/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +135 -0
  3. package/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/artifacts.d.ts +27 -0
  4. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.json +77 -0
  5. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +126 -0
  6. package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/artifacts.d.ts +43 -0
  7. package/artifacts/build-info/solc-0_8_28-5150b9e6b6cf4df4986fccba97bea37a16fdfebc.json +311 -0
  8. package/artifacts/build-info/solc-0_8_28-5150b9e6b6cf4df4986fccba97bea37a16fdfebc.output.json +1 -0
  9. package/artifacts/contracts/Enclave.sol/Enclave.json +239 -147
  10. package/artifacts/contracts/Enclave.sol/artifacts.d.ts +6 -6
  11. package/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json +881 -0
  12. package/artifacts/contracts/interfaces/IBondingRegistry.sol/artifacts.d.ts +27 -0
  13. package/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json +326 -10
  14. package/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/artifacts.d.ts +2 -2
  15. package/artifacts/contracts/interfaces/IComputeProvider.sol/IComputeProvider.json +1 -1
  16. package/artifacts/contracts/interfaces/IComputeProvider.sol/artifacts.d.ts +1 -1
  17. package/artifacts/contracts/interfaces/IDecryptionVerifier.sol/IDecryptionVerifier.json +1 -1
  18. package/artifacts/contracts/interfaces/IDecryptionVerifier.sol/artifacts.d.ts +1 -1
  19. package/artifacts/contracts/interfaces/IE3Program.sol/IE3Program.json +21 -3
  20. package/artifacts/contracts/interfaces/IE3Program.sol/artifacts.d.ts +2 -2
  21. package/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json +247 -27
  22. package/artifacts/contracts/interfaces/IEnclave.sol/artifacts.d.ts +2 -2
  23. package/artifacts/contracts/interfaces/{IRegistryFilter.sol/IRegistryFilter.json → ISlashVerifier.sol/ISlashVerifier.json} +10 -10
  24. package/artifacts/contracts/interfaces/ISlashVerifier.sol/artifacts.d.ts +27 -0
  25. package/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json +759 -0
  26. package/artifacts/contracts/interfaces/ISlashingManager.sol/artifacts.d.ts +27 -0
  27. package/artifacts/contracts/lib/ExitQueueLib.sol/ExitQueueLib.json +116 -0
  28. package/artifacts/contracts/lib/ExitQueueLib.sol/artifacts.d.ts +27 -0
  29. package/artifacts/contracts/registry/BondingRegistry.sol/BondingRegistry.json +1217 -0
  30. package/artifacts/contracts/registry/BondingRegistry.sol/artifacts.d.ts +27 -0
  31. package/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json +351 -57
  32. package/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/artifacts.d.ts +6 -6
  33. package/artifacts/contracts/slashing/SlashingManager.sol/SlashingManager.json +1107 -0
  34. package/artifacts/contracts/slashing/SlashingManager.sol/artifacts.d.ts +27 -0
  35. package/artifacts/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry.json +328 -12
  36. package/artifacts/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey.json +328 -12
  37. package/artifacts/contracts/test/MockCiphernodeRegistry.sol/artifacts.d.ts +8 -8
  38. package/artifacts/contracts/test/MockComputeProvider.sol/MockComputeProvider.json +4 -4
  39. package/artifacts/contracts/test/MockComputeProvider.sol/artifacts.d.ts +4 -4
  40. package/artifacts/contracts/test/MockDecryptionVerifier.sol/MockDecryptionVerifier.json +3 -3
  41. package/artifacts/contracts/test/MockDecryptionVerifier.sol/artifacts.d.ts +3 -3
  42. package/artifacts/contracts/test/MockE3Program.sol/MockE3Program.json +26 -32
  43. package/artifacts/contracts/test/MockE3Program.sol/artifacts.d.ts +4 -4
  44. package/artifacts/contracts/test/MockSlashingVerifier.sol/MockSlashingVerifier.json +38 -0
  45. package/artifacts/contracts/test/MockSlashingVerifier.sol/artifacts.d.ts +27 -0
  46. package/artifacts/contracts/test/MockStableToken.sol/MockUSDC.json +425 -0
  47. package/artifacts/contracts/test/MockStableToken.sol/artifacts.d.ts +27 -0
  48. package/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json +1222 -0
  49. package/artifacts/contracts/token/EnclaveTicketToken.sol/artifacts.d.ts +27 -0
  50. package/artifacts/contracts/token/EnclaveToken.sol/EnclaveToken.json +1460 -0
  51. package/artifacts/contracts/token/EnclaveToken.sol/artifacts.d.ts +27 -0
  52. package/artifacts/poseidon-solidity/PoseidonT3.sol/PoseidonT3.json +3 -3
  53. package/artifacts/poseidon-solidity/PoseidonT3.sol/artifacts.d.ts +3 -3
  54. package/contracts/Enclave.sol +230 -81
  55. package/contracts/interfaces/IBondingRegistry.sol +446 -0
  56. package/contracts/interfaces/ICiphernodeRegistry.sol +153 -9
  57. package/contracts/interfaces/IComputeProvider.sol +12 -2
  58. package/contracts/interfaces/IDecryptionVerifier.sol +11 -6
  59. package/contracts/interfaces/IE3.sol +21 -17
  60. package/contracts/interfaces/IE3Program.sol +30 -17
  61. package/contracts/interfaces/IEnclave.sol +95 -21
  62. package/contracts/interfaces/ISlashVerifier.sol +23 -0
  63. package/contracts/interfaces/ISlashingManager.sol +426 -0
  64. package/contracts/lib/ExitQueueLib.sol +490 -0
  65. package/contracts/registry/BondingRegistry.sol +737 -0
  66. package/contracts/registry/CiphernodeRegistryOwnable.sol +393 -26
  67. package/contracts/slashing/SlashingManager.sol +367 -0
  68. package/contracts/test/MockCiphernodeRegistry.sol +118 -24
  69. package/contracts/test/MockComputeProvider.sol +2 -2
  70. package/contracts/test/MockE3Program.sol +17 -14
  71. package/contracts/test/MockSlashingVerifier.sol +19 -0
  72. package/contracts/test/MockStableToken.sol +28 -0
  73. package/contracts/token/EnclaveTicketToken.sol +243 -0
  74. package/contracts/token/EnclaveToken.sol +267 -0
  75. package/dist/hardhat.config.d.ts.map +1 -1
  76. package/dist/hardhat.config.js +35 -16
  77. package/dist/ignition/modules/{mockInputValidator.d.ts → bondingRegistry.d.ts} +1 -1
  78. package/dist/ignition/modules/bondingRegistry.d.ts.map +1 -0
  79. package/dist/ignition/modules/bondingRegistry.js +35 -0
  80. package/dist/ignition/modules/ciphernodeRegistry.d.ts.map +1 -1
  81. package/dist/ignition/modules/ciphernodeRegistry.js +12 -2
  82. package/dist/ignition/modules/enclave.d.ts.map +1 -1
  83. package/dist/ignition/modules/enclave.js +16 -7
  84. package/dist/ignition/modules/{naiveRegistryFilter.d.ts → enclaveTicketToken.d.ts} +1 -1
  85. package/dist/ignition/modules/enclaveTicketToken.d.ts.map +1 -0
  86. package/dist/ignition/modules/enclaveTicketToken.js +17 -0
  87. package/dist/ignition/modules/enclaveToken.d.ts +3 -0
  88. package/dist/ignition/modules/enclaveToken.d.ts.map +1 -0
  89. package/dist/ignition/modules/{mockInputValidator.js → enclaveToken.js} +4 -4
  90. package/dist/ignition/modules/mockCiphernodeRegistry.d.ts.map +1 -1
  91. package/dist/ignition/modules/mockCiphernodeRegistry.js +0 -1
  92. package/dist/ignition/modules/mockCiphernodeRegistryEmptyKey.d.ts.map +1 -1
  93. package/dist/ignition/modules/mockCiphernodeRegistryEmptyKey.js +0 -1
  94. package/dist/ignition/modules/mockComputeProvider.d.ts.map +1 -1
  95. package/dist/ignition/modules/mockComputeProvider.js +0 -1
  96. package/dist/ignition/modules/mockDecryptionVerifier.d.ts.map +1 -1
  97. package/dist/ignition/modules/mockDecryptionVerifier.js +0 -1
  98. package/dist/ignition/modules/mockE3Program.d.ts.map +1 -1
  99. package/dist/ignition/modules/mockE3Program.js +1 -3
  100. package/dist/ignition/modules/mockSlashingVerifier.d.ts +3 -0
  101. package/dist/ignition/modules/mockSlashingVerifier.d.ts.map +1 -0
  102. package/dist/ignition/modules/mockSlashingVerifier.js +10 -0
  103. package/dist/ignition/modules/mockStableToken.d.ts +3 -0
  104. package/dist/ignition/modules/mockStableToken.d.ts.map +1 -0
  105. package/dist/ignition/modules/mockStableToken.js +11 -0
  106. package/dist/ignition/modules/poseidonT3.d.ts.map +1 -1
  107. package/dist/ignition/modules/poseidonT3.js +0 -1
  108. package/dist/ignition/modules/slashingManager.d.ts +3 -0
  109. package/dist/ignition/modules/slashingManager.d.ts.map +1 -0
  110. package/dist/ignition/modules/slashingManager.js +16 -0
  111. package/dist/scripts/cleanIgnitionState.d.ts +12 -0
  112. package/dist/scripts/cleanIgnitionState.d.ts.map +1 -0
  113. package/dist/scripts/cleanIgnitionState.js +41 -0
  114. package/dist/scripts/deployAndSave/bondingRegistry.d.ts +38 -0
  115. package/dist/scripts/deployAndSave/bondingRegistry.d.ts.map +1 -0
  116. package/dist/scripts/deployAndSave/bondingRegistry.js +133 -0
  117. package/dist/scripts/deployAndSave/ciphernodeRegistryOwnable.d.ts +11 -1
  118. package/dist/scripts/deployAndSave/ciphernodeRegistryOwnable.d.ts.map +1 -1
  119. package/dist/scripts/deployAndSave/ciphernodeRegistryOwnable.js +76 -19
  120. package/dist/scripts/deployAndSave/enclave.d.ts +16 -2
  121. package/dist/scripts/deployAndSave/enclave.d.ts.map +1 -1
  122. package/dist/scripts/deployAndSave/enclave.js +89 -22
  123. package/dist/scripts/deployAndSave/enclaveTicketToken.d.ts +20 -0
  124. package/dist/scripts/deployAndSave/enclaveTicketToken.d.ts.map +1 -0
  125. package/dist/scripts/deployAndSave/enclaveTicketToken.js +41 -0
  126. package/dist/scripts/deployAndSave/enclaveToken.d.ts +18 -0
  127. package/dist/scripts/deployAndSave/enclaveToken.d.ts.map +1 -0
  128. package/dist/scripts/deployAndSave/enclaveToken.js +57 -0
  129. package/dist/scripts/deployAndSave/mockComputeProvider.d.ts.map +1 -1
  130. package/dist/scripts/deployAndSave/mockComputeProvider.js +5 -5
  131. package/dist/scripts/deployAndSave/mockDecryptionVerifier.d.ts.map +1 -1
  132. package/dist/scripts/deployAndSave/mockDecryptionVerifier.js +5 -5
  133. package/dist/scripts/deployAndSave/mockProgram.d.ts +1 -2
  134. package/dist/scripts/deployAndSave/mockProgram.d.ts.map +1 -1
  135. package/dist/scripts/deployAndSave/mockProgram.js +7 -19
  136. package/dist/scripts/deployAndSave/mockStableToken.d.ts +18 -0
  137. package/dist/scripts/deployAndSave/mockStableToken.d.ts.map +1 -0
  138. package/dist/scripts/deployAndSave/mockStableToken.js +36 -0
  139. package/dist/scripts/deployAndSave/poseidonT3.d.ts +11 -0
  140. package/dist/scripts/deployAndSave/poseidonT3.d.ts.map +1 -0
  141. package/dist/scripts/deployAndSave/poseidonT3.js +41 -0
  142. package/dist/scripts/deployAndSave/slashingManager.d.ts +19 -0
  143. package/dist/scripts/deployAndSave/slashingManager.d.ts.map +1 -0
  144. package/dist/scripts/deployAndSave/slashingManager.js +38 -0
  145. package/dist/scripts/deployEnclave.d.ts.map +1 -1
  146. package/dist/scripts/deployEnclave.js +109 -23
  147. package/dist/scripts/deployMocks.d.ts +0 -1
  148. package/dist/scripts/deployMocks.d.ts.map +1 -1
  149. package/dist/scripts/deployMocks.js +3 -6
  150. package/dist/scripts/index.d.ts +7 -2
  151. package/dist/scripts/index.d.ts.map +1 -1
  152. package/dist/scripts/index.js +7 -2
  153. package/dist/scripts/proxy.d.ts +22 -0
  154. package/dist/scripts/proxy.d.ts.map +1 -0
  155. package/dist/scripts/proxy.js +36 -0
  156. package/dist/scripts/runVerification.d.ts +2 -0
  157. package/dist/scripts/runVerification.d.ts.map +1 -0
  158. package/dist/scripts/runVerification.js +16 -0
  159. package/dist/scripts/upgrade/bondingRegistry.d.ts +6 -0
  160. package/dist/scripts/upgrade/bondingRegistry.d.ts.map +1 -0
  161. package/dist/scripts/upgrade/bondingRegistry.js +49 -0
  162. package/dist/scripts/upgrade/ciphernodeRegistryOwnable.d.ts +6 -0
  163. package/dist/scripts/upgrade/ciphernodeRegistryOwnable.d.ts.map +1 -0
  164. package/dist/scripts/upgrade/ciphernodeRegistryOwnable.js +52 -0
  165. package/dist/scripts/upgrade/enclave.d.ts +6 -0
  166. package/dist/scripts/upgrade/enclave.d.ts.map +1 -0
  167. package/dist/scripts/upgrade/enclave.js +49 -0
  168. package/dist/scripts/utils.d.ts +51 -2
  169. package/dist/scripts/utils.d.ts.map +1 -1
  170. package/dist/scripts/utils.js +67 -4
  171. package/dist/scripts/verify.d.ts +6 -0
  172. package/dist/scripts/verify.d.ts.map +1 -0
  173. package/dist/scripts/verify.js +142 -0
  174. package/dist/tasks/ciphernode.d.ts +2 -0
  175. package/dist/tasks/ciphernode.d.ts.map +1 -1
  176. package/dist/tasks/ciphernode.js +290 -19
  177. package/dist/tasks/enclave.d.ts.map +1 -1
  178. package/dist/tasks/enclave.js +76 -31
  179. package/dist/test/Enclave.spec.js +377 -370
  180. package/dist/test/Registry/BondingRegistry.spec.d.ts +2 -0
  181. package/dist/test/Registry/BondingRegistry.spec.d.ts.map +1 -0
  182. package/dist/test/Registry/BondingRegistry.spec.js +684 -0
  183. package/dist/test/Registry/CiphernodeRegistryOwnable.spec.d.ts.map +1 -0
  184. package/dist/test/Registry/CiphernodeRegistryOwnable.spec.js +374 -0
  185. package/dist/test/Slashing/SlashingManager.spec.d.ts +2 -0
  186. package/dist/test/Slashing/SlashingManager.spec.d.ts.map +1 -0
  187. package/dist/test/Slashing/SlashingManager.spec.js +672 -0
  188. package/dist/types/@openzeppelin/contracts/index.d.ts +3 -0
  189. package/dist/types/@openzeppelin/contracts/index.d.ts.map +1 -0
  190. package/dist/types/@openzeppelin/contracts/proxy/index.d.ts +3 -0
  191. package/dist/types/@openzeppelin/contracts/proxy/index.d.ts.map +1 -0
  192. package/dist/types/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.d.ts +97 -0
  193. package/dist/types/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.d.ts.map +1 -0
  194. package/dist/types/{contracts/registry/NaiveRegistryFilter.js → @openzeppelin/contracts/proxy/transparent/ProxyAdmin.js} +0 -4
  195. package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.d.ts +81 -0
  196. package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.d.ts.map +1 -0
  197. package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.js +12 -0
  198. package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.d.ts +52 -0
  199. package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.d.ts.map +1 -0
  200. package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.js +8 -0
  201. package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.d.ts +3 -0
  202. package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.d.ts.map +1 -0
  203. package/dist/types/@openzeppelin/contracts/proxy/transparent/index.d.ts +4 -0
  204. package/dist/types/@openzeppelin/contracts/proxy/transparent/index.d.ts.map +1 -0
  205. package/dist/types/@openzeppelin/index.d.ts +3 -0
  206. package/dist/types/@openzeppelin/index.d.ts.map +1 -0
  207. package/dist/types/contracts/Enclave.d.ts +126 -53
  208. package/dist/types/contracts/Enclave.d.ts.map +1 -1
  209. package/dist/types/contracts/Enclave.js +12 -0
  210. package/dist/types/contracts/index.d.ts +6 -0
  211. package/dist/types/contracts/index.d.ts.map +1 -1
  212. package/dist/types/contracts/interfaces/IBondingRegistry.d.ts +622 -0
  213. package/dist/types/contracts/interfaces/IBondingRegistry.d.ts.map +1 -0
  214. package/dist/types/contracts/interfaces/IBondingRegistry.js +24 -0
  215. package/dist/types/contracts/interfaces/ICiphernodeRegistry.d.ts +245 -15
  216. package/dist/types/contracts/interfaces/ICiphernodeRegistry.d.ts.map +1 -1
  217. package/dist/types/contracts/interfaces/ICiphernodeRegistry.js +16 -0
  218. package/dist/types/contracts/interfaces/IE3Program.d.ts +20 -10
  219. package/dist/types/contracts/interfaces/IE3Program.d.ts.map +1 -1
  220. package/dist/types/contracts/interfaces/IEnclave.d.ts +149 -20
  221. package/dist/types/contracts/interfaces/IEnclave.d.ts.map +1 -1
  222. package/dist/types/contracts/interfaces/IEnclave.js +12 -0
  223. package/dist/types/contracts/interfaces/{IRegistryFilter.d.ts → ISlashVerifier.d.ts} +16 -16
  224. package/dist/types/contracts/interfaces/ISlashVerifier.d.ts.map +1 -0
  225. package/dist/types/contracts/interfaces/ISlashVerifier.js +1 -0
  226. package/dist/types/contracts/interfaces/ISlashingManager.d.ts +384 -0
  227. package/dist/types/contracts/interfaces/ISlashingManager.d.ts.map +1 -0
  228. package/dist/types/contracts/interfaces/ISlashingManager.js +24 -0
  229. package/dist/types/contracts/interfaces/index.d.ts +3 -2
  230. package/dist/types/contracts/interfaces/index.d.ts.map +1 -1
  231. package/dist/types/contracts/lib/ExitQueueLib.d.ts +73 -0
  232. package/dist/types/contracts/lib/ExitQueueLib.d.ts.map +1 -0
  233. package/dist/types/contracts/lib/ExitQueueLib.js +12 -0
  234. package/dist/types/contracts/lib/index.d.ts +2 -0
  235. package/dist/types/contracts/lib/index.d.ts.map +1 -0
  236. package/dist/types/contracts/lib/index.js +1 -0
  237. package/dist/types/contracts/registry/BondingRegistry.d.ts +821 -0
  238. package/dist/types/contracts/registry/BondingRegistry.d.ts.map +1 -0
  239. package/dist/types/contracts/registry/BondingRegistry.js +44 -0
  240. package/dist/types/contracts/registry/CiphernodeRegistryOwnable.d.ts +194 -34
  241. package/dist/types/contracts/registry/CiphernodeRegistryOwnable.d.ts.map +1 -1
  242. package/dist/types/contracts/registry/CiphernodeRegistryOwnable.js +20 -0
  243. package/dist/types/contracts/registry/index.d.ts +1 -1
  244. package/dist/types/contracts/registry/index.d.ts.map +1 -1
  245. package/dist/types/contracts/slashing/SlashingManager.d.ts +592 -0
  246. package/dist/types/contracts/slashing/SlashingManager.d.ts.map +1 -0
  247. package/dist/types/contracts/slashing/SlashingManager.js +36 -0
  248. package/dist/types/contracts/slashing/index.d.ts +2 -0
  249. package/dist/types/contracts/slashing/index.d.ts.map +1 -0
  250. package/dist/types/contracts/slashing/index.js +1 -0
  251. package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry.d.ts +247 -17
  252. package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry.d.ts.map +1 -1
  253. package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry.js +16 -0
  254. package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey.d.ts +247 -17
  255. package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey.d.ts.map +1 -1
  256. package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey.js +16 -0
  257. package/dist/types/contracts/test/MockE3Program.d.ts +20 -14
  258. package/dist/types/contracts/test/MockE3Program.d.ts.map +1 -1
  259. package/dist/types/contracts/test/{MockInputValidator.d.ts → MockSlashingVerifier.d.ts} +15 -15
  260. package/dist/types/contracts/test/MockSlashingVerifier.d.ts.map +1 -0
  261. package/dist/types/contracts/test/MockSlashingVerifier.js +1 -0
  262. package/dist/types/contracts/test/MockStableToken.sol/MockUSDC.d.ts +227 -0
  263. package/dist/types/contracts/test/MockStableToken.sol/MockUSDC.d.ts.map +1 -0
  264. package/dist/types/contracts/test/MockStableToken.sol/MockUSDC.js +12 -0
  265. package/dist/types/contracts/test/MockStableToken.sol/index.d.ts +2 -0
  266. package/dist/types/contracts/test/MockStableToken.sol/index.d.ts.map +1 -0
  267. package/dist/types/contracts/test/MockStableToken.sol/index.js +1 -0
  268. package/dist/types/contracts/test/index.d.ts +3 -3
  269. package/dist/types/contracts/test/index.d.ts.map +1 -1
  270. package/dist/types/contracts/token/EnclaveTicketToken.d.ts +574 -0
  271. package/dist/types/contracts/token/EnclaveTicketToken.d.ts.map +1 -0
  272. package/dist/types/contracts/token/EnclaveTicketToken.js +24 -0
  273. package/dist/types/contracts/token/EnclaveToken.d.ts +775 -0
  274. package/dist/types/contracts/token/EnclaveToken.d.ts.map +1 -0
  275. package/dist/types/contracts/token/EnclaveToken.js +48 -0
  276. package/dist/types/contracts/token/index.d.ts +3 -0
  277. package/dist/types/contracts/token/index.d.ts.map +1 -0
  278. package/dist/types/contracts/token/index.js +1 -0
  279. package/dist/types/factories/@openzeppelin/contracts/index.d.ts +2 -0
  280. package/dist/types/factories/@openzeppelin/contracts/index.d.ts.map +1 -0
  281. package/dist/types/factories/@openzeppelin/contracts/index.js +4 -0
  282. package/dist/types/factories/@openzeppelin/contracts/proxy/index.d.ts +2 -0
  283. package/dist/types/factories/@openzeppelin/contracts/proxy/index.d.ts.map +1 -0
  284. package/dist/types/factories/@openzeppelin/contracts/proxy/index.js +4 -0
  285. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/ProxyAdmin__factory.d.ts +118 -0
  286. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/ProxyAdmin__factory.d.ts.map +1 -0
  287. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/ProxyAdmin__factory.js +157 -0
  288. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy__factory.d.ts +57 -0
  289. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy__factory.d.ts.map +1 -0
  290. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy__factory.js +78 -0
  291. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy__factory.d.ts +105 -0
  292. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy__factory.d.ts.map +1 -0
  293. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy__factory.js +141 -0
  294. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.d.ts +3 -0
  295. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.d.ts.map +1 -0
  296. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.js +5 -0
  297. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/index.d.ts +3 -0
  298. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/index.d.ts.map +1 -0
  299. package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/index.js +5 -0
  300. package/dist/types/factories/@openzeppelin/index.d.ts +2 -0
  301. package/dist/types/factories/@openzeppelin/index.d.ts.map +1 -0
  302. package/dist/types/factories/@openzeppelin/index.js +4 -0
  303. package/dist/types/factories/contracts/Enclave__factory.d.ts +190 -104
  304. package/dist/types/factories/contracts/Enclave__factory.d.ts.map +1 -1
  305. package/dist/types/factories/contracts/Enclave__factory.js +241 -134
  306. package/dist/types/factories/contracts/index.d.ts +3 -0
  307. package/dist/types/factories/contracts/index.d.ts.map +1 -1
  308. package/dist/types/factories/contracts/index.js +3 -0
  309. package/dist/types/factories/contracts/interfaces/IBondingRegistry__factory.d.ts +678 -0
  310. package/dist/types/factories/contracts/interfaces/IBondingRegistry__factory.d.ts.map +1 -0
  311. package/dist/types/factories/contracts/interfaces/IBondingRegistry__factory.js +882 -0
  312. package/dist/types/factories/contracts/interfaces/ICiphernodeRegistry__factory.d.ts +253 -9
  313. package/dist/types/factories/contracts/interfaces/ICiphernodeRegistry__factory.d.ts.map +1 -1
  314. package/dist/types/factories/contracts/interfaces/ICiphernodeRegistry__factory.js +325 -9
  315. package/dist/types/factories/contracts/interfaces/IE3Program__factory.d.ts +16 -2
  316. package/dist/types/factories/contracts/interfaces/IE3Program__factory.d.ts.map +1 -1
  317. package/dist/types/factories/contracts/interfaces/IE3Program__factory.js +20 -2
  318. package/dist/types/factories/contracts/interfaces/IEnclave__factory.d.ts +190 -24
  319. package/dist/types/factories/contracts/interfaces/IEnclave__factory.d.ts.map +1 -1
  320. package/dist/types/factories/contracts/interfaces/IEnclave__factory.js +246 -26
  321. package/dist/types/factories/contracts/interfaces/ISlashVerifier__factory.d.ts +26 -0
  322. package/dist/types/factories/contracts/interfaces/ISlashVerifier__factory.d.ts.map +1 -0
  323. package/dist/types/factories/contracts/interfaces/{IRegistryFilter__factory.js → ISlashVerifier__factory.js} +7 -7
  324. package/dist/types/factories/contracts/interfaces/ISlashingManager__factory.d.ts +594 -0
  325. package/dist/types/factories/contracts/interfaces/ISlashingManager__factory.d.ts.map +1 -0
  326. package/dist/types/factories/contracts/interfaces/ISlashingManager__factory.js +760 -0
  327. package/dist/types/factories/contracts/interfaces/index.d.ts +3 -2
  328. package/dist/types/factories/contracts/interfaces/index.d.ts.map +1 -1
  329. package/dist/types/factories/contracts/interfaces/index.js +3 -2
  330. package/dist/types/factories/contracts/lib/ExitQueueLib__factory.d.ts +107 -0
  331. package/dist/types/factories/contracts/lib/ExitQueueLib__factory.d.ts.map +1 -0
  332. package/dist/types/factories/contracts/lib/ExitQueueLib__factory.js +138 -0
  333. package/dist/types/factories/contracts/lib/index.d.ts +2 -0
  334. package/dist/types/factories/contracts/lib/index.d.ts.map +1 -0
  335. package/dist/types/factories/contracts/lib/index.js +4 -0
  336. package/dist/types/factories/contracts/registry/BondingRegistry__factory.d.ts +958 -0
  337. package/dist/types/factories/contracts/registry/BondingRegistry__factory.d.ts.map +1 -0
  338. package/dist/types/factories/contracts/registry/BondingRegistry__factory.js +1239 -0
  339. package/dist/types/factories/contracts/registry/CiphernodeRegistryOwnable__factory.d.ts +272 -40
  340. package/dist/types/factories/contracts/registry/CiphernodeRegistryOwnable__factory.d.ts.map +1 -1
  341. package/dist/types/factories/contracts/registry/CiphernodeRegistryOwnable__factory.js +343 -49
  342. package/dist/types/factories/contracts/registry/index.d.ts +1 -1
  343. package/dist/types/factories/contracts/registry/index.d.ts.map +1 -1
  344. package/dist/types/factories/contracts/registry/index.js +1 -1
  345. package/dist/types/factories/contracts/slashing/SlashingManager__factory.d.ts +879 -0
  346. package/dist/types/factories/contracts/slashing/SlashingManager__factory.d.ts.map +1 -0
  347. package/dist/types/factories/contracts/slashing/SlashingManager__factory.js +1129 -0
  348. package/dist/types/factories/contracts/slashing/index.d.ts +2 -0
  349. package/dist/types/factories/contracts/slashing/index.d.ts.map +1 -0
  350. package/dist/types/factories/contracts/slashing/index.js +4 -0
  351. package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey__factory.d.ts +254 -10
  352. package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey__factory.d.ts.map +1 -1
  353. package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey__factory.js +326 -10
  354. package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry__factory.d.ts +254 -10
  355. package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry__factory.d.ts.map +1 -1
  356. package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry__factory.js +326 -10
  357. package/dist/types/factories/contracts/test/MockComputeProvider__factory.d.ts +2 -2
  358. package/dist/types/factories/contracts/test/MockComputeProvider__factory.d.ts.map +1 -1
  359. package/dist/types/factories/contracts/test/MockComputeProvider__factory.js +2 -2
  360. package/dist/types/factories/contracts/test/MockDecryptionVerifier__factory.d.ts +1 -1
  361. package/dist/types/factories/contracts/test/MockDecryptionVerifier__factory.d.ts.map +1 -1
  362. package/dist/types/factories/contracts/test/MockDecryptionVerifier__factory.js +1 -1
  363. package/dist/types/factories/contracts/test/MockE3Program__factory.d.ts +23 -27
  364. package/dist/types/factories/contracts/test/MockE3Program__factory.d.ts.map +1 -1
  365. package/dist/types/factories/contracts/test/MockE3Program__factory.js +28 -34
  366. package/dist/types/factories/contracts/test/MockSlashingVerifier__factory.d.ts +43 -0
  367. package/dist/types/factories/contracts/test/MockSlashingVerifier__factory.d.ts.map +1 -0
  368. package/dist/types/factories/contracts/test/MockSlashingVerifier__factory.js +60 -0
  369. package/dist/types/factories/contracts/test/MockStableToken.sol/MockUSDC__factory.d.ts +338 -0
  370. package/dist/types/factories/contracts/test/MockStableToken.sol/MockUSDC__factory.d.ts.map +1 -0
  371. package/dist/types/factories/contracts/test/MockStableToken.sol/MockUSDC__factory.js +447 -0
  372. package/dist/types/factories/contracts/test/MockStableToken.sol/index.d.ts +2 -0
  373. package/dist/types/factories/contracts/test/MockStableToken.sol/index.d.ts.map +1 -0
  374. package/dist/types/factories/contracts/test/MockStableToken.sol/index.js +4 -0
  375. package/dist/types/factories/contracts/test/index.d.ts +2 -2
  376. package/dist/types/factories/contracts/test/index.d.ts.map +1 -1
  377. package/dist/types/factories/contracts/test/index.js +2 -2
  378. package/dist/types/factories/contracts/token/EnclaveTicketToken__factory.d.ts +894 -0
  379. package/dist/types/factories/contracts/token/EnclaveTicketToken__factory.d.ts.map +1 -0
  380. package/dist/types/factories/contracts/token/EnclaveTicketToken__factory.js +1175 -0
  381. package/dist/types/factories/contracts/token/EnclaveToken__factory.d.ts +1101 -0
  382. package/dist/types/factories/contracts/token/EnclaveToken__factory.d.ts.map +1 -0
  383. package/dist/types/factories/contracts/token/EnclaveToken__factory.js +1439 -0
  384. package/dist/types/factories/contracts/token/index.d.ts +3 -0
  385. package/dist/types/factories/contracts/token/index.d.ts.map +1 -0
  386. package/dist/types/factories/contracts/token/index.js +5 -0
  387. package/dist/types/factories/index.d.ts +1 -0
  388. package/dist/types/factories/index.d.ts.map +1 -1
  389. package/dist/types/factories/index.js +1 -0
  390. package/dist/types/factories/poseidon-solidity/PoseidonT3__factory.d.ts +1 -1
  391. package/dist/types/factories/poseidon-solidity/PoseidonT3__factory.d.ts.map +1 -1
  392. package/dist/types/factories/poseidon-solidity/PoseidonT3__factory.js +1 -1
  393. package/dist/types/index.d.ts +28 -12
  394. package/dist/types/index.d.ts.map +1 -1
  395. package/dist/types/index.js +13 -6
  396. package/package.json +30 -21
  397. package/LICENSE.md +0 -165
  398. package/artifacts/build-info/solc-0_8_27-9aea5e3f6e25811e781e96c22e8edaf1eb1a01c5.json +0 -130
  399. package/artifacts/build-info/solc-0_8_27-9aea5e3f6e25811e781e96c22e8edaf1eb1a01c5.output.json +0 -1
  400. package/artifacts/contracts/interfaces/IInputValidator.sol/IInputValidator.json +0 -38
  401. package/artifacts/contracts/interfaces/IInputValidator.sol/artifacts.d.ts +0 -27
  402. package/artifacts/contracts/interfaces/IRegistryFilter.sol/artifacts.d.ts +0 -27
  403. package/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json +0 -309
  404. package/artifacts/contracts/registry/NaiveRegistryFilter.sol/artifacts.d.ts +0 -27
  405. package/artifacts/contracts/test/MockInputValidator.sol/MockInputValidator.json +0 -43
  406. package/artifacts/contracts/test/MockInputValidator.sol/artifacts.d.ts +0 -27
  407. package/artifacts/contracts/test/MockRegistryFilter.sol/IRegistry.json +0 -37
  408. package/artifacts/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter.json +0 -262
  409. package/artifacts/contracts/test/MockRegistryFilter.sol/artifacts.d.ts +0 -43
  410. package/contracts/interfaces/IInputValidator.sol +0 -18
  411. package/contracts/interfaces/IRegistryFilter.sol +0 -13
  412. package/contracts/registry/NaiveRegistryFilter.sol +0 -124
  413. package/contracts/test/MockInputValidator.sol +0 -29
  414. package/contracts/test/MockRegistryFilter.sol +0 -117
  415. package/dist/ignition/modules/mockInputValidator.d.ts.map +0 -1
  416. package/dist/ignition/modules/naiveRegistryFilter.d.ts.map +0 -1
  417. package/dist/ignition/modules/naiveRegistryFilter.js +0 -16
  418. package/dist/scripts/deployAndSave/mockInputValidator.d.ts +0 -6
  419. package/dist/scripts/deployAndSave/mockInputValidator.d.ts.map +0 -1
  420. package/dist/scripts/deployAndSave/mockInputValidator.js +0 -18
  421. package/dist/scripts/deployAndSave/naiveRegistryFilter.d.ts +0 -11
  422. package/dist/scripts/deployAndSave/naiveRegistryFilter.d.ts.map +0 -1
  423. package/dist/scripts/deployAndSave/naiveRegistryFilter.js +0 -41
  424. package/dist/test/CiphernodeRegistry/CiphernodeRegistryOwnable.spec.d.ts.map +0 -1
  425. package/dist/test/CiphernodeRegistry/CiphernodeRegistryOwnable.spec.js +0 -279
  426. package/dist/test/CiphernodeRegistry/NaiveRegistryFilter.spec.d.ts +0 -2
  427. package/dist/test/CiphernodeRegistry/NaiveRegistryFilter.spec.d.ts.map +0 -1
  428. package/dist/test/CiphernodeRegistry/NaiveRegistryFilter.spec.js +0 -160
  429. package/dist/types/contracts/interfaces/IInputValidator.d.ts +0 -36
  430. package/dist/types/contracts/interfaces/IInputValidator.d.ts.map +0 -1
  431. package/dist/types/contracts/interfaces/IRegistryFilter.d.ts.map +0 -1
  432. package/dist/types/contracts/registry/NaiveRegistryFilter.d.ts +0 -187
  433. package/dist/types/contracts/registry/NaiveRegistryFilter.d.ts.map +0 -1
  434. package/dist/types/contracts/test/MockInputValidator.d.ts.map +0 -1
  435. package/dist/types/contracts/test/MockRegistryFilter.sol/IRegistry.d.ts +0 -38
  436. package/dist/types/contracts/test/MockRegistryFilter.sol/IRegistry.d.ts.map +0 -1
  437. package/dist/types/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter.d.ts +0 -163
  438. package/dist/types/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter.d.ts.map +0 -1
  439. package/dist/types/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter.js +0 -8
  440. package/dist/types/contracts/test/MockRegistryFilter.sol/index.d.ts +0 -3
  441. package/dist/types/contracts/test/MockRegistryFilter.sol/index.d.ts.map +0 -1
  442. package/dist/types/factories/contracts/interfaces/IInputValidator__factory.d.ts +0 -26
  443. package/dist/types/factories/contracts/interfaces/IInputValidator__factory.d.ts.map +0 -1
  444. package/dist/types/factories/contracts/interfaces/IInputValidator__factory.js +0 -39
  445. package/dist/types/factories/contracts/interfaces/IRegistryFilter__factory.d.ts +0 -26
  446. package/dist/types/factories/contracts/interfaces/IRegistryFilter__factory.d.ts.map +0 -1
  447. package/dist/types/factories/contracts/registry/NaiveRegistryFilter__factory.d.ts +0 -251
  448. package/dist/types/factories/contracts/registry/NaiveRegistryFilter__factory.d.ts.map +0 -1
  449. package/dist/types/factories/contracts/registry/NaiveRegistryFilter__factory.js +0 -331
  450. package/dist/types/factories/contracts/test/MockInputValidator__factory.d.ts +0 -47
  451. package/dist/types/factories/contracts/test/MockInputValidator__factory.d.ts.map +0 -1
  452. package/dist/types/factories/contracts/test/MockInputValidator__factory.js +0 -65
  453. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/IRegistry__factory.d.ts +0 -26
  454. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/IRegistry__factory.d.ts.map +0 -1
  455. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/IRegistry__factory.js +0 -38
  456. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter__factory.d.ts +0 -216
  457. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter__factory.d.ts.map +0 -1
  458. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter__factory.js +0 -284
  459. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/index.d.ts +0 -3
  460. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/index.d.ts.map +0 -1
  461. package/dist/types/factories/contracts/test/MockRegistryFilter.sol/index.js +0 -5
  462. /package/dist/test/{CiphernodeRegistry → Registry}/CiphernodeRegistryOwnable.spec.d.ts +0 -0
  463. /package/dist/types/{contracts/test/MockRegistryFilter.sol → @openzeppelin/contracts}/index.js +0 -0
  464. /package/dist/types/{contracts/interfaces/IInputValidator.js → @openzeppelin/contracts/proxy/index.js} +0 -0
  465. /package/dist/types/{contracts/interfaces/IRegistryFilter.js → @openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.js} +0 -0
  466. /package/dist/types/{contracts/test/MockInputValidator.js → @openzeppelin/contracts/proxy/transparent/index.js} +0 -0
  467. /package/dist/types/{contracts/test/MockRegistryFilter.sol/IRegistry.js → @openzeppelin/index.js} +0 -0
@@ -7,19 +7,23 @@ import { LeanIMT } from "@zk-kit/lean-imt";
7
7
  import { expect } from "chai";
8
8
  import { network } from "hardhat";
9
9
  import { poseidon2 } from "poseidon-lite";
10
+ import BondingRegistryModule from "../ignition/modules/bondingRegistry";
11
+ import CiphernodeRegistryModule from "../ignition/modules/ciphernodeRegistry";
10
12
  import EnclaveModule from "../ignition/modules/enclave";
11
- import MockCiphernodeRegistryModule from "../ignition/modules/mockCiphernodeRegistry";
13
+ import EnclaveTicketTokenModule from "../ignition/modules/enclaveTicketToken";
14
+ import EnclaveTokenModule from "../ignition/modules/enclaveToken";
12
15
  import MockCiphernodeRegistryEmptyKeyModule from "../ignition/modules/mockCiphernodeRegistryEmptyKey";
13
16
  import mockComputeProviderModule from "../ignition/modules/mockComputeProvider";
14
17
  import MockDecryptionVerifierModule from "../ignition/modules/mockDecryptionVerifier";
15
18
  import MockE3ProgramModule from "../ignition/modules/mockE3Program";
16
- import MockInputValidatorModule from "../ignition/modules/mockInputValidator";
17
- import NaiveRegistryFilterModule from "../ignition/modules/naiveRegistryFilter";
18
- import { CiphernodeRegistryOwnable__factory as CiphernodeRegistryOwnableFactory, Enclave__factory as EnclaveFactory, NaiveRegistryFilter__factory as NaiveRegistryFilterFactory, } from "../types";
19
+ import MockStableTokenModule from "../ignition/modules/mockStableToken";
20
+ import SlashingManagerModule from "../ignition/modules/slashingManager";
21
+ import { BondingRegistry__factory as BondingRegistryFactory, CiphernodeRegistryOwnable__factory as CiphernodeRegistryOwnableFactory, Enclave__factory as EnclaveFactory, MockUSDC__factory as MockUSDCFactory, } from "../types";
19
22
  const { ethers, ignition, networkHelpers } = await network.connect();
20
23
  const { loadFixture, time, mine } = networkHelpers;
21
24
  describe("Enclave", function () {
22
25
  const THIRTY_DAYS_IN_SECONDS = 60 * 60 * 24 * 30;
26
+ const SORTITION_SUBMISSION_WINDOW = 10;
23
27
  const addressOne = "0x0000000000000000000000000000000000000001";
24
28
  const AddressTwo = "0x0000000000000000000000000000000000000002";
25
29
  const encryptionSchemeId = "0x2c2a814a0495f913a3a312fc4771e37552bc14f8a2d4075a08122d356f0849c6";
@@ -34,9 +38,89 @@ describe("Enclave", function () {
34
38
  const proof = "0x1337";
35
39
  // Hash function used to compute the tree nodes.
36
40
  const hash = (a, b) => poseidon2([a, b]);
41
+ const setupAndPublishCommittee = async (registry, e3Id, nodes, publicKey, operator1, operator2) => {
42
+ await registry.connect(operator1).submitTicket(e3Id, 1);
43
+ await registry.connect(operator2).submitTicket(e3Id, 1);
44
+ await time.increase(SORTITION_SUBMISSION_WINDOW + 1);
45
+ await registry.finalizeCommittee(e3Id);
46
+ await registry.publishCommittee(e3Id, nodes, publicKey);
47
+ };
48
+ // Helper function to approve USDC and make request
49
+ const makeRequest = async (enclave, usdcToken, requestParams, signer) => {
50
+ const fee = await enclave.getE3Quote(requestParams);
51
+ const tokenContract = signer ? usdcToken.connect(signer) : usdcToken;
52
+ const enclaveContract = signer ? enclave.connect(signer) : enclave;
53
+ await tokenContract.approve(await enclave.getAddress(), fee);
54
+ return enclaveContract.request(requestParams);
55
+ };
56
+ async function setupOperatorForSortition(operator, bondingRegistry, licenseToken, usdcToken, ticketToken, registry) {
57
+ const operatorAddress = await operator.getAddress();
58
+ await licenseToken.mintAllocation(operatorAddress, ethers.parseEther("10000"), "Test allocation");
59
+ await usdcToken.mint(operatorAddress, ethers.parseUnits("100000", 6));
60
+ await licenseToken
61
+ .connect(operator)
62
+ .approve(await bondingRegistry.getAddress(), ethers.parseEther("2000"));
63
+ await bondingRegistry
64
+ .connect(operator)
65
+ .bondLicense(ethers.parseEther("1000"));
66
+ await bondingRegistry.connect(operator).registerOperator();
67
+ const ticketAmount = ethers.parseUnits("100", 6);
68
+ await usdcToken
69
+ .connect(operator)
70
+ .approve(await ticketToken.getAddress(), ticketAmount);
71
+ await bondingRegistry.connect(operator).addTicketBalance(ticketAmount);
72
+ await registry.addCiphernode(operatorAddress);
73
+ }
37
74
  const setup = async () => {
38
- const [owner, notTheOwner] = await ethers.getSigners();
75
+ const [owner, notTheOwner, operator1, operator2] = await ethers.getSigners();
39
76
  const ownerAddress = await owner.getAddress();
77
+ const usdcContract = await ignition.deploy(MockStableTokenModule, {
78
+ parameters: {
79
+ MockUSDC: {
80
+ initialSupply: 1000000,
81
+ },
82
+ },
83
+ });
84
+ const usdcToken = MockUSDCFactory.connect(await usdcContract.mockUSDC.getAddress(), owner);
85
+ const enclTokenContract = await ignition.deploy(EnclaveTokenModule, {
86
+ parameters: {
87
+ EnclaveToken: {
88
+ owner: ownerAddress,
89
+ },
90
+ },
91
+ });
92
+ const ticketTokenContract = await ignition.deploy(EnclaveTicketTokenModule, {
93
+ parameters: {
94
+ EnclaveTicketToken: {
95
+ baseToken: await usdcToken.getAddress(),
96
+ registry: addressOne,
97
+ owner: ownerAddress,
98
+ },
99
+ },
100
+ });
101
+ const slashingManagerContract = await ignition.deploy(SlashingManagerModule, {
102
+ parameters: {
103
+ SlashingManager: {
104
+ admin: ownerAddress,
105
+ bondingRegistry: addressOne,
106
+ },
107
+ },
108
+ });
109
+ const bondingRegistryContract = await ignition.deploy(BondingRegistryModule, {
110
+ parameters: {
111
+ BondingRegistry: {
112
+ owner: ownerAddress,
113
+ ticketToken: await ticketTokenContract.enclaveTicketToken.getAddress(),
114
+ licenseToken: await enclTokenContract.enclaveToken.getAddress(),
115
+ registry: addressOne,
116
+ slashedFundsTreasury: ownerAddress,
117
+ ticketPrice: ethers.parseUnits("10", 6),
118
+ licenseRequiredBond: ethers.parseEther("1000"),
119
+ minTicketBalance: 5,
120
+ exitDelay: 7 * 24 * 60 * 60,
121
+ },
122
+ },
123
+ });
40
124
  const enclaveContract = await ignition.deploy(EnclaveModule, {
41
125
  parameters: {
42
126
  Enclave: {
@@ -44,63 +128,80 @@ describe("Enclave", function () {
44
128
  owner: ownerAddress,
45
129
  maxDuration: THIRTY_DAYS_IN_SECONDS,
46
130
  registry: addressOne,
131
+ bondingRegistry: await bondingRegistryContract.bondingRegistry.getAddress(),
132
+ feeToken: await usdcToken.getAddress(),
47
133
  },
48
134
  },
49
135
  });
50
136
  const enclaveAddress = await enclaveContract.enclave.getAddress();
51
- const ciphernodeRegistry = await ignition.deploy(MockCiphernodeRegistryModule);
52
- const ciphernodeRegistryAddress = await ciphernodeRegistry.mockCiphernodeRegistry.getAddress();
53
- const naiveRegistryFilter = await ignition.deploy(NaiveRegistryFilterModule, {
137
+ const ciphernodeRegistry = await ignition.deploy(CiphernodeRegistryModule, {
54
138
  parameters: {
55
- NaiveRegistryFilter: {
56
- ciphernodeRegistryAddress,
139
+ CiphernodeRegistry: {
140
+ enclaveAddress: enclaveAddress,
57
141
  owner: ownerAddress,
142
+ submissionWindow: SORTITION_SUBMISSION_WINDOW,
58
143
  },
59
144
  },
60
145
  });
61
- const naiveRegistryFilterAddress = await naiveRegistryFilter.naiveRegistryFilter.getAddress();
146
+ const ciphernodeRegistryAddress = await ciphernodeRegistry.cipherNodeRegistry.getAddress();
62
147
  const enclave = EnclaveFactory.connect(enclaveAddress, owner);
63
148
  const ciphernodeRegistryContract = CiphernodeRegistryOwnableFactory.connect(ciphernodeRegistryAddress, owner);
64
- const naiveRegistryFilterContract = NaiveRegistryFilterFactory.connect(naiveRegistryFilterAddress, owner);
149
+ const bondingRegistry = BondingRegistryFactory.connect(await bondingRegistryContract.bondingRegistry.getAddress(), owner);
65
150
  const registryAddress = await enclave.ciphernodeRegistry();
66
151
  if (registryAddress !== ciphernodeRegistryAddress) {
67
152
  await enclave.setCiphernodeRegistry(ciphernodeRegistryAddress);
68
153
  }
154
+ await ciphernodeRegistryContract.setBondingRegistry(await bondingRegistry.getAddress());
155
+ await ticketTokenContract.enclaveTicketToken.setRegistry(await bondingRegistry.getAddress());
156
+ await bondingRegistry.setRegistry(ciphernodeRegistryAddress);
157
+ await bondingRegistry.setSlashingManager(await slashingManagerContract.slashingManager.getAddress());
158
+ await slashingManagerContract.slashingManager.setBondingRegistry(await bondingRegistry.getAddress());
159
+ await bondingRegistry.setRewardDistributor(enclaveAddress);
160
+ const tree = new LeanIMT(hash);
161
+ const licenseToken = enclTokenContract.enclaveToken;
162
+ const ticketToken = ticketTokenContract.enclaveTicketToken;
163
+ await licenseToken.setTransferRestriction(false);
164
+ await setupOperatorForSortition(operator1, bondingRegistry, licenseToken, usdcToken, ticketToken, ciphernodeRegistryContract);
165
+ tree.insert(BigInt(await operator1.getAddress()));
166
+ await setupOperatorForSortition(operator2, bondingRegistry, licenseToken, usdcToken, ticketToken, ciphernodeRegistryContract);
167
+ tree.insert(BigInt(await operator2.getAddress()));
168
+ await mine(1);
69
169
  const mockComputeProvider = await ignition.deploy(mockComputeProviderModule);
70
170
  const decryptionVerifier = await ignition.deploy(MockDecryptionVerifierModule);
71
- const inputValidator = await ignition.deploy(MockInputValidatorModule);
72
- const e3Program = await ignition.deploy(MockE3ProgramModule, {
73
- parameters: {
74
- MockE3Program: {
75
- mockInputValidator: await inputValidator.mockInputValidator.getAddress(),
76
- },
77
- },
78
- });
171
+ const e3Program = await ignition.deploy(MockE3ProgramModule);
79
172
  await enclave.enableE3Program(await e3Program.mockE3Program.getAddress());
80
173
  await enclave.setE3ProgramsParams([encodedE3ProgramParams]);
81
174
  await enclave.setDecryptionVerifier(encryptionSchemeId, await decryptionVerifier.mockDecryptionVerifier.getAddress());
82
175
  const request = {
83
- filter: await naiveRegistryFilterContract.getAddress(),
84
176
  threshold: [2, 2],
85
- startTime: [await time.latest(), (await time.latest()) + 100],
177
+ startWindow: [await time.latest(), (await time.latest()) + 100],
86
178
  duration: time.duration.days(30),
87
179
  e3Program: await e3Program.mockE3Program.getAddress(),
88
180
  e3ProgramParams: encodedE3ProgramParams,
89
181
  computeProviderParams: abiCoder.encode(["address"], [await decryptionVerifier.mockDecryptionVerifier.getAddress()]),
182
+ customParams: abiCoder.encode(["address"], ["0x1234567890123456789012345678901234567890"]),
90
183
  };
184
+ await usdcToken.mint(ownerAddress, ethers.parseUnits("1000000", 6));
185
+ await usdcToken.mint(await notTheOwner.getAddress(), ethers.parseUnits("1000000", 6));
91
186
  return {
92
187
  enclave,
93
188
  ciphernodeRegistryContract,
94
- naiveRegistryFilterContract,
189
+ bondingRegistry: bondingRegistry,
190
+ ticketToken: ticketTokenContract.enclaveTicketToken,
191
+ licenseToken: licenseToken,
192
+ usdcToken,
193
+ slashingManager: slashingManagerContract.slashingManager,
194
+ tree,
95
195
  mocks: {
96
196
  decryptionVerifier: decryptionVerifier.mockDecryptionVerifier,
97
- inputValidator: inputValidator.mockInputValidator,
98
197
  e3Program: e3Program.mockE3Program,
99
198
  mockComputeProvider: mockComputeProvider.mockComputeProvider,
100
199
  },
101
200
  request,
102
201
  owner,
103
202
  notTheOwner,
203
+ operator1,
204
+ operator2,
104
205
  };
105
206
  };
106
207
  describe("constructor / initialize()", function () {
@@ -224,22 +325,21 @@ describe("Enclave", function () {
224
325
  .withArgs(1);
225
326
  });
226
327
  it("returns correct E3 details", async function () {
227
- const { enclave, request, mocks, naiveRegistryFilterContract } = await loadFixture(setup);
228
- await enclave.request({
229
- filter: await naiveRegistryFilterContract.getAddress(),
328
+ const { enclave, request, usdcToken } = await loadFixture(setup);
329
+ await makeRequest(enclave, usdcToken, {
230
330
  threshold: request.threshold,
231
- startWindow: request.startTime,
331
+ startWindow: request.startWindow,
232
332
  duration: request.duration,
233
333
  e3Program: request.e3Program,
234
334
  e3ProgramParams: request.e3ProgramParams,
235
335
  computeProviderParams: request.computeProviderParams,
236
- }, { value: 10 });
336
+ customParams: request.customParams,
337
+ });
237
338
  const e3 = await enclave.getE3(0);
238
339
  expect(e3.threshold).to.deep.equal(request.threshold);
239
340
  expect(e3.expiration).to.equal(0n);
240
341
  expect(e3.e3Program).to.equal(request.e3Program);
241
342
  expect(e3.e3ProgramParams).to.equal(request.e3ProgramParams);
242
- expect(e3.inputValidator).to.equal(await mocks.inputValidator.getAddress());
243
343
  expect(e3.decryptionVerifier).to.equal(abiCoder.decode(["address"], request.computeProviderParams)[0]);
244
344
  expect(e3.committeePublicKey).to.equal(ethers.ZeroHash);
245
345
  expect(e3.ciphertextOutput).to.equal(ethers.ZeroHash);
@@ -382,145 +482,150 @@ describe("Enclave", function () {
382
482
  });
383
483
  });
384
484
  describe("request()", function () {
385
- it("reverts if msg.value is 0", async function () {
386
- const { enclave, request } = await loadFixture(setup);
485
+ it("reverts if USDC allowance is insufficient", async function () {
486
+ const { enclave, request, usdcToken } = await loadFixture(setup);
387
487
  await expect(enclave.request({
388
- filter: request.filter,
389
488
  threshold: request.threshold,
390
- startWindow: request.startTime,
489
+ startWindow: request.startWindow,
391
490
  duration: request.duration,
392
491
  e3Program: request.e3Program,
393
492
  e3ProgramParams: request.e3ProgramParams,
394
493
  computeProviderParams: request.computeProviderParams,
395
- })).to.be.revertedWithCustomError(enclave, "PaymentRequired");
494
+ customParams: request.customParams,
495
+ })).to.be.revertedWithCustomError(usdcToken, "ERC20InsufficientAllowance");
396
496
  });
397
497
  it("reverts if threshold is 0", async function () {
398
- const { enclave, request } = await loadFixture(setup);
498
+ const { enclave, request, usdcToken } = await loadFixture(setup);
499
+ const fee = await enclave.getE3Quote({
500
+ threshold: [0, 2],
501
+ startWindow: request.startWindow,
502
+ duration: request.duration,
503
+ e3Program: request.e3Program,
504
+ e3ProgramParams: request.e3ProgramParams,
505
+ computeProviderParams: request.computeProviderParams,
506
+ customParams: request.customParams,
507
+ });
508
+ await usdcToken.approve(await enclave.getAddress(), fee);
399
509
  await expect(enclave.request({
400
- filter: request.filter,
401
510
  threshold: [0, 2],
402
- startWindow: request.startTime,
511
+ startWindow: request.startWindow,
403
512
  duration: request.duration,
404
513
  e3Program: request.e3Program,
405
514
  e3ProgramParams: request.e3ProgramParams,
406
515
  computeProviderParams: request.computeProviderParams,
407
- }, { value: 10 })).to.be.revertedWithCustomError(enclave, "InvalidThreshold");
516
+ customParams: request.customParams,
517
+ }))
518
+ .to.be.revertedWithCustomError(enclave, "InvalidThreshold")
519
+ .withArgs([0, 2]);
408
520
  });
409
521
  it("reverts if threshold is greater than number", async function () {
410
- const { enclave, request } = await loadFixture(setup);
411
- await expect(enclave.request({
412
- filter: request.filter,
522
+ const { enclave, request, usdcToken } = await loadFixture(setup);
523
+ await expect(makeRequest(enclave, usdcToken, {
413
524
  threshold: [3, 2],
414
- startWindow: request.startTime,
525
+ startWindow: request.startWindow,
415
526
  duration: request.duration,
416
527
  e3Program: request.e3Program,
417
528
  e3ProgramParams: request.e3ProgramParams,
418
529
  computeProviderParams: request.computeProviderParams,
419
- }, { value: 10 })).to.be.revertedWithCustomError(enclave, "InvalidThreshold");
530
+ customParams: request.customParams,
531
+ }))
532
+ .to.be.revertedWithCustomError(enclave, "InvalidThreshold")
533
+ .withArgs([3, 2]);
420
534
  });
421
535
  it("reverts if duration is 0", async function () {
422
- const { enclave, request } = await loadFixture(setup);
423
- await expect(enclave.request({
424
- filter: request.filter,
536
+ const { enclave, request, usdcToken } = await loadFixture(setup);
537
+ await expect(makeRequest(enclave, usdcToken, {
425
538
  threshold: request.threshold,
426
- startWindow: request.startTime,
539
+ startWindow: request.startWindow,
427
540
  duration: 0,
428
541
  e3Program: request.e3Program,
429
542
  e3ProgramParams: request.e3ProgramParams,
430
543
  computeProviderParams: request.computeProviderParams,
431
- }, { value: 10 })).to.be.revertedWithCustomError(enclave, "InvalidDuration");
544
+ customParams: request.customParams,
545
+ }))
546
+ .to.be.revertedWithCustomError(enclave, "InvalidDuration")
547
+ .withArgs(0);
432
548
  });
433
549
  it("reverts if duration is greater than maxDuration", async function () {
434
- const { enclave, request } = await loadFixture(setup);
435
- await expect(enclave.request({
436
- filter: request.filter,
550
+ const { enclave, request, usdcToken } = await loadFixture(setup);
551
+ await expect(makeRequest(enclave, usdcToken, {
437
552
  threshold: request.threshold,
438
- startWindow: request.startTime,
553
+ startWindow: request.startWindow,
439
554
  duration: time.duration.days(31),
440
555
  e3Program: request.e3Program,
441
556
  e3ProgramParams: request.e3ProgramParams,
442
557
  computeProviderParams: request.computeProviderParams,
443
- }, { value: 10 })).to.be.revertedWithCustomError(enclave, "InvalidDuration");
558
+ customParams: request.customParams,
559
+ }))
560
+ .to.be.revertedWithCustomError(enclave, "InvalidDuration")
561
+ .withArgs(time.duration.days(31));
444
562
  });
445
563
  it("reverts if E3 Program is not enabled", async function () {
446
- const { enclave, request } = await loadFixture(setup);
447
- await expect(enclave.request({
448
- filter: request.filter,
564
+ const { enclave, request, usdcToken } = await loadFixture(setup);
565
+ await expect(makeRequest(enclave, usdcToken, {
449
566
  threshold: request.threshold,
450
- startWindow: request.startTime,
567
+ startWindow: request.startWindow,
451
568
  duration: request.duration,
452
569
  e3Program: ethers.ZeroAddress,
453
570
  e3ProgramParams: request.e3ProgramParams,
454
571
  computeProviderParams: request.computeProviderParams,
455
- }, { value: 10 }))
572
+ customParams: request.customParams,
573
+ }))
456
574
  .to.be.revertedWithCustomError(enclave, "E3ProgramNotAllowed")
457
575
  .withArgs(ethers.ZeroAddress);
458
576
  });
459
577
  it("reverts if given encryption scheme is not enabled", async function () {
460
- const { enclave, request } = await loadFixture(setup);
578
+ const { enclave, request, usdcToken } = await loadFixture(setup);
461
579
  await enclave.disableEncryptionScheme(encryptionSchemeId);
462
- await expect(enclave.request({
463
- filter: request.filter,
580
+ await expect(makeRequest(enclave, usdcToken, {
464
581
  threshold: request.threshold,
465
- startWindow: request.startTime,
582
+ startWindow: request.startWindow,
466
583
  duration: request.duration,
467
584
  e3Program: request.e3Program,
468
585
  e3ProgramParams: request.e3ProgramParams,
469
586
  computeProviderParams: request.computeProviderParams,
470
- }, { value: 10 }))
587
+ customParams: request.customParams,
588
+ }))
471
589
  .to.be.revertedWithCustomError(enclave, "InvalidEncryptionScheme")
472
590
  .withArgs(encryptionSchemeId);
473
591
  });
474
- it("reverts if committee selection fails", async function () {
475
- const { enclave, request } = await loadFixture(setup);
476
- await expect(enclave.request({
477
- filter: AddressTwo,
478
- threshold: request.threshold,
479
- startWindow: request.startTime,
480
- duration: request.duration,
481
- e3Program: request.e3Program,
482
- e3ProgramParams: request.e3ProgramParams,
483
- computeProviderParams: request.computeProviderParams,
484
- }, { value: 10 })).to.be.revertedWithCustomError(enclave, "CommitteeSelectionFailed");
485
- });
486
592
  it("instantiates a new E3", async function () {
487
- const { enclave, request, mocks } = await loadFixture(setup);
488
- await enclave.request({
489
- filter: request.filter,
593
+ const { enclave, request, usdcToken } = await loadFixture(setup);
594
+ await makeRequest(enclave, usdcToken, {
490
595
  threshold: request.threshold,
491
- startWindow: request.startTime,
596
+ startWindow: request.startWindow,
492
597
  duration: request.duration,
493
598
  e3Program: request.e3Program,
494
599
  e3ProgramParams: request.e3ProgramParams,
495
600
  computeProviderParams: request.computeProviderParams,
496
- }, { value: 10 });
601
+ customParams: request.customParams,
602
+ });
497
603
  const e3 = await enclave.getE3(0);
498
604
  const block = await ethers.provider.getBlock("latest").catch((e) => e);
499
605
  expect(e3.threshold).to.deep.equal(request.threshold);
500
606
  expect(e3.expiration).to.equal(0n);
501
607
  expect(e3.e3Program).to.equal(request.e3Program);
502
608
  expect(e3.requestBlock).to.equal(block.number);
503
- expect(e3.inputValidator).to.equal(await mocks.inputValidator.getAddress());
504
609
  expect(e3.decryptionVerifier).to.equal(abiCoder.decode(["address"], request.computeProviderParams)[0]);
505
610
  expect(e3.committeePublicKey).to.equal(ethers.ZeroHash);
506
611
  expect(e3.ciphertextOutput).to.equal(ethers.ZeroHash);
507
612
  expect(e3.plaintextOutput).to.equal("0x");
508
613
  });
509
614
  it("emits E3Requested event", async function () {
510
- const { enclave, request } = await loadFixture(setup);
511
- const tx = await enclave.request({
512
- filter: request.filter,
615
+ const { enclave, request, usdcToken } = await loadFixture(setup);
616
+ const tx = await makeRequest(enclave, usdcToken, {
513
617
  threshold: request.threshold,
514
- startWindow: request.startTime,
618
+ startWindow: request.startWindow,
515
619
  duration: request.duration,
516
620
  e3Program: request.e3Program,
517
621
  e3ProgramParams: request.e3ProgramParams,
518
622
  computeProviderParams: request.computeProviderParams,
519
- }, { value: 10 });
623
+ customParams: request.customParams,
624
+ });
520
625
  const e3 = await enclave.getE3(0);
521
626
  await expect(tx)
522
627
  .to.emit(enclave, "E3Requested")
523
- .withArgs(0, e3, request.filter, request.e3Program);
628
+ .withArgs(0, e3, request.e3Program);
524
629
  });
525
630
  });
526
631
  describe("activate()", function () {
@@ -531,155 +636,144 @@ describe("Enclave", function () {
531
636
  .withArgs(0);
532
637
  });
533
638
  it("reverts if E3 has already been activated", async function () {
534
- const { enclave, request } = await loadFixture(setup);
535
- await enclave.request({
536
- filter: request.filter,
639
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
640
+ await makeRequest(enclave, usdcToken, {
537
641
  threshold: request.threshold,
538
- startWindow: request.startTime,
642
+ startWindow: request.startWindow,
539
643
  duration: request.duration,
540
644
  e3Program: request.e3Program,
541
645
  e3ProgramParams: request.e3ProgramParams,
542
646
  computeProviderParams: request.computeProviderParams,
543
- }, { value: 10 });
647
+ customParams: request.customParams,
648
+ });
649
+ await setupAndPublishCommittee(ciphernodeRegistryContract, 0, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
544
650
  await expect(enclave.getE3(0)).to.not.be.revert(ethers);
545
- await expect(enclave.activate(0, ethers.ZeroHash)).to.not.be.revert(ethers);
546
- await expect(enclave.activate(0, ethers.ZeroHash))
651
+ await expect(enclave.activate(0, data)).to.not.be.revert(ethers);
652
+ await expect(enclave.activate(0, data))
547
653
  .to.be.revertedWithCustomError(enclave, "E3AlreadyActivated")
548
654
  .withArgs(0);
549
655
  });
550
656
  it("reverts if E3 is not yet ready to start", async function () {
551
- const { enclave, request } = await loadFixture(setup);
657
+ const { enclave, request, usdcToken } = await loadFixture(setup);
552
658
  const startTime = [
553
659
  (await time.latest()) + 1000,
554
660
  (await time.latest()) + 2000,
555
661
  ];
556
- await enclave.request({
557
- filter: request.filter,
662
+ await makeRequest(enclave, usdcToken, {
558
663
  threshold: request.threshold,
559
664
  startWindow: startTime,
560
665
  duration: request.duration,
561
666
  e3Program: request.e3Program,
562
667
  e3ProgramParams: request.e3ProgramParams,
563
668
  computeProviderParams: request.computeProviderParams,
564
- }, { value: 10 });
669
+ customParams: request.customParams,
670
+ });
565
671
  await expect(enclave.activate(0, ethers.ZeroHash)).to.be.revertedWithCustomError(enclave, "E3NotReady");
566
672
  });
567
673
  it("reverts if E3 start has expired", async function () {
568
- const { enclave, request } = await loadFixture(setup);
569
- const startTime = [
570
- (await time.latest()) + 1,
571
- (await time.latest()) + 1000,
572
- ];
573
- await enclave.request({
574
- filter: request.filter,
575
- threshold: request.threshold,
674
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
675
+ const e3Id = 0;
676
+ const currentTime = await time.latest();
677
+ const startTime = [currentTime + 10, currentTime + 100];
678
+ await makeRequest(enclave, usdcToken, {
679
+ ...request,
576
680
  startWindow: startTime,
577
- duration: request.duration,
578
- e3Program: request.e3Program,
579
- e3ProgramParams: request.e3ProgramParams,
580
- computeProviderParams: request.computeProviderParams,
581
- }, { value: 10 });
681
+ });
682
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
582
683
  await mine(2, { interval: 2000 });
583
- await expect(enclave.activate(0, ethers.ZeroHash)).to.be.revertedWithCustomError(enclave, "E3Expired");
684
+ await expect(enclave.activate(e3Id, data)).to.be.revertedWithCustomError(enclave, "E3Expired");
584
685
  });
585
686
  it("reverts if ciphernodeRegistry does not return a public key", async function () {
586
- const { enclave, request } = await loadFixture(setup);
687
+ const { enclave, request, usdcToken } = await loadFixture(setup);
587
688
  const startTime = [
588
689
  (await time.latest()) + 1000,
589
690
  (await time.latest()) + 2000,
590
691
  ];
591
- await enclave.request({
592
- filter: request.filter,
692
+ await makeRequest(enclave, usdcToken, {
593
693
  threshold: request.threshold,
594
694
  startWindow: startTime,
595
695
  duration: request.duration,
596
696
  e3Program: request.e3Program,
597
697
  e3ProgramParams: request.e3ProgramParams,
598
698
  computeProviderParams: request.computeProviderParams,
599
- }, { value: 10 });
699
+ customParams: request.customParams,
700
+ });
600
701
  await expect(enclave.activate(0, ethers.ZeroHash)).to.be.revertedWithCustomError(enclave, "E3NotReady");
601
702
  });
602
703
  it("reverts if E3 start has expired", async function () {
603
- const { enclave, request } = await loadFixture(setup);
604
- const startTime = [await time.latest(), (await time.latest()) + 1];
605
- await enclave.request({
606
- filter: request.filter,
607
- threshold: request.threshold,
704
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
705
+ const e3Id = 0;
706
+ const currentTime = await time.latest();
707
+ const startTime = [currentTime + 5, currentTime + 50];
708
+ await makeRequest(enclave, usdcToken, {
709
+ ...request,
608
710
  startWindow: startTime,
609
- duration: request.duration,
610
- e3Program: request.e3Program,
611
- e3ProgramParams: request.e3ProgramParams,
612
- computeProviderParams: request.computeProviderParams,
613
- }, { value: 10 });
614
- await mine(1, { interval: 1000 });
615
- await expect(enclave.activate(0, ethers.ZeroHash)).to.be.revertedWithCustomError(enclave, "E3Expired");
711
+ });
712
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
713
+ await time.increaseTo(currentTime + request.duration + 100);
714
+ await expect(enclave.activate(e3Id, data)).to.be.revertedWithCustomError(enclave, "E3Expired");
616
715
  });
617
716
  it("reverts if ciphernodeRegistry does not return a public key", async function () {
618
- const { enclave, request, naiveRegistryFilterContract } = await loadFixture(setup);
619
- await enclave.request({
620
- filter: request.filter,
621
- threshold: request.threshold,
622
- startWindow: request.startTime,
623
- duration: request.duration,
624
- e3Program: request.e3Program,
625
- e3ProgramParams: request.e3ProgramParams,
626
- computeProviderParams: request.computeProviderParams,
627
- }, { value: 10 });
717
+ const { enclave, request, ciphernodeRegistryContract, usdcToken, operator1, operator2, } = await loadFixture(setup);
718
+ await makeRequest(enclave, usdcToken, request);
628
719
  const prevRegistry = await enclave.ciphernodeRegistry();
629
720
  const reg = await ignition.deploy(MockCiphernodeRegistryEmptyKeyModule);
630
721
  const nextRegistry = await reg.mockCiphernodeRegistryEmptyKey.getAddress();
631
722
  await enclave.setCiphernodeRegistry(nextRegistry);
632
- await naiveRegistryFilterContract.setRegistry(nextRegistry);
633
723
  await expect(enclave.activate(0, ethers.ZeroHash)).to.be.revertedWithCustomError(enclave, "CommitteeSelectionFailed");
634
724
  await enclave.setCiphernodeRegistry(prevRegistry);
635
- await expect(enclave.activate(0, ethers.ZeroHash)).not.to.be.revert(ethers);
725
+ await setupAndPublishCommittee(ciphernodeRegistryContract, 0, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
726
+ await expect(enclave.activate(0, data)).not.to.be.revert(ethers);
636
727
  });
637
728
  it("sets committeePublicKey correctly", async () => {
638
- const { enclave, request, ciphernodeRegistryContract } = await loadFixture(setup);
639
- await enclave.request({
640
- filter: request.filter,
729
+ const { enclave, request, ciphernodeRegistryContract, usdcToken, operator1, operator2, } = await loadFixture(setup);
730
+ await makeRequest(enclave, usdcToken, {
641
731
  threshold: request.threshold,
642
- startWindow: request.startTime,
732
+ startWindow: request.startWindow,
643
733
  duration: request.duration,
644
734
  e3Program: request.e3Program,
645
735
  e3ProgramParams: request.e3ProgramParams,
646
736
  computeProviderParams: request.computeProviderParams,
647
- }, { value: 10 });
737
+ customParams: request.customParams,
738
+ });
648
739
  const e3Id = 0;
740
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
649
741
  const publicKey = await ciphernodeRegistryContract.committeePublicKey(e3Id);
650
742
  let e3 = await enclave.getE3(e3Id);
651
- expect(e3.committeePublicKey).to.not.equal(ethers.keccak256(publicKey));
652
- await enclave.activate(e3Id, ethers.ZeroHash);
743
+ expect(e3.committeePublicKey).to.not.equal(publicKey);
744
+ await enclave.activate(e3Id, data);
653
745
  e3 = await enclave.getE3(e3Id);
654
746
  expect(e3.committeePublicKey).to.equal(publicKey);
655
747
  });
656
748
  it("returns true if E3 is activated successfully", async () => {
657
- const { enclave, request } = await loadFixture(setup);
658
- await enclave.request({
659
- filter: request.filter,
749
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
750
+ await makeRequest(enclave, usdcToken, {
660
751
  threshold: request.threshold,
661
- startWindow: request.startTime,
752
+ startWindow: request.startWindow,
662
753
  duration: request.duration,
663
754
  e3Program: request.e3Program,
664
755
  e3ProgramParams: request.e3ProgramParams,
665
756
  computeProviderParams: request.computeProviderParams,
666
- }, { value: 10 });
757
+ customParams: request.customParams,
758
+ });
667
759
  const e3Id = 0;
668
- expect(await enclave.activate.staticCall(e3Id, ethers.ZeroHash)).to.be.equal(true);
760
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
761
+ expect(await enclave.activate.staticCall(e3Id, data)).to.be.equal(true);
669
762
  });
670
763
  it("emits E3Activated event", async () => {
671
- const { enclave, request } = await loadFixture(setup);
672
- await enclave.request({
673
- filter: request.filter,
764
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
765
+ await makeRequest(enclave, usdcToken, {
674
766
  threshold: request.threshold,
675
- startWindow: request.startTime,
767
+ startWindow: request.startWindow,
676
768
  duration: request.duration,
677
769
  e3Program: request.e3Program,
678
770
  e3ProgramParams: request.e3ProgramParams,
679
771
  computeProviderParams: request.computeProviderParams,
680
- }, { value: 10 });
772
+ customParams: request.customParams,
773
+ });
681
774
  const e3Id = 0;
682
- await expect(enclave.activate(e3Id, ethers.ZeroHash)).to.emit(enclave, "E3Activated");
775
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
776
+ await expect(enclave.activate(e3Id, data)).to.emit(enclave, "E3Activated");
683
777
  });
684
778
  });
685
779
  describe("publishInput()", function () {
@@ -690,138 +784,98 @@ describe("Enclave", function () {
690
784
  .withArgs(0);
691
785
  });
692
786
  it("reverts if E3 has not been activated", async function () {
693
- const { enclave, request } = await loadFixture(setup);
694
- await enclave.request({
695
- filter: request.filter,
787
+ const { enclave, request, usdcToken } = await loadFixture(setup);
788
+ await makeRequest(enclave, usdcToken, {
696
789
  threshold: request.threshold,
697
- startWindow: request.startTime,
790
+ startWindow: request.startWindow,
698
791
  duration: request.duration,
699
792
  e3Program: request.e3Program,
700
793
  e3ProgramParams: request.e3ProgramParams,
701
794
  computeProviderParams: request.computeProviderParams,
702
- }, { value: 10 });
795
+ customParams: request.customParams,
796
+ });
703
797
  const inputData = abiCoder.encode(["bytes32"], [ethers.ZeroHash]);
704
798
  await expect(enclave.getE3(0)).to.not.be.revert(ethers);
705
799
  await expect(enclave.publishInput(0, inputData))
706
800
  .to.be.revertedWithCustomError(enclave, "E3NotActivated")
707
801
  .withArgs(0);
708
- await enclave.activate(0, ethers.ZeroHash);
709
802
  });
710
803
  it("reverts if input is not valid", async function () {
711
- const { enclave, request } = await loadFixture(setup);
712
- await enclave.request({
713
- filter: request.filter,
804
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
805
+ await makeRequest(enclave, usdcToken, {
714
806
  threshold: request.threshold,
715
- startWindow: request.startTime,
807
+ startWindow: request.startWindow,
716
808
  duration: request.duration,
717
809
  e3Program: request.e3Program,
718
810
  e3ProgramParams: request.e3ProgramParams,
719
811
  computeProviderParams: request.computeProviderParams,
720
- }, { value: 10 });
721
- await enclave.activate(0, ethers.ZeroHash);
812
+ customParams: request.customParams,
813
+ });
814
+ await setupAndPublishCommittee(ciphernodeRegistryContract, 0, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
815
+ await enclave.activate(0, data);
722
816
  await expect(enclave.publishInput(0, "0xaabbcc")).to.be.revertedWithCustomError(enclave, "InvalidInput");
723
817
  });
724
818
  it("reverts if outside of input window", async function () {
725
- const { enclave, request } = await loadFixture(setup);
726
- await enclave.request({
727
- filter: request.filter,
819
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
820
+ await makeRequest(enclave, usdcToken, {
728
821
  threshold: request.threshold,
729
- startWindow: request.startTime,
822
+ startWindow: request.startWindow,
730
823
  duration: request.duration,
731
824
  e3Program: request.e3Program,
732
825
  e3ProgramParams: request.e3ProgramParams,
733
826
  computeProviderParams: request.computeProviderParams,
734
- }, { value: 10 });
735
- await enclave.activate(0, ethers.ZeroHash);
827
+ customParams: request.customParams,
828
+ });
829
+ await setupAndPublishCommittee(ciphernodeRegistryContract, 0, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
830
+ await enclave.activate(0, data);
736
831
  await mine(2, { interval: request.duration });
737
832
  await expect(enclave.publishInput(0, ethers.ZeroHash)).to.be.revertedWithCustomError(enclave, "InputDeadlinePassed");
738
833
  });
739
834
  it("it allows publishing input to different requests", async function () {
740
835
  const fixtureSetup = () => setup();
741
- const { enclave, request } = await loadFixture(fixtureSetup);
836
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(fixtureSetup);
742
837
  const inputData = "0x12345678";
743
- await enclave.request({
744
- filter: request.filter,
838
+ await makeRequest(enclave, usdcToken, {
745
839
  threshold: request.threshold,
746
- startWindow: request.startTime,
840
+ startWindow: request.startWindow,
747
841
  duration: request.duration,
748
842
  e3Program: request.e3Program,
749
843
  e3ProgramParams: request.e3ProgramParams,
750
844
  computeProviderParams: request.computeProviderParams,
751
- }, { value: 10 });
752
- await enclave.activate(0, ethers.ZeroHash);
845
+ customParams: request.customParams,
846
+ });
847
+ await setupAndPublishCommittee(ciphernodeRegistryContract, 0, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
848
+ await enclave.activate(0, data);
753
849
  await enclave.publishInput(0, inputData);
754
- // Make a new request, activate and call
755
- await enclave.request({
756
- filter: request.filter,
850
+ await makeRequest(enclave, usdcToken, {
757
851
  threshold: request.threshold,
758
- startWindow: request.startTime,
852
+ startWindow: request.startWindow,
759
853
  duration: request.duration,
760
854
  e3Program: request.e3Program,
761
855
  e3ProgramParams: request.e3ProgramParams,
762
856
  computeProviderParams: request.computeProviderParams,
763
- }, { value: 10 });
764
- await enclave.activate(1, "0x0000000000000000000000000000000000000000000000000000000000000001");
857
+ customParams: request.customParams,
858
+ });
859
+ await setupAndPublishCommittee(ciphernodeRegistryContract, 1, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
860
+ await enclave.activate(1, data);
765
861
  await enclave.publishInput(1, inputData);
766
862
  });
767
863
  it("returns true if input is published successfully", async function () {
768
- const { enclave, request } = await loadFixture(setup);
864
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
769
865
  const inputData = "0x12345678";
770
- await enclave.request({
771
- filter: request.filter,
866
+ await makeRequest(enclave, usdcToken, {
772
867
  threshold: request.threshold,
773
- startWindow: request.startTime,
868
+ startWindow: request.startWindow,
774
869
  duration: request.duration,
775
870
  e3Program: request.e3Program,
776
871
  e3ProgramParams: request.e3ProgramParams,
777
872
  computeProviderParams: request.computeProviderParams,
778
- }, { value: 10 });
779
- await enclave.activate(0, ethers.ZeroHash);
873
+ customParams: request.customParams,
874
+ });
875
+ await setupAndPublishCommittee(ciphernodeRegistryContract, 0, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
876
+ await enclave.activate(0, data);
780
877
  expect(await enclave.publishInput.staticCall(0, inputData)).to.equal(true);
781
878
  });
782
- it("adds inputHash to merkle tree", async function () {
783
- const { enclave, request } = await loadFixture(setup);
784
- const inputData = abiCoder.encode(["bytes"], ["0xaabbccddeeff"]);
785
- // To create an instance of a LeanIMT, you must provide the hash function.
786
- const tree = new LeanIMT(hash);
787
- await enclave.request({
788
- filter: request.filter,
789
- threshold: request.threshold,
790
- startWindow: request.startTime,
791
- duration: request.duration,
792
- e3Program: request.e3Program,
793
- e3ProgramParams: request.e3ProgramParams,
794
- computeProviderParams: request.computeProviderParams,
795
- }, { value: 10 });
796
- const e3Id = 0;
797
- await enclave.activate(e3Id, ethers.ZeroHash);
798
- tree.insert(hash(BigInt(ethers.keccak256(inputData)), BigInt(0)));
799
- await enclave.publishInput(e3Id, inputData);
800
- expect(await enclave.getInputRoot(e3Id)).to.equal(tree.root);
801
- const secondInputData = abiCoder.encode(["bytes"], ["0x112233445566"]);
802
- tree.insert(hash(BigInt(ethers.keccak256(secondInputData)), BigInt(1)));
803
- await enclave.publishInput(e3Id, secondInputData);
804
- expect(await enclave.getInputRoot(e3Id)).to.equal(tree.root);
805
- });
806
- it("emits InputPublished event", async function () {
807
- const { enclave, request } = await loadFixture(setup);
808
- await enclave.request({
809
- filter: request.filter,
810
- threshold: request.threshold,
811
- startWindow: request.startTime,
812
- duration: request.duration,
813
- e3Program: request.e3Program,
814
- e3ProgramParams: request.e3ProgramParams,
815
- computeProviderParams: request.computeProviderParams,
816
- }, { value: 10 });
817
- const e3Id = 0;
818
- const inputData = abiCoder.encode(["bytes"], ["0xaabbccddeeff"]);
819
- await enclave.activate(e3Id, ethers.ZeroHash);
820
- const expectedHash = hash(BigInt(ethers.keccak256(inputData)), BigInt(0));
821
- await expect(enclave.publishInput(e3Id, inputData))
822
- .to.emit(enclave, "InputPublished")
823
- .withArgs(e3Id, inputData, expectedHash, 0);
824
- });
825
879
  });
826
880
  describe("publishCiphertextOutput()", function () {
827
881
  it("reverts if E3 does not exist", async function () {
@@ -831,54 +885,47 @@ describe("Enclave", function () {
831
885
  .withArgs(0);
832
886
  });
833
887
  it("reverts if E3 has not been activated", async function () {
834
- const { enclave, request } = await loadFixture(setup);
888
+ const { enclave, request, usdcToken } = await loadFixture(setup);
835
889
  const e3Id = 0;
836
- await enclave.request({
837
- filter: request.filter,
890
+ await makeRequest(enclave, usdcToken, {
838
891
  threshold: request.threshold,
839
- startWindow: request.startTime,
892
+ startWindow: request.startWindow,
840
893
  duration: request.duration,
841
894
  e3Program: request.e3Program,
842
895
  e3ProgramParams: request.e3ProgramParams,
843
896
  computeProviderParams: request.computeProviderParams,
844
- }, { value: 10 });
897
+ customParams: request.customParams,
898
+ });
845
899
  await expect(enclave.publishCiphertextOutput(e3Id, "0x", "0x"))
846
900
  .to.be.revertedWithCustomError(enclave, "E3NotActivated")
847
901
  .withArgs(e3Id);
848
902
  });
849
903
  it("reverts if input deadline has not passed", async function () {
850
- const { enclave, request } = await loadFixture(setup);
851
- const tx = await enclave.request({
852
- filter: request.filter,
853
- threshold: request.threshold,
854
- startWindow: [await time.latest(), (await time.latest()) + 100],
855
- duration: request.duration,
856
- e3Program: request.e3Program,
857
- e3ProgramParams: request.e3ProgramParams,
858
- computeProviderParams: request.computeProviderParams,
859
- }, { value: 10 });
860
- const block = await tx.getBlock();
861
- const timestamp = block ? block.timestamp : await time.latest();
862
- const expectedExpiration = timestamp + request.duration + 1;
904
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
905
+ const currentTime = await time.latest();
906
+ await makeRequest(enclave, usdcToken, {
907
+ ...request,
908
+ startWindow: [currentTime, currentTime + 100],
909
+ });
863
910
  const e3Id = 0;
864
- await enclave.activate(e3Id, ethers.ZeroHash);
865
- await expect(enclave.publishCiphertextOutput(e3Id, "0x", "0x"))
866
- .to.be.revertedWithCustomError(enclave, "InputDeadlineNotPassed")
867
- .withArgs(e3Id, expectedExpiration);
911
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
912
+ await enclave.activate(e3Id, data);
913
+ await expect(enclave.publishCiphertextOutput(e3Id, "0x", "0x")).to.be.revertedWithCustomError(enclave, "InputDeadlineNotPassed");
868
914
  });
869
915
  it("reverts if output has already been published", async function () {
870
- const { enclave, request } = await loadFixture(setup);
916
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
871
917
  const e3Id = 0;
872
- await enclave.request({
873
- filter: request.filter,
918
+ await makeRequest(enclave, usdcToken, {
874
919
  threshold: request.threshold,
875
920
  startWindow: [await time.latest(), (await time.latest()) + 100],
876
921
  duration: request.duration,
877
922
  e3Program: request.e3Program,
878
923
  e3ProgramParams: request.e3ProgramParams,
879
924
  computeProviderParams: request.computeProviderParams,
880
- }, { value: 10 });
881
- await enclave.activate(e3Id, ethers.ZeroHash);
925
+ customParams: request.customParams,
926
+ });
927
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
928
+ await enclave.activate(e3Id, data);
882
929
  await mine(2, { interval: request.duration });
883
930
  expect(await enclave.publishCiphertextOutput(e3Id, data, proof));
884
931
  await expect(enclave.publishCiphertextOutput(e3Id, data, proof))
@@ -886,68 +933,57 @@ describe("Enclave", function () {
886
933
  .withArgs(e3Id);
887
934
  });
888
935
  it("reverts if output is not valid", async function () {
889
- const { enclave, request } = await loadFixture(setup);
936
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
890
937
  const e3Id = 0;
891
- await enclave.request({
892
- filter: request.filter,
938
+ await makeRequest(enclave, usdcToken, {
893
939
  threshold: request.threshold,
894
940
  startWindow: [await time.latest(), (await time.latest()) + 100],
895
941
  duration: request.duration,
896
942
  e3Program: request.e3Program,
897
943
  e3ProgramParams: request.e3ProgramParams,
898
944
  computeProviderParams: request.computeProviderParams,
899
- }, { value: 10 });
900
- await enclave.activate(e3Id, ethers.ZeroHash);
945
+ customParams: request.customParams,
946
+ });
947
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
948
+ await enclave.activate(e3Id, data);
901
949
  await mine(2, { interval: request.duration });
902
950
  await expect(enclave.publishCiphertextOutput(e3Id, "0x", "0x")).to.be.revertedWithCustomError(enclave, "InvalidOutput");
903
951
  });
904
952
  it("sets ciphertextOutput correctly", async function () {
905
- const { enclave, request } = await loadFixture(setup);
953
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
906
954
  const e3Id = 0;
907
- await enclave.request({
908
- filter: request.filter,
909
- threshold: request.threshold,
955
+ await makeRequest(enclave, usdcToken, {
956
+ ...request,
910
957
  startWindow: [await time.latest(), (await time.latest()) + 100],
911
- duration: request.duration,
912
- e3Program: request.e3Program,
913
- e3ProgramParams: request.e3ProgramParams,
914
- computeProviderParams: request.computeProviderParams,
915
- }, { value: 10 });
916
- await enclave.activate(e3Id, ethers.ZeroHash);
958
+ });
959
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
960
+ await enclave.activate(e3Id, data);
917
961
  await mine(2, { interval: request.duration });
918
962
  expect(await enclave.publishCiphertextOutput(e3Id, data, proof));
919
963
  const e3 = await enclave.getE3(e3Id);
920
964
  expect(e3.ciphertextOutput).to.equal(dataHash);
921
965
  });
922
966
  it("returns true if output is published successfully", async function () {
923
- const { enclave, request } = await loadFixture(setup);
967
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
924
968
  const e3Id = 0;
925
- await enclave.request({
926
- filter: request.filter,
927
- threshold: request.threshold,
969
+ await makeRequest(enclave, usdcToken, {
970
+ ...request,
928
971
  startWindow: [await time.latest(), (await time.latest()) + 100],
929
- duration: request.duration,
930
- e3Program: request.e3Program,
931
- e3ProgramParams: request.e3ProgramParams,
932
- computeProviderParams: request.computeProviderParams,
933
- }, { value: 10 });
934
- await enclave.activate(e3Id, ethers.ZeroHash);
972
+ });
973
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
974
+ await enclave.activate(e3Id, data);
935
975
  await mine(2, { interval: request.duration });
936
976
  expect(await enclave.publishCiphertextOutput.staticCall(e3Id, data, proof)).to.equal(true);
937
977
  });
938
978
  it("emits CiphertextOutputPublished event", async function () {
939
- const { enclave, request } = await loadFixture(setup);
979
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
940
980
  const e3Id = 0;
941
- await enclave.request({
942
- filter: request.filter,
943
- threshold: request.threshold,
981
+ await makeRequest(enclave, usdcToken, {
982
+ ...request,
944
983
  startWindow: [await time.latest(), (await time.latest()) + 100],
945
- duration: request.duration,
946
- e3Program: request.e3Program,
947
- e3ProgramParams: request.e3ProgramParams,
948
- computeProviderParams: request.computeProviderParams,
949
- }, { value: 10 });
950
- await enclave.activate(e3Id, ethers.ZeroHash);
984
+ });
985
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
986
+ await enclave.activate(e3Id, data);
951
987
  await mine(2, { interval: request.duration });
952
988
  await expect(enclave.publishCiphertextOutput(e3Id, data, proof))
953
989
  .to.emit(enclave, "CiphertextOutputPublished")
@@ -963,51 +999,38 @@ describe("Enclave", function () {
963
999
  .withArgs(e3Id);
964
1000
  });
965
1001
  it("reverts if E3 has not been activated", async function () {
966
- const { enclave, request } = await loadFixture(setup);
1002
+ const { enclave, request, usdcToken } = await loadFixture(setup);
967
1003
  const e3Id = 0;
968
- await enclave.request({
969
- filter: request.filter,
970
- threshold: request.threshold,
1004
+ await makeRequest(enclave, usdcToken, {
1005
+ ...request,
971
1006
  startWindow: [await time.latest(), (await time.latest()) + 100],
972
- duration: request.duration,
973
- e3Program: request.e3Program,
974
- e3ProgramParams: request.e3ProgramParams,
975
- computeProviderParams: request.computeProviderParams,
976
- }, { value: 10 });
1007
+ });
977
1008
  await expect(enclave.publishPlaintextOutput(e3Id, data, "0x"))
978
1009
  .to.be.revertedWithCustomError(enclave, "E3NotActivated")
979
1010
  .withArgs(e3Id);
980
1011
  });
981
1012
  it("reverts if ciphertextOutput has not been published", async function () {
982
- const { enclave, request } = await loadFixture(setup);
1013
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
983
1014
  const e3Id = 0;
984
- await enclave.request({
985
- filter: request.filter,
986
- threshold: request.threshold,
1015
+ await makeRequest(enclave, usdcToken, {
1016
+ ...request,
987
1017
  startWindow: [await time.latest(), (await time.latest()) + 100],
988
- duration: request.duration,
989
- e3Program: request.e3Program,
990
- e3ProgramParams: request.e3ProgramParams,
991
- computeProviderParams: request.computeProviderParams,
992
- }, { value: 10 });
993
- await enclave.activate(e3Id, ethers.ZeroHash);
1018
+ });
1019
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
1020
+ await enclave.activate(e3Id, data);
994
1021
  await expect(enclave.publishPlaintextOutput(e3Id, data, "0x"))
995
1022
  .to.be.revertedWithCustomError(enclave, "CiphertextOutputNotPublished")
996
1023
  .withArgs(e3Id);
997
1024
  });
998
1025
  it("reverts if plaintextOutput has already been published", async function () {
999
- const { enclave, request } = await loadFixture(setup);
1026
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
1000
1027
  const e3Id = 0;
1001
- await enclave.request({
1002
- filter: request.filter,
1003
- threshold: request.threshold,
1028
+ await makeRequest(enclave, usdcToken, {
1029
+ ...request,
1004
1030
  startWindow: [await time.latest(), (await time.latest()) + 100],
1005
- duration: request.duration,
1006
- e3Program: request.e3Program,
1007
- e3ProgramParams: request.e3ProgramParams,
1008
- computeProviderParams: request.computeProviderParams,
1009
- }, { value: 10 });
1010
- await enclave.activate(e3Id, ethers.ZeroHash);
1031
+ });
1032
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
1033
+ await enclave.activate(e3Id, data);
1011
1034
  await mine(2, { interval: request.duration });
1012
1035
  await enclave.publishCiphertextOutput(e3Id, data, proof);
1013
1036
  await enclave.publishPlaintextOutput(e3Id, data, proof);
@@ -1016,18 +1039,14 @@ describe("Enclave", function () {
1016
1039
  .withArgs(e3Id);
1017
1040
  });
1018
1041
  it("reverts if output is not valid", async function () {
1019
- const { enclave, request } = await loadFixture(setup);
1042
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
1020
1043
  const e3Id = 0;
1021
- await enclave.request({
1022
- filter: request.filter,
1023
- threshold: request.threshold,
1044
+ await makeRequest(enclave, usdcToken, {
1045
+ ...request,
1024
1046
  startWindow: [await time.latest(), (await time.latest()) + 100],
1025
- duration: request.duration,
1026
- e3Program: request.e3Program,
1027
- e3ProgramParams: request.e3ProgramParams,
1028
- computeProviderParams: request.computeProviderParams,
1029
- }, { value: 10 });
1030
- await enclave.activate(e3Id, ethers.ZeroHash);
1047
+ });
1048
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
1049
+ await enclave.activate(e3Id, data);
1031
1050
  await mine(2, { interval: request.duration });
1032
1051
  await enclave.publishCiphertextOutput(e3Id, data, proof);
1033
1052
  await expect(enclave.publishPlaintextOutput(e3Id, data, "0x"))
@@ -1035,18 +1054,14 @@ describe("Enclave", function () {
1035
1054
  .withArgs(data);
1036
1055
  });
1037
1056
  it("sets plaintextOutput correctly", async function () {
1038
- const { enclave, request } = await loadFixture(setup);
1057
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
1039
1058
  const e3Id = 0;
1040
- await enclave.request({
1041
- filter: request.filter,
1042
- threshold: request.threshold,
1059
+ await makeRequest(enclave, usdcToken, {
1060
+ ...request,
1043
1061
  startWindow: [await time.latest(), (await time.latest()) + 100],
1044
- duration: request.duration,
1045
- e3Program: request.e3Program,
1046
- e3ProgramParams: request.e3ProgramParams,
1047
- computeProviderParams: request.computeProviderParams,
1048
- }, { value: 10 });
1049
- await enclave.activate(e3Id, ethers.ZeroHash);
1062
+ });
1063
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
1064
+ await enclave.activate(e3Id, data);
1050
1065
  await mine(2, { interval: request.duration });
1051
1066
  await enclave.publishCiphertextOutput(e3Id, data, proof);
1052
1067
  expect(await enclave.publishPlaintextOutput(e3Id, data, proof));
@@ -1054,35 +1069,27 @@ describe("Enclave", function () {
1054
1069
  expect(e3.plaintextOutput).to.equal(data);
1055
1070
  });
1056
1071
  it("returns true if output is published successfully", async function () {
1057
- const { enclave, request } = await loadFixture(setup);
1072
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
1058
1073
  const e3Id = 0;
1059
- await enclave.request({
1060
- filter: request.filter,
1061
- threshold: request.threshold,
1074
+ await makeRequest(enclave, usdcToken, {
1075
+ ...request,
1062
1076
  startWindow: [await time.latest(), (await time.latest()) + 100],
1063
- duration: request.duration,
1064
- e3Program: request.e3Program,
1065
- e3ProgramParams: request.e3ProgramParams,
1066
- computeProviderParams: request.computeProviderParams,
1067
- }, { value: 10 });
1068
- await enclave.activate(e3Id, ethers.ZeroHash);
1077
+ });
1078
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
1079
+ await enclave.activate(e3Id, data);
1069
1080
  await mine(2, { interval: request.duration });
1070
1081
  await enclave.publishCiphertextOutput(e3Id, data, proof);
1071
1082
  expect(await enclave.publishPlaintextOutput.staticCall(e3Id, data, proof)).to.equal(true);
1072
1083
  });
1073
1084
  it("emits PlaintextOutputPublished event", async function () {
1074
- const { enclave, request } = await loadFixture(setup);
1085
+ const { enclave, request, usdcToken, ciphernodeRegistryContract, operator1, operator2, } = await loadFixture(setup);
1075
1086
  const e3Id = 0;
1076
- await enclave.request({
1077
- filter: request.filter,
1078
- threshold: request.threshold,
1087
+ await makeRequest(enclave, usdcToken, {
1088
+ ...request,
1079
1089
  startWindow: [await time.latest(), (await time.latest()) + 100],
1080
- duration: request.duration,
1081
- e3Program: request.e3Program,
1082
- e3ProgramParams: request.e3ProgramParams,
1083
- computeProviderParams: request.computeProviderParams,
1084
- }, { value: 10 });
1085
- await enclave.activate(e3Id, ethers.ZeroHash);
1090
+ });
1091
+ await setupAndPublishCommittee(ciphernodeRegistryContract, e3Id, [await operator1.getAddress(), await operator2.getAddress()], data, operator1, operator2);
1092
+ await enclave.activate(e3Id, data);
1086
1093
  await mine(2, { interval: request.duration });
1087
1094
  await enclave.publishCiphertextOutput(e3Id, data, proof);
1088
1095
  await expect(await enclave.publishPlaintextOutput(e3Id, data, proof))