From 6e2d4d90dc8e150051142f928c90cb246e8739d4 Mon Sep 17 00:00:00 2001 From: Kresh Date: Tue, 2 Jul 2024 02:16:19 +0400 Subject: [PATCH] minor tests --- test/DelegatorFactory.t.sol | 74 +++++++++------ test/SlasherFactory.t.sol | 175 ++++++++++++++++++++++++++++++++++++ test/VaultFactory.t.sol | 162 +++++++++++++++++++++++++++++++++ 3 files changed, 386 insertions(+), 25 deletions(-) diff --git a/test/DelegatorFactory.t.sol b/test/DelegatorFactory.t.sol index f193d54d..64962bae 100644 --- a/test/DelegatorFactory.t.sol +++ b/test/DelegatorFactory.t.sol @@ -12,8 +12,13 @@ import {MetadataService} from "src/contracts/service/MetadataService.sol"; import {NetworkMiddlewareService} from "src/contracts/service/NetworkMiddlewareService.sol"; import {OptInService} from "src/contracts/service/OptInService.sol"; -import {IVault} from "src/interfaces/vault/IVault.sol"; import {Vault} from "src/contracts/vault/Vault.sol"; +import {NetworkRestakeDelegator} from "src/contracts/delegator/NetworkRestakeDelegator.sol"; +import {FullRestakeDelegator} from "src/contracts/delegator/FullRestakeDelegator.sol"; +import {Slasher} from "src/contracts/slasher/Slasher.sol"; +import {VetoSlasher} from "src/contracts/slasher/VetoSlasher.sol"; + +import {IVault} from "src/interfaces/vault/IVault.sol"; import {SimpleCollateral} from "./mocks/SimpleCollateral.sol"; import {Token} from "./mocks/Token.sol"; import {VaultConfigurator} from "src/contracts/VaultConfigurator.sol"; @@ -21,12 +26,7 @@ import {IVaultConfigurator} from "src/interfaces/IVaultConfigurator.sol"; import {INetworkRestakeDelegator} from "src/interfaces/delegator/INetworkRestakeDelegator.sol"; import {IBaseDelegator} from "src/interfaces/delegator/IBaseDelegator.sol"; -import {IEntity} from "src/interfaces/common/IEntity.sol"; - -import {NetworkRestakeDelegator} from "src/contracts/delegator/NetworkRestakeDelegator.sol"; -import {FullRestakeDelegator} from "src/contracts/delegator/FullRestakeDelegator.sol"; - -contract DelegatorFactoryTest is Test { +contract VaultConfiguratorTest is Test { address owner; address alice; uint256 alicePrivateKey; @@ -45,7 +45,6 @@ contract DelegatorFactoryTest is Test { OptInService operatorVaultOptInService; OptInService operatorNetworkOptInService; - Vault vault; SimpleCollateral collateral; VaultConfigurator vaultConfigurator; @@ -70,16 +69,6 @@ contract DelegatorFactoryTest is Test { address(new Vault(address(delegatorFactory), address(slasherFactory), address(vaultFactory))); vaultFactory.whitelist(vaultImpl); - Token token = new Token("Token"); - collateral = new SimpleCollateral(address(token)); - - collateral.mint(token.totalSupply()); - - vaultConfigurator = - new VaultConfigurator(address(vaultFactory), address(delegatorFactory), address(slasherFactory)); - } - - function test_Create() public { address networkRestakeDelegatorImpl = address( new NetworkRestakeDelegator( address(networkRegistry), @@ -102,7 +91,42 @@ contract DelegatorFactoryTest is Test { ); delegatorFactory.whitelist(fullRestakeDelegatorImpl); - (address vault_, address delegator, address slasher) = vaultConfigurator.create( + address slasherImpl = address( + new Slasher( + address(vaultFactory), + address(networkMiddlewareService), + address(networkVaultOptInService), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(slasherFactory) + ) + ); + slasherFactory.whitelist(slasherImpl); + + address vetoSlasherImpl = address( + new VetoSlasher( + address(vaultFactory), + address(networkMiddlewareService), + address(networkVaultOptInService), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(networkRegistry), + address(slasherFactory) + ) + ); + slasherFactory.whitelist(vetoSlasherImpl); + + Token token = new Token("Token"); + collateral = new SimpleCollateral(address(token)); + + collateral.mint(token.totalSupply()); + + vaultConfigurator = + new VaultConfigurator(address(vaultFactory), address(delegatorFactory), address(slasherFactory)); + } + + function test_Create() public { + (address vault_,,) = vaultConfigurator.create( IVaultConfigurator.InitParams({ version: 1, owner: alice, @@ -132,13 +156,11 @@ contract DelegatorFactoryTest is Test { }) ); - vault = Vault(vault_); - address networkRestakeDelegator = delegatorFactory.create( 0, true, abi.encode( - address(vault), + vault_, abi.encode( INetworkRestakeDelegator.InitParams({ baseParams: IBaseDelegator.BaseParams({defaultAdminRoleHolder: bob}), @@ -148,13 +170,14 @@ contract DelegatorFactoryTest is Test { ) ) ); - assertEq(IEntity(networkRestakeDelegator).FACTORY(), address(delegatorFactory)); + assertEq(NetworkRestakeDelegator(networkRestakeDelegator).FACTORY(), address(delegatorFactory)); + assertEq(delegatorFactory.isEntity(networkRestakeDelegator), true); address fullRestakeDelegator = delegatorFactory.create( 1, true, abi.encode( - address(vault), + vault_, abi.encode( INetworkRestakeDelegator.InitParams({ baseParams: IBaseDelegator.BaseParams({defaultAdminRoleHolder: bob}), @@ -164,6 +187,7 @@ contract DelegatorFactoryTest is Test { ) ) ); - assertEq(IEntity(fullRestakeDelegatorImpl).FACTORY(), address(delegatorFactory)); + assertEq(FullRestakeDelegator(fullRestakeDelegator).FACTORY(), address(delegatorFactory)); + assertEq(delegatorFactory.isEntity(fullRestakeDelegator), true); } } diff --git a/test/SlasherFactory.t.sol b/test/SlasherFactory.t.sol index 8b137891..62e76cf8 100644 --- a/test/SlasherFactory.t.sol +++ b/test/SlasherFactory.t.sol @@ -1 +1,176 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; +import {Test, console2} from "forge-std/Test.sol"; + +import {VaultFactory} from "src/contracts/VaultFactory.sol"; +import {DelegatorFactory} from "src/contracts/DelegatorFactory.sol"; +import {SlasherFactory} from "src/contracts/SlasherFactory.sol"; +import {NetworkRegistry} from "src/contracts/NetworkRegistry.sol"; +import {OperatorRegistry} from "src/contracts/OperatorRegistry.sol"; +import {MetadataService} from "src/contracts/service/MetadataService.sol"; +import {NetworkMiddlewareService} from "src/contracts/service/NetworkMiddlewareService.sol"; +import {OptInService} from "src/contracts/service/OptInService.sol"; + +import {Vault} from "src/contracts/vault/Vault.sol"; +import {NetworkRestakeDelegator} from "src/contracts/delegator/NetworkRestakeDelegator.sol"; +import {FullRestakeDelegator} from "src/contracts/delegator/FullRestakeDelegator.sol"; +import {Slasher} from "src/contracts/slasher/Slasher.sol"; +import {VetoSlasher} from "src/contracts/slasher/VetoSlasher.sol"; + +import {IVault} from "src/interfaces/vault/IVault.sol"; +import {SimpleCollateral} from "./mocks/SimpleCollateral.sol"; +import {Token} from "./mocks/Token.sol"; +import {VaultConfigurator} from "src/contracts/VaultConfigurator.sol"; +import {IVaultConfigurator} from "src/interfaces/IVaultConfigurator.sol"; +import {INetworkRestakeDelegator} from "src/interfaces/delegator/INetworkRestakeDelegator.sol"; +import {IBaseDelegator} from "src/interfaces/delegator/IBaseDelegator.sol"; +import {IVetoSlasher} from "src/interfaces/slasher/IVetoSlasher.sol"; + +contract VaultConfiguratorTest is Test { + address owner; + address alice; + uint256 alicePrivateKey; + address bob; + uint256 bobPrivateKey; + + VaultFactory vaultFactory; + DelegatorFactory delegatorFactory; + SlasherFactory slasherFactory; + NetworkRegistry networkRegistry; + OperatorRegistry operatorRegistry; + MetadataService operatorMetadataService; + MetadataService networkMetadataService; + NetworkMiddlewareService networkMiddlewareService; + OptInService networkVaultOptInService; + OptInService operatorVaultOptInService; + OptInService operatorNetworkOptInService; + + SimpleCollateral collateral; + VaultConfigurator vaultConfigurator; + + function setUp() public { + owner = address(this); + (alice, alicePrivateKey) = makeAddrAndKey("alice"); + (bob, bobPrivateKey) = makeAddrAndKey("bob"); + + vaultFactory = new VaultFactory(owner); + delegatorFactory = new DelegatorFactory(owner); + slasherFactory = new SlasherFactory(owner); + networkRegistry = new NetworkRegistry(); + operatorRegistry = new OperatorRegistry(); + operatorMetadataService = new MetadataService(address(operatorRegistry)); + networkMetadataService = new MetadataService(address(networkRegistry)); + networkMiddlewareService = new NetworkMiddlewareService(address(networkRegistry)); + networkVaultOptInService = new OptInService(address(networkRegistry), address(vaultFactory)); + operatorVaultOptInService = new OptInService(address(operatorRegistry), address(vaultFactory)); + operatorNetworkOptInService = new OptInService(address(operatorRegistry), address(networkRegistry)); + + address vaultImpl = + address(new Vault(address(delegatorFactory), address(slasherFactory), address(vaultFactory))); + vaultFactory.whitelist(vaultImpl); + + address networkRestakeDelegatorImpl = address( + new NetworkRestakeDelegator( + address(networkRegistry), + address(vaultFactory), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(delegatorFactory) + ) + ); + delegatorFactory.whitelist(networkRestakeDelegatorImpl); + + address fullRestakeDelegatorImpl = address( + new FullRestakeDelegator( + address(networkRegistry), + address(vaultFactory), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(delegatorFactory) + ) + ); + delegatorFactory.whitelist(fullRestakeDelegatorImpl); + + address slasherImpl = address( + new Slasher( + address(vaultFactory), + address(networkMiddlewareService), + address(networkVaultOptInService), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(slasherFactory) + ) + ); + slasherFactory.whitelist(slasherImpl); + + address vetoSlasherImpl = address( + new VetoSlasher( + address(vaultFactory), + address(networkMiddlewareService), + address(networkVaultOptInService), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(networkRegistry), + address(slasherFactory) + ) + ); + slasherFactory.whitelist(vetoSlasherImpl); + + Token token = new Token("Token"); + collateral = new SimpleCollateral(address(token)); + + collateral.mint(token.totalSupply()); + + vaultConfigurator = + new VaultConfigurator(address(vaultFactory), address(delegatorFactory), address(slasherFactory)); + } + + function test_Create() public { + (address vault_,,) = vaultConfigurator.create( + IVaultConfigurator.InitParams({ + version: 1, + owner: alice, + vaultParams: IVault.InitParams({ + collateral: address(collateral), + delegator: address(0), + slasher: address(0), + burner: address(0xdEaD), + epochDuration: 1, + slasherSetEpochsDelay: 3, + depositWhitelist: false, + defaultAdminRoleHolder: alice, + slasherSetRoleHolder: alice, + depositorWhitelistRoleHolder: alice + }), + delegatorIndex: 0, + delegatorParams: abi.encode( + INetworkRestakeDelegator.InitParams({ + baseParams: IBaseDelegator.BaseParams({defaultAdminRoleHolder: alice}), + networkLimitSetRoleHolder: alice, + operatorNetworkSharesSetRoleHolder: alice + }) + ), + withSlasher: false, + slasherIndex: 0, + slasherParams: "" + }) + ); + + address slasher = slasherFactory.create(0, true, abi.encode(vault_, "")); + assertEq(Slasher(slasher).FACTORY(), address(slasherFactory)); + assertEq(slasherFactory.isEntity(slasher), true); + + address vetoSlasher = slasherFactory.create( + 1, + true, + abi.encode( + vault_, + abi.encode(IVetoSlasher.InitParams({vetoDuration: 0, executeDuration: 1, resolverSetEpochsDelay: 3})) + ) + ); + + assertEq(VetoSlasher(vetoSlasher).FACTORY(), address(slasherFactory)); + assertEq(slasherFactory.isEntity(vetoSlasher), true); + } +} diff --git a/test/VaultFactory.t.sol b/test/VaultFactory.t.sol index 8b137891..891a0589 100644 --- a/test/VaultFactory.t.sol +++ b/test/VaultFactory.t.sol @@ -1 +1,163 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.25; +import {Test, console2} from "forge-std/Test.sol"; + +import {VaultFactory} from "src/contracts/VaultFactory.sol"; +import {DelegatorFactory} from "src/contracts/DelegatorFactory.sol"; +import {SlasherFactory} from "src/contracts/SlasherFactory.sol"; +import {NetworkRegistry} from "src/contracts/NetworkRegistry.sol"; +import {OperatorRegistry} from "src/contracts/OperatorRegistry.sol"; +import {MetadataService} from "src/contracts/service/MetadataService.sol"; +import {NetworkMiddlewareService} from "src/contracts/service/NetworkMiddlewareService.sol"; +import {OptInService} from "src/contracts/service/OptInService.sol"; + +import {Vault} from "src/contracts/vault/Vault.sol"; +import {NetworkRestakeDelegator} from "src/contracts/delegator/NetworkRestakeDelegator.sol"; +import {FullRestakeDelegator} from "src/contracts/delegator/FullRestakeDelegator.sol"; +import {Slasher} from "src/contracts/slasher/Slasher.sol"; +import {VetoSlasher} from "src/contracts/slasher/VetoSlasher.sol"; + +import {IVault} from "src/interfaces/vault/IVault.sol"; +import {SimpleCollateral} from "./mocks/SimpleCollateral.sol"; +import {Token} from "./mocks/Token.sol"; +import {VaultConfigurator} from "src/contracts/VaultConfigurator.sol"; +import {IVaultConfigurator} from "src/interfaces/IVaultConfigurator.sol"; +import {INetworkRestakeDelegator} from "src/interfaces/delegator/INetworkRestakeDelegator.sol"; +import {IBaseDelegator} from "src/interfaces/delegator/IBaseDelegator.sol"; +import {IVetoSlasher} from "src/interfaces/slasher/IVetoSlasher.sol"; + +contract VaultConfiguratorTest is Test { + address owner; + address alice; + uint256 alicePrivateKey; + address bob; + uint256 bobPrivateKey; + + VaultFactory vaultFactory; + DelegatorFactory delegatorFactory; + SlasherFactory slasherFactory; + NetworkRegistry networkRegistry; + OperatorRegistry operatorRegistry; + MetadataService operatorMetadataService; + MetadataService networkMetadataService; + NetworkMiddlewareService networkMiddlewareService; + OptInService networkVaultOptInService; + OptInService operatorVaultOptInService; + OptInService operatorNetworkOptInService; + + SimpleCollateral collateral; + VaultConfigurator vaultConfigurator; + + function setUp() public { + owner = address(this); + (alice, alicePrivateKey) = makeAddrAndKey("alice"); + (bob, bobPrivateKey) = makeAddrAndKey("bob"); + + vaultFactory = new VaultFactory(owner); + delegatorFactory = new DelegatorFactory(owner); + slasherFactory = new SlasherFactory(owner); + networkRegistry = new NetworkRegistry(); + operatorRegistry = new OperatorRegistry(); + operatorMetadataService = new MetadataService(address(operatorRegistry)); + networkMetadataService = new MetadataService(address(networkRegistry)); + networkMiddlewareService = new NetworkMiddlewareService(address(networkRegistry)); + networkVaultOptInService = new OptInService(address(networkRegistry), address(vaultFactory)); + operatorVaultOptInService = new OptInService(address(operatorRegistry), address(vaultFactory)); + operatorNetworkOptInService = new OptInService(address(operatorRegistry), address(networkRegistry)); + + address vaultImpl = + address(new Vault(address(delegatorFactory), address(slasherFactory), address(vaultFactory))); + vaultFactory.whitelist(vaultImpl); + + address networkRestakeDelegatorImpl = address( + new NetworkRestakeDelegator( + address(networkRegistry), + address(vaultFactory), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(delegatorFactory) + ) + ); + delegatorFactory.whitelist(networkRestakeDelegatorImpl); + + address fullRestakeDelegatorImpl = address( + new FullRestakeDelegator( + address(networkRegistry), + address(vaultFactory), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(delegatorFactory) + ) + ); + delegatorFactory.whitelist(fullRestakeDelegatorImpl); + + address slasherImpl = address( + new Slasher( + address(vaultFactory), + address(networkMiddlewareService), + address(networkVaultOptInService), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(slasherFactory) + ) + ); + slasherFactory.whitelist(slasherImpl); + + address vetoSlasherImpl = address( + new VetoSlasher( + address(vaultFactory), + address(networkMiddlewareService), + address(networkVaultOptInService), + address(operatorVaultOptInService), + address(operatorNetworkOptInService), + address(networkRegistry), + address(slasherFactory) + ) + ); + slasherFactory.whitelist(vetoSlasherImpl); + + Token token = new Token("Token"); + collateral = new SimpleCollateral(address(token)); + + collateral.mint(token.totalSupply()); + + vaultConfigurator = + new VaultConfigurator(address(vaultFactory), address(delegatorFactory), address(slasherFactory)); + } + + function test_Create() public { + (address vault_,,) = vaultConfigurator.create( + IVaultConfigurator.InitParams({ + version: 1, + owner: alice, + vaultParams: IVault.InitParams({ + collateral: address(collateral), + delegator: address(0), + slasher: address(0), + burner: address(0xdEaD), + epochDuration: 1, + slasherSetEpochsDelay: 3, + depositWhitelist: false, + defaultAdminRoleHolder: alice, + slasherSetRoleHolder: alice, + depositorWhitelistRoleHolder: alice + }), + delegatorIndex: 0, + delegatorParams: abi.encode( + INetworkRestakeDelegator.InitParams({ + baseParams: IBaseDelegator.BaseParams({defaultAdminRoleHolder: alice}), + networkLimitSetRoleHolder: alice, + operatorNetworkSharesSetRoleHolder: alice + }) + ), + withSlasher: false, + slasherIndex: 0, + slasherParams: "" + }) + ); + + assertEq(Vault(vault_).FACTORY(), address(vaultFactory)); + assertEq(vaultFactory.isEntity(vault_), true); + } +}