{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Shelley.TxAuxData (
  ShelleyTxAuxData (
    MkShelleyTxAuxData,
    ShelleyTxAuxData
  ),
  ShelleyTxAuxDataRaw (..),

  -- * Re-exports
  Metadatum (..),
) where

import Cardano.Ledger.Binary (Annotator, DecCBOR (..), EncCBOR (..))
import qualified Cardano.Ledger.Binary.Plain as Plain (ToCBOR)
import Cardano.Ledger.Core
import Cardano.Ledger.MemoBytes (
  EqRaw (..),
  Mem,
  MemoBytes,
  MemoHashIndex,
  Memoized (RawType),
  getMemoRawType,
  getMemoSafeHash,
  lensMemoRawType,
  mkMemoizedEra,
 )
import Cardano.Ledger.Metadata (Metadatum (..))
import Cardano.Ledger.Shelley.Era (ShelleyEra)
import Control.DeepSeq (NFData)
import Data.Aeson (FromJSON (..), ToJSON (..))
import Data.Map.Strict (Map)
import Data.Word (Word64)
import GHC.Generics (Generic)
import NoThunks.Class (InspectHeapNamed (..), NoThunks (..))

newtype ShelleyTxAuxDataRaw era = ShelleyTxAuxDataRaw
  { forall era. ShelleyTxAuxDataRaw era -> Map Word64 Metadatum
stadrMetadata :: Map Word64 Metadatum
  }
  deriving (ShelleyTxAuxDataRaw era -> ShelleyTxAuxDataRaw era -> Bool
(ShelleyTxAuxDataRaw era -> ShelleyTxAuxDataRaw era -> Bool)
-> (ShelleyTxAuxDataRaw era -> ShelleyTxAuxDataRaw era -> Bool)
-> Eq (ShelleyTxAuxDataRaw era)
forall era.
ShelleyTxAuxDataRaw era -> ShelleyTxAuxDataRaw era -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall era.
ShelleyTxAuxDataRaw era -> ShelleyTxAuxDataRaw era -> Bool
== :: ShelleyTxAuxDataRaw era -> ShelleyTxAuxDataRaw era -> Bool
$c/= :: forall era.
ShelleyTxAuxDataRaw era -> ShelleyTxAuxDataRaw era -> Bool
/= :: ShelleyTxAuxDataRaw era -> ShelleyTxAuxDataRaw era -> Bool
Eq, Int -> ShelleyTxAuxDataRaw era -> ShowS
[ShelleyTxAuxDataRaw era] -> ShowS
ShelleyTxAuxDataRaw era -> String
(Int -> ShelleyTxAuxDataRaw era -> ShowS)
-> (ShelleyTxAuxDataRaw era -> String)
-> ([ShelleyTxAuxDataRaw era] -> ShowS)
-> Show (ShelleyTxAuxDataRaw era)
forall era. Int -> ShelleyTxAuxDataRaw era -> ShowS
forall era. [ShelleyTxAuxDataRaw era] -> ShowS
forall era. ShelleyTxAuxDataRaw era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> ShelleyTxAuxDataRaw era -> ShowS
showsPrec :: Int -> ShelleyTxAuxDataRaw era -> ShowS
$cshow :: forall era. ShelleyTxAuxDataRaw era -> String
show :: ShelleyTxAuxDataRaw era -> String
$cshowList :: forall era. [ShelleyTxAuxDataRaw era] -> ShowS
showList :: [ShelleyTxAuxDataRaw era] -> ShowS
Show, (forall x.
 ShelleyTxAuxDataRaw era -> Rep (ShelleyTxAuxDataRaw era) x)
-> (forall x.
    Rep (ShelleyTxAuxDataRaw era) x -> ShelleyTxAuxDataRaw era)
-> Generic (ShelleyTxAuxDataRaw era)
forall x.
Rep (ShelleyTxAuxDataRaw era) x -> ShelleyTxAuxDataRaw era
forall x.
ShelleyTxAuxDataRaw era -> Rep (ShelleyTxAuxDataRaw era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x.
Rep (ShelleyTxAuxDataRaw era) x -> ShelleyTxAuxDataRaw era
forall era x.
ShelleyTxAuxDataRaw era -> Rep (ShelleyTxAuxDataRaw era) x
$cfrom :: forall era x.
ShelleyTxAuxDataRaw era -> Rep (ShelleyTxAuxDataRaw era) x
from :: forall x.
ShelleyTxAuxDataRaw era -> Rep (ShelleyTxAuxDataRaw era) x
$cto :: forall era x.
Rep (ShelleyTxAuxDataRaw era) x -> ShelleyTxAuxDataRaw era
to :: forall x.
Rep (ShelleyTxAuxDataRaw era) x -> ShelleyTxAuxDataRaw era
Generic)
  deriving newtype (ShelleyTxAuxDataRaw era -> ()
(ShelleyTxAuxDataRaw era -> ()) -> NFData (ShelleyTxAuxDataRaw era)
forall era. ShelleyTxAuxDataRaw era -> ()
forall a. (a -> ()) -> NFData a
$crnf :: forall era. ShelleyTxAuxDataRaw era -> ()
rnf :: ShelleyTxAuxDataRaw era -> ()
NFData)

deriving via
  InspectHeapNamed "ShelleyTxAuxDataRaw" (ShelleyTxAuxDataRaw era)
  instance
    NoThunks (ShelleyTxAuxDataRaw era)

deriving newtype instance Era era => EncCBOR (ShelleyTxAuxDataRaw era)

deriving newtype instance Era era => DecCBOR (ShelleyTxAuxDataRaw era)

instance Era era => DecCBOR (Annotator (ShelleyTxAuxDataRaw era)) where
  decCBOR :: forall s. Decoder s (Annotator (ShelleyTxAuxDataRaw era))
decCBOR = ShelleyTxAuxDataRaw era -> Annotator (ShelleyTxAuxDataRaw era)
forall a. a -> Annotator a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ShelleyTxAuxDataRaw era -> Annotator (ShelleyTxAuxDataRaw era))
-> Decoder s (ShelleyTxAuxDataRaw era)
-> Decoder s (Annotator (ShelleyTxAuxDataRaw era))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s (ShelleyTxAuxDataRaw era)
forall s. Decoder s (ShelleyTxAuxDataRaw era)
forall a s. DecCBOR a => Decoder s a
decCBOR

deriving via
  InspectHeapNamed "ShelleyTxAuxDataRaw" (ShelleyTxAuxData era)
  instance
    NoThunks (ShelleyTxAuxData era)

newtype ShelleyTxAuxData era
  = MkShelleyTxAuxData (MemoBytes (ShelleyTxAuxDataRaw era))
  deriving (ShelleyTxAuxData era -> ShelleyTxAuxData era -> Bool
(ShelleyTxAuxData era -> ShelleyTxAuxData era -> Bool)
-> (ShelleyTxAuxData era -> ShelleyTxAuxData era -> Bool)
-> Eq (ShelleyTxAuxData era)
forall era. ShelleyTxAuxData era -> ShelleyTxAuxData era -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall era. ShelleyTxAuxData era -> ShelleyTxAuxData era -> Bool
== :: ShelleyTxAuxData era -> ShelleyTxAuxData era -> Bool
$c/= :: forall era. ShelleyTxAuxData era -> ShelleyTxAuxData era -> Bool
/= :: ShelleyTxAuxData era -> ShelleyTxAuxData era -> Bool
Eq, Int -> ShelleyTxAuxData era -> ShowS
[ShelleyTxAuxData era] -> ShowS
ShelleyTxAuxData era -> String
(Int -> ShelleyTxAuxData era -> ShowS)
-> (ShelleyTxAuxData era -> String)
-> ([ShelleyTxAuxData era] -> ShowS)
-> Show (ShelleyTxAuxData era)
forall era. Int -> ShelleyTxAuxData era -> ShowS
forall era. [ShelleyTxAuxData era] -> ShowS
forall era. ShelleyTxAuxData era -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall era. Int -> ShelleyTxAuxData era -> ShowS
showsPrec :: Int -> ShelleyTxAuxData era -> ShowS
$cshow :: forall era. ShelleyTxAuxData era -> String
show :: ShelleyTxAuxData era -> String
$cshowList :: forall era. [ShelleyTxAuxData era] -> ShowS
showList :: [ShelleyTxAuxData era] -> ShowS
Show, (forall x. ShelleyTxAuxData era -> Rep (ShelleyTxAuxData era) x)
-> (forall x. Rep (ShelleyTxAuxData era) x -> ShelleyTxAuxData era)
-> Generic (ShelleyTxAuxData era)
forall x. Rep (ShelleyTxAuxData era) x -> ShelleyTxAuxData era
forall x. ShelleyTxAuxData era -> Rep (ShelleyTxAuxData era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x. Rep (ShelleyTxAuxData era) x -> ShelleyTxAuxData era
forall era x. ShelleyTxAuxData era -> Rep (ShelleyTxAuxData era) x
$cfrom :: forall era x. ShelleyTxAuxData era -> Rep (ShelleyTxAuxData era) x
from :: forall x. ShelleyTxAuxData era -> Rep (ShelleyTxAuxData era) x
$cto :: forall era x. Rep (ShelleyTxAuxData era) x -> ShelleyTxAuxData era
to :: forall x. Rep (ShelleyTxAuxData era) x -> ShelleyTxAuxData era
Generic)
  deriving newtype (ShelleyTxAuxData era -> ()
(ShelleyTxAuxData era -> ()) -> NFData (ShelleyTxAuxData era)
forall era. ShelleyTxAuxData era -> ()
forall a. (a -> ()) -> NFData a
$crnf :: forall era. ShelleyTxAuxData era -> ()
rnf :: ShelleyTxAuxData era -> ()
NFData, Typeable (ShelleyTxAuxData era)
Typeable (ShelleyTxAuxData era) =>
(ShelleyTxAuxData era -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy (ShelleyTxAuxData era) -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy [ShelleyTxAuxData era] -> Size)
-> ToCBOR (ShelleyTxAuxData era)
ShelleyTxAuxData era -> Encoding
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [ShelleyTxAuxData era] -> Size
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (ShelleyTxAuxData era) -> Size
forall era. Typeable era => Typeable (ShelleyTxAuxData era)
forall era. Typeable era => ShelleyTxAuxData era -> Encoding
forall a.
Typeable a =>
(a -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy a -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size) -> Proxy [a] -> Size)
-> ToCBOR a
forall era.
Typeable era =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [ShelleyTxAuxData era] -> Size
forall era.
Typeable era =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (ShelleyTxAuxData era) -> Size
$ctoCBOR :: forall era. Typeable era => ShelleyTxAuxData era -> Encoding
toCBOR :: ShelleyTxAuxData era -> Encoding
$cencodedSizeExpr :: forall era.
Typeable era =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (ShelleyTxAuxData era) -> Size
encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (ShelleyTxAuxData era) -> Size
$cencodedListSizeExpr :: forall era.
Typeable era =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [ShelleyTxAuxData era] -> Size
encodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [ShelleyTxAuxData era] -> Size
Plain.ToCBOR, ShelleyTxAuxData era -> Int
ShelleyTxAuxData era -> ByteString
(ShelleyTxAuxData era -> ByteString)
-> (ShelleyTxAuxData era -> Int)
-> (forall i. Proxy i -> ShelleyTxAuxData era -> SafeHash i)
-> SafeToHash (ShelleyTxAuxData era)
forall i. Proxy i -> ShelleyTxAuxData era -> SafeHash i
forall era. ShelleyTxAuxData era -> Int
forall era. ShelleyTxAuxData era -> ByteString
forall t.
(t -> ByteString)
-> (t -> Int)
-> (forall i. Proxy i -> t -> SafeHash i)
-> SafeToHash t
forall era i. Proxy i -> ShelleyTxAuxData era -> SafeHash i
$coriginalBytes :: forall era. ShelleyTxAuxData era -> ByteString
originalBytes :: ShelleyTxAuxData era -> ByteString
$coriginalBytesSize :: forall era. ShelleyTxAuxData era -> Int
originalBytesSize :: ShelleyTxAuxData era -> Int
$cmakeHashWithExplicitProxys :: forall era i. Proxy i -> ShelleyTxAuxData era -> SafeHash i
makeHashWithExplicitProxys :: forall i. Proxy i -> ShelleyTxAuxData era -> SafeHash i
SafeToHash)

instance Memoized (ShelleyTxAuxData era) where
  type RawType (ShelleyTxAuxData era) = ShelleyTxAuxDataRaw era

deriving via
  Mem (ShelleyTxAuxDataRaw era)
  instance
    Era era => DecCBOR (Annotator (ShelleyTxAuxData era))

instance EraTxAuxData ShelleyEra where
  type TxAuxData ShelleyEra = ShelleyTxAuxData ShelleyEra

  mkBasicTxAuxData :: TxAuxData ShelleyEra
mkBasicTxAuxData = Map Word64 Metadatum -> ShelleyTxAuxData ShelleyEra
forall era. Era era => Map Word64 Metadatum -> ShelleyTxAuxData era
ShelleyTxAuxData Map Word64 Metadatum
forall a. Monoid a => a
mempty

  metadataTxAuxDataL :: Lens' (TxAuxData ShelleyEra) (Map Word64 Metadatum)
metadataTxAuxDataL =
    forall era t a b.
(Era era, EncCBOR (RawType t), Memoized t) =>
(RawType t -> a) -> (RawType t -> b -> RawType t) -> Lens t t a b
lensMemoRawType @ShelleyEra RawType (TxAuxData ShelleyEra) -> Map Word64 Metadatum
ShelleyTxAuxDataRaw ShelleyEra -> Map Word64 Metadatum
forall era. ShelleyTxAuxDataRaw era -> Map Word64 Metadatum
stadrMetadata ((RawType (TxAuxData ShelleyEra)
  -> Map Word64 Metadatum -> RawType (TxAuxData ShelleyEra))
 -> Lens' (TxAuxData ShelleyEra) (Map Word64 Metadatum))
-> (RawType (TxAuxData ShelleyEra)
    -> Map Word64 Metadatum -> RawType (TxAuxData ShelleyEra))
-> Lens' (TxAuxData ShelleyEra) (Map Word64 Metadatum)
forall a b. (a -> b) -> a -> b
$
      \RawType (TxAuxData ShelleyEra)
txAuxDataRaw Map Word64 Metadatum
md -> RawType (TxAuxData ShelleyEra)
txAuxDataRaw {stadrMetadata = md}

  validateTxAuxData :: ProtVer -> TxAuxData ShelleyEra -> Bool
validateTxAuxData ProtVer
_ TxAuxData ShelleyEra
_ = Bool
True

instance EqRaw (ShelleyTxAuxData era)

instance Era era => ToJSON (ShelleyTxAuxData era) where
  toJSON :: ShelleyTxAuxData era -> Value
toJSON (ShelleyTxAuxData Map Word64 Metadatum
m) = Map Word64 Metadatum -> Value
forall a. ToJSON a => a -> Value
toJSON Map Word64 Metadatum
m

instance Era era => FromJSON (ShelleyTxAuxData era) where
  parseJSON :: Value -> Parser (ShelleyTxAuxData era)
parseJSON Value
v = Map Word64 Metadatum -> ShelleyTxAuxData era
forall era. Era era => Map Word64 Metadatum -> ShelleyTxAuxData era
ShelleyTxAuxData (Map Word64 Metadatum -> ShelleyTxAuxData era)
-> Parser (Map Word64 Metadatum) -> Parser (ShelleyTxAuxData era)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser (Map Word64 Metadatum)
forall a. FromJSON a => Value -> Parser a
parseJSON Value
v

instance HashAnnotated (ShelleyTxAuxData era) EraIndependentTxAuxData where
  hashAnnotated :: ShelleyTxAuxData era -> SafeHash EraIndependentTxAuxData
hashAnnotated = ShelleyTxAuxData era -> SafeHash EraIndependentTxAuxData
ShelleyTxAuxData era
-> SafeHash (MemoHashIndex (RawType (ShelleyTxAuxData era)))
forall t. Memoized t => t -> SafeHash (MemoHashIndex (RawType t))
getMemoSafeHash

pattern ShelleyTxAuxData :: forall era. Era era => Map Word64 Metadatum -> ShelleyTxAuxData era
pattern $mShelleyTxAuxData :: forall {r} {era}.
Era era =>
ShelleyTxAuxData era
-> (Map Word64 Metadatum -> r) -> ((# #) -> r) -> r
$bShelleyTxAuxData :: forall era. Era era => Map Word64 Metadatum -> ShelleyTxAuxData era
ShelleyTxAuxData m <-
  (getMemoRawType -> ShelleyTxAuxDataRaw m)
  where
    ShelleyTxAuxData Map Word64 Metadatum
m = forall era t.
(Era era, EncCBOR (RawType t), Memoized t) =>
RawType t -> t
mkMemoizedEra @era (RawType (ShelleyTxAuxData era) -> ShelleyTxAuxData era)
-> RawType (ShelleyTxAuxData era) -> ShelleyTxAuxData era
forall a b. (a -> b) -> a -> b
$ Map Word64 Metadatum -> ShelleyTxAuxDataRaw era
forall era. Map Word64 Metadatum -> ShelleyTxAuxDataRaw era
ShelleyTxAuxDataRaw Map Word64 Metadatum
m

{-# COMPLETE ShelleyTxAuxData #-}

-- | Encodes memoized bytes created upon construction.
instance Era era => EncCBOR (ShelleyTxAuxData era)

type instance MemoHashIndex (ShelleyTxAuxDataRaw era) = EraIndependentTxAuxData