-- 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,

  -- * 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.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