Skip to content

Commit

Permalink
Cleaning up
Browse files Browse the repository at this point in the history
  • Loading branch information
Jimbo4350 committed Feb 27, 2025
1 parent 9fafff6 commit 811f727
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,18 @@ module Cardano.Api.Internal.Experimental.Plutus.ScriptWitness
( PlutusScriptWitness (..)

-- * Plutus script witnessable things.
, TxIn
, Mint
, Withdrawal
, Cert
, Voter
, Proposal

-- * Any witness (key, simple script, plutus script).
, AnyWitness (..)

-- * Witnessable things
, Witnessable (..)
, getWitnessable
, getAnyWitnessScript

-- * All the parts that constitute a plutus script witness but also including simple scripts
Expand All @@ -46,8 +47,7 @@ module Cardano.Api.Internal.Experimental.Plutus.ScriptWitness
, PlutusScriptOrReferenceInput (..)
, ScriptRedeemer
, PlutusScriptPurpose (..)
, PlutusScriptDatum
, PlutusScriptDatumGADT (..)
, PlutusScriptDatum (..)
, NoScriptDatum (..)
, mkPlutusScriptWitness

Expand Down Expand Up @@ -118,7 +118,7 @@ data PlutusScriptWitness (lang :: L.Language) (purpose :: PlutusScriptPurpose) e
PlutusScriptWitness
:: L.SLanguage lang
-> (PlutusScriptOrReferenceInput lang era)
-> (PlutusScriptDatumGADT lang purpose)
-> (PlutusScriptDatum lang purpose)
-> ScriptRedeemer
-> ExecutionUnits
-> PlutusScriptWitness lang purpose era
Expand Down Expand Up @@ -151,35 +151,35 @@ data NoScriptDatum = NoScriptDatumAllowed deriving Show
-- | The PlutusScriptDatum type family is used to determine if a script datum is allowed
-- for a given plutus script purpose and version. This change was proposed in CIP-69
-- https://github.com/cardano-foundation/CIPs/tree/master/CIP-0069
type family PlutusScriptDatum (lang :: L.Language) (purpose :: PlutusScriptPurpose) where
PlutusScriptDatum L.PlutusV1 SpendingScript = HashableScriptData
PlutusScriptDatum L.PlutusV2 SpendingScript = HashableScriptData
PlutusScriptDatum L.PlutusV3 SpendingScript = Maybe HashableScriptData -- CIP-69
PlutusScriptDatum L.PlutusV1 MintingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV2 MintingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV3 MintingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV1 WithdrawingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV2 WithdrawingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV3 WithdrawingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV1 CertifyingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV2 CertifyingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV3 CertifyingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV1 ProposingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV2 ProposingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV3 ProposingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV1 VotingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV2 VotingScript = NoScriptDatum
PlutusScriptDatum L.PlutusV3 VotingScript = NoScriptDatum

data PlutusScriptDatumGADT (lang :: L.Language) (purpose :: PlutusScriptPurpose) where
type family PlutusScriptDatumF (lang :: L.Language) (purpose :: PlutusScriptPurpose) where
PlutusScriptDatumF L.PlutusV1 SpendingScript = HashableScriptData
PlutusScriptDatumF L.PlutusV2 SpendingScript = HashableScriptData
PlutusScriptDatumF L.PlutusV3 SpendingScript = Maybe HashableScriptData -- CIP-69
PlutusScriptDatumF L.PlutusV1 MintingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV2 MintingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV3 MintingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV1 WithdrawingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV2 WithdrawingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV3 WithdrawingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV1 CertifyingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV2 CertifyingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV3 CertifyingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV1 ProposingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV2 ProposingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV3 ProposingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV1 VotingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV2 VotingScript = NoScriptDatum
PlutusScriptDatumF L.PlutusV3 VotingScript = NoScriptDatum

data PlutusScriptDatum (lang :: L.Language) (purpose :: PlutusScriptPurpose) where
SpendingScriptDatum
:: PlutusScriptDatum lang SpendingScript -> PlutusScriptDatumGADT lang SpendingScript
InlineDatum :: PlutusScriptDatumGADT lang purpose
:: PlutusScriptDatumF lang SpendingScript -> PlutusScriptDatum lang SpendingScript
InlineDatum :: PlutusScriptDatum lang purpose
NoScriptDatum
:: PlutusScriptDatumGADT lang purpose
:: PlutusScriptDatum lang purpose

getPlutusDatum
:: L.SLanguage lang -> PlutusScriptDatumGADT lang purpose -> Maybe HashableScriptData
:: L.SLanguage lang -> PlutusScriptDatum lang purpose -> Maybe HashableScriptData
getPlutusDatum L.SPlutusV1 (SpendingScriptDatum d) = Just d
getPlutusDatum L.SPlutusV2 (SpendingScriptDatum d) = Just d
getPlutusDatum L.SPlutusV3 (SpendingScriptDatum d) = d
Expand All @@ -189,15 +189,15 @@ getPlutusDatum _ NoScriptDatum = Nothing
toAlonzoDatum
:: AlonzoEraOnwards era
-> L.SLanguage lang
-> PlutusScriptDatumGADT lang purpose
-> PlutusScriptDatum lang purpose
-> Maybe (L.Data (ShelleyLedgerEra era))
toAlonzoDatum eon l d =
let mHashableData = getPlutusDatum l d
in case mHashableData of
Just h -> Just $ alonzoEraOnwardsConstraints eon $ toAlonzoData h
Nothing -> Nothing

instance Show (PlutusScriptDatumGADT lang purpose) where
instance Show (PlutusScriptDatum lang purpose) where
show = \case
SpendingScriptDatum _d -> "Datum"
InlineDatum -> "InlineDatum"
Expand All @@ -220,15 +220,6 @@ data AnyIndexedPlutusScriptWitness era where
=> IndexedPlutusScriptWitness witnessable lang purpose era
-> AnyIndexedPlutusScriptWitness era

-------------------
{- Because we are traversing the container of things that need witnessing
we need a top level Witness type that encompasses Key and Plutus Script witnesses.
This is so that we generare the correct script witness index for things
witnessed by plutus scripts
-}
-------------------

-- | Here we consider three types of witnesses in Cardano: key witnesses, simple script witnesses and
-- Plutus script witnesses. Note that AnyKeyWitness does not contain a key witness. This is because
-- that witness is provided in the signing stage of the transaction. AnyWitness is used to contruct
Expand Down Expand Up @@ -427,10 +418,6 @@ type Voter = Api.AnyVoter

type Proposal = Api.AnyProposal

getWitnessable :: Witnessable thing era -> thing
getWitnessable (WitTxIn txIn) = txIn
getWitnessable _ = error "getWitnessable: minting scripts do not have a witnessable"

-- | In order to reduce boilerplate we reuse cardano-ledger's PlutusPurpose type. This
-- type is used in the construction of the redeemer pointers map. The redeemer pointers map
-- connects the redeemer and execution units to the thing being witnessed. The map is
Expand Down Expand Up @@ -526,7 +513,7 @@ mkPlutusScriptWitness
:: AlonzoEraOnwards era
-> L.SLanguage plutuslang
-> L.PlutusRunnable plutuslang
-> PlutusScriptDatumGADT plutuslang purpose
-> PlutusScriptDatum plutuslang purpose
-> ScriptRedeemer
-> ExecutionUnits
-> PlutusScriptWitness plutuslang purpose (ShelleyLedgerEra era)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ import Cardano.Api.Internal.Script
)
import Cardano.Api.Internal.Script qualified as Old
import Cardano.Api.Internal.Tx.BuildTxWith
import Cardano.Api.Internal.TxIn

import Cardano.Binary qualified as CBOR
import Cardano.Ledger.Alonzo.Scripts qualified as L
Expand Down Expand Up @@ -64,8 +63,11 @@ fromExistingApi eon (witnessable, BuildTxWith (Old.ScriptWitness _ oldApiPlutusS

type family ToPlutusScriptPurpose witnessable = (purpose :: PlutusScriptPurpose) | purpose -> witnessable where
ToPlutusScriptPurpose TxIn = SpendingScript
ToPlutusScriptPurpose Withdrawal = WithdrawingScript
ToPlutusScriptPurpose Mint = MintingScript
ToPlutusScriptPurpose Cert = CertifyingScript
ToPlutusScriptPurpose Withdrawal = WithdrawingScript
ToPlutusScriptPurpose Proposal = ProposingScript
ToPlutusScriptPurpose Voter = VotingScript

convertToNewPlutusScriptWitness
:: AlonzoEraOnwards era
Expand Down Expand Up @@ -102,7 +104,7 @@ createDatum
:: Witnessable thing era
-> Old.PlutusScriptVersion lang
-> Old.ScriptDatum witctx
-> PlutusScriptDatumGADT (Old.ToLedgerPlutusLanguage lang) SpendingScript
-> PlutusScriptDatum (Old.ToLedgerPlutusLanguage lang) SpendingScript
createDatum missingContext plutusVersion oldDatum =
case (missingContext, oldDatum) of
(w@WitTxIn{}, d@Old.ScriptDatumForTxIn{}) -> toCip69Datum w plutusVersion d
Expand All @@ -124,7 +126,7 @@ toCip69Datum
:: Witnessable TxIn era
-> Old.PlutusScriptVersion lang
-> Old.ScriptDatum Old.WitCtxTxIn
-> PlutusScriptDatumGADT (Old.ToLedgerPlutusLanguage lang) (ToPlutusScriptPurpose TxIn)
-> PlutusScriptDatum (Old.ToLedgerPlutusLanguage lang) (ToPlutusScriptPurpose TxIn)
-- ^ Encapsulates CIP-69: V3 spending script datums are optional
toCip69Datum WitTxIn{} Old.PlutusScriptV3 (Old.ScriptDatumForTxIn r) = SpendingScriptDatum r
-- \^ V2 and V1 spending script datums are required
Expand All @@ -135,7 +137,7 @@ toCip69Datum WitTxIn{} Old.PlutusScriptV3 (Old.InlineScriptDatum) = InlineDatum
toCip69Datum WitTxIn{} Old.PlutusScriptV2 (Old.InlineScriptDatum) = InlineDatum
-- \^ Everything else is not allowed. The old api does not prevent these invalid combinations
-- so we are forced to error here. The valid combinations are enforced in the PlutusScriptDatum
-- type family within the resultant PlutusScriptDatumGADT GADT.
-- type family within the resultant PlutusScriptDatum GADT.
toCip69Datum WitTxIn{} scriptVersion datum =
error $
unlines
Expand All @@ -152,7 +154,7 @@ toNewPlutusScriptWitness
-> Old.PlutusScriptOrReferenceInput lang
-> ScriptRedeemer
-> ExecutionUnits
-> PlutusScriptDatumGADT (Old.ToLedgerPlutusLanguage lang) purpose
-> PlutusScriptDatum (Old.ToLedgerPlutusLanguage lang) purpose
-> Either
CBOR.DecoderError
( AnyWitness
Expand Down

0 comments on commit 811f727

Please sign in to comment.