{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Mary (
  MaryEra,
  ShelleyTx,
  ShelleyTxOut,
  MaryValue,
  TxBody (..),
  Tx (..),
  ApplyTxError (..),
) where

import Cardano.Ledger.Binary (DecCBOR, EncCBOR)
import Cardano.Ledger.Mary.BlockBody ()
import Cardano.Ledger.Mary.Era (MaryEra)
import Cardano.Ledger.Mary.PParams ()
import Cardano.Ledger.Mary.Rules ()
import Cardano.Ledger.Mary.Scripts ()
import Cardano.Ledger.Mary.State ()
import Cardano.Ledger.Mary.Transition ()
import Cardano.Ledger.Mary.Translation ()
import Cardano.Ledger.Mary.Tx (Tx (..))
import Cardano.Ledger.Mary.TxAuxData ()
import Cardano.Ledger.Mary.TxBody (TxBody (..))
import Cardano.Ledger.Mary.UTxO ()
import Cardano.Ledger.Mary.Value (MaryValue)
import Cardano.Ledger.Shelley.API
import Cardano.Ledger.Shelley.Rules (ShelleyLedgerPredFailure)
import Data.Bifunctor (Bifunctor (first))
import Data.List.NonEmpty (NonEmpty)

instance ApplyTx MaryEra where
  newtype ApplyTxError MaryEra = MaryApplyTxError (NonEmpty (ShelleyLedgerPredFailure MaryEra))
    deriving (ApplyTxError MaryEra -> ApplyTxError MaryEra -> Bool
(ApplyTxError MaryEra -> ApplyTxError MaryEra -> Bool)
-> (ApplyTxError MaryEra -> ApplyTxError MaryEra -> Bool)
-> Eq (ApplyTxError MaryEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ApplyTxError MaryEra -> ApplyTxError MaryEra -> Bool
== :: ApplyTxError MaryEra -> ApplyTxError MaryEra -> Bool
$c/= :: ApplyTxError MaryEra -> ApplyTxError MaryEra -> Bool
/= :: ApplyTxError MaryEra -> ApplyTxError MaryEra -> Bool
Eq, Int -> ApplyTxError MaryEra -> ShowS
[ApplyTxError MaryEra] -> ShowS
ApplyTxError MaryEra -> String
(Int -> ApplyTxError MaryEra -> ShowS)
-> (ApplyTxError MaryEra -> String)
-> ([ApplyTxError MaryEra] -> ShowS)
-> Show (ApplyTxError MaryEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ApplyTxError MaryEra -> ShowS
showsPrec :: Int -> ApplyTxError MaryEra -> ShowS
$cshow :: ApplyTxError MaryEra -> String
show :: ApplyTxError MaryEra -> String
$cshowList :: [ApplyTxError MaryEra] -> ShowS
showList :: [ApplyTxError MaryEra] -> ShowS
Show)
    deriving newtype (ApplyTxError MaryEra -> Encoding
(ApplyTxError MaryEra -> Encoding)
-> EncCBOR (ApplyTxError MaryEra)
forall a. (a -> Encoding) -> EncCBOR a
$cencCBOR :: ApplyTxError MaryEra -> Encoding
encCBOR :: ApplyTxError MaryEra -> Encoding
EncCBOR, Typeable (ApplyTxError MaryEra)
Typeable (ApplyTxError MaryEra) =>
(forall s. Decoder s (ApplyTxError MaryEra))
-> (forall s. Proxy (ApplyTxError MaryEra) -> Decoder s ())
-> (Proxy (ApplyTxError MaryEra) -> Text)
-> DecCBOR (ApplyTxError MaryEra)
Proxy (ApplyTxError MaryEra) -> Text
forall s. Decoder s (ApplyTxError MaryEra)
forall a.
Typeable a =>
(forall s. Decoder s a)
-> (forall s. Proxy a -> Decoder s ())
-> (Proxy a -> Text)
-> DecCBOR a
forall s. Proxy (ApplyTxError MaryEra) -> Decoder s ()
$cdecCBOR :: forall s. Decoder s (ApplyTxError MaryEra)
decCBOR :: forall s. Decoder s (ApplyTxError MaryEra)
$cdropCBOR :: forall s. Proxy (ApplyTxError MaryEra) -> Decoder s ()
dropCBOR :: forall s. Proxy (ApplyTxError MaryEra) -> Decoder s ()
$clabel :: Proxy (ApplyTxError MaryEra) -> Text
label :: Proxy (ApplyTxError MaryEra) -> Text
DecCBOR)
  applyTxValidation :: ValidationPolicy
-> Globals
-> MempoolEnv MaryEra
-> MempoolState MaryEra
-> Tx TopTx MaryEra
-> Either
     (ApplyTxError MaryEra)
     (MempoolState MaryEra, Validated (Tx TopTx MaryEra))
applyTxValidation ValidationPolicy
validationPolicy Globals
globals MempoolEnv MaryEra
env MempoolState MaryEra
state Tx TopTx MaryEra
tx =
    (NonEmpty (ShelleyLedgerPredFailure MaryEra)
 -> ApplyTxError MaryEra)
-> Either
     (NonEmpty (ShelleyLedgerPredFailure MaryEra))
     (MempoolState MaryEra, Validated (Tx TopTx MaryEra))
-> Either
     (ApplyTxError MaryEra)
     (MempoolState MaryEra, Validated (Tx TopTx MaryEra))
forall a b c. (a -> b) -> Either a c -> Either b c
forall (p :: * -> * -> *) a b c.
Bifunctor p =>
(a -> b) -> p a c -> p b c
first NonEmpty (ShelleyLedgerPredFailure MaryEra) -> ApplyTxError MaryEra
MaryApplyTxError (Either
   (NonEmpty (ShelleyLedgerPredFailure MaryEra))
   (MempoolState MaryEra, Validated (Tx TopTx MaryEra))
 -> Either
      (ApplyTxError MaryEra)
      (MempoolState MaryEra, Validated (Tx TopTx MaryEra)))
-> Either
     (NonEmpty (ShelleyLedgerPredFailure MaryEra))
     (MempoolState MaryEra, Validated (Tx TopTx MaryEra))
-> Either
     (ApplyTxError MaryEra)
     (MempoolState MaryEra, Validated (Tx TopTx MaryEra))
forall a b. (a -> b) -> a -> b
$
      forall (rule :: Symbol) era.
(STS (EraRule rule era), BaseM (EraRule rule era) ~ ShelleyBase,
 Environment (EraRule rule era) ~ LedgerEnv era,
 State (EraRule rule era) ~ MempoolState era,
 Signal (EraRule rule era) ~ Tx TopTx era) =>
ValidationPolicy
-> Globals
-> LedgerEnv era
-> MempoolState era
-> Tx TopTx era
-> Either
     (NonEmpty (PredicateFailure (EraRule rule era)))
     (MempoolState era, Validated (Tx TopTx era))
ruleApplyTxValidation @"LEDGER" ValidationPolicy
validationPolicy Globals
globals MempoolEnv MaryEra
env MempoolState MaryEra
state Tx TopTx MaryEra
tx

instance ApplyBlock MaryEra