@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.
- package/README.md +46 -2
- package/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/ProxyAdmin.json +135 -0
- package/artifacts/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol/artifacts.d.ts +27 -0
- package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.json +77 -0
- package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.json +126 -0
- package/artifacts/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/artifacts.d.ts +43 -0
- package/artifacts/build-info/solc-0_8_28-5150b9e6b6cf4df4986fccba97bea37a16fdfebc.json +311 -0
- package/artifacts/build-info/solc-0_8_28-5150b9e6b6cf4df4986fccba97bea37a16fdfebc.output.json +1 -0
- package/artifacts/contracts/Enclave.sol/Enclave.json +239 -147
- package/artifacts/contracts/Enclave.sol/artifacts.d.ts +6 -6
- package/artifacts/contracts/interfaces/IBondingRegistry.sol/IBondingRegistry.json +881 -0
- package/artifacts/contracts/interfaces/IBondingRegistry.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/ICiphernodeRegistry.json +326 -10
- package/artifacts/contracts/interfaces/ICiphernodeRegistry.sol/artifacts.d.ts +2 -2
- package/artifacts/contracts/interfaces/IComputeProvider.sol/IComputeProvider.json +1 -1
- package/artifacts/contracts/interfaces/IComputeProvider.sol/artifacts.d.ts +1 -1
- package/artifacts/contracts/interfaces/IDecryptionVerifier.sol/IDecryptionVerifier.json +1 -1
- package/artifacts/contracts/interfaces/IDecryptionVerifier.sol/artifacts.d.ts +1 -1
- package/artifacts/contracts/interfaces/IE3Program.sol/IE3Program.json +21 -3
- package/artifacts/contracts/interfaces/IE3Program.sol/artifacts.d.ts +2 -2
- package/artifacts/contracts/interfaces/IEnclave.sol/IEnclave.json +247 -27
- package/artifacts/contracts/interfaces/IEnclave.sol/artifacts.d.ts +2 -2
- package/artifacts/contracts/interfaces/{IRegistryFilter.sol/IRegistryFilter.json → ISlashVerifier.sol/ISlashVerifier.json} +10 -10
- package/artifacts/contracts/interfaces/ISlashVerifier.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/interfaces/ISlashingManager.sol/ISlashingManager.json +759 -0
- package/artifacts/contracts/interfaces/ISlashingManager.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/lib/ExitQueueLib.sol/ExitQueueLib.json +116 -0
- package/artifacts/contracts/lib/ExitQueueLib.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/registry/BondingRegistry.sol/BondingRegistry.json +1217 -0
- package/artifacts/contracts/registry/BondingRegistry.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/CiphernodeRegistryOwnable.json +351 -57
- package/artifacts/contracts/registry/CiphernodeRegistryOwnable.sol/artifacts.d.ts +6 -6
- package/artifacts/contracts/slashing/SlashingManager.sol/SlashingManager.json +1107 -0
- package/artifacts/contracts/slashing/SlashingManager.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry.json +328 -12
- package/artifacts/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey.json +328 -12
- package/artifacts/contracts/test/MockCiphernodeRegistry.sol/artifacts.d.ts +8 -8
- package/artifacts/contracts/test/MockComputeProvider.sol/MockComputeProvider.json +4 -4
- package/artifacts/contracts/test/MockComputeProvider.sol/artifacts.d.ts +4 -4
- package/artifacts/contracts/test/MockDecryptionVerifier.sol/MockDecryptionVerifier.json +3 -3
- package/artifacts/contracts/test/MockDecryptionVerifier.sol/artifacts.d.ts +3 -3
- package/artifacts/contracts/test/MockE3Program.sol/MockE3Program.json +26 -32
- package/artifacts/contracts/test/MockE3Program.sol/artifacts.d.ts +4 -4
- package/artifacts/contracts/test/MockSlashingVerifier.sol/MockSlashingVerifier.json +38 -0
- package/artifacts/contracts/test/MockSlashingVerifier.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/test/MockStableToken.sol/MockUSDC.json +425 -0
- package/artifacts/contracts/test/MockStableToken.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/token/EnclaveTicketToken.sol/EnclaveTicketToken.json +1222 -0
- package/artifacts/contracts/token/EnclaveTicketToken.sol/artifacts.d.ts +27 -0
- package/artifacts/contracts/token/EnclaveToken.sol/EnclaveToken.json +1460 -0
- package/artifacts/contracts/token/EnclaveToken.sol/artifacts.d.ts +27 -0
- package/artifacts/poseidon-solidity/PoseidonT3.sol/PoseidonT3.json +3 -3
- package/artifacts/poseidon-solidity/PoseidonT3.sol/artifacts.d.ts +3 -3
- package/contracts/Enclave.sol +230 -81
- package/contracts/interfaces/IBondingRegistry.sol +446 -0
- package/contracts/interfaces/ICiphernodeRegistry.sol +153 -9
- package/contracts/interfaces/IComputeProvider.sol +12 -2
- package/contracts/interfaces/IDecryptionVerifier.sol +11 -6
- package/contracts/interfaces/IE3.sol +21 -17
- package/contracts/interfaces/IE3Program.sol +30 -17
- package/contracts/interfaces/IEnclave.sol +95 -21
- package/contracts/interfaces/ISlashVerifier.sol +23 -0
- package/contracts/interfaces/ISlashingManager.sol +426 -0
- package/contracts/lib/ExitQueueLib.sol +490 -0
- package/contracts/registry/BondingRegistry.sol +737 -0
- package/contracts/registry/CiphernodeRegistryOwnable.sol +393 -26
- package/contracts/slashing/SlashingManager.sol +367 -0
- package/contracts/test/MockCiphernodeRegistry.sol +118 -24
- package/contracts/test/MockComputeProvider.sol +2 -2
- package/contracts/test/MockE3Program.sol +17 -14
- package/contracts/test/MockSlashingVerifier.sol +19 -0
- package/contracts/test/MockStableToken.sol +28 -0
- package/contracts/token/EnclaveTicketToken.sol +243 -0
- package/contracts/token/EnclaveToken.sol +267 -0
- package/dist/hardhat.config.d.ts.map +1 -1
- package/dist/hardhat.config.js +35 -16
- package/dist/ignition/modules/{mockInputValidator.d.ts → bondingRegistry.d.ts} +1 -1
- package/dist/ignition/modules/bondingRegistry.d.ts.map +1 -0
- package/dist/ignition/modules/bondingRegistry.js +35 -0
- package/dist/ignition/modules/ciphernodeRegistry.d.ts.map +1 -1
- package/dist/ignition/modules/ciphernodeRegistry.js +12 -2
- package/dist/ignition/modules/enclave.d.ts.map +1 -1
- package/dist/ignition/modules/enclave.js +16 -7
- package/dist/ignition/modules/{naiveRegistryFilter.d.ts → enclaveTicketToken.d.ts} +1 -1
- package/dist/ignition/modules/enclaveTicketToken.d.ts.map +1 -0
- package/dist/ignition/modules/enclaveTicketToken.js +17 -0
- package/dist/ignition/modules/enclaveToken.d.ts +3 -0
- package/dist/ignition/modules/enclaveToken.d.ts.map +1 -0
- package/dist/ignition/modules/{mockInputValidator.js → enclaveToken.js} +4 -4
- package/dist/ignition/modules/mockCiphernodeRegistry.d.ts.map +1 -1
- package/dist/ignition/modules/mockCiphernodeRegistry.js +0 -1
- package/dist/ignition/modules/mockCiphernodeRegistryEmptyKey.d.ts.map +1 -1
- package/dist/ignition/modules/mockCiphernodeRegistryEmptyKey.js +0 -1
- package/dist/ignition/modules/mockComputeProvider.d.ts.map +1 -1
- package/dist/ignition/modules/mockComputeProvider.js +0 -1
- package/dist/ignition/modules/mockDecryptionVerifier.d.ts.map +1 -1
- package/dist/ignition/modules/mockDecryptionVerifier.js +0 -1
- package/dist/ignition/modules/mockE3Program.d.ts.map +1 -1
- package/dist/ignition/modules/mockE3Program.js +1 -3
- package/dist/ignition/modules/mockSlashingVerifier.d.ts +3 -0
- package/dist/ignition/modules/mockSlashingVerifier.d.ts.map +1 -0
- package/dist/ignition/modules/mockSlashingVerifier.js +10 -0
- package/dist/ignition/modules/mockStableToken.d.ts +3 -0
- package/dist/ignition/modules/mockStableToken.d.ts.map +1 -0
- package/dist/ignition/modules/mockStableToken.js +11 -0
- package/dist/ignition/modules/poseidonT3.d.ts.map +1 -1
- package/dist/ignition/modules/poseidonT3.js +0 -1
- package/dist/ignition/modules/slashingManager.d.ts +3 -0
- package/dist/ignition/modules/slashingManager.d.ts.map +1 -0
- package/dist/ignition/modules/slashingManager.js +16 -0
- package/dist/scripts/cleanIgnitionState.d.ts +12 -0
- package/dist/scripts/cleanIgnitionState.d.ts.map +1 -0
- package/dist/scripts/cleanIgnitionState.js +41 -0
- package/dist/scripts/deployAndSave/bondingRegistry.d.ts +38 -0
- package/dist/scripts/deployAndSave/bondingRegistry.d.ts.map +1 -0
- package/dist/scripts/deployAndSave/bondingRegistry.js +133 -0
- package/dist/scripts/deployAndSave/ciphernodeRegistryOwnable.d.ts +11 -1
- package/dist/scripts/deployAndSave/ciphernodeRegistryOwnable.d.ts.map +1 -1
- package/dist/scripts/deployAndSave/ciphernodeRegistryOwnable.js +76 -19
- package/dist/scripts/deployAndSave/enclave.d.ts +16 -2
- package/dist/scripts/deployAndSave/enclave.d.ts.map +1 -1
- package/dist/scripts/deployAndSave/enclave.js +89 -22
- package/dist/scripts/deployAndSave/enclaveTicketToken.d.ts +20 -0
- package/dist/scripts/deployAndSave/enclaveTicketToken.d.ts.map +1 -0
- package/dist/scripts/deployAndSave/enclaveTicketToken.js +41 -0
- package/dist/scripts/deployAndSave/enclaveToken.d.ts +18 -0
- package/dist/scripts/deployAndSave/enclaveToken.d.ts.map +1 -0
- package/dist/scripts/deployAndSave/enclaveToken.js +57 -0
- package/dist/scripts/deployAndSave/mockComputeProvider.d.ts.map +1 -1
- package/dist/scripts/deployAndSave/mockComputeProvider.js +5 -5
- package/dist/scripts/deployAndSave/mockDecryptionVerifier.d.ts.map +1 -1
- package/dist/scripts/deployAndSave/mockDecryptionVerifier.js +5 -5
- package/dist/scripts/deployAndSave/mockProgram.d.ts +1 -2
- package/dist/scripts/deployAndSave/mockProgram.d.ts.map +1 -1
- package/dist/scripts/deployAndSave/mockProgram.js +7 -19
- package/dist/scripts/deployAndSave/mockStableToken.d.ts +18 -0
- package/dist/scripts/deployAndSave/mockStableToken.d.ts.map +1 -0
- package/dist/scripts/deployAndSave/mockStableToken.js +36 -0
- package/dist/scripts/deployAndSave/poseidonT3.d.ts +11 -0
- package/dist/scripts/deployAndSave/poseidonT3.d.ts.map +1 -0
- package/dist/scripts/deployAndSave/poseidonT3.js +41 -0
- package/dist/scripts/deployAndSave/slashingManager.d.ts +19 -0
- package/dist/scripts/deployAndSave/slashingManager.d.ts.map +1 -0
- package/dist/scripts/deployAndSave/slashingManager.js +38 -0
- package/dist/scripts/deployEnclave.d.ts.map +1 -1
- package/dist/scripts/deployEnclave.js +109 -23
- package/dist/scripts/deployMocks.d.ts +0 -1
- package/dist/scripts/deployMocks.d.ts.map +1 -1
- package/dist/scripts/deployMocks.js +3 -6
- package/dist/scripts/index.d.ts +7 -2
- package/dist/scripts/index.d.ts.map +1 -1
- package/dist/scripts/index.js +7 -2
- package/dist/scripts/proxy.d.ts +22 -0
- package/dist/scripts/proxy.d.ts.map +1 -0
- package/dist/scripts/proxy.js +36 -0
- package/dist/scripts/runVerification.d.ts +2 -0
- package/dist/scripts/runVerification.d.ts.map +1 -0
- package/dist/scripts/runVerification.js +16 -0
- package/dist/scripts/upgrade/bondingRegistry.d.ts +6 -0
- package/dist/scripts/upgrade/bondingRegistry.d.ts.map +1 -0
- package/dist/scripts/upgrade/bondingRegistry.js +49 -0
- package/dist/scripts/upgrade/ciphernodeRegistryOwnable.d.ts +6 -0
- package/dist/scripts/upgrade/ciphernodeRegistryOwnable.d.ts.map +1 -0
- package/dist/scripts/upgrade/ciphernodeRegistryOwnable.js +52 -0
- package/dist/scripts/upgrade/enclave.d.ts +6 -0
- package/dist/scripts/upgrade/enclave.d.ts.map +1 -0
- package/dist/scripts/upgrade/enclave.js +49 -0
- package/dist/scripts/utils.d.ts +51 -2
- package/dist/scripts/utils.d.ts.map +1 -1
- package/dist/scripts/utils.js +67 -4
- package/dist/scripts/verify.d.ts +6 -0
- package/dist/scripts/verify.d.ts.map +1 -0
- package/dist/scripts/verify.js +142 -0
- package/dist/tasks/ciphernode.d.ts +2 -0
- package/dist/tasks/ciphernode.d.ts.map +1 -1
- package/dist/tasks/ciphernode.js +290 -19
- package/dist/tasks/enclave.d.ts.map +1 -1
- package/dist/tasks/enclave.js +76 -31
- package/dist/test/Enclave.spec.js +377 -370
- package/dist/test/Registry/BondingRegistry.spec.d.ts +2 -0
- package/dist/test/Registry/BondingRegistry.spec.d.ts.map +1 -0
- package/dist/test/Registry/BondingRegistry.spec.js +684 -0
- package/dist/test/Registry/CiphernodeRegistryOwnable.spec.d.ts.map +1 -0
- package/dist/test/Registry/CiphernodeRegistryOwnable.spec.js +374 -0
- package/dist/test/Slashing/SlashingManager.spec.d.ts +2 -0
- package/dist/test/Slashing/SlashingManager.spec.d.ts.map +1 -0
- package/dist/test/Slashing/SlashingManager.spec.js +672 -0
- package/dist/types/@openzeppelin/contracts/index.d.ts +3 -0
- package/dist/types/@openzeppelin/contracts/index.d.ts.map +1 -0
- package/dist/types/@openzeppelin/contracts/proxy/index.d.ts +3 -0
- package/dist/types/@openzeppelin/contracts/proxy/index.d.ts.map +1 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.d.ts +97 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.d.ts.map +1 -0
- package/dist/types/{contracts/registry/NaiveRegistryFilter.js → @openzeppelin/contracts/proxy/transparent/ProxyAdmin.js} +0 -4
- package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.d.ts +81 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.d.ts.map +1 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy.js +12 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.d.ts +52 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.d.ts.map +1 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy.js +8 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.d.ts +3 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.d.ts.map +1 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/index.d.ts +4 -0
- package/dist/types/@openzeppelin/contracts/proxy/transparent/index.d.ts.map +1 -0
- package/dist/types/@openzeppelin/index.d.ts +3 -0
- package/dist/types/@openzeppelin/index.d.ts.map +1 -0
- package/dist/types/contracts/Enclave.d.ts +126 -53
- package/dist/types/contracts/Enclave.d.ts.map +1 -1
- package/dist/types/contracts/Enclave.js +12 -0
- package/dist/types/contracts/index.d.ts +6 -0
- package/dist/types/contracts/index.d.ts.map +1 -1
- package/dist/types/contracts/interfaces/IBondingRegistry.d.ts +622 -0
- package/dist/types/contracts/interfaces/IBondingRegistry.d.ts.map +1 -0
- package/dist/types/contracts/interfaces/IBondingRegistry.js +24 -0
- package/dist/types/contracts/interfaces/ICiphernodeRegistry.d.ts +245 -15
- package/dist/types/contracts/interfaces/ICiphernodeRegistry.d.ts.map +1 -1
- package/dist/types/contracts/interfaces/ICiphernodeRegistry.js +16 -0
- package/dist/types/contracts/interfaces/IE3Program.d.ts +20 -10
- package/dist/types/contracts/interfaces/IE3Program.d.ts.map +1 -1
- package/dist/types/contracts/interfaces/IEnclave.d.ts +149 -20
- package/dist/types/contracts/interfaces/IEnclave.d.ts.map +1 -1
- package/dist/types/contracts/interfaces/IEnclave.js +12 -0
- package/dist/types/contracts/interfaces/{IRegistryFilter.d.ts → ISlashVerifier.d.ts} +16 -16
- package/dist/types/contracts/interfaces/ISlashVerifier.d.ts.map +1 -0
- package/dist/types/contracts/interfaces/ISlashVerifier.js +1 -0
- package/dist/types/contracts/interfaces/ISlashingManager.d.ts +384 -0
- package/dist/types/contracts/interfaces/ISlashingManager.d.ts.map +1 -0
- package/dist/types/contracts/interfaces/ISlashingManager.js +24 -0
- package/dist/types/contracts/interfaces/index.d.ts +3 -2
- package/dist/types/contracts/interfaces/index.d.ts.map +1 -1
- package/dist/types/contracts/lib/ExitQueueLib.d.ts +73 -0
- package/dist/types/contracts/lib/ExitQueueLib.d.ts.map +1 -0
- package/dist/types/contracts/lib/ExitQueueLib.js +12 -0
- package/dist/types/contracts/lib/index.d.ts +2 -0
- package/dist/types/contracts/lib/index.d.ts.map +1 -0
- package/dist/types/contracts/lib/index.js +1 -0
- package/dist/types/contracts/registry/BondingRegistry.d.ts +821 -0
- package/dist/types/contracts/registry/BondingRegistry.d.ts.map +1 -0
- package/dist/types/contracts/registry/BondingRegistry.js +44 -0
- package/dist/types/contracts/registry/CiphernodeRegistryOwnable.d.ts +194 -34
- package/dist/types/contracts/registry/CiphernodeRegistryOwnable.d.ts.map +1 -1
- package/dist/types/contracts/registry/CiphernodeRegistryOwnable.js +20 -0
- package/dist/types/contracts/registry/index.d.ts +1 -1
- package/dist/types/contracts/registry/index.d.ts.map +1 -1
- package/dist/types/contracts/slashing/SlashingManager.d.ts +592 -0
- package/dist/types/contracts/slashing/SlashingManager.d.ts.map +1 -0
- package/dist/types/contracts/slashing/SlashingManager.js +36 -0
- package/dist/types/contracts/slashing/index.d.ts +2 -0
- package/dist/types/contracts/slashing/index.d.ts.map +1 -0
- package/dist/types/contracts/slashing/index.js +1 -0
- package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry.d.ts +247 -17
- package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry.d.ts.map +1 -1
- package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry.js +16 -0
- package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey.d.ts +247 -17
- package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey.d.ts.map +1 -1
- package/dist/types/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey.js +16 -0
- package/dist/types/contracts/test/MockE3Program.d.ts +20 -14
- package/dist/types/contracts/test/MockE3Program.d.ts.map +1 -1
- package/dist/types/contracts/test/{MockInputValidator.d.ts → MockSlashingVerifier.d.ts} +15 -15
- package/dist/types/contracts/test/MockSlashingVerifier.d.ts.map +1 -0
- package/dist/types/contracts/test/MockSlashingVerifier.js +1 -0
- package/dist/types/contracts/test/MockStableToken.sol/MockUSDC.d.ts +227 -0
- package/dist/types/contracts/test/MockStableToken.sol/MockUSDC.d.ts.map +1 -0
- package/dist/types/contracts/test/MockStableToken.sol/MockUSDC.js +12 -0
- package/dist/types/contracts/test/MockStableToken.sol/index.d.ts +2 -0
- package/dist/types/contracts/test/MockStableToken.sol/index.d.ts.map +1 -0
- package/dist/types/contracts/test/MockStableToken.sol/index.js +1 -0
- package/dist/types/contracts/test/index.d.ts +3 -3
- package/dist/types/contracts/test/index.d.ts.map +1 -1
- package/dist/types/contracts/token/EnclaveTicketToken.d.ts +574 -0
- package/dist/types/contracts/token/EnclaveTicketToken.d.ts.map +1 -0
- package/dist/types/contracts/token/EnclaveTicketToken.js +24 -0
- package/dist/types/contracts/token/EnclaveToken.d.ts +775 -0
- package/dist/types/contracts/token/EnclaveToken.d.ts.map +1 -0
- package/dist/types/contracts/token/EnclaveToken.js +48 -0
- package/dist/types/contracts/token/index.d.ts +3 -0
- package/dist/types/contracts/token/index.d.ts.map +1 -0
- package/dist/types/contracts/token/index.js +1 -0
- package/dist/types/factories/@openzeppelin/contracts/index.d.ts +2 -0
- package/dist/types/factories/@openzeppelin/contracts/index.d.ts.map +1 -0
- package/dist/types/factories/@openzeppelin/contracts/index.js +4 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/index.d.ts +2 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/index.d.ts.map +1 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/index.js +4 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/ProxyAdmin__factory.d.ts +118 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/ProxyAdmin__factory.d.ts.map +1 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/ProxyAdmin__factory.js +157 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy__factory.d.ts +57 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy__factory.d.ts.map +1 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/ITransparentUpgradeableProxy__factory.js +78 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy__factory.d.ts +105 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy__factory.d.ts.map +1 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/TransparentUpgradeableProxy__factory.js +141 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.d.ts +3 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.d.ts.map +1 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.js +5 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/index.d.ts +3 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/index.d.ts.map +1 -0
- package/dist/types/factories/@openzeppelin/contracts/proxy/transparent/index.js +5 -0
- package/dist/types/factories/@openzeppelin/index.d.ts +2 -0
- package/dist/types/factories/@openzeppelin/index.d.ts.map +1 -0
- package/dist/types/factories/@openzeppelin/index.js +4 -0
- package/dist/types/factories/contracts/Enclave__factory.d.ts +190 -104
- package/dist/types/factories/contracts/Enclave__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/Enclave__factory.js +241 -134
- package/dist/types/factories/contracts/index.d.ts +3 -0
- package/dist/types/factories/contracts/index.d.ts.map +1 -1
- package/dist/types/factories/contracts/index.js +3 -0
- package/dist/types/factories/contracts/interfaces/IBondingRegistry__factory.d.ts +678 -0
- package/dist/types/factories/contracts/interfaces/IBondingRegistry__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/interfaces/IBondingRegistry__factory.js +882 -0
- package/dist/types/factories/contracts/interfaces/ICiphernodeRegistry__factory.d.ts +253 -9
- package/dist/types/factories/contracts/interfaces/ICiphernodeRegistry__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/interfaces/ICiphernodeRegistry__factory.js +325 -9
- package/dist/types/factories/contracts/interfaces/IE3Program__factory.d.ts +16 -2
- package/dist/types/factories/contracts/interfaces/IE3Program__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/interfaces/IE3Program__factory.js +20 -2
- package/dist/types/factories/contracts/interfaces/IEnclave__factory.d.ts +190 -24
- package/dist/types/factories/contracts/interfaces/IEnclave__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/interfaces/IEnclave__factory.js +246 -26
- package/dist/types/factories/contracts/interfaces/ISlashVerifier__factory.d.ts +26 -0
- package/dist/types/factories/contracts/interfaces/ISlashVerifier__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/interfaces/{IRegistryFilter__factory.js → ISlashVerifier__factory.js} +7 -7
- package/dist/types/factories/contracts/interfaces/ISlashingManager__factory.d.ts +594 -0
- package/dist/types/factories/contracts/interfaces/ISlashingManager__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/interfaces/ISlashingManager__factory.js +760 -0
- package/dist/types/factories/contracts/interfaces/index.d.ts +3 -2
- package/dist/types/factories/contracts/interfaces/index.d.ts.map +1 -1
- package/dist/types/factories/contracts/interfaces/index.js +3 -2
- package/dist/types/factories/contracts/lib/ExitQueueLib__factory.d.ts +107 -0
- package/dist/types/factories/contracts/lib/ExitQueueLib__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/lib/ExitQueueLib__factory.js +138 -0
- package/dist/types/factories/contracts/lib/index.d.ts +2 -0
- package/dist/types/factories/contracts/lib/index.d.ts.map +1 -0
- package/dist/types/factories/contracts/lib/index.js +4 -0
- package/dist/types/factories/contracts/registry/BondingRegistry__factory.d.ts +958 -0
- package/dist/types/factories/contracts/registry/BondingRegistry__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/registry/BondingRegistry__factory.js +1239 -0
- package/dist/types/factories/contracts/registry/CiphernodeRegistryOwnable__factory.d.ts +272 -40
- package/dist/types/factories/contracts/registry/CiphernodeRegistryOwnable__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/registry/CiphernodeRegistryOwnable__factory.js +343 -49
- package/dist/types/factories/contracts/registry/index.d.ts +1 -1
- package/dist/types/factories/contracts/registry/index.d.ts.map +1 -1
- package/dist/types/factories/contracts/registry/index.js +1 -1
- package/dist/types/factories/contracts/slashing/SlashingManager__factory.d.ts +879 -0
- package/dist/types/factories/contracts/slashing/SlashingManager__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/slashing/SlashingManager__factory.js +1129 -0
- package/dist/types/factories/contracts/slashing/index.d.ts +2 -0
- package/dist/types/factories/contracts/slashing/index.d.ts.map +1 -0
- package/dist/types/factories/contracts/slashing/index.js +4 -0
- package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey__factory.d.ts +254 -10
- package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistryEmptyKey__factory.js +326 -10
- package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry__factory.d.ts +254 -10
- package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/test/MockCiphernodeRegistry.sol/MockCiphernodeRegistry__factory.js +326 -10
- package/dist/types/factories/contracts/test/MockComputeProvider__factory.d.ts +2 -2
- package/dist/types/factories/contracts/test/MockComputeProvider__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/test/MockComputeProvider__factory.js +2 -2
- package/dist/types/factories/contracts/test/MockDecryptionVerifier__factory.d.ts +1 -1
- package/dist/types/factories/contracts/test/MockDecryptionVerifier__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/test/MockDecryptionVerifier__factory.js +1 -1
- package/dist/types/factories/contracts/test/MockE3Program__factory.d.ts +23 -27
- package/dist/types/factories/contracts/test/MockE3Program__factory.d.ts.map +1 -1
- package/dist/types/factories/contracts/test/MockE3Program__factory.js +28 -34
- package/dist/types/factories/contracts/test/MockSlashingVerifier__factory.d.ts +43 -0
- package/dist/types/factories/contracts/test/MockSlashingVerifier__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/test/MockSlashingVerifier__factory.js +60 -0
- package/dist/types/factories/contracts/test/MockStableToken.sol/MockUSDC__factory.d.ts +338 -0
- package/dist/types/factories/contracts/test/MockStableToken.sol/MockUSDC__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/test/MockStableToken.sol/MockUSDC__factory.js +447 -0
- package/dist/types/factories/contracts/test/MockStableToken.sol/index.d.ts +2 -0
- package/dist/types/factories/contracts/test/MockStableToken.sol/index.d.ts.map +1 -0
- package/dist/types/factories/contracts/test/MockStableToken.sol/index.js +4 -0
- package/dist/types/factories/contracts/test/index.d.ts +2 -2
- package/dist/types/factories/contracts/test/index.d.ts.map +1 -1
- package/dist/types/factories/contracts/test/index.js +2 -2
- package/dist/types/factories/contracts/token/EnclaveTicketToken__factory.d.ts +894 -0
- package/dist/types/factories/contracts/token/EnclaveTicketToken__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/token/EnclaveTicketToken__factory.js +1175 -0
- package/dist/types/factories/contracts/token/EnclaveToken__factory.d.ts +1101 -0
- package/dist/types/factories/contracts/token/EnclaveToken__factory.d.ts.map +1 -0
- package/dist/types/factories/contracts/token/EnclaveToken__factory.js +1439 -0
- package/dist/types/factories/contracts/token/index.d.ts +3 -0
- package/dist/types/factories/contracts/token/index.d.ts.map +1 -0
- package/dist/types/factories/contracts/token/index.js +5 -0
- package/dist/types/factories/index.d.ts +1 -0
- package/dist/types/factories/index.d.ts.map +1 -1
- package/dist/types/factories/index.js +1 -0
- package/dist/types/factories/poseidon-solidity/PoseidonT3__factory.d.ts +1 -1
- package/dist/types/factories/poseidon-solidity/PoseidonT3__factory.d.ts.map +1 -1
- package/dist/types/factories/poseidon-solidity/PoseidonT3__factory.js +1 -1
- package/dist/types/index.d.ts +28 -12
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +13 -6
- package/package.json +30 -21
- package/LICENSE.md +0 -165
- package/artifacts/build-info/solc-0_8_27-9aea5e3f6e25811e781e96c22e8edaf1eb1a01c5.json +0 -130
- package/artifacts/build-info/solc-0_8_27-9aea5e3f6e25811e781e96c22e8edaf1eb1a01c5.output.json +0 -1
- package/artifacts/contracts/interfaces/IInputValidator.sol/IInputValidator.json +0 -38
- package/artifacts/contracts/interfaces/IInputValidator.sol/artifacts.d.ts +0 -27
- package/artifacts/contracts/interfaces/IRegistryFilter.sol/artifacts.d.ts +0 -27
- package/artifacts/contracts/registry/NaiveRegistryFilter.sol/NaiveRegistryFilter.json +0 -309
- package/artifacts/contracts/registry/NaiveRegistryFilter.sol/artifacts.d.ts +0 -27
- package/artifacts/contracts/test/MockInputValidator.sol/MockInputValidator.json +0 -43
- package/artifacts/contracts/test/MockInputValidator.sol/artifacts.d.ts +0 -27
- package/artifacts/contracts/test/MockRegistryFilter.sol/IRegistry.json +0 -37
- package/artifacts/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter.json +0 -262
- package/artifacts/contracts/test/MockRegistryFilter.sol/artifacts.d.ts +0 -43
- package/contracts/interfaces/IInputValidator.sol +0 -18
- package/contracts/interfaces/IRegistryFilter.sol +0 -13
- package/contracts/registry/NaiveRegistryFilter.sol +0 -124
- package/contracts/test/MockInputValidator.sol +0 -29
- package/contracts/test/MockRegistryFilter.sol +0 -117
- package/dist/ignition/modules/mockInputValidator.d.ts.map +0 -1
- package/dist/ignition/modules/naiveRegistryFilter.d.ts.map +0 -1
- package/dist/ignition/modules/naiveRegistryFilter.js +0 -16
- package/dist/scripts/deployAndSave/mockInputValidator.d.ts +0 -6
- package/dist/scripts/deployAndSave/mockInputValidator.d.ts.map +0 -1
- package/dist/scripts/deployAndSave/mockInputValidator.js +0 -18
- package/dist/scripts/deployAndSave/naiveRegistryFilter.d.ts +0 -11
- package/dist/scripts/deployAndSave/naiveRegistryFilter.d.ts.map +0 -1
- package/dist/scripts/deployAndSave/naiveRegistryFilter.js +0 -41
- package/dist/test/CiphernodeRegistry/CiphernodeRegistryOwnable.spec.d.ts.map +0 -1
- package/dist/test/CiphernodeRegistry/CiphernodeRegistryOwnable.spec.js +0 -279
- package/dist/test/CiphernodeRegistry/NaiveRegistryFilter.spec.d.ts +0 -2
- package/dist/test/CiphernodeRegistry/NaiveRegistryFilter.spec.d.ts.map +0 -1
- package/dist/test/CiphernodeRegistry/NaiveRegistryFilter.spec.js +0 -160
- package/dist/types/contracts/interfaces/IInputValidator.d.ts +0 -36
- package/dist/types/contracts/interfaces/IInputValidator.d.ts.map +0 -1
- package/dist/types/contracts/interfaces/IRegistryFilter.d.ts.map +0 -1
- package/dist/types/contracts/registry/NaiveRegistryFilter.d.ts +0 -187
- package/dist/types/contracts/registry/NaiveRegistryFilter.d.ts.map +0 -1
- package/dist/types/contracts/test/MockInputValidator.d.ts.map +0 -1
- package/dist/types/contracts/test/MockRegistryFilter.sol/IRegistry.d.ts +0 -38
- package/dist/types/contracts/test/MockRegistryFilter.sol/IRegistry.d.ts.map +0 -1
- package/dist/types/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter.d.ts +0 -163
- package/dist/types/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter.d.ts.map +0 -1
- package/dist/types/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter.js +0 -8
- package/dist/types/contracts/test/MockRegistryFilter.sol/index.d.ts +0 -3
- package/dist/types/contracts/test/MockRegistryFilter.sol/index.d.ts.map +0 -1
- package/dist/types/factories/contracts/interfaces/IInputValidator__factory.d.ts +0 -26
- package/dist/types/factories/contracts/interfaces/IInputValidator__factory.d.ts.map +0 -1
- package/dist/types/factories/contracts/interfaces/IInputValidator__factory.js +0 -39
- package/dist/types/factories/contracts/interfaces/IRegistryFilter__factory.d.ts +0 -26
- package/dist/types/factories/contracts/interfaces/IRegistryFilter__factory.d.ts.map +0 -1
- package/dist/types/factories/contracts/registry/NaiveRegistryFilter__factory.d.ts +0 -251
- package/dist/types/factories/contracts/registry/NaiveRegistryFilter__factory.d.ts.map +0 -1
- package/dist/types/factories/contracts/registry/NaiveRegistryFilter__factory.js +0 -331
- package/dist/types/factories/contracts/test/MockInputValidator__factory.d.ts +0 -47
- package/dist/types/factories/contracts/test/MockInputValidator__factory.d.ts.map +0 -1
- package/dist/types/factories/contracts/test/MockInputValidator__factory.js +0 -65
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/IRegistry__factory.d.ts +0 -26
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/IRegistry__factory.d.ts.map +0 -1
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/IRegistry__factory.js +0 -38
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter__factory.d.ts +0 -216
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter__factory.d.ts.map +0 -1
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/MockNaiveRegistryFilter__factory.js +0 -284
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/index.d.ts +0 -3
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/index.d.ts.map +0 -1
- package/dist/types/factories/contracts/test/MockRegistryFilter.sol/index.js +0 -5
- /package/dist/test/{CiphernodeRegistry → Registry}/CiphernodeRegistryOwnable.spec.d.ts +0 -0
- /package/dist/types/{contracts/test/MockRegistryFilter.sol → @openzeppelin/contracts}/index.js +0 -0
- /package/dist/types/{contracts/interfaces/IInputValidator.js → @openzeppelin/contracts/proxy/index.js} +0 -0
- /package/dist/types/{contracts/interfaces/IRegistryFilter.js → @openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol/index.js} +0 -0
- /package/dist/types/{contracts/test/MockInputValidator.js → @openzeppelin/contracts/proxy/transparent/index.js} +0 -0
- /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
|
+
});
|