from abc import (
    ABC,
    abstractmethod,
)
from typing import (
    Union,
)


class PreImageAPI(ABC):
    @abstractmethod
    def __init__(self, value: bytes) -> None:
        ...

    @abstractmethod
    def update(self, value: bytes) -> None:
        ...

    @abstractmethod
    def digest(self) -> bytes:
        ...

    @abstractmethod
    def copy(self) -> 'PreImageAPI':
        ...


class BackendAPI(ABC):
    @abstractmethod
    def keccak256(self, in_data: Union[bytearray, bytes]) -> bytes:
        ...

    @abstractmethod
    def preimage(self, in_data: Union[bytearray, bytes]) -> PreImageAPI:
        ...
