Plutus.V1.Ledger.Scripts
1. 📜 Overview
2. 🔧 LANGUAGE PRAGMAS AND IMPORTS
3. 🗄️ Core Types
3.1 🖥️ Script
3.2 📐 Validator, MintingPolicy, StakeValidator
3.3 📊 Datum, Redeemer, Context
3.4 🔑 Hash Types
3.5 ⚙️ ScriptError
4. ⚙️ Key Functions
4.1 📏 scriptSize
4.2 🔄 fromCompiledCode
4.3 🏗️ applyArguments
4.4 🚀 evaluateScript
4.5 🎬 runScript / runMintingPolicyScript / runStakeValidatorScript
4.6 🔗 applyValidator / applyMintingPolicyScript / applyStakeValidatorScript
4.7 📚 unitDatum, unitRedeemer
5. 🤝 Typeclass Instances
6. 🏭 On-Chain Derivations
7. 📚 Glossary
1 📜 Overview
The Plutus.V1.Ledger.Scripts
module provides the core abstractions and utilities for working with on-chain scripts in Plutus:
Script
: opaque representation of a UPLC program.Wrappers:
Validator
,MintingPolicy
, andStakeValidator
for specific script roles.Data wrappers:
Datum
,Redeemer
, andContext
for script inputs.Hash types:
ScriptHash
,ValidatorHash
,DatumHash
, etc., for script identification.Evaluation: functions to apply and run scripts, extracting budgets and logs.
Utilities:
scriptSize
,fromCompiledCode
,applyArguments
, and exampleunitDatum
/unitRedeemer
.
2 🔧 LANGUAGE PRAGMAS AND IMPORTS
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# OPTIONS_GHC -fno-specialise #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
module Plutus.V1.Ledger.Scripts where
import qualified Prelude as Haskell
import Codec.Serialise (Serialise, serialise)
import Codec.CBOR.Extras (SerialiseViaFlat(..))
import Control.DeepSeq (NFData)
import Control.Lens (over)
import Control.Monad.Except (MonadError, throwError)
import Data.ByteString.Lazy qualified as BSL
import Data.String (IsString)
import Data.Text (Text)
import GHC.Generics (Generic)
import Plutus.V1.Ledger.Bytes (LedgerBytes(..))
import PlutusTx (CompiledCode, ToData, FromData, UnsafeFromData, getPlc, makeLift)
import PlutusTx.Builtins as Builtins
import PlutusTx.Prelude
import Prettyprinter
import Prettyprinter.Extras (PrettyShow(..))
import PlutusCore qualified as PLC
import PlutusCore.Data qualified as PLC
import PlutusCore.MkPlc qualified as PLC
import UntypedPlutusCore qualified as UPLC
import UntypedPlutusCore.Check.Scope qualified as UPLC
import UntypedPlutusCore.Evaluation.Machine.Cek qualified as UPLC
Extensive pragmas for generics, template Haskell, and disabling warnings for orphans and name shadowing.
Imports for serialization, ByteString, builtins, and untpye UPLC modules.
3 🗄️ Core Types
3.1 🖥️ Script
newtype Script = Script { unScript :: UPLC.Program UPLC.DeBruijn PLC.DefaultUni PLC.DefaultFun () }
Opaque wrapper around UPLC
Program
.Instances:
Generic
,NFData
,Serialise
via Flat.
3.2 📐 Validator, MintingPolicy, StakeValidator
newtype Validator = Validator { getValidator :: Script }
newtype MintingPolicy = MintingPolicy { getMintingPolicy :: Script }
newtype StakeValidator = StakeValidator { getStakeValidator :: Script }
Role-specific wrappers adding
Eq
,Ord
,Serialise
,Pretty
viaLedgerBytes
.
3.3 📊 Datum, Redeemer, Context
newtype Datum = Datum { getDatum :: BuiltinData }
newtype Redeemer = Redeemer { getRedeemer :: BuiltinData }
newtype Context = Context BuiltinData
Wrap
BuiltinData
for script inputs and blockchain context.
3.4 🔑 Hash Types
newtype ScriptHash = ScriptHash Builtins.BuiltinByteString deriving via LedgerBytes
newtype ValidatorHash = ValidatorHash Builtins.BuiltinByteString deriving via LedgerBytes
-- similarly: DatumHash, RedeemerHash, MintingPolicyHash, StakeValidatorHash
String literals via
IsString
,Eq
,Ord
,ToData
,FromData
,UnsafeFromData
,Pretty
viaLedgerBytes
.
3.5 ⚙️ ScriptError
data ScriptError = EvaluationError [Text] String | EvaluationException String String
Captures expected user errors vs internal evaluation exceptions.
4 ⚙️ Key Functions
4.1 📏 scriptSize
scriptSize :: Script -> Integer
scriptSize (Script s) = UPLC.programSize s
Returns serialized program size.
4.2 🔄 fromCompiledCode
fromCompiledCode :: CompiledCode a -> Script
Converts GHC-compiled Plutus Tx code into nameless
Script
.
4.3 🏗️ applyArguments
applyArguments :: Script -> [PLC.Data] -> Script
Applies a list of
Data
arguments to a UPLC program.
4.4 🚀 evaluateScript
evaluateScript :: MonadError ScriptError m => Script -> m (PLC.ExBudget, [Text])
Runs the CEK evaluator, returning resource budget and log, or throws
ScriptError
.
4.5 🎬 runScript / runMintingPolicyScript / runStakeValidatorScript
runScript :: Context -> Validator -> Datum -> Redeemer -> m (PLC.ExBudget,[Text])
runMintingPolicyScript :: Context -> MintingPolicy -> Redeemer -> m (...)
runStakeValidatorScript :: Context -> StakeValidator -> Redeemer -> m (...)
Helper functions combining application and evaluation.
4.6 🔗 applyValidator / applyMintingPolicyScript / applyStakeValidatorScript
applyValidator :: Context -> Validator -> Datum -> Redeemer -> Script
Applies wrapper types to produce a
Script
with applied arguments.
4.7 📚 unitDatum, unitRedeemer
unitDatum :: Datum
unitRedeemer :: Redeemer
Convenience values for
()
data.
5 🤝 Typeclass Instances
Eq Script
,Ord Script
: based on serialized bytes for alpha-equivalence.Show Script
: prints<Script>
placeholder.Pretty
viaPrettyShow
for wrappers.Functor
forapplyArguments
usesPLC.mkIterApp
.
6 🏭 On-Chain Derivations
makeLift ''ScriptHash
makeLift ''ValidatorHash
makeLift ''DatumHash
makeLift ''RedeemerHash
makeLift ''MintingPolicyHash
makeLift ''StakeValidatorHash
makeLift ''Datum
makeLift ''Redeemer
Enables embedding these types in PlutusTx code.
7 📚 Glossary
UPLC: Untyped Plutus Core.
CEK: evaluation machine for Plutus Core.
BuiltinData: on-chain data type.
Script: on-chain program encoded as UPLC.
Validator/MintingPolicy/StakeValidator: typed script roles.
Datum/Redeemer/Context: inputs to validators.
ScriptHash/ValidatorHash/etc.: hashed identifiers for scripts.
CompiledCode: code produced by PlutusTx compiler plugin.
SerialiseViaFlat: CBOR using Flat serialization for programs.
ProgramSize: approximate resource usage metric.
Alpha-equivalence: program equality modulo renaming.
Last updated