module Convex.ThreatModel.All where

import Convex.ThreatModel (ThreatModel, getThreatModelName)
import Convex.ThreatModel.DatumBloat (datumByteBloatAttack, datumListBloatAttack)
import Convex.ThreatModel.DoubleSatisfaction (doubleSatisfaction)
import Convex.ThreatModel.DuplicateListEntry (duplicateListEntryAttack)
import Convex.ThreatModel.InputDuplication (inputDuplication)
import Convex.ThreatModel.InvalidDatumIndex (invalidDatumIndexAttack)
import Convex.ThreatModel.LargeData (largeDataAttack)
import Convex.ThreatModel.LargeValue (largeValueAttack)
import Convex.ThreatModel.MissingOutputDatum (missingOutputDatumAttack)
import Convex.ThreatModel.MutualExclusion (mutualExclusionAttack)
import Convex.ThreatModel.NegativeInteger (negativeIntegerAttack)
import Convex.ThreatModel.OutputDatumHashMissing (outputDatumHashMissingAttack)
import Convex.ThreatModel.RedeemerAssetSubstitution (redeemerAssetSubstitution)
import Convex.ThreatModel.SelfReferenceInjection (selfReferenceInjection)
import Convex.ThreatModel.SignatoryRemoval (signatoryRemoval)
import Convex.ThreatModel.TimeBoundManipulation (timeBoundManipulation)
import Convex.ThreatModel.TokenForgery (simpleAlwaysSucceedsMintingPolicyV2, simpleTestAssetName, tokenForgeryAttack)
import Convex.ThreatModel.UnprotectedScriptOutput (unprotectedScriptOutput)
import Convex.ThreatModel.ValueUnderpayment (valueUnderpaymentAttack)
import Data.Maybe (mapMaybe)

{- | A list of all the threat models that don't take parameters.
Almost all threat models in this library have versions without parameters, except @TokenForgery@.
-}
allThreatModels :: [ThreatModel ()]
allThreatModels :: [ThreatModel ()]
allThreatModels =
  [ ThreatModel ()
datumListBloatAttack
  , ThreatModel ()
datumByteBloatAttack
  , ThreatModel ()
doubleSatisfaction
  , ThreatModel ()
duplicateListEntryAttack
  , ThreatModel ()
inputDuplication
  , ThreatModel ()
invalidDatumIndexAttack
  , ThreatModel ()
largeDataAttack
  , ThreatModel ()
largeValueAttack
  , ThreatModel ()
missingOutputDatumAttack
  , ThreatModel ()
mutualExclusionAttack
  , ThreatModel ()
negativeIntegerAttack
  , ThreatModel ()
outputDatumHashMissingAttack
  , ThreatModel ()
redeemerAssetSubstitution
  , ThreatModel ()
selfReferenceInjection
  , ThreatModel ()
signatoryRemoval
  , ThreatModel ()
timeBoundManipulation
  , PlutusScript PlutusScriptV2 -> AssetName -> ThreatModel ()
forall lang.
IsPlutusScriptInEra lang =>
PlutusScript lang -> AssetName -> ThreatModel ()
tokenForgeryAttack PlutusScript PlutusScriptV2
simpleAlwaysSucceedsMintingPolicyV2 AssetName
simpleTestAssetName
  , ThreatModel ()
unprotectedScriptOutput
  , ThreatModel ()
valueUnderpaymentAttack
  ]

allThreatModelsNames :: [String]
allThreatModelsNames :: [String]
allThreatModelsNames = (ThreatModel () -> Maybe String) -> [ThreatModel ()] -> [String]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe ThreatModel () -> Maybe String
forall a. ThreatModel a -> Maybe String
getThreatModelName [ThreatModel ()]
allThreatModels