{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE EmptyDataDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Cardano.Ledger.Conway.Rules.Mempool (
ConwayMEMPOOL,
) where
import Cardano.Ledger.BaseTypes (ShelleyBase)
import Cardano.Ledger.Conway.Core
import Cardano.Ledger.Conway.Era (
ConwayLEDGER,
ConwayMEMPOOL,
hardforkConwayDisallowUnelectedCommitteeFromVoting,
)
import Cardano.Ledger.Conway.Governance (
ConwayEraGov,
ConwayGovState,
Proposals,
committeeGovStateL,
)
import Cardano.Ledger.Conway.Rules.Certs (CertsEnv)
import Cardano.Ledger.Conway.Rules.Gov (GovEnv, GovSignal, unelectedCommitteeVoters)
import Cardano.Ledger.Conway.Rules.Ledger (ConwayLedgerEvent, ConwayLedgerPredFailure (..))
import Cardano.Ledger.Conway.State
import Cardano.Ledger.Shelley.LedgerState
import Cardano.Ledger.Shelley.Rules (LedgerEnv (..), ShelleyLedgerPredFailure, UtxoEnv, ledgerPpL)
import Control.Monad (unless)
import Control.State.Transition (
BaseM,
Environment,
Event,
PredicateFailure,
STS (..),
Signal,
State,
TRC (TRC),
TransitionRule,
failOnNonEmpty,
judgmentContext,
transitionRules,
whenFailureFreeDefault,
(?!),
)
import Control.State.Transition.Extended (Embed (..), trans)
import qualified Data.List.NonEmpty as NE
import qualified Data.Map.Strict as Map
import Data.Sequence (Seq)
import Data.Text as T (pack)
import Lens.Micro ((^.))
instance
( EraTx era
, ConwayEraTxBody era
, ConwayEraGov era
, ConwayEraCertState era
, EraStake era
, EraCertState era
, Embed (EraRule "LEDGER" era) (ConwayMEMPOOL era)
, State (EraRule "LEDGER" era) ~ LedgerState era
, Eq (PredicateFailure (EraRule "CERTS" era))
, Eq (PredicateFailure (EraRule "GOV" era))
, Eq (PredicateFailure (EraRule "UTXOW" era))
, Show (PredicateFailure (EraRule "CERTS" era))
, Show (PredicateFailure (EraRule "GOV" era))
, Show (PredicateFailure (EraRule "UTXOW" era))
, Environment (EraRule "LEDGER" era) ~ LedgerEnv era
, Tx TopTx era ~ Signal (EraRule "LEDGER" era)
) =>
STS (ConwayMEMPOOL era)
where
type State (ConwayMEMPOOL era) = LedgerState era
type Signal (ConwayMEMPOOL era) = Tx TopTx era
type Environment (ConwayMEMPOOL era) = LedgerEnv era
type BaseM (ConwayMEMPOOL era) = ShelleyBase
type PredicateFailure (ConwayMEMPOOL era) = ConwayLedgerPredFailure era
type Event (ConwayMEMPOOL era) = ConwayLedgerEvent era
transitionRules :: [TransitionRule (ConwayMEMPOOL era)]
transitionRules = [forall era.
(EraTx era, ConwayEraTxBody era, ConwayEraGov era,
ConwayEraCertState era,
Embed (EraRule "LEDGER" era) (ConwayMEMPOOL era),
State (EraRule "LEDGER" era) ~ LedgerState era,
Environment (EraRule "LEDGER" era) ~ LedgerEnv era,
Tx TopTx era ~ Signal (EraRule "LEDGER" era)) =>
TransitionRule (ConwayMEMPOOL era)
mempoolTransition @era]
mempoolTransition ::
forall era.
( EraTx era
, ConwayEraTxBody era
, ConwayEraGov era
, ConwayEraCertState era
, Embed (EraRule "LEDGER" era) (ConwayMEMPOOL era)
, State (EraRule "LEDGER" era) ~ LedgerState era
, Environment (EraRule "LEDGER" era) ~ LedgerEnv era
, Tx TopTx era ~ Signal (EraRule "LEDGER" era)
) =>
TransitionRule (ConwayMEMPOOL era)
mempoolTransition :: forall era.
(EraTx era, ConwayEraTxBody era, ConwayEraGov era,
ConwayEraCertState era,
Embed (EraRule "LEDGER" era) (ConwayMEMPOOL era),
State (EraRule "LEDGER" era) ~ LedgerState era,
Environment (EraRule "LEDGER" era) ~ LedgerEnv era,
Tx TopTx era ~ Signal (EraRule "LEDGER" era)) =>
TransitionRule (ConwayMEMPOOL era)
mempoolTransition = do
TRC trc@(ledgerEnv, ledgerState, tx) <-
Rule
(ConwayMEMPOOL era)
'Transition
(RuleContext 'Transition (ConwayMEMPOOL era))
F (Clause (ConwayMEMPOOL era) 'Transition)
(TRC (ConwayMEMPOOL era))
forall sts (rtype :: RuleType).
Rule sts rtype (RuleContext rtype sts)
judgmentContext
let
inputs = Tx TopTx era
Signal (ConwayMEMPOOL era)
tx Tx TopTx era
-> Getting (Set TxIn) (Tx TopTx era) (Set TxIn) -> Set TxIn
forall s a. s -> Getting a s a -> a
^. (TxBody TopTx era -> Const (Set TxIn) (TxBody TopTx era))
-> Tx TopTx era -> Const (Set TxIn) (Tx TopTx era)
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxBody l era)
forall (l :: TxLevel). Lens' (Tx l era) (TxBody l era)
bodyTxL ((TxBody TopTx era -> Const (Set TxIn) (TxBody TopTx era))
-> Tx TopTx era -> Const (Set TxIn) (Tx TopTx era))
-> ((Set TxIn -> Const (Set TxIn) (Set TxIn))
-> TxBody TopTx era -> Const (Set TxIn) (TxBody TopTx era))
-> Getting (Set TxIn) (Tx TopTx era) (Set TxIn)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Set TxIn -> Const (Set TxIn) (Set TxIn))
-> TxBody TopTx era -> Const (Set TxIn) (TxBody TopTx era)
forall era (l :: TxLevel).
EraTxBody era =>
Lens' (TxBody l era) (Set TxIn)
forall (l :: TxLevel). Lens' (TxBody l era) (Set TxIn)
inputsTxBodyL
UTxO utxo = ledgerState ^. utxoG
notAllSpent = (TxIn -> Bool) -> Set TxIn -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (TxIn -> Map TxIn (TxOut era) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
`Map.member` Map TxIn (TxOut era)
utxo) Set TxIn
inputs
notAllSpent
?! ConwayMempoolFailure
"All inputs are spent. Transaction has probably already been included"
whenFailureFreeDefault ledgerState $ do
let protVer = LedgerEnv era
Environment (ConwayMEMPOOL era)
ledgerEnv LedgerEnv era -> Getting ProtVer (LedgerEnv era) ProtVer -> ProtVer
forall s a. s -> Getting a s a -> a
^. (PParams era -> Const ProtVer (PParams era))
-> LedgerEnv era -> Const ProtVer (LedgerEnv era)
forall era (f :: * -> *).
Functor f =>
(PParams era -> f (PParams era))
-> LedgerEnv era -> f (LedgerEnv era)
ledgerPpL ((PParams era -> Const ProtVer (PParams era))
-> LedgerEnv era -> Const ProtVer (LedgerEnv era))
-> ((ProtVer -> Const ProtVer ProtVer)
-> PParams era -> Const ProtVer (PParams era))
-> Getting ProtVer (LedgerEnv era) ProtVer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ProtVer -> Const ProtVer ProtVer)
-> PParams era -> Const ProtVer (PParams era)
forall era. EraPParams era => Lens' (PParams era) ProtVer
Lens' (PParams era) ProtVer
ppProtocolVersionL
unless (hardforkConwayDisallowUnelectedCommitteeFromVoting protVer) $
let addPrefix = (Text
"Unelected committee members are not allowed to cast votes: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>)
in failOnNonEmpty
( unelectedCommitteeVoters
(ledgerState ^. lsUTxOStateL . utxosGovStateL . committeeGovStateL)
(ledgerState ^. lsCertStateL . certVStateL . vsCommitteeStateL)
(tx ^. bodyTxL . votingProceduresTxBodyL)
)
(ConwayMempoolFailure . addPrefix . T.pack . show . NE.toList)
trans @(EraRule "LEDGER" era) $ TRC trc
instance
( AlonzoEraTx era
, ConwayEraTxBody era
, ConwayEraGov era
, BaseM (EraRule "CERTS" era) ~ ShelleyBase
, BaseM (EraRule "GOV" era) ~ ShelleyBase
, BaseM (EraRule "UTXOW" era) ~ ShelleyBase
, Embed (EraRule "CERTS" era) (ConwayLEDGER era)
, Embed (EraRule "GOV" era) (ConwayLEDGER era)
, Embed (EraRule "UTXOW" era) (ConwayLEDGER era)
, Environment (EraRule "CERTS" era) ~ CertsEnv era
, Environment (EraRule "GOV" era) ~ GovEnv era
, Environment (EraRule "UTXOW" era) ~ UtxoEnv era
, Environment (EraRule "LEDGER" era) ~ LedgerEnv era
, State (EraRule "CERTS" era) ~ CertState era
, State (EraRule "GOV" era) ~ Proposals era
, State (EraRule "UTXOW" era) ~ UTxOState era
, State (EraRule "LEDGER" era) ~ LedgerState era
, GovState era ~ ConwayGovState era
, Signal (EraRule "CERTS" era) ~ Seq (TxCert era)
, Signal (EraRule "GOV" era) ~ GovSignal era
, Signal (EraRule "UTXOW" era) ~ Tx TopTx era
, Signal (EraRule "LEDGER" era) ~ Tx TopTx era
, ConwayEraCertState era
, EraRule "LEDGER" era ~ ConwayLEDGER era
, EraRuleFailure "LEDGER" era ~ ConwayLedgerPredFailure era
, InjectRuleFailure "LEDGER" ShelleyLedgerPredFailure era
) =>
Embed (ConwayLEDGER era) (ConwayMEMPOOL era)
where
wrapFailed :: PredicateFailure (ConwayLEDGER era)
-> PredicateFailure (ConwayMEMPOOL era)
wrapFailed = PredicateFailure (ConwayLEDGER era)
-> PredicateFailure (ConwayMEMPOOL era)
ConwayLedgerPredFailure era -> ConwayLedgerPredFailure era
forall a. a -> a
id
wrapEvent :: Event (ConwayLEDGER era) -> Event (ConwayMEMPOOL era)
wrapEvent = Event (ConwayLEDGER era) -> Event (ConwayMEMPOOL era)
ConwayLedgerEvent era -> ConwayLedgerEvent era
forall a. a -> a
id