-- editorconfig-checker-disable-file

-- | The types and functions that are common among all ledger Plutus versions.
module PlutusLedgerApi.Common
  ( -- * Script (de)serialization
    SerialisedScript.SerialisedScript
  , SerialisedScript.ScriptForEvaluation
  , SerialisedScript.serialisedScript
  , SerialisedScript.deserialisedScript
  , SerialisedScript.serialiseCompiledCode
  , SerialisedScript.serialiseUPLC
  , SerialisedScript.deserialiseScript
  , SerialisedScript.uncheckedDeserialiseUPLC
  , SerialisedScript.ScriptDecodeError (..)
  , SerialisedScript.ScriptNamedDeBruijn (..)

    -- * Script evaluation
  , Eval.evaluateScriptCounting
  , Eval.evaluateScriptRestricting
  , Eval.evaluateTerm
  , Eval.VerboseMode (..)
  , Eval.LogOutput
  , Eval.EvaluationError (..)

    -- * Network's versioning
    {-| The network's behaviour (and plutus's by extension) can change via /hard forks/,
    which directly correspond to major-number protocol version bumps. -}
  , Versions.MajorProtocolVersion (..)
  , Versions.PlutusLedgerLanguage (..)
  , Versions.Version (..)
  , Versions.builtinsIntroducedIn
  , Versions.builtinsAvailableIn
  , Versions.ledgerLanguageIntroducedIn
  , Versions.ledgerLanguagesAvailableIn

    -- * Protocol Versions
  , Protocol.shelleyPV
  , Protocol.allegraPV
  , Protocol.maryPV
  , Protocol.alonzoPV
  , Protocol.vasilPV
  , Protocol.valentinePV
  , Protocol.changPV
  , Protocol.plominPV
  , Protocol.pv11PV
  , Protocol.knownPVs

    -- * Costing-related types
  , PLC.ExBudget (..)
  , PLC.ExCPU (..)
  , PLC.ExMemory (..)
  , SatInt.SatInt (unSatInt)
  , SatInt.fromSatInt

    -- * Network's costing parameters
    {-| A less drastic approach (that does not rely on a HF)
    to affect the network's (and plutus's by extension) behaviour
    is by tweaking the values of the cost model parameters.

    The network does not associate names to cost model parameters;
    Plutus attaches names to the network's cost model parameters (values)
    either in a raw textual form or typed by a specific plutus version.

    See Note [Cost model parameters] -}
  , PLC.CostModelParams
  , ParamName.toCostModelParams
  , Eval.assertWellFormedCostModelParams
  , ParamName.IsParamName (showParamName, readParamName)
  , ParamName.GenericParamName
  , ParamName.CostModelApplyError (..)
  , ParamName.CostModelApplyWarn (..)

    -- ** Evaluation context
  , Eval.EvaluationContext (..)
  , Eval.mkDynEvaluationContext
  , Eval.toMachineParameters
  -- While not strictly used by the ledger, this is useful for people trying to
  -- reconstruct the term evaluated by the ledger from the arguments, e.g.
  -- for profiling purposes.
  , Eval.mkTermToEvaluate

    -- ** Supporting types used in the context types

    -- *** Builtins
  , TxPrelude.BuiltinByteString
  , TxPrelude.toBuiltin
  , TxPrelude.fromBuiltin
  , TxPrelude.toOpaque
  , TxPrelude.fromOpaque

    -- * Data
  , PLC.Data (..)
  , Builtins.BuiltinData (..)
  , IsData.ToData (..)
  , IsData.FromData (..)
  , IsData.UnsafeFromData (..)
  , IsData.toData
  , IsData.fromData
  , IsData.unsafeFromData
  , Builtins.dataToBuiltinData
  , Builtins.builtinDataToData

    -- * Misc
  , MonadError
  ) where

import PlutusLedgerApi.Common.Eval qualified as Eval
import PlutusLedgerApi.Common.ParamName qualified as ParamName
import PlutusLedgerApi.Common.ProtocolVersions qualified as Protocol
import PlutusLedgerApi.Common.SerialisedScript qualified as SerialisedScript
import PlutusLedgerApi.Common.Versions qualified as Versions

import PlutusTx.Builtins.Internal qualified as Builtins
import PlutusTx.IsData.Class qualified as IsData
import PlutusTx.Prelude qualified as TxPrelude

import PlutusCore.Data qualified as PLC
import PlutusCore.Evaluation.Machine.CostModelInterface qualified as PLC
import PlutusCore.Evaluation.Machine.ExBudget qualified as PLC
import PlutusCore.Evaluation.Machine.ExMemory qualified as PLC

import Control.Monad.Except (MonadError)
import Data.SatInt qualified as SatInt