diff --git a/contracts/interfaces/IValidatorsChecker.sol b/contracts/interfaces/IValidatorsChecker.sol index db32e75b..3c0984d2 100644 --- a/contracts/interfaces/IValidatorsChecker.sol +++ b/contracts/interfaces/IValidatorsChecker.sol @@ -7,7 +7,7 @@ import {IERC5267} from '@openzeppelin/contracts/interfaces/IERC5267.sol'; /** * @title IValidatorsChecker * @author StakeWise - * @notice Defines the interface for EthValidatorsChecker + * @notice Defines the interface for ValidatorsChecker */ interface IValidatorsChecker is IERC5267 { /** @@ -15,6 +15,7 @@ interface IValidatorsChecker is IERC5267 { * @param vault The address of the vault * @param validatorsRegistryRoot The validators registry root * @param publicKeys The concatenation of the validators' public keys + * @param signature The validators manager signature * @return Current block number */ function checkValidatorsManagerSignature( diff --git a/contracts/validators/EthValidatorsChecker.sol b/contracts/validators/EthValidatorsChecker.sol index 30c9629a..e8f649b3 100644 --- a/contracts/validators/EthValidatorsChecker.sol +++ b/contracts/validators/EthValidatorsChecker.sol @@ -3,12 +3,10 @@ pragma solidity =0.8.22; import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; - import {IValidatorsRegistry} from '../interfaces/IValidatorsRegistry.sol'; import {IKeeper} from '../interfaces/IKeeper.sol'; import {IDepositDataRegistry} from '../interfaces/IDepositDataRegistry.sol'; import {IVaultsRegistry} from '../interfaces/IVaultsRegistry.sol'; - import {ValidatorsChecker} from './ValidatorsChecker.sol'; /** @@ -17,11 +15,6 @@ import {ValidatorsChecker} from './ValidatorsChecker.sol'; * @notice Defines Ethereum-specific settings for ValidatorsChecker contract */ contract EthValidatorsChecker is ValidatorsChecker { - IValidatorsRegistry private immutable _validatorsRegistry; - IKeeper private immutable _keeper; - IVaultsRegistry private immutable _vaultsRegistry; - IDepositDataRegistry private immutable _depositDataRegistry; - /** * @dev Constructor * @param validatorsRegistry The address of the beacon chain validators registry contract @@ -39,14 +32,14 @@ contract EthValidatorsChecker is ValidatorsChecker { EIP712('EthValidatorsChecker', '1') {} - function validatorsManagerSignatureTypeHash() public pure override returns (bytes32) { + function validatorsManagerSignatureTypeHash() internal pure override returns (bytes32) { return keccak256( 'EthValidatorsChecker(bytes32 validatorsRegistryRoot,address vault,bytes validators)' ); } - function depositAmount() public pure override returns (uint256) { + function depositAmount() internal pure override returns (uint256) { return 32 ether; } } diff --git a/contracts/validators/GnoValidatorsChecker.sol b/contracts/validators/GnoValidatorsChecker.sol index 00f23e2d..85536a0c 100644 --- a/contracts/validators/GnoValidatorsChecker.sol +++ b/contracts/validators/GnoValidatorsChecker.sol @@ -3,12 +3,10 @@ pragma solidity =0.8.22; import {EIP712} from '@openzeppelin/contracts/utils/cryptography/EIP712.sol'; - import {IValidatorsRegistry} from '../interfaces/IValidatorsRegistry.sol'; import {IKeeper} from '../interfaces/IKeeper.sol'; import {IDepositDataRegistry} from '../interfaces/IDepositDataRegistry.sol'; import {IVaultsRegistry} from '../interfaces/IVaultsRegistry.sol'; - import {ValidatorsChecker} from './ValidatorsChecker.sol'; /** @@ -17,11 +15,6 @@ import {ValidatorsChecker} from './ValidatorsChecker.sol'; * @notice Defines Gnosis-specific settings for ValidatorsChecker contract */ contract GnoValidatorsChecker is ValidatorsChecker { - IValidatorsRegistry private immutable _validatorsRegistry; - IKeeper private immutable _keeper; - IVaultsRegistry private immutable _vaultsRegistry; - IDepositDataRegistry private immutable _depositDataRegistry; - /** * @dev Constructor * @param validatorsRegistry The address of the beacon chain validators registry contract @@ -39,14 +32,14 @@ contract GnoValidatorsChecker is ValidatorsChecker { EIP712('GnoValidatorsChecker', '1') {} - function validatorsManagerSignatureTypeHash() public pure override returns (bytes32) { + function validatorsManagerSignatureTypeHash() internal pure override returns (bytes32) { return keccak256( 'GnoValidatorsChecker(bytes32 validatorsRegistryRoot,address vault,bytes validators)' ); } - function depositAmount() public pure override returns (uint256) { + function depositAmount() internal pure override returns (uint256) { return 1 ether; } } diff --git a/contracts/validators/ValidatorsChecker.sol b/contracts/validators/ValidatorsChecker.sol index e82c8a5e..6f77825f 100644 --- a/contracts/validators/ValidatorsChecker.sol +++ b/contracts/validators/ValidatorsChecker.sol @@ -171,7 +171,7 @@ abstract contract ValidatorsChecker is IValidatorsChecker, EIP712 { return block.number; } - function validatorsManagerSignatureTypeHash() public pure virtual returns (bytes32); + function validatorsManagerSignatureTypeHash() internal pure virtual returns (bytes32); - function depositAmount() public pure virtual returns (uint256); + function depositAmount() internal pure virtual returns (uint256); } diff --git a/test/EthValidatorsChecker.spec.ts b/test/ValidatorsChecker.spec.ts similarity index 93% rename from test/EthValidatorsChecker.spec.ts rename to test/ValidatorsChecker.spec.ts index f4feee3b..665c6c90 100644 --- a/test/EthValidatorsChecker.spec.ts +++ b/test/ValidatorsChecker.spec.ts @@ -14,7 +14,12 @@ import { import { MAX_UINT256, ZERO_ADDRESS } from './shared/constants' import { getEthVaultV1Factory } from './shared/contracts' import { expect } from './shared/expect' -import { deployEthVaultV1, encodeEthVaultInitParams, ethVaultFixture } from './shared/fixtures' +import { + createEthValidatorsChecker, + deployEthVaultV1, + encodeEthVaultInitParams, + ethVaultFixture, +} from './shared/fixtures' import { EthValidatorsData, createEthValidatorsData, @@ -22,11 +27,12 @@ import { getValidatorsCheckerSigningData, getValidatorsMultiProof, } from './shared/validators' +import { createGnoValidatorsChecker } from './shared/gnoFixtures' const networks = ['ETHEREUM', 'GNOSIS'] networks.forEach((network) => { - describe(`EthValidatorsChecker [${network}]`, () => { + describe(`ValidatorsChecker [${network}]`, () => { let validatorDeposit = ethers.parseEther('32') if (network == 'GNOSIS') { validatorDeposit = ethers.parseEther('1') @@ -57,17 +63,28 @@ networks.forEach((network) => { validatorsRegistry = fixture.validatorsRegistry keeper = fixture.keeper depositDataRegistry = fixture.depositDataRegistry + vaultsRegistry = fixture.vaultsRegistry - validatorsCheckerTypeName = 'EthValidatorsChecker' - validatorsChecker = fixture.ethValidatorsChecker - - if (network == 'GNOSIS') { + if (network == 'ETHEREUM') { + validatorsCheckerTypeName = 'EthValidatorsChecker' + validatorsChecker = await createEthValidatorsChecker( + validatorsRegistry, + keeper, + vaultsRegistry, + depositDataRegistry + ) + } else if (network == 'GNOSIS') { validatorsCheckerTypeName = 'GnoValidatorsChecker' - validatorsChecker = fixture.gnoValidatorsChecker + validatorsChecker = await createGnoValidatorsChecker( + validatorsRegistry, + keeper, + vaultsRegistry, + depositDataRegistry + ) + } else { + throw Error('unknown network') } - vaultsRegistry = fixture.vaultsRegistry - vault = await fixture.createEthVault(admin, { capacity, feePercent, diff --git a/test/shared/fixtures.ts b/test/shared/fixtures.ts index ad98bbb3..d095ffd4 100644 --- a/test/shared/fixtures.ts +++ b/test/shared/fixtures.ts @@ -53,10 +53,7 @@ import { VaultsRegistry__factory, DepositDataRegistry, DepositDataRegistry__factory, - EthValidatorsChecker, EthValidatorsChecker__factory, - GnoValidatorsChecker, - GnoValidatorsChecker__factory, } from '../../typechain-types' import { getEthValidatorsRegistryFactory, getOsTokenConfigV1Factory } from './contracts' import { @@ -278,23 +275,6 @@ export const createEthValidatorsChecker = async function ( return EthValidatorsChecker__factory.connect(await contract.getAddress(), signer) } -export const createGnoValidatorsChecker = async function ( - validatorsRegistry: Contract, - keeper: Keeper, - vaultsRegistry: VaultsRegistry, - depositDataRegistry: DepositDataRegistry -) { - const signer = await ethers.provider.getSigner() - const factory = await ethers.getContractFactory('GnoValidatorsChecker') - const contract = await factory.deploy( - await validatorsRegistry.getAddress(), - await keeper.getAddress(), - await vaultsRegistry.getAddress(), - await depositDataRegistry.getAddress() - ) - return GnoValidatorsChecker__factory.connect(await contract.getAddress(), signer) -} - export const createOsTokenVaultController = async function ( keeperAddress: string, registry: VaultsRegistry, @@ -622,8 +602,6 @@ interface EthVaultFixture { osToken: OsToken osTokenVaultController: OsTokenVaultController osTokenConfig: OsTokenConfig - ethValidatorsChecker: EthValidatorsChecker - gnoValidatorsChecker: GnoValidatorsChecker createEthVault( admin: Signer, @@ -750,21 +728,7 @@ export const ethVaultFixture = async function (): Promise { // 7. deploy depositDataRegistry const depositDataRegistry = await createDepositDataRegistry(vaultsRegistry) - // 8. deploy ValidatorsCheckers for Ethereum and Gnosis - const ethValidatorsChecker = await createEthValidatorsChecker( - validatorsRegistry, - keeper, - vaultsRegistry, - depositDataRegistry - ) - const gnoValidatorsChecker = await createGnoValidatorsChecker( - validatorsRegistry, - keeper, - vaultsRegistry, - depositDataRegistry - ) - - // 9. deploy implementations and factories + // 8. deploy implementations and factories const factories = {} const implementations = {} @@ -822,8 +786,6 @@ export const ethVaultFixture = async function (): Promise { osTokenVaultController, osTokenConfig, osToken, - ethValidatorsChecker, - gnoValidatorsChecker, createEthVault: async ( admin: Signer, vaultParams: EthVaultInitParamsStruct, diff --git a/test/shared/gnoFixtures.ts b/test/shared/gnoFixtures.ts index 54cb8e12..70365af6 100644 --- a/test/shared/gnoFixtures.ts +++ b/test/shared/gnoFixtures.ts @@ -46,6 +46,7 @@ import { XdaiExchange__factory, PriceFeedMock, PriceFeedMock__factory, + GnoValidatorsChecker__factory, } from '../../typechain-types' import { getGnoValidatorsRegistryFactory } from './contracts' import { @@ -706,3 +707,20 @@ export const gnoVaultFixture = async function (): Promise { }, } } + +export const createGnoValidatorsChecker = async function ( + validatorsRegistry: Contract, + keeper: Keeper, + vaultsRegistry: VaultsRegistry, + depositDataRegistry: DepositDataRegistry +) { + const signer = await ethers.provider.getSigner() + const factory = await ethers.getContractFactory('GnoValidatorsChecker') + const contract = await factory.deploy( + await validatorsRegistry.getAddress(), + await keeper.getAddress(), + await vaultsRegistry.getAddress(), + await depositDataRegistry.getAddress() + ) + return GnoValidatorsChecker__factory.connect(await contract.getAddress(), signer) +}