{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}

module Cardano.Ledger.AuxiliaryData
  ( AuxiliaryDataHash (..),
    ValidateAuxiliaryData (..),
  )
where

import Cardano.Binary (FromCBOR, ToCBOR)
import qualified Cardano.Ledger.Core as Core
import qualified Cardano.Ledger.Crypto as CC (Crypto)
import Cardano.Ledger.Era (Crypto)
import Control.DeepSeq (NFData (..))
import NoThunks.Class (NoThunks (..))
import Shelley.Spec.Ledger.Hashing (EraIndependentMetadata)
import Shelley.Spec.Ledger.Keys (Hash)

newtype AuxiliaryDataHash crypto = AuxiliaryDataHash
  { AuxiliaryDataHash crypto -> Hash crypto EraIndependentMetadata
unsafeAuxiliaryDataHash :: Hash crypto EraIndependentMetadata
  }
  deriving (Int -> AuxiliaryDataHash crypto -> ShowS
[AuxiliaryDataHash crypto] -> ShowS
AuxiliaryDataHash crypto -> String
(Int -> AuxiliaryDataHash crypto -> ShowS)
-> (AuxiliaryDataHash crypto -> String)
-> ([AuxiliaryDataHash crypto] -> ShowS)
-> Show (AuxiliaryDataHash crypto)
forall crypto. Int -> AuxiliaryDataHash crypto -> ShowS
forall crypto. [AuxiliaryDataHash crypto] -> ShowS
forall crypto. AuxiliaryDataHash crypto -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AuxiliaryDataHash crypto] -> ShowS
$cshowList :: forall crypto. [AuxiliaryDataHash crypto] -> ShowS
show :: AuxiliaryDataHash crypto -> String
$cshow :: forall crypto. AuxiliaryDataHash crypto -> String
showsPrec :: Int -> AuxiliaryDataHash crypto -> ShowS
$cshowsPrec :: forall crypto. Int -> AuxiliaryDataHash crypto -> ShowS
Show, AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
(AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool)
-> (AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool)
-> Eq (AuxiliaryDataHash crypto)
forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
$c/= :: forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
== :: AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
$c== :: forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
Eq, Eq (AuxiliaryDataHash crypto)
Eq (AuxiliaryDataHash crypto)
-> (AuxiliaryDataHash crypto
    -> AuxiliaryDataHash crypto -> Ordering)
-> (AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool)
-> (AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool)
-> (AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool)
-> (AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool)
-> (AuxiliaryDataHash crypto
    -> AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto)
-> (AuxiliaryDataHash crypto
    -> AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto)
-> Ord (AuxiliaryDataHash crypto)
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Ordering
AuxiliaryDataHash crypto
-> AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto
forall crypto. Eq (AuxiliaryDataHash crypto)
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Ordering
forall crypto.
AuxiliaryDataHash crypto
-> AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto
min :: AuxiliaryDataHash crypto
-> AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto
$cmin :: forall crypto.
AuxiliaryDataHash crypto
-> AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto
max :: AuxiliaryDataHash crypto
-> AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto
$cmax :: forall crypto.
AuxiliaryDataHash crypto
-> AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto
>= :: AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
$c>= :: forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
> :: AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
$c> :: forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
<= :: AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
$c<= :: forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
< :: AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
$c< :: forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Bool
compare :: AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Ordering
$ccompare :: forall crypto.
AuxiliaryDataHash crypto -> AuxiliaryDataHash crypto -> Ordering
$cp1Ord :: forall crypto. Eq (AuxiliaryDataHash crypto)
Ord, Context -> AuxiliaryDataHash crypto -> IO (Maybe ThunkInfo)
Proxy (AuxiliaryDataHash crypto) -> String
(Context -> AuxiliaryDataHash crypto -> IO (Maybe ThunkInfo))
-> (Context -> AuxiliaryDataHash crypto -> IO (Maybe ThunkInfo))
-> (Proxy (AuxiliaryDataHash crypto) -> String)
-> NoThunks (AuxiliaryDataHash crypto)
forall crypto.
Context -> AuxiliaryDataHash crypto -> IO (Maybe ThunkInfo)
forall crypto. Proxy (AuxiliaryDataHash crypto) -> String
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
showTypeOf :: Proxy (AuxiliaryDataHash crypto) -> String
$cshowTypeOf :: forall crypto. Proxy (AuxiliaryDataHash crypto) -> String
wNoThunks :: Context -> AuxiliaryDataHash crypto -> IO (Maybe ThunkInfo)
$cwNoThunks :: forall crypto.
Context -> AuxiliaryDataHash crypto -> IO (Maybe ThunkInfo)
noThunks :: Context -> AuxiliaryDataHash crypto -> IO (Maybe ThunkInfo)
$cnoThunks :: forall crypto.
Context -> AuxiliaryDataHash crypto -> IO (Maybe ThunkInfo)
NoThunks, AuxiliaryDataHash crypto -> ()
(AuxiliaryDataHash crypto -> ())
-> NFData (AuxiliaryDataHash crypto)
forall crypto. AuxiliaryDataHash crypto -> ()
forall a. (a -> ()) -> NFData a
rnf :: AuxiliaryDataHash crypto -> ()
$crnf :: forall crypto. AuxiliaryDataHash crypto -> ()
NFData)

deriving instance
  CC.Crypto crypto =>
  ToCBOR (AuxiliaryDataHash crypto)

deriving instance
  CC.Crypto crypto =>
  FromCBOR (AuxiliaryDataHash crypto)

class ValidateAuxiliaryData era where
  hashAuxiliaryData :: Core.AuxiliaryData era -> AuxiliaryDataHash (Crypto era)
  validateAuxiliaryData :: Core.AuxiliaryData era -> Bool