-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Shelley ledger with multiasset and time lock support.
--   
--   This package extends the Shelley ledger with support for native tokens
--   and timelocks.
@package cardano-ledger-shelley-ma
@version 0.1.0.0

module Cardano.Ledger.Mary.Value

-- | Policy ID
newtype PolicyID crypto
PolicyID :: ScriptHash crypto -> PolicyID crypto
[policyID] :: PolicyID crypto -> ScriptHash crypto

-- | Asset Name
newtype AssetName
AssetName :: ByteString -> AssetName
[assetName] :: AssetName -> ByteString

-- | The Value representing MultiAssets
data Value crypto
Value :: !Integer -> !Map (PolicyID crypto) (Map AssetName Integer) -> Value crypto

-- | insert comb policy asset n v, if comb = old new -&gt; old, the integer
--   in the Value is prefered over n if comb = old new -&gt; new, then n is
--   prefered over the integer in the Value if (comb old new) == 0, then
--   that value should not be stored in the Map part of the Value.
insert :: (Integer -> Integer -> Integer) -> PolicyID crypto -> AssetName -> Integer -> Value crypto -> Value crypto
lookup :: PolicyID crypto -> AssetName -> Value crypto -> Integer

-- | Extract the set of policies in the Value.
--   
--   This function is equivalent to computing the support of the value in
--   the spec.
policies :: Value crypto -> Set (PolicyID crypto)

-- | Remove 0 assets from a map
prune :: Map (PolicyID crypto) (Map AssetName Integer) -> Map (PolicyID crypto) (Map AssetName Integer)

-- | Display a Value as a String, one token per line
showValue :: Value crypto -> String

-- | Rather than using prune to remove 0 assets, when can avoid adding them
--   in the first place by using valueFromList to construct a Value.
valueFromList :: Integer -> [(PolicyID era, AssetName, Integer)] -> Value era
instance Control.DeepSeq.NFData Cardano.Ledger.Mary.Value.AssetName
instance NoThunks.Class.NoThunks Cardano.Ledger.Mary.Value.AssetName
instance GHC.Classes.Ord Cardano.Ledger.Mary.Value.AssetName
instance Cardano.Binary.FromCBOR.FromCBOR Cardano.Ledger.Mary.Value.AssetName
instance Cardano.Binary.ToCBOR.ToCBOR Cardano.Ledger.Mary.Value.AssetName
instance GHC.Classes.Eq Cardano.Ledger.Mary.Value.AssetName
instance GHC.Show.Show Cardano.Ledger.Mary.Value.AssetName
instance Control.DeepSeq.NFData (Cardano.Ledger.Mary.Value.PolicyID crypto)
instance NoThunks.Class.NoThunks (Cardano.Ledger.Mary.Value.PolicyID crypto)
instance GHC.Classes.Ord (Cardano.Ledger.Mary.Value.PolicyID crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Ledger.Mary.Value.PolicyID crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.ToCBOR.ToCBOR (Cardano.Ledger.Mary.Value.PolicyID crypto)
instance GHC.Classes.Eq (Cardano.Ledger.Mary.Value.PolicyID crypto)
instance GHC.Show.Show (Cardano.Ledger.Mary.Value.PolicyID crypto)
instance GHC.Generics.Generic (Cardano.Ledger.Mary.Value.Value crypto)
instance GHC.Show.Show (Cardano.Ledger.Mary.Value.Value crypto)
instance GHC.Show.Show (Cardano.Ledger.Mary.Value.CVPart crypto)
instance GHC.Classes.Eq (Cardano.Ledger.Mary.Value.CVPart crypto)
instance GHC.Show.Show (Cardano.Ledger.Mary.Value.CV crypto)
instance GHC.Classes.Eq (Cardano.Ledger.Mary.Value.CV crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Ledger.Compactible.CompactForm (Cardano.Ledger.Mary.Value.Value crypto))
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.ToCBOR.ToCBOR (Cardano.Ledger.Compactible.CompactForm (Cardano.Ledger.Mary.Value.Value crypto))
instance GHC.Show.Show (Cardano.Ledger.Compactible.CompactForm (Cardano.Ledger.Mary.Value.Value crypto))
instance GHC.Classes.Eq (Cardano.Ledger.Compactible.CompactForm (Cardano.Ledger.Mary.Value.Value crypto))
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Ledger.Compactible.Compactible (Cardano.Ledger.Mary.Value.Value crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.ToCBOR.ToCBOR (Cardano.Ledger.Mary.Value.CV crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Ledger.Mary.Value.CV crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => GHC.Classes.Eq (Cardano.Ledger.Mary.Value.Value crypto)
instance Control.DeepSeq.NFData (Cardano.Ledger.Mary.Value.Value crypto)
instance NoThunks.Class.NoThunks (Cardano.Ledger.Mary.Value.Value crypto)
instance GHC.Base.Semigroup (Cardano.Ledger.Mary.Value.Value crypto)
instance GHC.Base.Monoid (Cardano.Ledger.Mary.Value.Value crypto)
instance Data.Group.Group (Cardano.Ledger.Mary.Value.Value crypto)
instance Data.Group.Abelian (Cardano.Ledger.Mary.Value.Value crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Ledger.Val.Val (Cardano.Ledger.Mary.Value.Value crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.ToCBOR.ToCBOR (Cardano.Ledger.Mary.Value.Value crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Ledger.Mary.Value.Value crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Ledger.Val.DecodeNonNegative (Cardano.Ledger.Mary.Value.Value crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Ledger.Val.DecodeMint (Cardano.Ledger.Mary.Value.Value crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Ledger.Val.EncodeMint (Cardano.Ledger.Mary.Value.Value crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Ledger.Torsor.Torsor (Cardano.Ledger.Mary.Value.Value crypto)

module Cardano.Ledger.ShelleyMA.AuxiliaryData
newtype AuxiliaryData era
AuxiliaryDataWithBytes :: MemoBytes (AuxiliaryDataRaw era) -> AuxiliaryData era
pattern AuxiliaryData :: (AnnotatedData (Script era), Ord (Script era)) => Map Word64 Metadatum -> StrictSeq (Script era) -> AuxiliaryData era
instance GHC.Generics.Generic (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryDataRaw era)
instance Data.Typeable.Internal.Typeable era => Cardano.Binary.ToCBOR.ToCBOR (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryData era)
instance GHC.Generics.Generic (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryData era)
instance Cardano.Ledger.Core.ChainData (Cardano.Ledger.Core.Script era) => GHC.Classes.Eq (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryDataRaw era)
instance Cardano.Ledger.Core.ChainData (Cardano.Ledger.Core.Script era) => GHC.Show.Show (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryDataRaw era)
instance Cardano.Ledger.Core.ChainData (Cardano.Ledger.Core.Script era) => NoThunks.Class.NoThunks (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryDataRaw era)
instance (Cardano.Ledger.Era.Era era, Cardano.Ledger.Core.ChainData (Cardano.Ledger.Core.Script era)) => GHC.Classes.Eq (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryData era)
instance (Cardano.Ledger.Era.Era era, Cardano.Ledger.Core.ChainData (Cardano.Ledger.Core.Script era)) => GHC.Show.Show (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryData era)
instance (Cardano.Ledger.Era.Era era, Cardano.Ledger.Core.ChainData (Cardano.Ledger.Core.Script era)) => NoThunks.Class.NoThunks (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryData era)
instance (Cardano.Ledger.Era.Era era, Cardano.Ledger.Core.AnnotatedData (Cardano.Ledger.Core.Script era)) => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Binary.Annotated.Annotator (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryData era))
instance (Cardano.Ledger.Era.Era era, Cardano.Ledger.Core.AnnotatedData (Cardano.Ledger.Core.Script era)) => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Binary.Annotated.Annotator (Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryDataRaw era))

module Cardano.Ledger.ShelleyMA.Timelocks
data Timelock crypto
pattern RequireSignature :: Crypto crypto => KeyHash 'Witness crypto -> Timelock crypto
pattern RequireAllOf :: Crypto crypto => StrictSeq (Timelock crypto) -> Timelock crypto
pattern RequireAnyOf :: Crypto crypto => StrictSeq (Timelock crypto) -> Timelock crypto
pattern RequireMOf :: Crypto crypto => Int -> StrictSeq (Timelock crypto) -> Timelock crypto
pattern RequireTimeExpire :: Crypto crypto => SlotNo -> Timelock crypto
pattern RequireTimeStart :: Crypto crypto => SlotNo -> Timelock crypto
pattern TimelockConstr :: () => MemoBytes (TimelockRaw crypto) -> Timelock crypto

-- | Test if a slot is in the Validity interval. Recall that a
--   ValidityInterval is a half Open interval, that is why we use (slot
--   &lt; top)
inInterval :: SlotNo -> ValidityInterval -> Bool

-- | Hashes native timelock script.
hashTimelockScript :: Crypto crypto => Timelock crypto -> ScriptHash crypto
showTimelock :: Crypto crypto => Timelock crypto -> String
validateTimelock :: forall era. (TxBodyConstraints era, HasField "vldt" (TxBody era) ValidityInterval, ToCBOR (AuxiliaryData era)) => Timelock (Crypto era) -> Tx era -> Bool

-- | ValidityInterval is a half open interval. Closed on the bottom, Open
--   on the top. A SNothing on the bottom is negative infinity, and a
--   SNothing on the top is positive infinity
data ValidityInterval
ValidityInterval :: !StrictMaybe SlotNo -> !StrictMaybe SlotNo -> ValidityInterval
[invalidBefore] :: ValidityInterval -> !StrictMaybe SlotNo
[invalidHereafter] :: ValidityInterval -> !StrictMaybe SlotNo
encodeVI :: ValidityInterval -> Encode ('Closed 'Dense) ValidityInterval
decodeVI :: Decode ('Closed 'Dense) ValidityInterval
translate :: Crypto crypto => MultiSig crypto -> Timelock crypto
instance Control.DeepSeq.NFData Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval
instance NoThunks.Class.NoThunks Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval
instance GHC.Show.Show Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval
instance GHC.Generics.Generic Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval
instance GHC.Classes.Eq Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval
instance GHC.Classes.Ord Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval
instance Control.DeepSeq.NFData (Cardano.Ledger.ShelleyMA.Timelocks.TimelockRaw crypto)
instance GHC.Generics.Generic (Cardano.Ledger.ShelleyMA.Timelocks.TimelockRaw crypto)
instance GHC.Classes.Ord (Cardano.Ledger.ShelleyMA.Timelocks.TimelockRaw crypto)
instance GHC.Show.Show (Cardano.Ledger.ShelleyMA.Timelocks.TimelockRaw crypto)
instance GHC.Classes.Eq (Cardano.Ledger.ShelleyMA.Timelocks.TimelockRaw crypto)
instance Control.DeepSeq.NFData (Cardano.Ledger.ShelleyMA.Timelocks.Timelock crypto)
instance Data.Typeable.Internal.Typeable crypto => NoThunks.Class.NoThunks (Cardano.Ledger.ShelleyMA.Timelocks.Timelock crypto)
instance Data.Typeable.Internal.Typeable crypto => Cardano.Binary.ToCBOR.ToCBOR (Cardano.Ledger.ShelleyMA.Timelocks.Timelock crypto)
instance GHC.Generics.Generic (Cardano.Ledger.ShelleyMA.Timelocks.Timelock crypto)
instance GHC.Show.Show (Cardano.Ledger.ShelleyMA.Timelocks.Timelock crypto)
instance GHC.Classes.Ord (Cardano.Ledger.ShelleyMA.Timelocks.Timelock crypto)
instance GHC.Classes.Eq (Cardano.Ledger.ShelleyMA.Timelocks.Timelock crypto)
instance Data.Typeable.Internal.Typeable crypto => NoThunks.Class.NoThunks (Cardano.Ledger.ShelleyMA.Timelocks.TimelockRaw crypto)
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Binary.Annotated.Annotator (Cardano.Ledger.ShelleyMA.Timelocks.Timelock crypto))
instance Cardano.Ledger.Crypto.Crypto crypto => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Binary.Annotated.Annotator (Cardano.Ledger.ShelleyMA.Timelocks.TimelockRaw crypto))
instance Cardano.Binary.ToCBOR.ToCBOR Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval
instance Cardano.Binary.FromCBOR.FromCBOR Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval

module Cardano.Ledger.ShelleyMA.TxBody
newtype TxBody e
TxBodyConstr :: MemoBytes (TxBodyRaw e) -> TxBody e
pattern TxBody :: (Val (Value era), FamsTo era) => Set (TxIn (Crypto era)) -> StrictSeq (TxOut era) -> StrictSeq (DCert (Crypto era)) -> Wdrl (Crypto era) -> Coin -> ValidityInterval -> StrictMaybe (Update era) -> StrictMaybe (AuxiliaryDataHash (Crypto era)) -> Value era -> TxBody era
data TxBodyRaw era
TxBodyRaw :: !Set (TxIn (Crypto era)) -> !StrictSeq (TxOut era) -> !StrictSeq (DCert (Crypto era)) -> !Wdrl (Crypto era) -> !Coin -> !ValidityInterval -> !StrictMaybe (Update era) -> !StrictMaybe (AuxiliaryDataHash (Crypto era)) -> !Value era -> TxBodyRaw era
[inputs] :: TxBodyRaw era -> !Set (TxIn (Crypto era))
[outputs] :: TxBodyRaw era -> !StrictSeq (TxOut era)
[certs] :: TxBodyRaw era -> !StrictSeq (DCert (Crypto era))
[wdrls] :: TxBodyRaw era -> !Wdrl (Crypto era)
[txfee] :: TxBodyRaw era -> !Coin
[vldt] :: TxBodyRaw era -> !ValidityInterval
[update] :: TxBodyRaw era -> !StrictMaybe (Update era)
[adHash] :: TxBodyRaw era -> !StrictMaybe (AuxiliaryDataHash (Crypto era))
[mint] :: TxBodyRaw era -> !Value era
type FamsFrom era = (Era era, Typeable era, Typeable (Script era), Typeable (AuxiliaryData era), Show (Value era), Compactible (Value era), DecodeNonNegative (Value era), DecodeMint (Value era), FromCBOR (CompactForm (Value era)), FromCBOR (Value era), FromCBOR (Annotator (Script era)))
type FamsTo era = (Era era, ToCBOR (Value era), Compactible (Value era), EncodeMint (Value era), ToCBOR (CompactForm (Value era)), ToCBOR (Script era), Typeable (AuxiliaryData era))
txSparse :: (Val (Value era), FamsTo era) => TxBodyRaw era -> Encode ('Closed 'Sparse) (TxBodyRaw era)
bodyFields :: FamsFrom era => Word -> Field (TxBodyRaw era)

-- | Strict <a>Maybe</a>.
--   
--   TODO move to <tt>cardano-prelude</tt>
data StrictMaybe a
SNothing :: StrictMaybe a
SJust :: !a -> StrictMaybe a
isSNothing :: StrictMaybe a -> Bool
fromSJust :: StrictMaybe a -> a

-- | ValidityInterval is a half open interval. Closed on the bottom, Open
--   on the top. A SNothing on the bottom is negative infinity, and a
--   SNothing on the top is positive infinity
data ValidityInterval
ValidityInterval :: !StrictMaybe SlotNo -> !StrictMaybe SlotNo -> ValidityInterval
[invalidBefore] :: ValidityInterval -> !StrictMaybe SlotNo
[invalidHereafter] :: ValidityInterval -> !StrictMaybe SlotNo
initial :: Val (Value era) => TxBodyRaw era
instance (Control.DeepSeq.NFData (Cardano.Ledger.Core.Value era), Cardano.Ledger.Era.Era era) => Control.DeepSeq.NFData (Cardano.Ledger.ShelleyMA.TxBody.TxBodyRaw era)
instance (Cardano.Ledger.Compactible.Compactible (Cardano.Ledger.Core.Value era), GHC.Classes.Eq (Cardano.Ledger.Core.Value era), GHC.Classes.Eq (Cardano.Ledger.Compactible.CompactForm (Cardano.Ledger.Core.Value era))) => GHC.Classes.Eq (Cardano.Ledger.ShelleyMA.TxBody.TxBodyRaw era)
instance (Cardano.Ledger.Era.Era era, Cardano.Ledger.Compactible.Compactible (Cardano.Ledger.Core.Value era), GHC.Show.Show (Cardano.Ledger.Core.Value era)) => GHC.Show.Show (Cardano.Ledger.ShelleyMA.TxBody.TxBodyRaw era)
instance GHC.Generics.Generic (Cardano.Ledger.ShelleyMA.TxBody.TxBodyRaw era)
instance NoThunks.Class.NoThunks (Cardano.Ledger.Core.Value era) => NoThunks.Class.NoThunks (Cardano.Ledger.ShelleyMA.TxBody.TxBodyRaw era)
instance (Cardano.Ledger.Compactible.Compactible (Cardano.Ledger.Core.Value era), GHC.Classes.Eq (Cardano.Ledger.Core.Value era), GHC.Classes.Eq (Cardano.Ledger.Compactible.CompactForm (Cardano.Ledger.Core.Value era))) => GHC.Classes.Eq (Cardano.Ledger.ShelleyMA.TxBody.TxBody era)
instance (Cardano.Ledger.Era.Era era, Cardano.Ledger.Compactible.Compactible (Cardano.Ledger.Core.Value era), GHC.Show.Show (Cardano.Ledger.Core.Value era)) => GHC.Show.Show (Cardano.Ledger.ShelleyMA.TxBody.TxBody era)
instance GHC.Generics.Generic (Cardano.Ledger.ShelleyMA.TxBody.TxBody era)
instance (Data.Typeable.Internal.Typeable era, NoThunks.Class.NoThunks (Cardano.Ledger.Core.Value era)) => NoThunks.Class.NoThunks (Cardano.Ledger.ShelleyMA.TxBody.TxBody era)
instance (Control.DeepSeq.NFData (Cardano.Ledger.Core.Value era), Cardano.Ledger.Era.Era era) => Control.DeepSeq.NFData (Cardano.Ledger.ShelleyMA.TxBody.TxBody era)
instance Data.Typeable.Internal.Typeable era => Cardano.Binary.ToCBOR.ToCBOR (Cardano.Ledger.ShelleyMA.TxBody.TxBody era)
instance (Cardano.Ledger.Val.Val (Cardano.Ledger.Core.Value era), Cardano.Ledger.ShelleyMA.TxBody.FamsFrom era) => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Binary.Annotated.Annotator (Cardano.Ledger.ShelleyMA.TxBody.TxBody era))
instance Cardano.Ledger.Era.Era era => Shelley.Spec.Ledger.Hashing.HashAnnotated (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) era
instance (Cardano.Ledger.Era.Crypto era GHC.Types.~ crypto) => GHC.Records.HasField "inputs" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) (Data.Set.Internal.Set (Shelley.Spec.Ledger.TxBody.TxIn crypto))
instance GHC.Records.HasField "outputs" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) (Data.Sequence.Strict.StrictSeq (Shelley.Spec.Ledger.TxBody.TxOut era))
instance (Cardano.Ledger.Era.Crypto era GHC.Types.~ crypto) => GHC.Records.HasField "certs" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) (Data.Sequence.Strict.StrictSeq (Shelley.Spec.Ledger.TxBody.DCert crypto))
instance (Cardano.Ledger.Era.Crypto era GHC.Types.~ crypto) => GHC.Records.HasField "wdrls" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) (Shelley.Spec.Ledger.TxBody.Wdrl crypto)
instance GHC.Records.HasField "txfee" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) Shelley.Spec.Ledger.Coin.Coin
instance GHC.Records.HasField "vldt" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval
instance GHC.Records.HasField "update" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) (Shelley.Spec.Ledger.BaseTypes.StrictMaybe (Shelley.Spec.Ledger.PParams.Update era))
instance (Cardano.Ledger.Era.Crypto era GHC.Types.~ crypto) => GHC.Records.HasField "adHash" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) (Shelley.Spec.Ledger.BaseTypes.StrictMaybe (Cardano.Ledger.AuxiliaryData.AuxiliaryDataHash crypto))
instance (Cardano.Ledger.Core.Value era GHC.Types.~ value) => GHC.Records.HasField "mint" (Cardano.Ledger.ShelleyMA.TxBody.TxBody era) value
instance (Cardano.Ledger.Val.Val (Cardano.Ledger.Core.Value era), Cardano.Ledger.ShelleyMA.TxBody.FamsFrom era) => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Ledger.ShelleyMA.TxBody.TxBodyRaw era)
instance (Cardano.Ledger.Val.Val (Cardano.Ledger.Core.Value era), Cardano.Ledger.ShelleyMA.TxBody.FamsFrom era) => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Binary.Annotated.Annotator (Cardano.Ledger.ShelleyMA.TxBody.TxBodyRaw era))

module Cardano.Ledger.ShelleyMA

-- | The Shelley Mary/Allegra eras
--   
--   Both eras are implemented within the same codebase, matching the
--   formal specification. They differ only in the <tt>value</tt> type. Due
--   to some annoying issues with <a>Coin</a> and <a>Value</a> being of
--   different kinds, we don't parametrise over the value but instead over
--   a closed kind <a>MaryOrAllegra</a>. But this should be transparent to
--   the user.
data ShelleyMAEra (ma :: MaryOrAllegra) c
data MaryOrAllegra
Mary :: MaryOrAllegra
Allegra :: MaryOrAllegra
type family MAValue (x :: MaryOrAllegra) c :: Type
instance (Data.Typeable.Internal.Typeable ma, Cardano.Ledger.Crypto.Crypto c) => Cardano.Ledger.Era.Era (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)
instance (Cardano.Ledger.Crypto.Crypto c, Data.Typeable.Internal.Typeable ma, Cardano.Ledger.Shelley.Constraints.TxBodyConstraints (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c), Cardano.Ledger.Core.AnnotatedData (Cardano.Ledger.Core.AuxiliaryData (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), GHC.Records.HasField "vldt" (Cardano.Ledger.Core.TxBody (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)) Cardano.Ledger.ShelleyMA.Timelocks.ValidityInterval) => Shelley.Spec.Ledger.Tx.ValidateScript (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)
instance (Cardano.Ledger.Crypto.Crypto c, Data.Typeable.Internal.Typeable ma, Cardano.Ledger.Core.AnnotatedData (Cardano.Ledger.Core.Script (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))) => Cardano.Ledger.AuxiliaryData.ValidateAuxiliaryData (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)

module Cardano.Ledger.ShelleyMA.Rules.Utxo
data UtxoPredicateFailure era
BadInputsUTxO :: !Set (TxIn (Crypto era)) -> UtxoPredicateFailure era
OutsideValidityIntervalUTxO :: !ValidityInterval -> !SlotNo -> UtxoPredicateFailure era
MaxTxSizeUTxO :: !Integer -> !Integer -> UtxoPredicateFailure era
InputSetEmptyUTxO :: UtxoPredicateFailure era
FeeTooSmallUTxO :: !Coin -> !Coin -> UtxoPredicateFailure era
ValueNotConservedUTxO :: !Delta (Value era) -> !Delta (Value era) -> UtxoPredicateFailure era
WrongNetwork :: !Network -> !Set (Addr (Crypto era)) -> UtxoPredicateFailure era
WrongNetworkWithdrawal :: !Network -> !Set (RewardAcnt (Crypto era)) -> UtxoPredicateFailure era
OutputTooSmallUTxO :: ![TxOut era] -> UtxoPredicateFailure era
UpdateFailure :: PredicateFailure (PPUP era) -> UtxoPredicateFailure era
OutputBootAddrAttrsTooBig :: ![TxOut era] -> UtxoPredicateFailure era
TriesToForgeADA :: UtxoPredicateFailure era

-- | Calculate the value consumed by the transation.
--   
--   This differs from the corresponding Shelley function
--   <tt>Shelley.consumed</tt> since it also considers the "mint" field
--   which creates or destroys non-Ada tokens.
--   
--   Note that this is slightly confusing, since it also covers non-Ada
--   assets _created_ by the transaction, depending on the sign of the
--   quantities in the mint field.
consumed :: forall era. (ShelleyBased era, HasField "certs" (TxBody era) (StrictSeq (DCert (Crypto era))), HasField "inputs" (TxBody era) (Set (TxIn (Crypto era))), HasField "mint" (TxBody era) (Value era), HasField "wdrls" (TxBody era) (Wdrl (Crypto era))) => PParams era -> UTxO era -> TxBody era -> Value era

-- | The UTxO transition rule for the Shelley-MA (Mary and Allegra) eras.
utxoTransition :: forall era. (ShelleyBased era, STS (UTXO era), Embed (PPUP era) (UTXO era), BaseM (UTXO era) ~ ShelleyBase, Environment (UTXO era) ~ UtxoEnv era, State (UTXO era) ~ UTxOState era, Signal (UTXO era) ~ Tx era, PredicateFailure (UTXO era) ~ UtxoPredicateFailure era, HasField "certs" (TxBody era) (StrictSeq (DCert (Crypto era))), HasField "inputs" (TxBody era) (Set (TxIn (Crypto era))), HasField "mint" (TxBody era) (Value era), HasField "outputs" (TxBody era) (StrictSeq (TxOut era)), HasField "wdrls" (TxBody era) (Wdrl (Crypto era)), HasField "txfee" (TxBody era) Coin, HasField "vldt" (TxBody era) ValidityInterval, HasField "update" (TxBody era) (StrictMaybe (Update era))) => TransitionRule (UTXO era)
instance GHC.Generics.Generic (Cardano.Ledger.ShelleyMA.Rules.Utxo.UtxoPredicateFailure era)
instance Cardano.Ledger.Shelley.Constraints.ShelleyBased era => GHC.Show.Show (Cardano.Ledger.ShelleyMA.Rules.Utxo.UtxoPredicateFailure era)
instance Cardano.Ledger.Shelley.Constraints.ShelleyBased era => GHC.Classes.Eq (Cardano.Ledger.ShelleyMA.Rules.Utxo.UtxoPredicateFailure era)
instance NoThunks.Class.NoThunks (Cardano.Ledger.Torsor.Delta (Cardano.Ledger.Core.Value era)) => NoThunks.Class.NoThunks (Cardano.Ledger.ShelleyMA.Rules.Utxo.UtxoPredicateFailure era)
instance (Cardano.Ledger.Crypto.Crypto c, Data.Typeable.Internal.Typeable ma, Cardano.Ledger.Shelley.Constraints.ShelleyBased (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c), Cardano.Ledger.Core.TxBody (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c) GHC.Types.~ Cardano.Ledger.ShelleyMA.TxBody.TxBody (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)) => Control.State.Transition.Extended.STS (Shelley.Spec.Ledger.STS.Utxo.UTXO (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))
instance (Cardano.Ledger.Crypto.Crypto c, Data.Typeable.Internal.Typeable ma) => Control.State.Transition.Extended.Embed (Shelley.Spec.Ledger.STS.Ppup.PPUP (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)) (Shelley.Spec.Ledger.STS.Utxo.UTXO (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))
instance Cardano.Ledger.Shelley.Constraints.ShelleyBased era => Cardano.Binary.ToCBOR.ToCBOR (Cardano.Ledger.ShelleyMA.Rules.Utxo.UtxoPredicateFailure era)
instance Cardano.Ledger.Shelley.Constraints.ShelleyBased era => Cardano.Binary.FromCBOR.FromCBOR (Cardano.Ledger.ShelleyMA.Rules.Utxo.UtxoPredicateFailure era)

module Cardano.Ledger.ShelleyMA.Rules.Utxow

-- | We want to reuse the same rules for Mary and Allegra. This however
--   relies on being able to get a set of <a>PolicyID</a>s from the value.
--   Since a <a>Coin</a> has no policies, we create a small class which
--   returns a null set of <a>PolicyID</a>s for <a>Coin</a>.
--   
--   This should not escape this module.
class GetPolicies a crypto
getPolicies :: GetPolicies a crypto => a -> Set (PolicyID crypto)

-- | Computes the set of script hashes required to unlock the transaction
--   inputs and the withdrawals.
scriptsNeeded :: (ShelleyBased era, GetPolicies (Value era) (Crypto era), HasField "certs" (TxBody era) (StrictSeq (DCert (Crypto era))), HasField "wdrls" (TxBody era) (Wdrl (Crypto era)), HasField "inputs" (TxBody era) (Set (TxIn (Crypto era))), HasField "mint" (TxBody era) (Value era)) => UTxO era -> Tx era -> Set (ScriptHash (Crypto era))
instance Cardano.Ledger.ShelleyMA.Rules.Utxow.GetPolicies Shelley.Spec.Ledger.Coin.Coin crypto
instance Cardano.Ledger.ShelleyMA.Rules.Utxow.GetPolicies (Cardano.Ledger.Mary.Value.Value crypto) crypto
instance (Cardano.Ledger.Crypto.Crypto c, Data.Typeable.Internal.Typeable ma, Control.State.Transition.Extended.STS (Shelley.Spec.Ledger.STS.Utxo.UTXO (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Control.State.Transition.Extended.BaseM (Shelley.Spec.Ledger.STS.Utxo.UTXO (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)) GHC.Types.~ Shelley.Spec.Ledger.BaseTypes.ShelleyBase, Cardano.Ledger.Val.DecodeMint (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Cardano.Ledger.Val.DecodeNonNegative (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Cardano.Ledger.Compactible.Compactible (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Cardano.Ledger.Val.Val (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Cardano.Ledger.ShelleyMA.Rules.Utxow.GetPolicies (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)) c, GHC.Classes.Eq (Cardano.Ledger.Compactible.CompactForm (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))), Cardano.Ledger.Core.ChainData (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Cardano.Ledger.Core.ChainData (Cardano.Ledger.Torsor.Delta (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))), Cardano.Ledger.Core.SerialisableData (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Cardano.Ledger.Core.SerialisableData (Cardano.Ledger.Torsor.Delta (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))), Cardano.Ledger.Core.SerialisableData (Cardano.Ledger.Compactible.CompactForm (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))), Cardano.Ledger.Torsor.Torsor (Cardano.Ledger.Core.Value (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Shelley.Spec.Ledger.Keys.DSignable c (Shelley.Spec.Ledger.Keys.Hash c Shelley.Spec.Ledger.Hashing.EraIndependentTxBody)) => Control.State.Transition.Extended.STS (Shelley.Spec.Ledger.STS.Utxow.UTXOW (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))
instance (Cardano.Ledger.Crypto.Crypto c, Control.State.Transition.Extended.STS (Shelley.Spec.Ledger.STS.Utxo.UTXO (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)), Control.State.Transition.Extended.BaseM (Shelley.Spec.Ledger.STS.Utxo.UTXO (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)) GHC.Types.~ Shelley.Spec.Ledger.BaseTypes.ShelleyBase) => Control.State.Transition.Extended.Embed (Shelley.Spec.Ledger.STS.Utxo.UTXO (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c)) (Shelley.Spec.Ledger.STS.Utxow.UTXOW (Cardano.Ledger.ShelleyMA.ShelleyMAEra ma c))

module Cardano.Ledger.Mary
type MaryEra = ShelleyMAEra 'Mary
instance Shelley.Spec.Ledger.API.Protocol.PraosCrypto c => Shelley.Spec.Ledger.API.Mempool.ApplyTx (Cardano.Ledger.Mary.MaryEra c)
instance Shelley.Spec.Ledger.API.Protocol.PraosCrypto c => Shelley.Spec.Ledger.API.Validation.ApplyBlock (Cardano.Ledger.Mary.MaryEra c)
instance Shelley.Spec.Ledger.API.Protocol.PraosCrypto c => Shelley.Spec.Ledger.API.Protocol.GetLedgerView (Cardano.Ledger.Mary.MaryEra c)
instance Shelley.Spec.Ledger.API.Protocol.PraosCrypto c => Shelley.Spec.Ledger.API.ShelleyBasedEra (Cardano.Ledger.Mary.MaryEra c)

module Cardano.Ledger.Allegra
type AllegraEra = ShelleyMAEra 'Allegra
instance Shelley.Spec.Ledger.API.Protocol.PraosCrypto c => Shelley.Spec.Ledger.API.Mempool.ApplyTx (Cardano.Ledger.Allegra.AllegraEra c)
instance Shelley.Spec.Ledger.API.Protocol.PraosCrypto c => Shelley.Spec.Ledger.API.Validation.ApplyBlock (Cardano.Ledger.Allegra.AllegraEra c)
instance Shelley.Spec.Ledger.API.Protocol.PraosCrypto c => Shelley.Spec.Ledger.API.Protocol.GetLedgerView (Cardano.Ledger.Allegra.AllegraEra c)
instance Shelley.Spec.Ledger.API.Protocol.PraosCrypto c => Shelley.Spec.Ledger.API.ShelleyBasedEra (Cardano.Ledger.Allegra.AllegraEra c)

module Cardano.Ledger.Mary.Translation
translateValue :: Crypto c => Coin -> Value c
translateCompactValue :: Crypto c => CompactForm Coin -> CompactForm (Value c)
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.LedgerState.NewEpochState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.Tx.Tx
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.Genesis.ShelleyGenesis
instance (Cardano.Ledger.Crypto.Crypto c, GHC.Base.Functor f) => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) (Shelley.Spec.Ledger.PParams.PParams' f)
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.LedgerState.EpochState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.LedgerState.LedgerState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.PParams.ProposedPPUpdates
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.LedgerState.PPUPState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.LedgerState.UTxOState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.TxBody.TxOut
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.UTxO.UTxO
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.Tx.WitnessSet
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Shelley.Spec.Ledger.PParams.Update
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Cardano.Ledger.ShelleyMA.TxBody.TxBody
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Mary.MaryEra c) Cardano.Ledger.ShelleyMA.AuxiliaryData.AuxiliaryData

module Cardano.Ledger.Allegra.Translation
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.LedgerState.NewEpochState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.Tx.Tx
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.Genesis.ShelleyGenesis
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) (Shelley.Spec.Ledger.PParams.PParams' f)
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.PParams.ProposedPPUpdates
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.LedgerState.PPUPState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.TxBody.TxOut
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.UTxO.UTxO
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.LedgerState.UTxOState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.LedgerState.LedgerState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.LedgerState.EpochState
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.Tx.WitnessSet
instance Cardano.Ledger.Crypto.Crypto c => Cardano.Ledger.Era.TranslateEra (Cardano.Ledger.Allegra.AllegraEra c) Shelley.Spec.Ledger.PParams.Update
