{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Mary.TxAuxData (
  module Cardano.Ledger.Allegra.TxAuxData,
)
where

import Cardano.Ledger.Allegra.TxAuxData (
  AllegraEraTxAuxData (..),
  AllegraTxAuxData (..),
  metadataAllegraTxAuxDataL,
  timelockScriptsAllegraTxAuxDataL,
 )
import Cardano.Ledger.AuxiliaryData (AuxiliaryDataHash (..))
import Cardano.Ledger.Core (EraTxAuxData (..), upgradeScript)
import Cardano.Ledger.Crypto (Crypto)
import Cardano.Ledger.Mary.Era (MaryEra)
import Cardano.Ledger.Mary.Scripts ()
import Cardano.Ledger.SafeHash (hashAnnotated)
import Cardano.Ledger.Shelley.TxAuxData (validMetadatum)
import Control.DeepSeq (deepseq)

-- =======================================

instance Crypto c => EraTxAuxData (MaryEra c) where
  type TxAuxData (MaryEra c) = AllegraTxAuxData (MaryEra c)

  mkBasicTxAuxData :: TxAuxData (MaryEra c)
mkBasicTxAuxData = forall era.
Era era =>
Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxData era
AllegraTxAuxData forall a. Monoid a => a
mempty forall a. Monoid a => a
mempty

  metadataTxAuxDataL :: Lens' (TxAuxData (MaryEra c)) (Map Word64 Metadatum)
metadataTxAuxDataL = forall era.
Era era =>
Lens' (AllegraTxAuxData era) (Map Word64 Metadatum)
metadataAllegraTxAuxDataL

  upgradeTxAuxData :: EraTxAuxData (PreviousEra (MaryEra c)) =>
TxAuxData (PreviousEra (MaryEra c)) -> TxAuxData (MaryEra c)
upgradeTxAuxData (AllegraTxAuxData Map Word64 Metadatum
md StrictSeq (Timelock (AllegraEra c))
scripts) = forall era.
Era era =>
Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxData era
AllegraTxAuxData Map Word64 Metadatum
md forall a b. (a -> b) -> a -> b
$ forall era.
(EraScript era, EraScript (PreviousEra era)) =>
Script (PreviousEra era) -> Script era
upgradeScript forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> StrictSeq (Timelock (AllegraEra c))
scripts

  validateTxAuxData :: ProtVer -> TxAuxData (MaryEra c) -> Bool
validateTxAuxData ProtVer
_ (AllegraTxAuxData Map Word64 Metadatum
md StrictSeq (Timelock (MaryEra c))
as) = StrictSeq (Timelock (MaryEra c))
as forall a b. NFData a => a -> b -> b
`deepseq` forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Metadatum -> Bool
validMetadatum Map Word64 Metadatum
md

  hashTxAuxData :: TxAuxData (MaryEra c) -> AuxiliaryDataHash (EraCrypto (MaryEra c))
hashTxAuxData TxAuxData (MaryEra c)
aux = forall c. SafeHash c EraIndependentTxAuxData -> AuxiliaryDataHash c
AuxiliaryDataHash (forall x index c.
(HashAnnotated x index c, HashAlgorithm (HASH c)) =>
x -> SafeHash c index
hashAnnotated TxAuxData (MaryEra c)
aux)

instance Crypto c => AllegraEraTxAuxData (MaryEra c) where
  timelockScriptsTxAuxDataL :: Lens' (TxAuxData (MaryEra c)) (StrictSeq (Timelock (MaryEra c)))
timelockScriptsTxAuxDataL = forall era.
Era era =>
Lens' (AllegraTxAuxData era) (StrictSeq (Timelock era))
timelockScriptsAllegraTxAuxDataL