@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,672 @@
|
|
|
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 { expect } from "chai";
|
|
7
|
+
import { network } from "hardhat";
|
|
8
|
+
import BondingRegistryModule from "../../ignition/modules/bondingRegistry";
|
|
9
|
+
import EnclaveTicketTokenModule from "../../ignition/modules/enclaveTicketToken";
|
|
10
|
+
import EnclaveTokenModule from "../../ignition/modules/enclaveToken";
|
|
11
|
+
import MockSlashingVerifierModule from "../../ignition/modules/mockSlashingVerifier";
|
|
12
|
+
import MockStableTokenModule from "../../ignition/modules/mockStableToken";
|
|
13
|
+
import SlashingManagerModule from "../../ignition/modules/slashingManager";
|
|
14
|
+
import { BondingRegistry__factory as BondingRegistryFactory, EnclaveTicketToken__factory as EnclaveTicketTokenFactory, EnclaveToken__factory as EnclaveTokenFactory, MockSlashingVerifier__factory as MockSlashingVerifierFactory, MockUSDC__factory as MockUSDCFactory, SlashingManager__factory as SlashingManagerFactory, } from "../../types";
|
|
15
|
+
const { ethers, networkHelpers, ignition } = await network.connect();
|
|
16
|
+
const { loadFixture, time } = networkHelpers;
|
|
17
|
+
describe("SlashingManager", function () {
|
|
18
|
+
const REASON_MISBEHAVIOR = ethers.encodeBytes32String("misbehavior");
|
|
19
|
+
const REASON_INACTIVITY = ethers.encodeBytes32String("inactivity");
|
|
20
|
+
const REASON_DOUBLE_SIGN = ethers.encodeBytes32String("doubleSign");
|
|
21
|
+
const SLASHER_ROLE = ethers.keccak256(ethers.toUtf8Bytes("SLASHER_ROLE"));
|
|
22
|
+
const VERIFIER_ROLE = ethers.keccak256(ethers.toUtf8Bytes("VERIFIER_ROLE"));
|
|
23
|
+
const GOVERNANCE_ROLE = ethers.keccak256(ethers.toUtf8Bytes("GOVERNANCE_ROLE"));
|
|
24
|
+
const DEFAULT_ADMIN_ROLE = ethers.ZeroHash;
|
|
25
|
+
const APPEAL_WINDOW = 7 * 24 * 60 * 60;
|
|
26
|
+
async function setupPolicies(slashingManager, mockVerifier) {
|
|
27
|
+
const proofPolicy = {
|
|
28
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
29
|
+
licensePenalty: ethers.parseEther("100"),
|
|
30
|
+
requiresProof: true,
|
|
31
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
32
|
+
banNode: false,
|
|
33
|
+
appealWindow: 0,
|
|
34
|
+
enabled: true,
|
|
35
|
+
};
|
|
36
|
+
const evidencePolicy = {
|
|
37
|
+
ticketPenalty: ethers.parseUnits("20", 6),
|
|
38
|
+
licensePenalty: ethers.parseEther("50"),
|
|
39
|
+
requiresProof: false,
|
|
40
|
+
proofVerifier: ethers.ZeroAddress,
|
|
41
|
+
banNode: false,
|
|
42
|
+
appealWindow: APPEAL_WINDOW,
|
|
43
|
+
enabled: true,
|
|
44
|
+
};
|
|
45
|
+
const banPolicy = {
|
|
46
|
+
ticketPenalty: ethers.parseUnits("100", 6),
|
|
47
|
+
licensePenalty: ethers.parseEther("500"),
|
|
48
|
+
requiresProof: true,
|
|
49
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
50
|
+
banNode: true,
|
|
51
|
+
appealWindow: 0,
|
|
52
|
+
enabled: true,
|
|
53
|
+
};
|
|
54
|
+
await slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, proofPolicy);
|
|
55
|
+
await slashingManager.setSlashPolicy(REASON_INACTIVITY, evidencePolicy);
|
|
56
|
+
await slashingManager.setSlashPolicy(REASON_DOUBLE_SIGN, banPolicy);
|
|
57
|
+
}
|
|
58
|
+
async function setup() {
|
|
59
|
+
const [owner, slasher, verifier, operator, notTheOwner] = await ethers.getSigners();
|
|
60
|
+
const ownerAddress = await owner.getAddress();
|
|
61
|
+
const operatorAddress = await operator.getAddress();
|
|
62
|
+
const usdcContract = await ignition.deploy(MockStableTokenModule, {
|
|
63
|
+
parameters: {
|
|
64
|
+
MockUSDC: {
|
|
65
|
+
initialSupply: 1000000,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const enclTokenContract = await ignition.deploy(EnclaveTokenModule, {
|
|
70
|
+
parameters: {
|
|
71
|
+
EnclaveToken: {
|
|
72
|
+
owner: ownerAddress,
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
const ticketTokenContract = await ignition.deploy(EnclaveTicketTokenModule, {
|
|
77
|
+
parameters: {
|
|
78
|
+
EnclaveTicketToken: {
|
|
79
|
+
baseToken: await usdcContract.mockUSDC.getAddress(),
|
|
80
|
+
registry: ownerAddress,
|
|
81
|
+
owner: ownerAddress,
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
const mockVerifierContract = await ignition.deploy(MockSlashingVerifierModule);
|
|
86
|
+
const slashingManagerContract = await ignition.deploy(SlashingManagerModule, {
|
|
87
|
+
parameters: {
|
|
88
|
+
SlashingManager: {
|
|
89
|
+
admin: ownerAddress,
|
|
90
|
+
bondingRegistry: ownerAddress,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
const bondingRegistryContract = await ignition.deploy(BondingRegistryModule, {
|
|
95
|
+
parameters: {
|
|
96
|
+
BondingRegistry: {
|
|
97
|
+
owner: ownerAddress,
|
|
98
|
+
ticketToken: await ticketTokenContract.enclaveTicketToken.getAddress(),
|
|
99
|
+
licenseToken: await enclTokenContract.enclaveToken.getAddress(),
|
|
100
|
+
registry: ethers.ZeroAddress,
|
|
101
|
+
slashedFundsTreasury: ownerAddress,
|
|
102
|
+
ticketPrice: ethers.parseUnits("10", 6),
|
|
103
|
+
licenseRequiredBond: ethers.parseEther("1000"),
|
|
104
|
+
minTicketBalance: 5,
|
|
105
|
+
exitDelay: APPEAL_WINDOW,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
const usdcToken = MockUSDCFactory.connect(await usdcContract.mockUSDC.getAddress(), owner);
|
|
110
|
+
const enclaveToken = EnclaveTokenFactory.connect(await enclTokenContract.enclaveToken.getAddress(), owner);
|
|
111
|
+
const ticketToken = EnclaveTicketTokenFactory.connect(await ticketTokenContract.enclaveTicketToken.getAddress(), owner);
|
|
112
|
+
const mockVerifier = MockSlashingVerifierFactory.connect(await mockVerifierContract.mockSlashingVerifier.getAddress(), owner);
|
|
113
|
+
const slashingManager = SlashingManagerFactory.connect(await slashingManagerContract.slashingManager.getAddress(), owner);
|
|
114
|
+
const bondingRegistry = BondingRegistryFactory.connect(await bondingRegistryContract.bondingRegistry.getAddress(), owner);
|
|
115
|
+
await ticketToken.setRegistry(await bondingRegistry.getAddress());
|
|
116
|
+
await slashingManager.setBondingRegistry(await bondingRegistry.getAddress());
|
|
117
|
+
await bondingRegistry.setSlashingManager(await slashingManager.getAddress());
|
|
118
|
+
await enclaveToken.setTransferRestriction(false);
|
|
119
|
+
await enclaveToken.mintAllocation(operatorAddress, ethers.parseEther("2000"), "Test allocation");
|
|
120
|
+
await slashingManager.addSlasher(await slasher.getAddress());
|
|
121
|
+
await slashingManager.addVerifier(await verifier.getAddress());
|
|
122
|
+
return {
|
|
123
|
+
owner,
|
|
124
|
+
slasher,
|
|
125
|
+
verifier,
|
|
126
|
+
operator,
|
|
127
|
+
operatorAddress,
|
|
128
|
+
notTheOwner,
|
|
129
|
+
slashingManager,
|
|
130
|
+
bondingRegistry,
|
|
131
|
+
enclaveToken,
|
|
132
|
+
ticketToken,
|
|
133
|
+
usdcToken,
|
|
134
|
+
mockVerifier,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
describe("constructor / initialization", function () {
|
|
138
|
+
it("should set the admin role correctly", async function () {
|
|
139
|
+
const { slashingManager, owner } = await loadFixture(setup);
|
|
140
|
+
expect(await slashingManager.hasRole(DEFAULT_ADMIN_ROLE, await owner.getAddress())).to.be.true;
|
|
141
|
+
expect(await slashingManager.hasRole(GOVERNANCE_ROLE, await owner.getAddress())).to.be.true;
|
|
142
|
+
});
|
|
143
|
+
it("should set the bonding registry correctly", async function () {
|
|
144
|
+
const { slashingManager, bondingRegistry } = await loadFixture(setup);
|
|
145
|
+
expect(await slashingManager.bondingRegistry()).to.equal(await bondingRegistry.getAddress());
|
|
146
|
+
});
|
|
147
|
+
it("should revert if admin is zero address", async function () {
|
|
148
|
+
await expect(ignition.deploy(SlashingManagerModule, {
|
|
149
|
+
parameters: {
|
|
150
|
+
SlashingManager: {
|
|
151
|
+
admin: ethers.ZeroAddress,
|
|
152
|
+
bondingRegistry: ethers.ZeroAddress,
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
})).to.be.rejected;
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("setSlashPolicy()", function () {
|
|
159
|
+
it("should set a valid slash policy", async function () {
|
|
160
|
+
const { slashingManager, mockVerifier } = await loadFixture(setup);
|
|
161
|
+
const policy = {
|
|
162
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
163
|
+
licensePenalty: ethers.parseEther("100"),
|
|
164
|
+
requiresProof: true,
|
|
165
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
166
|
+
banNode: false,
|
|
167
|
+
appealWindow: 0,
|
|
168
|
+
enabled: true,
|
|
169
|
+
};
|
|
170
|
+
await expect(slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, policy))
|
|
171
|
+
.to.emit(slashingManager, "SlashPolicyUpdated")
|
|
172
|
+
.withArgs(REASON_MISBEHAVIOR, Object.values(policy));
|
|
173
|
+
const storedPolicy = await slashingManager.getSlashPolicy(REASON_MISBEHAVIOR);
|
|
174
|
+
expect(storedPolicy.ticketPenalty).to.equal(policy.ticketPenalty);
|
|
175
|
+
expect(storedPolicy.licensePenalty).to.equal(policy.licensePenalty);
|
|
176
|
+
expect(storedPolicy.requiresProof).to.equal(policy.requiresProof);
|
|
177
|
+
expect(storedPolicy.enabled).to.equal(policy.enabled);
|
|
178
|
+
});
|
|
179
|
+
it("should set a policy without proof requirement", async function () {
|
|
180
|
+
const { slashingManager } = await loadFixture(setup);
|
|
181
|
+
const policy = {
|
|
182
|
+
ticketPenalty: ethers.parseUnits("20", 6),
|
|
183
|
+
licensePenalty: ethers.parseEther("50"),
|
|
184
|
+
requiresProof: false,
|
|
185
|
+
proofVerifier: ethers.ZeroAddress,
|
|
186
|
+
banNode: false,
|
|
187
|
+
appealWindow: APPEAL_WINDOW,
|
|
188
|
+
enabled: true,
|
|
189
|
+
};
|
|
190
|
+
await expect(slashingManager.setSlashPolicy(REASON_INACTIVITY, policy))
|
|
191
|
+
.to.emit(slashingManager, "SlashPolicyUpdated")
|
|
192
|
+
.withArgs(REASON_INACTIVITY, Object.values(policy));
|
|
193
|
+
});
|
|
194
|
+
it("should revert if caller is not governance", async function () {
|
|
195
|
+
const { slashingManager, notTheOwner } = await loadFixture(setup);
|
|
196
|
+
const policy = {
|
|
197
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
198
|
+
licensePenalty: ethers.parseEther("100"),
|
|
199
|
+
requiresProof: false,
|
|
200
|
+
proofVerifier: ethers.ZeroAddress,
|
|
201
|
+
banNode: false,
|
|
202
|
+
appealWindow: APPEAL_WINDOW,
|
|
203
|
+
enabled: true,
|
|
204
|
+
};
|
|
205
|
+
await expect(slashingManager
|
|
206
|
+
.connect(notTheOwner)
|
|
207
|
+
.setSlashPolicy(REASON_MISBEHAVIOR, policy)).to.be.revertedWithCustomError(slashingManager, "AccessControlUnauthorizedAccount");
|
|
208
|
+
});
|
|
209
|
+
it("should revert if reason is zero", async function () {
|
|
210
|
+
const { slashingManager } = await loadFixture(setup);
|
|
211
|
+
const policy = {
|
|
212
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
213
|
+
licensePenalty: ethers.parseEther("100"),
|
|
214
|
+
requiresProof: false,
|
|
215
|
+
proofVerifier: ethers.ZeroAddress,
|
|
216
|
+
banNode: false,
|
|
217
|
+
appealWindow: APPEAL_WINDOW,
|
|
218
|
+
enabled: true,
|
|
219
|
+
};
|
|
220
|
+
await expect(slashingManager.setSlashPolicy(ethers.ZeroHash, policy)).to.be.revertedWithCustomError(slashingManager, "InvalidPolicy");
|
|
221
|
+
});
|
|
222
|
+
it("should revert if policy is disabled", async function () {
|
|
223
|
+
const { slashingManager } = await loadFixture(setup);
|
|
224
|
+
const policy = {
|
|
225
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
226
|
+
licensePenalty: ethers.parseEther("100"),
|
|
227
|
+
requiresProof: false,
|
|
228
|
+
proofVerifier: ethers.ZeroAddress,
|
|
229
|
+
banNode: false,
|
|
230
|
+
appealWindow: APPEAL_WINDOW,
|
|
231
|
+
enabled: false,
|
|
232
|
+
};
|
|
233
|
+
await expect(slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, policy)).to.be.revertedWithCustomError(slashingManager, "InvalidPolicy");
|
|
234
|
+
});
|
|
235
|
+
it("should revert if no penalties are set", async function () {
|
|
236
|
+
const { slashingManager } = await loadFixture(setup);
|
|
237
|
+
const policy = {
|
|
238
|
+
ticketPenalty: 0,
|
|
239
|
+
licensePenalty: 0,
|
|
240
|
+
requiresProof: false,
|
|
241
|
+
proofVerifier: ethers.ZeroAddress,
|
|
242
|
+
banNode: false,
|
|
243
|
+
appealWindow: APPEAL_WINDOW,
|
|
244
|
+
enabled: true,
|
|
245
|
+
};
|
|
246
|
+
await expect(slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, policy)).to.be.revertedWithCustomError(slashingManager, "InvalidPolicy");
|
|
247
|
+
});
|
|
248
|
+
it("should revert if proof required but no verifier set", async function () {
|
|
249
|
+
const { slashingManager } = await loadFixture(setup);
|
|
250
|
+
const policy = {
|
|
251
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
252
|
+
licensePenalty: ethers.parseEther("100"),
|
|
253
|
+
requiresProof: true,
|
|
254
|
+
proofVerifier: ethers.ZeroAddress,
|
|
255
|
+
banNode: false,
|
|
256
|
+
appealWindow: 0,
|
|
257
|
+
enabled: true,
|
|
258
|
+
};
|
|
259
|
+
await expect(slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, policy)).to.be.revertedWithCustomError(slashingManager, "VerifierNotSet");
|
|
260
|
+
});
|
|
261
|
+
it("should revert if proof required but appeal window set", async function () {
|
|
262
|
+
const { slashingManager, mockVerifier } = await loadFixture(setup);
|
|
263
|
+
const policy = {
|
|
264
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
265
|
+
licensePenalty: ethers.parseEther("100"),
|
|
266
|
+
requiresProof: true,
|
|
267
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
268
|
+
banNode: false,
|
|
269
|
+
appealWindow: APPEAL_WINDOW,
|
|
270
|
+
enabled: true,
|
|
271
|
+
};
|
|
272
|
+
await expect(slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, policy)).to.be.revertedWithCustomError(slashingManager, "InvalidPolicy");
|
|
273
|
+
});
|
|
274
|
+
it("should revert if no proof required but no appeal window", async function () {
|
|
275
|
+
const { slashingManager } = await loadFixture(setup);
|
|
276
|
+
const policy = {
|
|
277
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
278
|
+
licensePenalty: ethers.parseEther("100"),
|
|
279
|
+
requiresProof: false,
|
|
280
|
+
proofVerifier: ethers.ZeroAddress,
|
|
281
|
+
banNode: false,
|
|
282
|
+
appealWindow: 0,
|
|
283
|
+
enabled: true,
|
|
284
|
+
};
|
|
285
|
+
await expect(slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, policy)).to.be.revertedWithCustomError(slashingManager, "InvalidPolicy");
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
describe("role management", function () {
|
|
289
|
+
it("should add and remove slasher role", async function () {
|
|
290
|
+
const { slashingManager, notTheOwner } = await loadFixture(setup);
|
|
291
|
+
await slashingManager.addSlasher(await notTheOwner.getAddress());
|
|
292
|
+
expect(await slashingManager.hasRole(SLASHER_ROLE, await notTheOwner.getAddress())).to.be.true;
|
|
293
|
+
await slashingManager.removeSlasher(await notTheOwner.getAddress());
|
|
294
|
+
expect(await slashingManager.hasRole(SLASHER_ROLE, await notTheOwner.getAddress())).to.be.false;
|
|
295
|
+
});
|
|
296
|
+
it("should add and remove verifier role", async function () {
|
|
297
|
+
const { slashingManager, notTheOwner } = await loadFixture(setup);
|
|
298
|
+
await slashingManager.addVerifier(await notTheOwner.getAddress());
|
|
299
|
+
expect(await slashingManager.hasRole(VERIFIER_ROLE, await notTheOwner.getAddress())).to.be.true;
|
|
300
|
+
await slashingManager.removeVerifier(await notTheOwner.getAddress());
|
|
301
|
+
expect(await slashingManager.hasRole(VERIFIER_ROLE, await notTheOwner.getAddress())).to.be.false;
|
|
302
|
+
});
|
|
303
|
+
it("should revert if non-admin tries to add slasher", async function () {
|
|
304
|
+
const { slashingManager, notTheOwner } = await loadFixture(setup);
|
|
305
|
+
await expect(slashingManager
|
|
306
|
+
.connect(notTheOwner)
|
|
307
|
+
.addSlasher(await notTheOwner.getAddress())).to.be.revert(ethers);
|
|
308
|
+
});
|
|
309
|
+
it("should revert if zero address is added as slasher", async function () {
|
|
310
|
+
const { slashingManager } = await loadFixture(setup);
|
|
311
|
+
await expect(slashingManager.addSlasher(ethers.ZeroAddress)).to.be.revertedWithCustomError(slashingManager, "ZeroAddress");
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
describe("proposeSlash()", function () {
|
|
315
|
+
it("should propose slash with proof", async function () {
|
|
316
|
+
const { slashingManager, slasher, operatorAddress, mockVerifier } = await loadFixture(setup);
|
|
317
|
+
const proofPolicy = {
|
|
318
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
319
|
+
licensePenalty: ethers.parseEther("100"),
|
|
320
|
+
requiresProof: true,
|
|
321
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
322
|
+
banNode: false,
|
|
323
|
+
appealWindow: 0,
|
|
324
|
+
enabled: true,
|
|
325
|
+
};
|
|
326
|
+
await slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, proofPolicy);
|
|
327
|
+
const proof = ethers.toUtf8Bytes("Valid proof data");
|
|
328
|
+
const currentTime = await time.latest();
|
|
329
|
+
await expect(slashingManager
|
|
330
|
+
.connect(slasher)
|
|
331
|
+
.proposeSlash(operatorAddress, REASON_MISBEHAVIOR, proof))
|
|
332
|
+
.to.emit(slashingManager, "SlashProposed")
|
|
333
|
+
.withArgs(0, operatorAddress, REASON_MISBEHAVIOR, ethers.parseUnits("50", 6), ethers.parseEther("100"), currentTime + 1, await slasher.getAddress());
|
|
334
|
+
const proposal = await slashingManager.getSlashProposal(0);
|
|
335
|
+
expect(proposal.operator).to.equal(operatorAddress);
|
|
336
|
+
expect(proposal.reason).to.equal(REASON_MISBEHAVIOR);
|
|
337
|
+
expect(proposal.proofVerified).to.be.true;
|
|
338
|
+
expect(proposal.proposer).to.equal(await slasher.getAddress());
|
|
339
|
+
});
|
|
340
|
+
it("should propose slash without proof (evidence-based)", async function () {
|
|
341
|
+
const { slashingManager, slasher, operatorAddress } = await loadFixture(setup);
|
|
342
|
+
const evidencePolicy = {
|
|
343
|
+
ticketPenalty: ethers.parseUnits("20", 6),
|
|
344
|
+
licensePenalty: ethers.parseEther("50"),
|
|
345
|
+
requiresProof: false,
|
|
346
|
+
proofVerifier: ethers.ZeroAddress,
|
|
347
|
+
banNode: false,
|
|
348
|
+
appealWindow: APPEAL_WINDOW,
|
|
349
|
+
enabled: true,
|
|
350
|
+
};
|
|
351
|
+
await slashingManager.setSlashPolicy(REASON_INACTIVITY, evidencePolicy);
|
|
352
|
+
const proof = ethers.toUtf8Bytes("");
|
|
353
|
+
const currentTime = await time.latest();
|
|
354
|
+
await expect(slashingManager
|
|
355
|
+
.connect(slasher)
|
|
356
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, proof))
|
|
357
|
+
.to.emit(slashingManager, "SlashProposed")
|
|
358
|
+
.withArgs(0, operatorAddress, REASON_INACTIVITY, ethers.parseUnits("20", 6), ethers.parseEther("50"), currentTime + APPEAL_WINDOW + 1, await slasher.getAddress());
|
|
359
|
+
const proposal = await slashingManager.getSlashProposal(0);
|
|
360
|
+
expect(proposal.proofVerified).to.be.false;
|
|
361
|
+
expect(proposal.executableAt).to.be.greaterThan(currentTime + APPEAL_WINDOW);
|
|
362
|
+
});
|
|
363
|
+
it("should revert if caller is not slasher", async function () {
|
|
364
|
+
const { slashingManager, notTheOwner, operatorAddress } = await loadFixture(setup);
|
|
365
|
+
const proof = ethers.toUtf8Bytes("Some proof");
|
|
366
|
+
await expect(slashingManager
|
|
367
|
+
.connect(notTheOwner)
|
|
368
|
+
.proposeSlash(operatorAddress, REASON_MISBEHAVIOR, proof)).to.be.revertedWithCustomError(slashingManager, "Unauthorized");
|
|
369
|
+
});
|
|
370
|
+
it("should revert if operator is zero address", async function () {
|
|
371
|
+
const { slashingManager, slasher } = await loadFixture(setup);
|
|
372
|
+
const proof = ethers.toUtf8Bytes("Some proof");
|
|
373
|
+
await expect(slashingManager
|
|
374
|
+
.connect(slasher)
|
|
375
|
+
.proposeSlash(ethers.ZeroAddress, REASON_MISBEHAVIOR, proof)).to.be.revertedWithCustomError(slashingManager, "ZeroAddress");
|
|
376
|
+
});
|
|
377
|
+
it("should revert if slash reason is disabled", async function () {
|
|
378
|
+
const { slashingManager, slasher, operatorAddress } = await loadFixture(setup);
|
|
379
|
+
const proof = ethers.toUtf8Bytes("Some proof");
|
|
380
|
+
await expect(slashingManager
|
|
381
|
+
.connect(slasher)
|
|
382
|
+
.proposeSlash(operatorAddress, REASON_DOUBLE_SIGN, proof)).to.be.revertedWithCustomError(slashingManager, "SlashReasonDisabled");
|
|
383
|
+
});
|
|
384
|
+
it("should revert if proof required but not provided", async function () {
|
|
385
|
+
const { slashingManager, slasher, operatorAddress, mockVerifier } = await loadFixture(setup);
|
|
386
|
+
const proofPolicy = {
|
|
387
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
388
|
+
licensePenalty: ethers.parseEther("100"),
|
|
389
|
+
requiresProof: true,
|
|
390
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
391
|
+
banNode: false,
|
|
392
|
+
appealWindow: 0,
|
|
393
|
+
enabled: true,
|
|
394
|
+
};
|
|
395
|
+
await slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, proofPolicy);
|
|
396
|
+
const emptyProof = ethers.toUtf8Bytes("");
|
|
397
|
+
await expect(slashingManager
|
|
398
|
+
.connect(slasher)
|
|
399
|
+
.proposeSlash(operatorAddress, REASON_MISBEHAVIOR, emptyProof)).to.be.revertedWithCustomError(slashingManager, "ProofRequired");
|
|
400
|
+
});
|
|
401
|
+
it("should increment totalProposals", async function () {
|
|
402
|
+
const { slashingManager, slasher, operatorAddress, mockVerifier } = await loadFixture(setup);
|
|
403
|
+
const proofPolicy = {
|
|
404
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
405
|
+
licensePenalty: ethers.parseEther("100"),
|
|
406
|
+
requiresProof: true,
|
|
407
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
408
|
+
banNode: false,
|
|
409
|
+
appealWindow: 0,
|
|
410
|
+
enabled: true,
|
|
411
|
+
};
|
|
412
|
+
const evidencePolicy = {
|
|
413
|
+
ticketPenalty: ethers.parseUnits("20", 6),
|
|
414
|
+
licensePenalty: ethers.parseEther("50"),
|
|
415
|
+
requiresProof: false,
|
|
416
|
+
proofVerifier: ethers.ZeroAddress,
|
|
417
|
+
banNode: false,
|
|
418
|
+
appealWindow: APPEAL_WINDOW,
|
|
419
|
+
enabled: true,
|
|
420
|
+
};
|
|
421
|
+
await slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, proofPolicy);
|
|
422
|
+
await slashingManager.setSlashPolicy(REASON_INACTIVITY, evidencePolicy);
|
|
423
|
+
expect(await slashingManager.totalProposals()).to.equal(0);
|
|
424
|
+
const proof = ethers.toUtf8Bytes("Valid proof");
|
|
425
|
+
await slashingManager
|
|
426
|
+
.connect(slasher)
|
|
427
|
+
.proposeSlash(operatorAddress, REASON_MISBEHAVIOR, proof);
|
|
428
|
+
expect(await slashingManager.totalProposals()).to.equal(1);
|
|
429
|
+
await slashingManager
|
|
430
|
+
.connect(slasher)
|
|
431
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
432
|
+
expect(await slashingManager.totalProposals()).to.equal(2);
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
describe("executeSlash()", function () {
|
|
436
|
+
it("should execute slash with proof immediately", async function () {
|
|
437
|
+
const { slashingManager, slasher, operatorAddress, mockVerifier } = await loadFixture(setup);
|
|
438
|
+
const proofPolicy = {
|
|
439
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
440
|
+
licensePenalty: ethers.parseEther("100"),
|
|
441
|
+
requiresProof: true,
|
|
442
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
443
|
+
banNode: false,
|
|
444
|
+
appealWindow: 0,
|
|
445
|
+
enabled: true,
|
|
446
|
+
};
|
|
447
|
+
await slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, proofPolicy);
|
|
448
|
+
const proof = ethers.toUtf8Bytes("Valid proof");
|
|
449
|
+
await slashingManager
|
|
450
|
+
.connect(slasher)
|
|
451
|
+
.proposeSlash(operatorAddress, REASON_MISBEHAVIOR, proof);
|
|
452
|
+
await expect(slashingManager.connect(slasher).executeSlash(0))
|
|
453
|
+
.to.emit(slashingManager, "SlashExecuted")
|
|
454
|
+
.withArgs(0, operatorAddress, REASON_MISBEHAVIOR, ethers.parseUnits("50", 6), ethers.parseEther("100"), true);
|
|
455
|
+
const proposal = await slashingManager.getSlashProposal(0);
|
|
456
|
+
expect(proposal.executed).to.be.true;
|
|
457
|
+
});
|
|
458
|
+
it("should execute slash after appeal window expires", async function () {
|
|
459
|
+
const { slashingManager, slasher, operatorAddress, mockVerifier } = await loadFixture(setup);
|
|
460
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
461
|
+
await slashingManager
|
|
462
|
+
.connect(slasher)
|
|
463
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
464
|
+
await expect(slashingManager.connect(slasher).executeSlash(0)).to.be.revertedWithCustomError(slashingManager, "AppealWindowActive");
|
|
465
|
+
await time.increase(APPEAL_WINDOW + 1);
|
|
466
|
+
await expect(slashingManager.connect(slasher).executeSlash(0)).to.emit(slashingManager, "SlashExecuted");
|
|
467
|
+
});
|
|
468
|
+
it("should ban node when policy requires it", async function () {
|
|
469
|
+
const { slashingManager, slasher, operatorAddress, mockVerifier } = await loadFixture(setup);
|
|
470
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
471
|
+
const proof = ethers.toUtf8Bytes("Serious violation proof");
|
|
472
|
+
await slashingManager
|
|
473
|
+
.connect(slasher)
|
|
474
|
+
.proposeSlash(operatorAddress, REASON_DOUBLE_SIGN, proof);
|
|
475
|
+
expect(await slashingManager.isBanned(operatorAddress)).to.be.false;
|
|
476
|
+
await expect(slashingManager.connect(slasher).executeSlash(0))
|
|
477
|
+
.to.emit(slashingManager, "NodeBanUpdated")
|
|
478
|
+
.withArgs(operatorAddress, true, REASON_DOUBLE_SIGN, slasher);
|
|
479
|
+
expect(await slashingManager.isBanned(operatorAddress)).to.be.true;
|
|
480
|
+
});
|
|
481
|
+
it("should revert if proposal doesn't exist", async function () {
|
|
482
|
+
const { slashingManager, slasher } = await loadFixture(setup);
|
|
483
|
+
await expect(slashingManager.connect(slasher).executeSlash(999)).to.be.revertedWithCustomError(slashingManager, "InvalidProposal");
|
|
484
|
+
});
|
|
485
|
+
it("should revert if already executed", async function () {
|
|
486
|
+
const { slashingManager, slasher, operatorAddress, mockVerifier } = await loadFixture(setup);
|
|
487
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
488
|
+
const proof = ethers.toUtf8Bytes("Valid proof");
|
|
489
|
+
await slashingManager
|
|
490
|
+
.connect(slasher)
|
|
491
|
+
.proposeSlash(operatorAddress, REASON_MISBEHAVIOR, proof);
|
|
492
|
+
await slashingManager.connect(slasher).executeSlash(0);
|
|
493
|
+
await expect(slashingManager.connect(slasher).executeSlash(0)).to.be.revertedWithCustomError(slashingManager, "AlreadyExecuted");
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
describe("appeal system", function () {
|
|
497
|
+
it("should allow operator to file appeal", async function () {
|
|
498
|
+
const { slashingManager, slasher, operator, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
499
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
500
|
+
await slashingManager
|
|
501
|
+
.connect(slasher)
|
|
502
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
503
|
+
const evidence = "I was not inactive, here's the proof...";
|
|
504
|
+
await expect(slashingManager.connect(operator).fileAppeal(0, evidence))
|
|
505
|
+
.to.emit(slashingManager, "AppealFiled")
|
|
506
|
+
.withArgs(0, operatorAddress, REASON_INACTIVITY, evidence);
|
|
507
|
+
const proposal = await slashingManager.getSlashProposal(0);
|
|
508
|
+
expect(proposal.appealed).to.be.true;
|
|
509
|
+
});
|
|
510
|
+
it("should revert if non-operator tries to appeal", async function () {
|
|
511
|
+
const { slashingManager, slasher, notTheOwner, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
512
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
513
|
+
await slashingManager
|
|
514
|
+
.connect(slasher)
|
|
515
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
516
|
+
await expect(slashingManager.connect(notTheOwner).fileAppeal(0, "Not my appeal")).to.be.revertedWithCustomError(slashingManager, "Unauthorized");
|
|
517
|
+
});
|
|
518
|
+
it("should revert if appeal window expired", async function () {
|
|
519
|
+
const { slashingManager, slasher, operator, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
520
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
521
|
+
await slashingManager
|
|
522
|
+
.connect(slasher)
|
|
523
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
524
|
+
await time.increase(APPEAL_WINDOW + 1);
|
|
525
|
+
await expect(slashingManager.connect(operator).fileAppeal(0, "Too late")).to.be.revertedWithCustomError(slashingManager, "AppealWindowExpired");
|
|
526
|
+
});
|
|
527
|
+
it("should revert if already appealed", async function () {
|
|
528
|
+
const { slashingManager, slasher, operator, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
529
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
530
|
+
await slashingManager
|
|
531
|
+
.connect(slasher)
|
|
532
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
533
|
+
await slashingManager.connect(operator).fileAppeal(0, "First appeal");
|
|
534
|
+
await expect(slashingManager.connect(operator).fileAppeal(0, "Second appeal")).to.be.revertedWithCustomError(slashingManager, "AlreadyAppealed");
|
|
535
|
+
});
|
|
536
|
+
it("should allow governance to resolve appeal (approve)", async function () {
|
|
537
|
+
const { slashingManager, slasher, operator, owner, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
538
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
539
|
+
await slashingManager
|
|
540
|
+
.connect(slasher)
|
|
541
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
542
|
+
await slashingManager.connect(operator).fileAppeal(0, "Evidence");
|
|
543
|
+
const resolution = "Appeal approved after review";
|
|
544
|
+
await expect(slashingManager.connect(owner).resolveAppeal(0, true, resolution))
|
|
545
|
+
.to.emit(slashingManager, "AppealResolved")
|
|
546
|
+
.withArgs(0, operatorAddress, true, await owner.getAddress(), resolution);
|
|
547
|
+
const proposal = await slashingManager.getSlashProposal(0);
|
|
548
|
+
expect(proposal.resolved).to.be.true;
|
|
549
|
+
expect(proposal.appealUpheld).to.be.true;
|
|
550
|
+
});
|
|
551
|
+
it("should allow governance to resolve appeal (deny)", async function () {
|
|
552
|
+
const { slashingManager, slasher, operator, owner, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
553
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
554
|
+
await slashingManager
|
|
555
|
+
.connect(slasher)
|
|
556
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
557
|
+
await slashingManager.connect(operator).fileAppeal(0, "Evidence");
|
|
558
|
+
await slashingManager
|
|
559
|
+
.connect(owner)
|
|
560
|
+
.resolveAppeal(0, false, "Appeal denied");
|
|
561
|
+
const proposal = await slashingManager.getSlashProposal(0);
|
|
562
|
+
expect(proposal.resolved).to.be.true;
|
|
563
|
+
expect(proposal.appealUpheld).to.be.false;
|
|
564
|
+
});
|
|
565
|
+
it("should block execution if appeal is pending", async function () {
|
|
566
|
+
const { slashingManager, slasher, operator, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
567
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
568
|
+
await slashingManager
|
|
569
|
+
.connect(slasher)
|
|
570
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
571
|
+
await slashingManager.connect(operator).fileAppeal(0, "Evidence");
|
|
572
|
+
await time.increase(APPEAL_WINDOW + 1);
|
|
573
|
+
await expect(slashingManager.connect(slasher).executeSlash(0)).to.be.revertedWithCustomError(slashingManager, "AppealPending");
|
|
574
|
+
});
|
|
575
|
+
it("should block execution if appeal was approved", async function () {
|
|
576
|
+
const { slashingManager, slasher, operator, owner, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
577
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
578
|
+
await slashingManager
|
|
579
|
+
.connect(slasher)
|
|
580
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
581
|
+
await slashingManager.connect(operator).fileAppeal(0, "Evidence");
|
|
582
|
+
await slashingManager.connect(owner).resolveAppeal(0, true, "Approved");
|
|
583
|
+
await time.increase(APPEAL_WINDOW + 1);
|
|
584
|
+
await expect(slashingManager.connect(slasher).executeSlash(0)).to.be.revertedWithCustomError(slashingManager, "AppealUpheld");
|
|
585
|
+
});
|
|
586
|
+
it("should allow execution if appeal was denied", async function () {
|
|
587
|
+
const { slashingManager, slasher, operator, owner, operatorAddress, mockVerifier, } = await loadFixture(setup);
|
|
588
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
589
|
+
await slashingManager
|
|
590
|
+
.connect(slasher)
|
|
591
|
+
.proposeSlash(operatorAddress, REASON_INACTIVITY, ethers.toUtf8Bytes(""));
|
|
592
|
+
await slashingManager.connect(operator).fileAppeal(0, "Evidence");
|
|
593
|
+
await slashingManager.connect(owner).resolveAppeal(0, false, "Denied");
|
|
594
|
+
await time.increase(APPEAL_WINDOW + 1);
|
|
595
|
+
await expect(slashingManager.connect(slasher).executeSlash(0)).to.emit(slashingManager, "SlashExecuted");
|
|
596
|
+
});
|
|
597
|
+
});
|
|
598
|
+
describe("ban management", function () {
|
|
599
|
+
it("should allow governance to ban node", async function () {
|
|
600
|
+
const { slashingManager, owner, operatorAddress } = await loadFixture(setup);
|
|
601
|
+
const reason = ethers.encodeBytes32String("manual_ban");
|
|
602
|
+
await expect(slashingManager
|
|
603
|
+
.connect(owner)
|
|
604
|
+
.updateBanStatus(operatorAddress, true, reason))
|
|
605
|
+
.to.emit(slashingManager, "NodeBanUpdated")
|
|
606
|
+
.withArgs(operatorAddress, true, reason, await owner.getAddress());
|
|
607
|
+
expect(await slashingManager.isBanned(operatorAddress)).to.be.true;
|
|
608
|
+
});
|
|
609
|
+
it("should allow governance to unban node", async function () {
|
|
610
|
+
const { slashingManager, owner, operatorAddress } = await loadFixture(setup);
|
|
611
|
+
await slashingManager
|
|
612
|
+
.connect(owner)
|
|
613
|
+
.updateBanStatus(operatorAddress, true, ethers.encodeBytes32String("test"));
|
|
614
|
+
expect(await slashingManager.isBanned(operatorAddress)).to.be.true;
|
|
615
|
+
await expect(slashingManager
|
|
616
|
+
.connect(owner)
|
|
617
|
+
.updateBanStatus(operatorAddress, false, ethers.encodeBytes32String("test")))
|
|
618
|
+
.to.emit(slashingManager, "NodeBanUpdated")
|
|
619
|
+
.withArgs(operatorAddress, false, ethers.encodeBytes32String("test"), await owner.getAddress());
|
|
620
|
+
expect(await slashingManager.isBanned(operatorAddress)).to.be.false;
|
|
621
|
+
});
|
|
622
|
+
it("should revert if non-governance tries to ban", async function () {
|
|
623
|
+
const { slashingManager, notTheOwner, operatorAddress } = await loadFixture(setup);
|
|
624
|
+
await expect(slashingManager
|
|
625
|
+
.connect(notTheOwner)
|
|
626
|
+
.updateBanStatus(operatorAddress, false, ethers.encodeBytes32String("test"))).to.be.revertedWithCustomError(slashingManager, "Unauthorized");
|
|
627
|
+
});
|
|
628
|
+
});
|
|
629
|
+
describe("view functions", function () {
|
|
630
|
+
it("should return correct slash policy", async function () {
|
|
631
|
+
const { slashingManager, mockVerifier } = await loadFixture(setup);
|
|
632
|
+
const policy = {
|
|
633
|
+
ticketPenalty: ethers.parseUnits("50", 6),
|
|
634
|
+
licensePenalty: ethers.parseEther("100"),
|
|
635
|
+
requiresProof: true,
|
|
636
|
+
proofVerifier: await mockVerifier.getAddress(),
|
|
637
|
+
banNode: true,
|
|
638
|
+
appealWindow: 0,
|
|
639
|
+
enabled: true,
|
|
640
|
+
};
|
|
641
|
+
await slashingManager.setSlashPolicy(REASON_MISBEHAVIOR, policy);
|
|
642
|
+
const retrieved = await slashingManager.getSlashPolicy(REASON_MISBEHAVIOR);
|
|
643
|
+
expect(retrieved.ticketPenalty).to.equal(policy.ticketPenalty);
|
|
644
|
+
expect(retrieved.licensePenalty).to.equal(policy.licensePenalty);
|
|
645
|
+
expect(retrieved.requiresProof).to.equal(policy.requiresProof);
|
|
646
|
+
expect(retrieved.proofVerifier).to.equal(policy.proofVerifier);
|
|
647
|
+
expect(retrieved.banNode).to.equal(policy.banNode);
|
|
648
|
+
expect(retrieved.appealWindow).to.equal(policy.appealWindow);
|
|
649
|
+
expect(retrieved.enabled).to.equal(policy.enabled);
|
|
650
|
+
});
|
|
651
|
+
it("should return correct slash proposal", async function () {
|
|
652
|
+
const { slashingManager, slasher, operatorAddress, mockVerifier } = await loadFixture(setup);
|
|
653
|
+
await setupPolicies(slashingManager, mockVerifier);
|
|
654
|
+
const proof = ethers.toUtf8Bytes("test proof");
|
|
655
|
+
await slashingManager
|
|
656
|
+
.connect(slasher)
|
|
657
|
+
.proposeSlash(operatorAddress, REASON_MISBEHAVIOR, proof);
|
|
658
|
+
const proposal = await slashingManager.getSlashProposal(0);
|
|
659
|
+
expect(proposal.operator).to.equal(operatorAddress);
|
|
660
|
+
expect(proposal.reason).to.equal(REASON_MISBEHAVIOR);
|
|
661
|
+
expect(proposal.ticketAmount).to.equal(ethers.parseUnits("50", 6));
|
|
662
|
+
expect(proposal.licenseAmount).to.equal(ethers.parseEther("100"));
|
|
663
|
+
expect(proposal.proposer).to.equal(await slasher.getAddress());
|
|
664
|
+
expect(proposal.proofHash).to.equal(ethers.keccak256(proof));
|
|
665
|
+
expect(proposal.proofVerified).to.be.true;
|
|
666
|
+
});
|
|
667
|
+
it("should revert for invalid proposal ID", async function () {
|
|
668
|
+
const { slashingManager } = await loadFixture(setup);
|
|
669
|
+
await expect(slashingManager.getSlashProposal(999)).to.be.revertedWithCustomError(slashingManager, "InvalidProposal");
|
|
670
|
+
});
|
|
671
|
+
});
|
|
672
|
+
});
|