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

module Cardano.Ledger.Allegra.TxAuxData (
  AllegraTxAuxData (AllegraTxAuxData, MkAlegraTxAuxData),
  AllegraTxAuxDataRaw (..),
  metadataAllegraTxAuxDataL,
  AllegraEraTxAuxData (..),
  timelockScriptsAllegraTxAuxDataL,
) where

import Cardano.Ledger.Allegra.Era (AllegraEra)
import Cardano.Ledger.Allegra.Scripts (Timelock)
import Cardano.Ledger.Binary (
  DecCBOR (..),
  EncCBOR (..),
  ToCBOR,
  peekTokenType,
 )
import Cardano.Ledger.Binary.Coders
import Cardano.Ledger.MemoBytes (
  EqRaw,
  MemoBytes,
  MemoHashIndex,
  Memoized (RawType),
  getMemoRawType,
  getMemoSafeHash,
  lensMemoRawType,
  mkMemoizedEra,
 )
import Cardano.Ledger.Shelley.Core
import Cardano.Ledger.Shelley.TxAuxData (Metadatum, ShelleyTxAuxData (..), validMetadatum)
import Codec.CBOR.Decoding (
  TokenType (
    TypeListLen,
    TypeListLen64,
    TypeListLenIndef,
    TypeMapLen,
    TypeMapLen64,
    TypeMapLenIndef
  ),
 )
import Control.DeepSeq (NFData, deepseq)
import Data.Map.Strict (Map)
import Data.Sequence.Strict (StrictSeq)
import qualified Data.Sequence.Strict as StrictSeq
import Data.Word (Word64)
import GHC.Generics (Generic)
import Lens.Micro (Lens')
import NoThunks.Class (NoThunks)

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

-- | Raw, un-memoised metadata type
data AllegraTxAuxDataRaw era = AllegraTxAuxDataRaw
  { forall era. AllegraTxAuxDataRaw era -> Map Word64 Metadatum
atadrMetadata :: !(Map Word64 Metadatum)
  -- ^ Structured transaction metadata
  , forall era. AllegraTxAuxDataRaw era -> StrictSeq (Timelock era)
atadrTimelock :: !(StrictSeq (Timelock era))
  -- ^ Pre-images of script hashes found within the TxBody, but which are not
  -- required as witnesses. Examples include:
  -- - Token policy IDs appearing in transaction outputs
  -- - Pool reward account registrations
  }
  deriving ((forall x.
 AllegraTxAuxDataRaw era -> Rep (AllegraTxAuxDataRaw era) x)
-> (forall x.
    Rep (AllegraTxAuxDataRaw era) x -> AllegraTxAuxDataRaw era)
-> Generic (AllegraTxAuxDataRaw era)
forall x.
Rep (AllegraTxAuxDataRaw era) x -> AllegraTxAuxDataRaw era
forall x.
AllegraTxAuxDataRaw era -> Rep (AllegraTxAuxDataRaw era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x.
Rep (AllegraTxAuxDataRaw era) x -> AllegraTxAuxDataRaw era
forall era x.
AllegraTxAuxDataRaw era -> Rep (AllegraTxAuxDataRaw era) x
$cfrom :: forall era x.
AllegraTxAuxDataRaw era -> Rep (AllegraTxAuxDataRaw era) x
from :: forall x.
AllegraTxAuxDataRaw era -> Rep (AllegraTxAuxDataRaw era) x
$cto :: forall era x.
Rep (AllegraTxAuxDataRaw era) x -> AllegraTxAuxDataRaw era
to :: forall x.
Rep (AllegraTxAuxDataRaw era) x -> AllegraTxAuxDataRaw era
Generic, AllegraTxAuxDataRaw era -> AllegraTxAuxDataRaw era -> Bool
(AllegraTxAuxDataRaw era -> AllegraTxAuxDataRaw era -> Bool)
-> (AllegraTxAuxDataRaw era -> AllegraTxAuxDataRaw era -> Bool)
-> Eq (AllegraTxAuxDataRaw era)
forall era.
AllegraTxAuxDataRaw era -> AllegraTxAuxDataRaw era -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall era.
AllegraTxAuxDataRaw era -> AllegraTxAuxDataRaw era -> Bool
== :: AllegraTxAuxDataRaw era -> AllegraTxAuxDataRaw era -> Bool
$c/= :: forall era.
AllegraTxAuxDataRaw era -> AllegraTxAuxDataRaw era -> Bool
/= :: AllegraTxAuxDataRaw era -> AllegraTxAuxDataRaw era -> Bool
Eq)

class EraTxAuxData era => AllegraEraTxAuxData era where
  timelockScriptsTxAuxDataL :: Lens' (TxAuxData era) (StrictSeq (Timelock era))

instance EraTxAuxData AllegraEra where
  type TxAuxData AllegraEra = AllegraTxAuxData AllegraEra

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

  metadataTxAuxDataL :: Lens' (TxAuxData AllegraEra) (Map Word64 Metadatum)
metadataTxAuxDataL = (Map Word64 Metadatum -> f (Map Word64 Metadatum))
-> TxAuxData AllegraEra -> f (TxAuxData AllegraEra)
(Map Word64 Metadatum -> f (Map Word64 Metadatum))
-> AllegraTxAuxData AllegraEra -> f (AllegraTxAuxData AllegraEra)
forall era.
Era era =>
Lens' (AllegraTxAuxData era) (Map Word64 Metadatum)
Lens' (AllegraTxAuxData AllegraEra) (Map Word64 Metadatum)
metadataAllegraTxAuxDataL

  upgradeTxAuxData :: EraTxAuxData (PreviousEra AllegraEra) =>
TxAuxData (PreviousEra AllegraEra) -> TxAuxData AllegraEra
upgradeTxAuxData (ShelleyTxAuxData Map Word64 Metadatum
md) = Map Word64 Metadatum
-> StrictSeq (Timelock AllegraEra) -> AllegraTxAuxData AllegraEra
forall era.
Era era =>
Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxData era
AllegraTxAuxData Map Word64 Metadatum
md StrictSeq (Timelock AllegraEra)
forall a. Monoid a => a
mempty

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

metadataAllegraTxAuxDataL ::
  forall era. Era era => Lens' (AllegraTxAuxData era) (Map Word64 Metadatum)
metadataAllegraTxAuxDataL :: forall era.
Era era =>
Lens' (AllegraTxAuxData era) (Map Word64 Metadatum)
metadataAllegraTxAuxDataL =
  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 @era RawType (AllegraTxAuxData era) -> Map Word64 Metadatum
AllegraTxAuxDataRaw era -> Map Word64 Metadatum
forall era. AllegraTxAuxDataRaw era -> Map Word64 Metadatum
atadrMetadata ((RawType (AllegraTxAuxData era)
  -> Map Word64 Metadatum -> RawType (AllegraTxAuxData era))
 -> forall {f :: * -> *}.
    Functor f =>
    (Map Word64 Metadatum -> f (Map Word64 Metadatum))
    -> AllegraTxAuxData era -> f (AllegraTxAuxData era))
-> (RawType (AllegraTxAuxData era)
    -> Map Word64 Metadatum -> RawType (AllegraTxAuxData era))
-> forall {f :: * -> *}.
   Functor f =>
   (Map Word64 Metadatum -> f (Map Word64 Metadatum))
   -> AllegraTxAuxData era -> f (AllegraTxAuxData era)
forall a b. (a -> b) -> a -> b
$
    \RawType (AllegraTxAuxData era)
txAuxDataRaw Map Word64 Metadatum
md -> RawType (AllegraTxAuxData era)
txAuxDataRaw {atadrMetadata = md}

instance AllegraEraTxAuxData AllegraEra where
  timelockScriptsTxAuxDataL :: Lens' (TxAuxData AllegraEra) (StrictSeq (Timelock AllegraEra))
timelockScriptsTxAuxDataL = (StrictSeq (Timelock AllegraEra)
 -> f (StrictSeq (Timelock AllegraEra)))
-> TxAuxData AllegraEra -> f (TxAuxData AllegraEra)
(StrictSeq (Timelock AllegraEra)
 -> f (StrictSeq (Timelock AllegraEra)))
-> AllegraTxAuxData AllegraEra -> f (AllegraTxAuxData AllegraEra)
forall era.
Era era =>
Lens' (AllegraTxAuxData era) (StrictSeq (Timelock era))
Lens'
  (AllegraTxAuxData AllegraEra) (StrictSeq (Timelock AllegraEra))
timelockScriptsAllegraTxAuxDataL

timelockScriptsAllegraTxAuxDataL ::
  forall era.
  Era era =>
  Lens' (AllegraTxAuxData era) (StrictSeq (Timelock era))
timelockScriptsAllegraTxAuxDataL :: forall era.
Era era =>
Lens' (AllegraTxAuxData era) (StrictSeq (Timelock era))
timelockScriptsAllegraTxAuxDataL =
  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 @era RawType (AllegraTxAuxData era) -> StrictSeq (Timelock era)
AllegraTxAuxDataRaw era -> StrictSeq (Timelock era)
forall era. AllegraTxAuxDataRaw era -> StrictSeq (Timelock era)
atadrTimelock ((RawType (AllegraTxAuxData era)
  -> StrictSeq (Timelock era) -> RawType (AllegraTxAuxData era))
 -> forall {f :: * -> *}.
    Functor f =>
    (StrictSeq (Timelock era) -> f (StrictSeq (Timelock era)))
    -> AllegraTxAuxData era -> f (AllegraTxAuxData era))
-> (RawType (AllegraTxAuxData era)
    -> StrictSeq (Timelock era) -> RawType (AllegraTxAuxData era))
-> forall {f :: * -> *}.
   Functor f =>
   (StrictSeq (Timelock era) -> f (StrictSeq (Timelock era)))
   -> AllegraTxAuxData era -> f (AllegraTxAuxData era)
forall a b. (a -> b) -> a -> b
$
    \RawType (AllegraTxAuxData era)
txAuxDataRaw StrictSeq (Timelock era)
ts -> RawType (AllegraTxAuxData era)
txAuxDataRaw {atadrTimelock = ts}

deriving instance Show (AllegraTxAuxDataRaw era)

deriving instance Era era => NoThunks (AllegraTxAuxDataRaw era)

instance NFData (AllegraTxAuxDataRaw era)

newtype AllegraTxAuxData era = MkAlegraTxAuxData (MemoBytes (AllegraTxAuxDataRaw era))
  deriving ((forall x. AllegraTxAuxData era -> Rep (AllegraTxAuxData era) x)
-> (forall x. Rep (AllegraTxAuxData era) x -> AllegraTxAuxData era)
-> Generic (AllegraTxAuxData era)
forall x. Rep (AllegraTxAuxData era) x -> AllegraTxAuxData era
forall x. AllegraTxAuxData era -> Rep (AllegraTxAuxData era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x. Rep (AllegraTxAuxData era) x -> AllegraTxAuxData era
forall era x. AllegraTxAuxData era -> Rep (AllegraTxAuxData era) x
$cfrom :: forall era x. AllegraTxAuxData era -> Rep (AllegraTxAuxData era) x
from :: forall x. AllegraTxAuxData era -> Rep (AllegraTxAuxData era) x
$cto :: forall era x. Rep (AllegraTxAuxData era) x -> AllegraTxAuxData era
to :: forall x. Rep (AllegraTxAuxData era) x -> AllegraTxAuxData era
Generic)
  deriving newtype (AllegraTxAuxData era -> AllegraTxAuxData era -> Bool
(AllegraTxAuxData era -> AllegraTxAuxData era -> Bool)
-> (AllegraTxAuxData era -> AllegraTxAuxData era -> Bool)
-> Eq (AllegraTxAuxData era)
forall era. AllegraTxAuxData era -> AllegraTxAuxData era -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall era. AllegraTxAuxData era -> AllegraTxAuxData era -> Bool
== :: AllegraTxAuxData era -> AllegraTxAuxData era -> Bool
$c/= :: forall era. AllegraTxAuxData era -> AllegraTxAuxData era -> Bool
/= :: AllegraTxAuxData era -> AllegraTxAuxData era -> Bool
Eq, Typeable (AllegraTxAuxData era)
Typeable (AllegraTxAuxData era) =>
(AllegraTxAuxData era -> Encoding)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy (AllegraTxAuxData era) -> Size)
-> ((forall t. ToCBOR t => Proxy t -> Size)
    -> Proxy [AllegraTxAuxData era] -> Size)
-> ToCBOR (AllegraTxAuxData era)
AllegraTxAuxData era -> Encoding
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [AllegraTxAuxData era] -> Size
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (AllegraTxAuxData era) -> Size
forall era. Typeable era => Typeable (AllegraTxAuxData era)
forall era. Typeable era => AllegraTxAuxData 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 [AllegraTxAuxData era] -> Size
forall era.
Typeable era =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (AllegraTxAuxData era) -> Size
$ctoCBOR :: forall era. Typeable era => AllegraTxAuxData era -> Encoding
toCBOR :: AllegraTxAuxData era -> Encoding
$cencodedSizeExpr :: forall era.
Typeable era =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (AllegraTxAuxData era) -> Size
encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy (AllegraTxAuxData era) -> Size
$cencodedListSizeExpr :: forall era.
Typeable era =>
(forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [AllegraTxAuxData era] -> Size
encodedListSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size)
-> Proxy [AllegraTxAuxData era] -> Size
ToCBOR, AllegraTxAuxData era -> Int
AllegraTxAuxData era -> ByteString
(AllegraTxAuxData era -> ByteString)
-> (AllegraTxAuxData era -> Int)
-> (forall i. Proxy i -> AllegraTxAuxData era -> SafeHash i)
-> SafeToHash (AllegraTxAuxData era)
forall i. Proxy i -> AllegraTxAuxData era -> SafeHash i
forall era. AllegraTxAuxData era -> Int
forall era. AllegraTxAuxData era -> ByteString
forall t.
(t -> ByteString)
-> (t -> Int)
-> (forall i. Proxy i -> t -> SafeHash i)
-> SafeToHash t
forall era i. Proxy i -> AllegraTxAuxData era -> SafeHash i
$coriginalBytes :: forall era. AllegraTxAuxData era -> ByteString
originalBytes :: AllegraTxAuxData era -> ByteString
$coriginalBytesSize :: forall era. AllegraTxAuxData era -> Int
originalBytesSize :: AllegraTxAuxData era -> Int
$cmakeHashWithExplicitProxys :: forall era i. Proxy i -> AllegraTxAuxData era -> SafeHash i
makeHashWithExplicitProxys :: forall i. Proxy i -> AllegraTxAuxData era -> SafeHash i
SafeToHash, Typeable (AllegraTxAuxData era)
Typeable (AllegraTxAuxData era) =>
(forall s. Decoder s (AllegraTxAuxData era))
-> (forall s. Proxy (AllegraTxAuxData era) -> Decoder s ())
-> (Proxy (AllegraTxAuxData era) -> Text)
-> DecCBOR (AllegraTxAuxData era)
Proxy (AllegraTxAuxData era) -> Text
forall s. Decoder s (AllegraTxAuxData era)
forall a.
Typeable a =>
(forall s. Decoder s a)
-> (forall s. Proxy a -> Decoder s ())
-> (Proxy a -> Text)
-> DecCBOR a
forall s. Proxy (AllegraTxAuxData era) -> Decoder s ()
forall era. Era era => Typeable (AllegraTxAuxData era)
forall era. Era era => Proxy (AllegraTxAuxData era) -> Text
forall era s. Era era => Decoder s (AllegraTxAuxData era)
forall era s.
Era era =>
Proxy (AllegraTxAuxData era) -> Decoder s ()
$cdecCBOR :: forall era s. Era era => Decoder s (AllegraTxAuxData era)
decCBOR :: forall s. Decoder s (AllegraTxAuxData era)
$cdropCBOR :: forall era s.
Era era =>
Proxy (AllegraTxAuxData era) -> Decoder s ()
dropCBOR :: forall s. Proxy (AllegraTxAuxData era) -> Decoder s ()
$clabel :: forall era. Era era => Proxy (AllegraTxAuxData era) -> Text
label :: Proxy (AllegraTxAuxData era) -> Text
DecCBOR)

instance Memoized (AllegraTxAuxData era) where
  type RawType (AllegraTxAuxData era) = AllegraTxAuxDataRaw era

type instance MemoHashIndex (AllegraTxAuxDataRaw era) = EraIndependentTxAuxData

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

deriving newtype instance Show (AllegraTxAuxData era)

deriving newtype instance Era era => NoThunks (AllegraTxAuxData era)

deriving newtype instance NFData (AllegraTxAuxData era)

instance EqRaw (AllegraTxAuxData era)

pattern AllegraTxAuxData ::
  forall era.
  Era era =>
  Map Word64 Metadatum ->
  StrictSeq (Timelock era) ->
  AllegraTxAuxData era
pattern $mAllegraTxAuxData :: forall {r} {era}.
Era era =>
AllegraTxAuxData era
-> (Map Word64 Metadatum -> StrictSeq (Timelock era) -> r)
-> ((# #) -> r)
-> r
$bAllegraTxAuxData :: forall era.
Era era =>
Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxData era
AllegraTxAuxData blob sp <- (getMemoRawType -> AllegraTxAuxDataRaw blob sp)
  where
    AllegraTxAuxData Map Word64 Metadatum
blob StrictSeq (Timelock era)
sp = forall era t.
(Era era, EncCBOR (RawType t), Memoized t) =>
RawType t -> t
mkMemoizedEra @era (RawType (AllegraTxAuxData era) -> AllegraTxAuxData era)
-> RawType (AllegraTxAuxData era) -> AllegraTxAuxData era
forall a b. (a -> b) -> a -> b
$ Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era
forall era.
Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era
AllegraTxAuxDataRaw Map Word64 Metadatum
blob StrictSeq (Timelock era)
sp

{-# COMPLETE AllegraTxAuxData #-}

--------------------------------------------------------------------------------
-- Serialisation
--------------------------------------------------------------------------------

instance Era era => EncCBOR (AllegraTxAuxDataRaw era) where
  encCBOR :: AllegraTxAuxDataRaw era -> Encoding
encCBOR (AllegraTxAuxDataRaw Map Word64 Metadatum
blob StrictSeq (Timelock era)
sp) =
    Encode ('Closed 'Dense) (AllegraTxAuxDataRaw era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode ((Map Word64 Metadatum
 -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Encode
     ('Closed 'Dense)
     (Map Word64 Metadatum
      -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
forall t. t -> Encode ('Closed 'Dense) t
Rec Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era
forall era.
Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era
AllegraTxAuxDataRaw Encode
  ('Closed 'Dense)
  (Map Word64 Metadatum
   -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Encode ('Closed 'Dense) (Map Word64 Metadatum)
-> Encode
     ('Closed 'Dense)
     (StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> Map Word64 Metadatum
-> Encode ('Closed 'Dense) (Map Word64 Metadatum)
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To Map Word64 Metadatum
blob Encode
  ('Closed 'Dense)
  (StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Encode ('Closed 'Dense) (StrictSeq (Timelock era))
-> Encode ('Closed 'Dense) (AllegraTxAuxDataRaw era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode ('Closed r) a -> Encode w t
!> StrictSeq (Timelock era)
-> Encode ('Closed 'Dense) (StrictSeq (Timelock era))
forall t. EncCBOR t => t -> Encode ('Closed 'Dense) t
To StrictSeq (Timelock era)
sp)

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

instance Era era => DecCBOR (AllegraTxAuxDataRaw era) where
  decCBOR :: forall s. Decoder s (AllegraTxAuxDataRaw era)
decCBOR =
    Decoder s TokenType
forall s. Decoder s TokenType
peekTokenType Decoder s TokenType
-> (TokenType -> Decoder s (AllegraTxAuxDataRaw era))
-> Decoder s (AllegraTxAuxDataRaw era)
forall a b. Decoder s a -> (a -> Decoder s b) -> Decoder s b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      TokenType
TypeMapLen -> Decoder s (AllegraTxAuxDataRaw era)
forall s. Decoder s (AllegraTxAuxDataRaw era)
decodeFromMap
      TokenType
TypeMapLen64 -> Decoder s (AllegraTxAuxDataRaw era)
forall s. Decoder s (AllegraTxAuxDataRaw era)
decodeFromMap
      TokenType
TypeMapLenIndef -> Decoder s (AllegraTxAuxDataRaw era)
forall s. Decoder s (AllegraTxAuxDataRaw era)
decodeFromMap
      TokenType
TypeListLen -> Decoder s (AllegraTxAuxDataRaw era)
forall s. Decoder s (AllegraTxAuxDataRaw era)
decodeFromList
      TokenType
TypeListLen64 -> Decoder s (AllegraTxAuxDataRaw era)
forall s. Decoder s (AllegraTxAuxDataRaw era)
decodeFromList
      TokenType
TypeListLenIndef -> Decoder s (AllegraTxAuxDataRaw era)
forall s. Decoder s (AllegraTxAuxDataRaw era)
decodeFromList
      TokenType
_ -> String -> Decoder s (AllegraTxAuxDataRaw era)
forall a. String -> Decoder s a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Failed to decode AuxiliaryDataRaw"
    where
      decodeFromMap :: Decoder s (AllegraTxAuxDataRaw era)
decodeFromMap =
        Decode Any (AllegraTxAuxDataRaw era)
-> Decoder s (AllegraTxAuxDataRaw era)
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode
          ( (Map Word64 Metadatum
 -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Decode
     Any
     (Map Word64 Metadatum
      -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
forall t (w :: Wrapped). t -> Decode w t
Emit Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era
forall era.
Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era
AllegraTxAuxDataRaw
              Decode
  Any
  (Map Word64 Metadatum
   -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Decode ('Closed Any) (Map Word64 Metadatum)
-> Decode Any (StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) (Map Word64 Metadatum)
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
              Decode Any (StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Decode ('Closed Any) (StrictSeq (Timelock era))
-> Decode Any (AllegraTxAuxDataRaw era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! StrictSeq (Timelock era)
-> Decode ('Closed Any) (StrictSeq (Timelock era))
forall t (w :: Wrapped). t -> Decode w t
Emit StrictSeq (Timelock era)
forall a. StrictSeq a
StrictSeq.empty
          )
      decodeFromList :: Decoder s (AllegraTxAuxDataRaw era)
decodeFromList =
        Decode ('Closed 'Dense) (AllegraTxAuxDataRaw era)
-> Decoder s (AllegraTxAuxDataRaw era)
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode
          ( (Map Word64 Metadatum
 -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Decode
     ('Closed 'Dense)
     (Map Word64 Metadatum
      -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
forall t. t -> Decode ('Closed 'Dense) t
RecD Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era
forall era.
Map Word64 Metadatum
-> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era
AllegraTxAuxDataRaw
              Decode
  ('Closed 'Dense)
  (Map Word64 Metadatum
   -> StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Decode ('Closed Any) (Map Word64 Metadatum)
-> Decode
     ('Closed 'Dense)
     (StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) (Map Word64 Metadatum)
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
              Decode
  ('Closed 'Dense)
  (StrictSeq (Timelock era) -> AllegraTxAuxDataRaw era)
-> Decode ('Closed Any) (StrictSeq (Timelock era))
-> Decode ('Closed 'Dense) (AllegraTxAuxDataRaw era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode ('Closed w) a -> Decode w1 t
<! Decode ('Closed Any) (StrictSeq (Timelock era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
          )