interface ISolos {
    /**
    * @dev Structure for storing information about the solo deposits.
    * @param amount - amount deposited.
    * @param withdrawalCredentials - withdrawal credentials of the validators.
    * @param releaseTime - the time when the deposit amount can be canceled.
    */
    struct Solo {
        uint256 amount;
        bytes32 withdrawalCredentials;
        uint256 releaseTime;
    }

    /**
    * @dev Structure for passing information about new Validator.
    * @param publicKey - BLS public key of the validator, generated by the operator.
    * @param signature - BLS signature of the validator, generated by the operator.
    * @param depositDataRoot - hash tree root of the deposit data, generated by the operator.
    * @param soloId - ID of the solo to register validator for.
    */
    struct Validator {
        bytes publicKey;
        bytes signature;
        bytes32 depositDataRoot;
        bytes32 soloId;
    }

    /**
    * @dev Event for tracking added deposits.
    * @param soloId - ID of the solo.
    * @param sender - address of the deposit sender.
    * @param amount - amount added.
    * @param withdrawalCredentials - withdrawal credentials submitted by deposit owner.
    */
    event DepositAdded(
        bytes32 indexed soloId,
        address indexed sender,
        uint256 amount,
        bytes32 withdrawalCredentials
    );

    /**
    * @dev Event for tracking canceled deposits.
    * @param soloId - ID of the solo.
    * @param sender - address of the deposit sender.
    * @param amount - amount canceled.
    * @param withdrawalCredentials - withdrawal credentials submitted by deposit owner.
    */
    event DepositCanceled(
        bytes32 indexed soloId,
        address indexed sender,
        uint256 amount,
        bytes32 withdrawalCredentials
    );

    /**
    * @dev Event for tracking new cancel lock duration time.
    * @param cancelLockDuration - new cancel lock duration for solo deposits.
    */
    event CancelLockDurationUpdated(uint256 cancelLockDuration);

    /**
    * @dev Event for tracking solo validator price updates.
    * @param validatorPrice - new price for the solo validators.
    */
    event ValidatorPriceUpdated(uint256 validatorPrice);

    /**
    * @dev Event for tracking registered validators.
    * @param soloId - ID of the solo where the deposit was accumulated.
    * @param publicKey - validator public key.
    * @param price - validator monthly price.
    * @param operator - address of the validator operator.
    */
    event ValidatorRegistered(bytes32 indexed soloId, bytes publicKey, uint256 price, address operator);

    /**
    * @dev Function for getting solo's details.
    * @param _soloId - ID of the solo to retrieve data for.
    */
    function solos(bytes32 _soloId) external view returns (
        uint256 amount,
        bytes32 withdrawalCredentials,
        uint256 releaseTime
    );

    /**
    * @dev Function for retrieving the validator registration contract address.
    */
    function validatorRegistration() external view returns (IDepositContract);

    /**
    * @dev Function for getting solo validator price per month.
    */
    function validatorPrice() external view returns (uint256);

    /**
    * @dev Function for updating solo validator price.
    * @param _validatorPrice - new validator price.
    */
    function setValidatorPrice(uint256 _validatorPrice) external;

    /**
    * @dev Function for getting cancel lock duration in seconds.
    */
    function cancelLockDuration() external view returns (uint256);

    /**
    * @dev Function for updating cancel lock duration in seconds.
    * @param newCancelLockDuration - new cancel lock duration in seconds.
    */
    function setCancelLockDuration(uint256 newCancelLockDuration) external;

    /**
    * @dev Function for adding solo deposits.
    * The deposit amount must be divisible by the validator deposit amount.
    * @param _withdrawalCredentials - withdrawal credentials for performing validator withdrawal.
    */
    function addDeposit(bytes32 _withdrawalCredentials) external payable;

    /**
    * @dev Function for canceling solo deposits.
    * The deposit amount can only be canceled before it will be registered as a validator.
    * @param _withdrawalCredentials - withdrawal credentials of solo validators.
    * @param _amount - amount to cancel.
    */
    function cancelDeposit(bytes32 _withdrawalCredentials, uint256 _amount) external;

    /**
    * @dev Function for registering new solo validator.
    * @param _validator - validator to register.
    */
    function registerValidator(Validator calldata _validator) external;
}
/**
 * @dev Interface of the Solos contract.
 */
function addDeposit(bytes32 _withdrawalCredentials) external payable;

/**
 * @dev Function for adding solo deposits.
 * The deposit amount must be divisible by the validator deposit amount.
 * @param _withdrawalCredentials - withdrawal credentials for performing validator withdrawal.
 */