@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
@@ -0,0 +1,684 @@
1
+ // SPDX-License-Identifier: LGPL-3.0-only
2
+ //
3
+ // This file is provided WITHOUT ANY WARRANTY;
4
+ // without even the implied warranty of MERCHANTABILITY
5
+ // or FITNESS FOR A PARTICULAR PURPOSE.
6
+ import { LeanIMT } from "@zk-kit/lean-imt";
7
+ import { expect } from "chai";
8
+ import { network } from "hardhat";
9
+ import { poseidon2 } from "poseidon-lite";
10
+ import BondingRegistryModule from "../../ignition/modules/bondingRegistry";
11
+ import EnclaveTicketTokenModule from "../../ignition/modules/enclaveTicketToken";
12
+ import EnclaveTokenModule from "../../ignition/modules/enclaveToken";
13
+ import MockCiphernodeRegistryModule from "../../ignition/modules/mockCiphernodeRegistry";
14
+ import MockStableTokenModule from "../../ignition/modules/mockStableToken";
15
+ import SlashingManagerModule from "../../ignition/modules/slashingManager";
16
+ import { BondingRegistry__factory as BondingRegistryFactory, CiphernodeRegistryOwnable__factory as CiphernodeRegistryOwnableFactory, EnclaveTicketToken__factory as EnclaveTicketTokenFactory, EnclaveToken__factory as EnclaveTokenFactory, MockUSDC__factory as MockUSDCFactory, SlashingManager__factory as SlashingManagerFactory, } from "../../types";
17
+ const AddressOne = "0x0000000000000000000000000000000000000001";
18
+ const { ethers, networkHelpers, ignition } = await network.connect();
19
+ const { loadFixture, time } = networkHelpers;
20
+ const hash = (a, b) => poseidon2([a, b]);
21
+ const REASON_DEPOSIT = ethers.encodeBytes32String("DEPOSIT");
22
+ const REASON_WITHDRAW = ethers.encodeBytes32String("WITHDRAW");
23
+ const REASON_BOND = ethers.encodeBytes32String("BOND");
24
+ const REASON_UNBOND = ethers.encodeBytes32String("UNBOND");
25
+ describe("BondingRegistry", function () {
26
+ const SEVEN_DAYS_IN_SECONDS = 7 * 24 * 60 * 60;
27
+ const TICKET_PRICE = ethers.parseUnits("10", 6);
28
+ const LICENSE_REQUIRED_BOND = ethers.parseEther("1000");
29
+ const MIN_TICKET_BALANCE = 5;
30
+ async function setup() {
31
+ const [owner, operator1, operator2, treasury, notTheOwner] = await ethers.getSigners();
32
+ const ownerAddress = await owner.getAddress();
33
+ const operator1Address = await operator1.getAddress();
34
+ const operator2Address = await operator2.getAddress();
35
+ const treasuryAddress = await treasury.getAddress();
36
+ const usdcContract = await ignition.deploy(MockStableTokenModule, {
37
+ parameters: {
38
+ MockUSDC: {
39
+ initialSupply: 1000000,
40
+ },
41
+ },
42
+ });
43
+ const enclTokenContract = await ignition.deploy(EnclaveTokenModule, {
44
+ parameters: {
45
+ EnclaveToken: {
46
+ owner: ownerAddress,
47
+ },
48
+ },
49
+ });
50
+ const ciphernodeRegistryContract = await ignition.deploy(MockCiphernodeRegistryModule, {
51
+ parameters: {
52
+ CiphernodeRegistry: {
53
+ enclaveAddress: ownerAddress,
54
+ owner: ownerAddress,
55
+ },
56
+ },
57
+ });
58
+ const ticketTokenContract = await ignition.deploy(EnclaveTicketTokenModule, {
59
+ parameters: {
60
+ EnclaveTicketToken: {
61
+ baseToken: await usdcContract.mockUSDC.getAddress(),
62
+ registry: AddressOne,
63
+ owner: ownerAddress,
64
+ },
65
+ },
66
+ });
67
+ const slashingManagerContract = await ignition.deploy(SlashingManagerModule, {
68
+ parameters: {
69
+ SlashingManager: {
70
+ admin: ownerAddress,
71
+ bondingRegistry: AddressOne,
72
+ },
73
+ },
74
+ });
75
+ const bondingRegistryContract = await ignition.deploy(BondingRegistryModule, {
76
+ parameters: {
77
+ BondingRegistry: {
78
+ owner: ownerAddress,
79
+ ticketToken: await ticketTokenContract.enclaveTicketToken.getAddress(),
80
+ licenseToken: await enclTokenContract.enclaveToken.getAddress(),
81
+ registry: await ciphernodeRegistryContract.mockCiphernodeRegistry.getAddress(),
82
+ slashedFundsTreasury: treasuryAddress,
83
+ ticketPrice: TICKET_PRICE,
84
+ licenseRequiredBond: LICENSE_REQUIRED_BOND,
85
+ minTicketBalance: MIN_TICKET_BALANCE,
86
+ exitDelay: SEVEN_DAYS_IN_SECONDS,
87
+ },
88
+ },
89
+ });
90
+ const bondingRegistry = BondingRegistryFactory.connect(await bondingRegistryContract.bondingRegistry.getAddress(), owner);
91
+ const ticketToken = EnclaveTicketTokenFactory.connect(await ticketTokenContract.enclaveTicketToken.getAddress(), owner);
92
+ const licenseToken = EnclaveTokenFactory.connect(await enclTokenContract.enclaveToken.getAddress(), owner);
93
+ const usdcToken = MockUSDCFactory.connect(await usdcContract.mockUSDC.getAddress(), owner);
94
+ const slashingManager = SlashingManagerFactory.connect(await slashingManagerContract.slashingManager.getAddress(), owner);
95
+ const ciphernodeRegistry = CiphernodeRegistryOwnableFactory.connect(await ciphernodeRegistryContract.mockCiphernodeRegistry.getAddress(), owner);
96
+ await ticketToken.setRegistry(await bondingRegistry.getAddress());
97
+ await slashingManager.setBondingRegistry(await bondingRegistry.getAddress());
98
+ await bondingRegistry.setSlashingManager(await slashingManager.getAddress());
99
+ await usdcToken.mint(ownerAddress, ethers.parseUnits("100000", 6));
100
+ await usdcToken.mint(operator1Address, ethers.parseUnits("100000", 6));
101
+ await usdcToken.mint(operator2Address, ethers.parseUnits("100000", 6));
102
+ await licenseToken.mintAllocation(ownerAddress, ethers.parseEther("100000"), "Test allocation");
103
+ await licenseToken.mintAllocation(operator1Address, ethers.parseEther("100000"), "Test allocation");
104
+ await licenseToken.mintAllocation(operator2Address, ethers.parseEther("100000"), "Test allocation");
105
+ await licenseToken.setTransferRestriction(false);
106
+ const tree = new LeanIMT(hash);
107
+ return {
108
+ bondingRegistry,
109
+ ticketToken,
110
+ licenseToken,
111
+ usdcToken,
112
+ slashingManager,
113
+ ciphernodeRegistry,
114
+ tree,
115
+ owner,
116
+ operator1,
117
+ operator2,
118
+ treasury,
119
+ notTheOwner,
120
+ ownerAddress,
121
+ operator1Address,
122
+ operator2Address,
123
+ treasuryAddress,
124
+ };
125
+ }
126
+ describe("constructor / initialize()", function () {
127
+ it("correctly sets initial parameters", async function () {
128
+ const { bondingRegistry, ticketToken, licenseToken, treasuryAddress } = await loadFixture(setup);
129
+ expect(await bondingRegistry.ticketToken()).to.equal(await ticketToken.getAddress());
130
+ expect(await bondingRegistry.licenseToken()).to.equal(await licenseToken.getAddress());
131
+ expect(await bondingRegistry.slashedFundsTreasury()).to.equal(treasuryAddress);
132
+ expect(await bondingRegistry.ticketPrice()).to.equal(TICKET_PRICE);
133
+ expect(await bondingRegistry.licenseRequiredBond()).to.equal(LICENSE_REQUIRED_BOND);
134
+ expect(await bondingRegistry.minTicketBalance()).to.equal(MIN_TICKET_BALANCE);
135
+ expect(await bondingRegistry.exitDelay()).to.equal(SEVEN_DAYS_IN_SECONDS);
136
+ expect(await bondingRegistry.licenseActiveBps()).to.equal(8000);
137
+ });
138
+ });
139
+ describe("bondLicense()", function () {
140
+ it("allows operators to bond license tokens", async function () {
141
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
142
+ const bondAmount = ethers.parseEther("1000");
143
+ await licenseToken
144
+ .connect(operator1)
145
+ .approve(await bondingRegistry.getAddress(), bondAmount);
146
+ await expect(bondingRegistry.connect(operator1).bondLicense(bondAmount))
147
+ .to.emit(bondingRegistry, "LicenseBondUpdated")
148
+ .withArgs(await operator1.getAddress(), bondAmount, bondAmount, REASON_BOND);
149
+ expect(await bondingRegistry.getLicenseBond(await operator1.getAddress())).to.equal(bondAmount);
150
+ });
151
+ it("reverts if amount is zero", async function () {
152
+ const { bondingRegistry, operator1 } = await loadFixture(setup);
153
+ await expect(bondingRegistry.connect(operator1).bondLicense(0)).to.be.revertedWithCustomError(bondingRegistry, "ZeroAmount");
154
+ });
155
+ it("reverts if exit is in progress", async function () {
156
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
157
+ const bondAmount = ethers.parseEther("1000");
158
+ await licenseToken
159
+ .connect(operator1)
160
+ .approve(await bondingRegistry.getAddress(), bondAmount);
161
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
162
+ await bondingRegistry.connect(operator1).registerOperator();
163
+ await bondingRegistry.connect(operator1).deregisterOperator([]);
164
+ await licenseToken
165
+ .connect(operator1)
166
+ .approve(await bondingRegistry.getAddress(), bondAmount);
167
+ await expect(bondingRegistry.connect(operator1).bondLicense(bondAmount)).to.be.revertedWithCustomError(bondingRegistry, "ExitInProgress");
168
+ });
169
+ it("accumulates multiple bond amounts", async function () {
170
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
171
+ const bondAmount1 = ethers.parseEther("500");
172
+ const bondAmount2 = ethers.parseEther("300");
173
+ await licenseToken
174
+ .connect(operator1)
175
+ .approve(await bondingRegistry.getAddress(), bondAmount1);
176
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount1);
177
+ await licenseToken
178
+ .connect(operator1)
179
+ .approve(await bondingRegistry.getAddress(), bondAmount2);
180
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount2);
181
+ expect(await bondingRegistry.getLicenseBond(await operator1.getAddress())).to.equal(bondAmount1 + bondAmount2);
182
+ });
183
+ });
184
+ describe("unbondLicense()", function () {
185
+ it("allows operators to unbond license tokens", async function () {
186
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
187
+ const bondAmount = ethers.parseEther("1000");
188
+ const unbondAmount = ethers.parseEther("200");
189
+ await licenseToken
190
+ .connect(operator1)
191
+ .approve(await bondingRegistry.getAddress(), bondAmount);
192
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
193
+ await expect(bondingRegistry.connect(operator1).unbondLicense(unbondAmount))
194
+ .to.emit(bondingRegistry, "LicenseBondUpdated")
195
+ .withArgs(await operator1.getAddress(), -unbondAmount, bondAmount - unbondAmount, REASON_UNBOND);
196
+ expect(await bondingRegistry.getLicenseBond(await operator1.getAddress())).to.equal(bondAmount - unbondAmount);
197
+ });
198
+ it("reverts if amount is zero", async function () {
199
+ const { bondingRegistry, operator1 } = await loadFixture(setup);
200
+ await expect(bondingRegistry.connect(operator1).unbondLicense(0)).to.be.revertedWithCustomError(bondingRegistry, "ZeroAmount");
201
+ });
202
+ it("reverts if insufficient balance", async function () {
203
+ const { bondingRegistry, operator1 } = await loadFixture(setup);
204
+ await expect(bondingRegistry
205
+ .connect(operator1)
206
+ .unbondLicense(ethers.parseEther("100"))).to.be.revertedWithCustomError(bondingRegistry, "InsufficientBalance");
207
+ });
208
+ it("queues license tokens for exit", async function () {
209
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
210
+ const bondAmount = ethers.parseEther("1000");
211
+ const unbondAmount = ethers.parseEther("200");
212
+ await licenseToken
213
+ .connect(operator1)
214
+ .approve(await bondingRegistry.getAddress(), bondAmount);
215
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
216
+ await bondingRegistry.connect(operator1).unbondLicense(unbondAmount);
217
+ const [, licensePending] = await bondingRegistry.pendingExits(await operator1.getAddress());
218
+ expect(licensePending).to.equal(unbondAmount);
219
+ });
220
+ });
221
+ describe("registerOperator()", function () {
222
+ it("allows properly licensed operators to register", async function () {
223
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
224
+ const bondAmount = LICENSE_REQUIRED_BOND;
225
+ await licenseToken
226
+ .connect(operator1)
227
+ .approve(await bondingRegistry.getAddress(), bondAmount);
228
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
229
+ await bondingRegistry.connect(operator1).registerOperator();
230
+ expect(await bondingRegistry.isRegistered(await operator1.getAddress()))
231
+ .to.be.true;
232
+ expect(await bondingRegistry.isActive(await operator1.getAddress())).to.be
233
+ .false;
234
+ });
235
+ it("reverts if not properly licensed", async function () {
236
+ const { bondingRegistry, operator1 } = await loadFixture(setup);
237
+ await expect(bondingRegistry.connect(operator1).registerOperator()).to.be.revertedWithCustomError(bondingRegistry, "NotLicensed");
238
+ });
239
+ it("reverts if already registered", async function () {
240
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
241
+ const bondAmount = LICENSE_REQUIRED_BOND;
242
+ await licenseToken
243
+ .connect(operator1)
244
+ .approve(await bondingRegistry.getAddress(), bondAmount);
245
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
246
+ await bondingRegistry.connect(operator1).registerOperator();
247
+ await expect(bondingRegistry.connect(operator1).registerOperator()).to.be.revertedWithCustomError(bondingRegistry, "AlreadyRegistered");
248
+ });
249
+ it("clears previous exit request when re-registering", async function () {
250
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
251
+ const bondAmount = LICENSE_REQUIRED_BOND;
252
+ await licenseToken
253
+ .connect(operator1)
254
+ .approve(await bondingRegistry.getAddress(), bondAmount);
255
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
256
+ await bondingRegistry.connect(operator1).registerOperator();
257
+ await bondingRegistry.connect(operator1).deregisterOperator([]);
258
+ await time.increase(SEVEN_DAYS_IN_SECONDS + 1);
259
+ await licenseToken
260
+ .connect(operator1)
261
+ .approve(await bondingRegistry.getAddress(), bondAmount);
262
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
263
+ await bondingRegistry.connect(operator1).registerOperator();
264
+ expect(await bondingRegistry.hasExitInProgress(await operator1.getAddress())).to.be.false;
265
+ });
266
+ });
267
+ describe("deregisterOperator()", function () {
268
+ it("allows registered operators to deregister", async function () {
269
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
270
+ const bondAmount = LICENSE_REQUIRED_BOND;
271
+ await licenseToken
272
+ .connect(operator1)
273
+ .approve(await bondingRegistry.getAddress(), bondAmount);
274
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
275
+ await bondingRegistry.connect(operator1).registerOperator();
276
+ const latestTime = await time.latest();
277
+ await expect(bondingRegistry.connect(operator1).deregisterOperator([]))
278
+ .to.emit(bondingRegistry, "CiphernodeDeregistrationRequested")
279
+ .withArgs(await operator1.getAddress(), latestTime + SEVEN_DAYS_IN_SECONDS + 1);
280
+ expect(await bondingRegistry.isRegistered(await operator1.getAddress()))
281
+ .to.be.false;
282
+ expect(await bondingRegistry.hasExitInProgress(await operator1.getAddress())).to.be.true;
283
+ });
284
+ it("reverts if not registered", async function () {
285
+ const { bondingRegistry, operator1 } = await loadFixture(setup);
286
+ await expect(bondingRegistry.connect(operator1).deregisterOperator([])).to.be.revertedWithCustomError(bondingRegistry, "NotRegistered");
287
+ });
288
+ it("queues assets for exit when deregistering", async function () {
289
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
290
+ const bondAmount = LICENSE_REQUIRED_BOND;
291
+ await licenseToken
292
+ .connect(operator1)
293
+ .approve(await bondingRegistry.getAddress(), bondAmount);
294
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
295
+ await bondingRegistry.connect(operator1).registerOperator();
296
+ const ticketAmount = ethers.parseUnits("100", 6);
297
+ await usdcToken
298
+ .connect(operator1)
299
+ .approve(await ticketToken.getAddress(), ticketAmount);
300
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
301
+ await bondingRegistry.connect(operator1).deregisterOperator([]);
302
+ const [ticketPending, licensePending] = await bondingRegistry.pendingExits(await operator1.getAddress());
303
+ expect(ticketPending).to.equal(ticketAmount);
304
+ expect(licensePending).to.equal(bondAmount);
305
+ });
306
+ });
307
+ describe("addTicketBalance()", function () {
308
+ it("allows registered operators to add ticket balance", async function () {
309
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
310
+ const bondAmount = LICENSE_REQUIRED_BOND;
311
+ await licenseToken
312
+ .connect(operator1)
313
+ .approve(await bondingRegistry.getAddress(), bondAmount);
314
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
315
+ await bondingRegistry.connect(operator1).registerOperator();
316
+ const ticketAmount = ethers.parseUnits("100", 6);
317
+ await usdcToken
318
+ .connect(operator1)
319
+ .approve(await ticketToken.getAddress(), ticketAmount);
320
+ await expect(bondingRegistry.connect(operator1).addTicketBalance(ticketAmount))
321
+ .to.emit(bondingRegistry, "TicketBalanceUpdated")
322
+ .withArgs(await operator1.getAddress(), ticketAmount, ticketAmount, REASON_DEPOSIT);
323
+ expect(await bondingRegistry.getTicketBalance(await operator1.getAddress())).to.equal(ticketAmount);
324
+ });
325
+ it("activates operator when minimum balance is reached", async function () {
326
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
327
+ const bondAmount = LICENSE_REQUIRED_BOND;
328
+ await licenseToken
329
+ .connect(operator1)
330
+ .approve(await bondingRegistry.getAddress(), bondAmount);
331
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
332
+ await bondingRegistry.connect(operator1).registerOperator();
333
+ const ticketAmount = ethers.parseUnits("50", 6);
334
+ await usdcToken
335
+ .connect(operator1)
336
+ .approve(await ticketToken.getAddress(), ticketAmount);
337
+ await expect(bondingRegistry.connect(operator1).addTicketBalance(ticketAmount))
338
+ .to.emit(bondingRegistry, "OperatorActivationChanged")
339
+ .withArgs(await operator1.getAddress(), true);
340
+ expect(await bondingRegistry.isActive(await operator1.getAddress())).to.be
341
+ .true;
342
+ });
343
+ it("reverts if not registered", async function () {
344
+ const { bondingRegistry, operator1 } = await loadFixture(setup);
345
+ await expect(bondingRegistry
346
+ .connect(operator1)
347
+ .addTicketBalance(ethers.parseUnits("100", 6))).to.be.revertedWithCustomError(bondingRegistry, "NotRegistered");
348
+ });
349
+ it("reverts if amount is zero", async function () {
350
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
351
+ const bondAmount = LICENSE_REQUIRED_BOND;
352
+ await licenseToken
353
+ .connect(operator1)
354
+ .approve(await bondingRegistry.getAddress(), bondAmount);
355
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
356
+ await bondingRegistry.connect(operator1).registerOperator();
357
+ await expect(bondingRegistry.connect(operator1).addTicketBalance(0)).to.be.revertedWithCustomError(bondingRegistry, "ZeroAmount");
358
+ });
359
+ });
360
+ describe("removeTicketBalance()", function () {
361
+ it("allows operators to remove ticket balance", async function () {
362
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
363
+ const bondAmount = LICENSE_REQUIRED_BOND;
364
+ await licenseToken
365
+ .connect(operator1)
366
+ .approve(await bondingRegistry.getAddress(), bondAmount);
367
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
368
+ await bondingRegistry.connect(operator1).registerOperator();
369
+ const ticketAmount = ethers.parseUnits("100", 6);
370
+ await usdcToken
371
+ .connect(operator1)
372
+ .approve(await ticketToken.getAddress(), ticketAmount);
373
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
374
+ const removeAmount = ethers.parseUnits("30", 6);
375
+ await expect(bondingRegistry.connect(operator1).removeTicketBalance(removeAmount))
376
+ .to.emit(bondingRegistry, "TicketBalanceUpdated")
377
+ .withArgs(await operator1.getAddress(), -removeAmount, ticketAmount - removeAmount, REASON_WITHDRAW);
378
+ expect(await bondingRegistry.getTicketBalance(await operator1.getAddress())).to.equal(ticketAmount - removeAmount);
379
+ });
380
+ it("queues removed tickets for exit", async function () {
381
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
382
+ const bondAmount = LICENSE_REQUIRED_BOND;
383
+ await licenseToken
384
+ .connect(operator1)
385
+ .approve(await bondingRegistry.getAddress(), bondAmount);
386
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
387
+ await bondingRegistry.connect(operator1).registerOperator();
388
+ const ticketAmount = ethers.parseUnits("100", 6);
389
+ await usdcToken
390
+ .connect(operator1)
391
+ .approve(await ticketToken.getAddress(), ticketAmount);
392
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
393
+ const removeAmount = ethers.parseUnits("30", 6);
394
+ await bondingRegistry
395
+ .connect(operator1)
396
+ .removeTicketBalance(removeAmount);
397
+ const [ticketPending] = await bondingRegistry.pendingExits(await operator1.getAddress());
398
+ expect(ticketPending).to.equal(removeAmount);
399
+ });
400
+ it("deactivates operator if balance falls below minimum", async function () {
401
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
402
+ const bondAmount = LICENSE_REQUIRED_BOND;
403
+ await licenseToken
404
+ .connect(operator1)
405
+ .approve(await bondingRegistry.getAddress(), bondAmount);
406
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
407
+ await bondingRegistry.connect(operator1).registerOperator();
408
+ const ticketAmount = ethers.parseUnits("60", 6);
409
+ await usdcToken
410
+ .connect(operator1)
411
+ .approve(await ticketToken.getAddress(), ticketAmount);
412
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
413
+ const removeAmount = ethers.parseUnits("20", 6);
414
+ await expect(bondingRegistry.connect(operator1).removeTicketBalance(removeAmount))
415
+ .to.emit(bondingRegistry, "OperatorActivationChanged")
416
+ .withArgs(await operator1.getAddress(), false);
417
+ expect(await bondingRegistry.isActive(await operator1.getAddress())).to.be
418
+ .false;
419
+ });
420
+ it("reverts if insufficient balance", async function () {
421
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
422
+ const bondAmount = LICENSE_REQUIRED_BOND;
423
+ await licenseToken
424
+ .connect(operator1)
425
+ .approve(await bondingRegistry.getAddress(), bondAmount);
426
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
427
+ await bondingRegistry.connect(operator1).registerOperator();
428
+ await expect(bondingRegistry
429
+ .connect(operator1)
430
+ .removeTicketBalance(ethers.parseUnits("100", 6))).to.be.revertedWithCustomError(bondingRegistry, "InsufficientBalance");
431
+ });
432
+ });
433
+ describe("claimExits()", function () {
434
+ it("allows claiming after exit delay", async function () {
435
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
436
+ const bondAmount = LICENSE_REQUIRED_BOND;
437
+ await licenseToken
438
+ .connect(operator1)
439
+ .approve(await bondingRegistry.getAddress(), bondAmount);
440
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
441
+ await bondingRegistry.connect(operator1).registerOperator();
442
+ const ticketAmount = ethers.parseUnits("100", 6);
443
+ await usdcToken
444
+ .connect(operator1)
445
+ .approve(await ticketToken.getAddress(), ticketAmount);
446
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
447
+ await bondingRegistry.connect(operator1).deregisterOperator([]);
448
+ await time.increase(SEVEN_DAYS_IN_SECONDS + 1);
449
+ const initialUSDCBalance = await usdcToken.balanceOf(await operator1.getAddress());
450
+ const initialENCLBalance = await licenseToken.balanceOf(await operator1.getAddress());
451
+ await bondingRegistry
452
+ .connect(operator1)
453
+ .claimExits(ticketAmount, bondAmount);
454
+ expect(await usdcToken.balanceOf(await operator1.getAddress())).to.equal(initialUSDCBalance + ticketAmount);
455
+ expect(await licenseToken.balanceOf(await operator1.getAddress())).to.equal(initialENCLBalance + bondAmount);
456
+ });
457
+ it("reverts if exit not ready", async function () {
458
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
459
+ const bondAmount = LICENSE_REQUIRED_BOND;
460
+ await licenseToken
461
+ .connect(operator1)
462
+ .approve(await bondingRegistry.getAddress(), bondAmount);
463
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
464
+ await bondingRegistry.connect(operator1).registerOperator();
465
+ await bondingRegistry.connect(operator1).deregisterOperator([]);
466
+ await expect(bondingRegistry.connect(operator1).claimExits(0, bondAmount)).to.be.revertedWithCustomError(bondingRegistry, "ExitNotReady");
467
+ });
468
+ it("allows partial claims", async function () {
469
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
470
+ const bondAmount = LICENSE_REQUIRED_BOND;
471
+ await licenseToken
472
+ .connect(operator1)
473
+ .approve(await bondingRegistry.getAddress(), bondAmount);
474
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
475
+ await bondingRegistry.connect(operator1).registerOperator();
476
+ const ticketAmount = ethers.parseUnits("100", 6);
477
+ await usdcToken
478
+ .connect(operator1)
479
+ .approve(await ticketToken.getAddress(), ticketAmount);
480
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
481
+ await bondingRegistry.connect(operator1).deregisterOperator([]);
482
+ await time.increase(SEVEN_DAYS_IN_SECONDS + 1);
483
+ const partialTickets = ethers.parseUnits("50", 6);
484
+ const partialLicense = ethers.parseEther("500");
485
+ const initialUSDCBalance = await usdcToken.balanceOf(await operator1.getAddress());
486
+ const initialENCLBalance = await licenseToken.balanceOf(await operator1.getAddress());
487
+ await bondingRegistry
488
+ .connect(operator1)
489
+ .claimExits(partialTickets, partialLicense);
490
+ expect(await usdcToken.balanceOf(await operator1.getAddress())).to.equal(initialUSDCBalance + partialTickets);
491
+ expect(await licenseToken.balanceOf(await operator1.getAddress())).to.equal(initialENCLBalance + partialLicense);
492
+ const [remainingTickets, remainingLicense] = await bondingRegistry.pendingExits(await operator1.getAddress());
493
+ expect(remainingTickets).to.equal(ticketAmount - partialTickets);
494
+ expect(remainingLicense).to.equal(bondAmount - partialLicense);
495
+ });
496
+ });
497
+ describe("isLicensed()", function () {
498
+ it("returns true when operator has minimum license bond", async function () {
499
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
500
+ const minBond = (LICENSE_REQUIRED_BOND * 8000n) / 10000n;
501
+ await licenseToken
502
+ .connect(operator1)
503
+ .approve(await bondingRegistry.getAddress(), minBond);
504
+ await bondingRegistry.connect(operator1).bondLicense(minBond);
505
+ expect(await bondingRegistry.isLicensed(await operator1.getAddress())).to
506
+ .be.true;
507
+ });
508
+ it("returns false when operator has insufficient license bond", async function () {
509
+ const { bondingRegistry, licenseToken, operator1 } = await loadFixture(setup);
510
+ const insufficientBond = (LICENSE_REQUIRED_BOND * 7999n) / 10000n;
511
+ await licenseToken
512
+ .connect(operator1)
513
+ .approve(await bondingRegistry.getAddress(), insufficientBond);
514
+ await bondingRegistry.connect(operator1).bondLicense(insufficientBond);
515
+ expect(await bondingRegistry.isLicensed(await operator1.getAddress())).to
516
+ .be.false;
517
+ });
518
+ });
519
+ describe("availableTickets()", function () {
520
+ it("calculates available tickets correctly", async function () {
521
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
522
+ const bondAmount = LICENSE_REQUIRED_BOND;
523
+ await licenseToken
524
+ .connect(operator1)
525
+ .approve(await bondingRegistry.getAddress(), bondAmount);
526
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
527
+ await bondingRegistry.connect(operator1).registerOperator();
528
+ const ticketAmount = ethers.parseUnits("100", 6);
529
+ await usdcToken
530
+ .connect(operator1)
531
+ .approve(await ticketToken.getAddress(), ticketAmount);
532
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
533
+ expect(await bondingRegistry.availableTickets(await operator1.getAddress())).to.equal(10);
534
+ });
535
+ it("returns 0 when operator has zero ticket balance", async function () {
536
+ const { bondingRegistry, operator1 } = await loadFixture(setup);
537
+ expect(await bondingRegistry.availableTickets(await operator1.getAddress())).to.equal(0);
538
+ });
539
+ });
540
+ describe("Admin Functions", function () {
541
+ describe("setTicketPrice()", function () {
542
+ it("allows owner to set ticket price", async function () {
543
+ const { bondingRegistry } = await loadFixture(setup);
544
+ const newPrice = ethers.parseUnits("15", 6);
545
+ await expect(bondingRegistry.setTicketPrice(newPrice))
546
+ .to.emit(bondingRegistry, "ConfigurationUpdated")
547
+ .withArgs(ethers.encodeBytes32String("ticketPrice"), TICKET_PRICE, newPrice);
548
+ expect(await bondingRegistry.ticketPrice()).to.equal(newPrice);
549
+ });
550
+ it("reverts if price is zero", async function () {
551
+ const { bondingRegistry } = await loadFixture(setup);
552
+ await expect(bondingRegistry.setTicketPrice(0)).to.be.revertedWithCustomError(bondingRegistry, "InvalidConfiguration");
553
+ });
554
+ it("reverts if not owner", async function () {
555
+ const { bondingRegistry, notTheOwner } = await loadFixture(setup);
556
+ await expect(bondingRegistry
557
+ .connect(notTheOwner)
558
+ .setTicketPrice(ethers.parseEther("15"))).to.be.revertedWithCustomError(bondingRegistry, "OwnableUnauthorizedAccount");
559
+ });
560
+ });
561
+ describe("setLicenseActiveBps()", function () {
562
+ it("allows owner to set license active basis points", async function () {
563
+ const { bondingRegistry } = await loadFixture(setup);
564
+ const newBps = 9000;
565
+ await expect(bondingRegistry.setLicenseActiveBps(newBps))
566
+ .to.emit(bondingRegistry, "ConfigurationUpdated")
567
+ .withArgs(ethers.encodeBytes32String("licenseActiveBps"), 8000, newBps);
568
+ expect(await bondingRegistry.licenseActiveBps()).to.equal(newBps);
569
+ });
570
+ it("reverts if bps is 0", async function () {
571
+ const { bondingRegistry } = await loadFixture(setup);
572
+ await expect(bondingRegistry.setLicenseActiveBps(0)).to.be.revertedWithCustomError(bondingRegistry, "InvalidConfiguration");
573
+ });
574
+ it("reverts if bps is greater than 10000", async function () {
575
+ const { bondingRegistry } = await loadFixture(setup);
576
+ await expect(bondingRegistry.setLicenseActiveBps(10001)).to.be.revertedWithCustomError(bondingRegistry, "InvalidConfiguration");
577
+ });
578
+ });
579
+ describe("withdrawSlashedFunds()", function () {
580
+ it("allows owner to withdraw slashed funds", async function () {
581
+ const { bondingRegistry, treasury } = await loadFixture(setup);
582
+ await expect(bondingRegistry.withdrawSlashedFunds(0, 0))
583
+ .to.emit(bondingRegistry, "SlashedFundsWithdrawn")
584
+ .withArgs(await treasury.getAddress(), 0, 0);
585
+ });
586
+ it("reverts if not owner", async function () {
587
+ const { bondingRegistry, notTheOwner } = await loadFixture(setup);
588
+ await expect(bondingRegistry.connect(notTheOwner).withdrawSlashedFunds(0, 0)).to.be.revertedWithCustomError(bondingRegistry, "OwnableUnauthorizedAccount");
589
+ });
590
+ });
591
+ });
592
+ describe("Edge Cases and Complex Scenarios", function () {
593
+ it("handles operator becoming inactive due to license reduction", async function () {
594
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
595
+ const bondAmount = LICENSE_REQUIRED_BOND;
596
+ await licenseToken
597
+ .connect(operator1)
598
+ .approve(await bondingRegistry.getAddress(), bondAmount);
599
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
600
+ await bondingRegistry.connect(operator1).registerOperator();
601
+ const ticketAmount = ethers.parseUnits("60", 6);
602
+ await usdcToken
603
+ .connect(operator1)
604
+ .approve(await ticketToken.getAddress(), ticketAmount);
605
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
606
+ expect(await bondingRegistry.isActive(await operator1.getAddress())).to.be
607
+ .true;
608
+ const unbondAmount = LICENSE_REQUIRED_BOND / 5n;
609
+ await bondingRegistry.connect(operator1).unbondLicense(unbondAmount + 1n);
610
+ expect(await bondingRegistry.isActive(await operator1.getAddress())).to.be
611
+ .false;
612
+ expect(await bondingRegistry.isLicensed(await operator1.getAddress())).to
613
+ .be.false;
614
+ });
615
+ it("handles multiple operators with different states", async function () {
616
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, operator2, } = await loadFixture(setup);
617
+ const bondAmount = LICENSE_REQUIRED_BOND;
618
+ await licenseToken
619
+ .connect(operator1)
620
+ .approve(await bondingRegistry.getAddress(), bondAmount);
621
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
622
+ await bondingRegistry.connect(operator1).registerOperator();
623
+ await licenseToken
624
+ .connect(operator2)
625
+ .approve(await bondingRegistry.getAddress(), bondAmount);
626
+ await bondingRegistry.connect(operator2).bondLicense(bondAmount);
627
+ await bondingRegistry.connect(operator2).registerOperator();
628
+ const ticketAmount = ethers.parseUnits("60", 6);
629
+ await usdcToken
630
+ .connect(operator2)
631
+ .approve(await ticketToken.getAddress(), ticketAmount);
632
+ await bondingRegistry.connect(operator2).addTicketBalance(ticketAmount);
633
+ expect(await bondingRegistry.isRegistered(await operator1.getAddress()))
634
+ .to.be.true;
635
+ expect(await bondingRegistry.isActive(await operator1.getAddress())).to.be
636
+ .false;
637
+ expect(await bondingRegistry.isRegistered(await operator2.getAddress()))
638
+ .to.be.true;
639
+ expect(await bondingRegistry.isActive(await operator2.getAddress())).to.be
640
+ .true;
641
+ });
642
+ it("handles the complete operator lifecycle", async function () {
643
+ const { bondingRegistry, licenseToken, usdcToken, ticketToken, operator1, } = await loadFixture(setup);
644
+ const bondAmount = LICENSE_REQUIRED_BOND;
645
+ await licenseToken
646
+ .connect(operator1)
647
+ .approve(await bondingRegistry.getAddress(), bondAmount);
648
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
649
+ expect(await bondingRegistry.isLicensed(await operator1.getAddress())).to
650
+ .be.true;
651
+ await bondingRegistry.connect(operator1).registerOperator();
652
+ expect(await bondingRegistry.isRegistered(await operator1.getAddress()))
653
+ .to.be.true;
654
+ expect(await bondingRegistry.isActive(await operator1.getAddress())).to.be
655
+ .false;
656
+ const ticketAmount = ethers.parseUnits("60", 6);
657
+ await usdcToken
658
+ .connect(operator1)
659
+ .approve(await ticketToken.getAddress(), ticketAmount);
660
+ await bondingRegistry.connect(operator1).addTicketBalance(ticketAmount);
661
+ expect(await bondingRegistry.isActive(await operator1.getAddress())).to.be
662
+ .true;
663
+ await bondingRegistry.connect(operator1).deregisterOperator([]);
664
+ expect(await bondingRegistry.isRegistered(await operator1.getAddress()))
665
+ .to.be.false;
666
+ expect(await bondingRegistry.hasExitInProgress(await operator1.getAddress())).to.be.true;
667
+ await time.increase(SEVEN_DAYS_IN_SECONDS + 1);
668
+ const initialUSDCBalance = await usdcToken.balanceOf(await operator1.getAddress());
669
+ const initialENCLBalance = await licenseToken.balanceOf(await operator1.getAddress());
670
+ await bondingRegistry
671
+ .connect(operator1)
672
+ .claimExits(ticketAmount, bondAmount);
673
+ expect(await usdcToken.balanceOf(await operator1.getAddress())).to.equal(initialUSDCBalance + ticketAmount);
674
+ expect(await licenseToken.balanceOf(await operator1.getAddress())).to.equal(initialENCLBalance + bondAmount);
675
+ await licenseToken
676
+ .connect(operator1)
677
+ .approve(await bondingRegistry.getAddress(), bondAmount);
678
+ await bondingRegistry.connect(operator1).bondLicense(bondAmount);
679
+ await bondingRegistry.connect(operator1).registerOperator();
680
+ expect(await bondingRegistry.isRegistered(await operator1.getAddress()))
681
+ .to.be.true;
682
+ });
683
+ });
684
+ });