cardano-api
Safe HaskellNone
LanguageHaskell2010

Cardano.Api.Experimental.Plutus

Synopsis

Plutus Script

data PlutusScriptInEra (lang :: Language) era where Source #

A Plutus script in a particular era. Why PlutusRunnable? Mainly for deserialization benefits. The deserialization of this type looks at the major protocol version and the script language to determine if indeed the script is runnable. This is a dramatic improvement over the old api which essentially read a ByteString and hoped for the best. Any failures due to malformed/invalid scripts were caught upon transaction submission or running the script when attempting to predict the necessary execution units.

Where do we get the major protocol version from? In order to access the major protocol version we pass in an era type parameter which can be translated to the major protocol version.

Where do we get the script language from? The serialized version of PlutusRunnable encodes the script language. See `DecCBOR (PlutusRunnable l)` in cardano-ledger for more details.

Constructors

PlutusScriptInEra :: forall (lang :: Language) era. PlutusRunnable lang -> PlutusScriptInEra lang era 

Instances

Instances details
Show (PlutusScriptInEra lang era) Source # 
Instance details

Defined in Cardano.Api.Experimental.Plutus.Internal.Script

Legacy Scripts

legacyWitnessConversion :: forall era (witnessable :: WitnessableItem) ctx. AlonzoEraOnwards era -> [(Witnessable witnessable (ShelleyLedgerEra era), BuildTxWith BuildTx (Witness ctx era))] -> Either DecoderError [(Witnessable witnessable (ShelleyLedgerEra era), AnyWitness (ShelleyLedgerEra era))] Source #

When it comes to using plutus scripts we need to provide the following to the tx:

  1. The redeemer pointer map
  2. The set of plutus languages in use
  3. The set of plutus scripts in use (present in the t)
  4. The datum map

Plutus Script Witness

data PlutusScriptWitness (lang :: Language) (purpose :: PlutusScriptPurpose) era where Source #

This is a Plutus script witness. It possesses: 1. The plutus script or reference input 2. The script redeemer 3. The execution units 4. Potentially a script datum. See the PlutusScriptDatum type family for more details.

Note that Plutus script witnesses do not exist on their own. They must witness something and a redeemer pointer must be constucted to point to the thing being witnessed. See IndexedPlutusScriptWitness for more details.

Constructors

PlutusScriptWitness :: forall (lang :: Language) era (purpose :: PlutusScriptPurpose). SLanguage lang -> PlutusScriptOrReferenceInput lang era -> PlutusScriptDatum lang purpose -> ScriptRedeemer -> ExecutionUnits -> PlutusScriptWitness lang purpose era 

Instances

Instances details
Show (PlutusScriptWitness lang purpose era) Source # 
Instance details

Defined in Cardano.Api.Experimental.Plutus.Internal.ScriptWitness

Methods

showsPrec :: Int -> PlutusScriptWitness lang purpose era -> ShowS Source #

show :: PlutusScriptWitness lang purpose era -> String Source #

showList :: [PlutusScriptWitness lang purpose era] -> ShowS Source #

Constructing a plutus script witness.

data PlutusScriptOrReferenceInput (lang :: Language) era Source #

You can provide the plutus script directly in the transaction or a reference input that points to the script in the UTxO. Using a reference script saves space in your transaction.

data PlutusScriptPurpose Source #

Every Plutus script has a purpose that indicates what that script is witnessing.

Constructors

SpendingScript

Witnesses a transaction input

MintingScript

Witnesses a minting policy

WithdrawingScript

Witnesses a withdrawal

CertifyingScript

Witnesses a certificate

ProposingScript

Witnesses a proposal

VotingScript

Witnesses a vote

data PlutusScriptDatum (lang :: Language) (purpose :: PlutusScriptPurpose) where Source #

Constructors

SpendingScriptDatum :: forall (lang :: Language). PlutusScriptDatumF lang 'SpendingScript -> PlutusScriptDatum lang 'SpendingScript 
InlineDatum :: forall (lang :: Language) (purpose :: PlutusScriptPurpose). PlutusScriptDatum lang purpose 
NoScriptDatum :: forall (lang :: Language) (purpose :: PlutusScriptPurpose). PlutusScriptDatum lang purpose 

Instances

Instances details
Show (PlutusScriptDatum lang purpose) Source # 
Instance details

Defined in Cardano.Api.Experimental.Plutus.Internal.ScriptWitness

Methods

showsPrec :: Int -> PlutusScriptDatum lang purpose -> ShowS Source #

show :: PlutusScriptDatum lang purpose -> String Source #

showList :: [PlutusScriptDatum lang purpose] -> ShowS Source #

mkPlutusScriptWitness :: forall era (plutuslang :: Language) (purpose :: PlutusScriptPurpose). AlonzoEraOnwards era -> SLanguage plutuslang -> PlutusRunnable plutuslang -> PlutusScriptDatum plutuslang purpose -> ScriptRedeemer -> ExecutionUnits -> PlutusScriptWitness plutuslang purpose (ShelleyLedgerEra era) Source #

getPlutusScriptWitnessLanguage :: forall (lang :: Language) (purpose :: PlutusScriptPurpose) era. PlutusScriptWitness lang purpose era -> Language Source #

Constuct an indexed plutus script witness.

data IndexedPlutusScriptWitness (witnessable :: WitnessableItem) (lang :: Language) (purpose :: PlutusScriptPurpose) era where Source #

A Plutus script witness along the thing it is witnessing and the index of that thing. E.g transaction input, certificate, withdrawal, minting policy, etc. A Plutus script witness only makes sense in the context of what it is witnessing and the index of the thing it is witnessing.

Constructors

IndexedPlutusScriptWitness :: forall era (witnessable :: WitnessableItem) (lang :: Language) (purpose :: PlutusScriptPurpose). AlonzoEraScript era => Witnessable witnessable era -> PlutusPurpose AsIx era -> PlutusScriptWitness lang purpose era -> IndexedPlutusScriptWitness witnessable lang purpose era 

Instances

Instances details
Show (IndexedPlutusScriptWitness witnessable lang purpose era) Source # 
Instance details

Defined in Cardano.Api.Experimental.Plutus.Internal.IndexedPlutusScriptWitness

Methods

showsPrec :: Int -> IndexedPlutusScriptWitness witnessable lang purpose era -> ShowS Source #

show :: IndexedPlutusScriptWitness witnessable lang purpose era -> String Source #

showList :: [IndexedPlutusScriptWitness witnessable lang purpose era] -> ShowS Source #

Witnessable things.

data Witnessable (thing :: WitnessableItem) era where Source #

These are all of the "things" a plutus script can witness. We include the relevant type class constraint to avoid boilerplate when creating the PlutusPurpose in the GetPlutusScriptPurpose instances.

Constructors

WitTxIn :: forall era. AlonzoEraScript era => TxIn -> Witnessable 'TxInItem era 
WitTxCert :: forall era. (EraTxCert era, AlonzoEraScript era) => TxCert era -> StakeCredential -> Witnessable 'CertItem era 
WitMint :: forall era. AlonzoEraScript era => PolicyId -> PolicyAssets -> Witnessable 'MintItem era 
WitWithdrawal :: forall era. AlonzoEraScript era => StakeAddress -> Coin -> Witnessable 'WithdrawalItem era 
WitVote :: forall era. ConwayEraScript era => Voter -> Witnessable 'VoterItem era 
WitProposal :: forall era. (ConwayEraScript era, EraPParams era) => ProposalProcedure era -> Witnessable 'ProposalItem era 

Instances

Instances details
Show (Witnessable thing era) Source # 
Instance details

Defined in Cardano.Api.Experimental.Plutus.Internal.IndexedPlutusScriptWitness

Methods

showsPrec :: Int -> Witnessable thing era -> ShowS Source #

show :: Witnessable thing era -> String Source #

showList :: [Witnessable thing era] -> ShowS Source #

Eq (Witnessable thing era) Source # 
Instance details

Defined in Cardano.Api.Experimental.Plutus.Internal.IndexedPlutusScriptWitness

Methods

(==) :: Witnessable thing era -> Witnessable thing era -> Bool Source #

(/=) :: Witnessable thing era -> Witnessable thing era -> Bool Source #

Create the index for a witnessable thing.

class GetPlutusScriptPurpose era where Source #

To reduce boilerplate, we reuse the PlutusPurpose type from `cardano-ledger`. This type is utilized in constructing the redeemer pointers map, which links the redeemer and execution units with the entity being witnessed. The map is indexed by the redeemer pointer.

A natural question arises: How do Plutus scripts determine which execution units and redeemer are paired with them? The ledger constructs a redeemer pointer for every Plutus script, and this pointer corresponds to the one in the transaction's redeemer pointers map. For more details, refer to collectPlutusScriptsWithContext in `cardano-ledger`.

Methods

toPlutusScriptPurpose :: forall (thing :: WitnessableItem). Word32 -> Witnessable thing era -> PlutusPurpose AsIx era Source #

Instances

Instances details
GetPlutusScriptPurpose era Source # 
Instance details

Defined in Cardano.Api.Experimental.Plutus.Internal.IndexedPlutusScriptWitness

Methods

toPlutusScriptPurpose :: forall (thing :: WitnessableItem). Word32 -> Witnessable thing era -> PlutusPurpose AsIx era Source #

createIndexedPlutusScriptWitnesses :: forall era (witnessable :: WitnessableItem). AlonzoEraScript era => [(Witnessable witnessable era, AnyWitness era)] -> [AnyIndexedPlutusScriptWitness era] Source #

Create a list of indexed plutus script witnesses from anything witnessable that has been witnesseed by a plutus script.

getAnyWitnessRedeemerPointerMap :: forall era (witnessable :: WitnessableItem). AlonzoEraOnwards era -> [(Witnessable witnessable (ShelleyLedgerEra era), AnyWitness (ShelleyLedgerEra era))] -> Redeemers (ShelleyLedgerEra era) Source #

The transaction's redeemer pointer map allows the ledger to connect a redeemer and execution unit pairing to the relevant script. The ledger basically reconstructs the indicies (redeemer pointers) of this map can then look up the relevant execution units/redeemer pairing. NB: the redeemer pointer has been renamed to 'PlutusPurpose AsIndex' in the ledger.

Low level functions