Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changes/20260619_fix_plutusv4_script_handling.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
project: cardano-api
pr: 1237
kind:
- bugfix
description: |
Fix PlutusV4 scripts being mislabelled as V3 in several conversion functions, causing silent hash mismatches for V4 reference scripts. Fix `toShelleyScript` and `getPlutusDatum` crashing for V4. Fix scrambled `ToPlutusScriptPurpose` type family.
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,11 @@ toAnyWitness eon (witnessable, BuildTxWith (Old.ScriptWitness _ oldApiPlutusScri

type family ToPlutusScriptPurpose witnessable = (purpose :: PlutusScriptPurpose) | purpose -> witnessable where
ToPlutusScriptPurpose TxInItem = SpendingScript
ToPlutusScriptPurpose CertItem = MintingScript
ToPlutusScriptPurpose MintItem = CertifyingScript
ToPlutusScriptPurpose CertItem = CertifyingScript
ToPlutusScriptPurpose MintItem = MintingScript
ToPlutusScriptPurpose WithdrawalItem = WithdrawingScript
ToPlutusScriptPurpose VoterItem = ProposingScript
ToPlutusScriptPurpose ProposalItem = VotingScript
ToPlutusScriptPurpose VoterItem = VotingScript
ToPlutusScriptPurpose ProposalItem = ProposingScript

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm 99% sure that this was not right.


convertToNewScriptWitness
:: AlonzoEraOnwards era
Expand Down Expand Up @@ -133,10 +133,11 @@ createPlutusScriptDatum missingContext plutusVersion oldDatum =
(WitTxCert{}, _) -> NoScriptDatum

toPlutusScriptDatum
:: Witnessable TxInItem era
:: thing ~ TxInItem
=> Witnessable thing era
-> Old.PlutusScriptVersion lang
-> Old.ScriptDatum Old.WitCtxTxIn
-> PlutusScriptDatum (Old.ToLedgerPlutusLanguage lang) (ToPlutusScriptPurpose TxInItem)
-> PlutusScriptDatum (Old.ToLedgerPlutusLanguage lang) (ToPlutusScriptPurpose thing)
Comment on lines +136 to +140
-- ^ Encapsulates CIP-69: V3 spending script datums are optional
toPlutusScriptDatum WitTxIn{} Old.PlutusScriptV4 (Old.ScriptDatumForTxIn r) = SpendingScriptDatum r
toPlutusScriptDatum WitTxIn{} Old.PlutusScriptV3 (Old.ScriptDatumForTxIn r) = SpendingScriptDatum r
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ getPlutusDatum
getPlutusDatum L.SPlutusV1 (SpendingScriptDatum d) = Just d
getPlutusDatum L.SPlutusV2 (SpendingScriptDatum d) = Just d
getPlutusDatum L.SPlutusV3 (SpendingScriptDatum d) = d
getPlutusDatum L.SPlutusV4 (SpendingScriptDatum _d) = error "TODO Dijkstra: getPlutusDatum: era not supported"
getPlutusDatum L.SPlutusV4 (SpendingScriptDatum d) = d
getPlutusDatum _ InlineDatum = Nothing
getPlutusDatum _ NoScriptDatum = Nothing

Expand Down
33 changes: 16 additions & 17 deletions cardano-api/src/Cardano/Api/Plutus/Internal/Script.hs
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,7 @@ instance Enum AnyScriptLanguage where
toEnum 1 = AnyScriptLanguage (PlutusScriptLanguage PlutusScriptV1)
toEnum 2 = AnyScriptLanguage (PlutusScriptLanguage PlutusScriptV2)
toEnum 3 = AnyScriptLanguage (PlutusScriptLanguage PlutusScriptV3)
toEnum 4 = AnyScriptLanguage (PlutusScriptLanguage PlutusScriptV4)
toEnum err = error $ "AnyScriptLanguage.toEnum: bad argument: " <> show err

fromEnum (AnyScriptLanguage SimpleScriptLanguage) = 0
Expand All @@ -300,7 +301,7 @@ instance Enum AnyScriptLanguage where

instance Bounded AnyScriptLanguage where
minBound = AnyScriptLanguage SimpleScriptLanguage
maxBound = AnyScriptLanguage (PlutusScriptLanguage PlutusScriptV3)
maxBound = AnyScriptLanguage (PlutusScriptLanguage PlutusScriptV4)

data AnyPlutusScriptVersion where
AnyPlutusScriptVersion
Expand All @@ -320,6 +321,7 @@ instance Enum AnyPlutusScriptVersion where
toEnum 0 = AnyPlutusScriptVersion PlutusScriptV1
toEnum 1 = AnyPlutusScriptVersion PlutusScriptV2
toEnum 2 = AnyPlutusScriptVersion PlutusScriptV3
toEnum 3 = AnyPlutusScriptVersion PlutusScriptV4
toEnum err = error $ "AnyPlutusScriptVersion.toEnum: bad argument: " <> show err

fromEnum (AnyPlutusScriptVersion PlutusScriptV1) = 0
Expand All @@ -329,7 +331,7 @@ instance Enum AnyPlutusScriptVersion where

instance Bounded AnyPlutusScriptVersion where
minBound = AnyPlutusScriptVersion PlutusScriptV1
maxBound = AnyPlutusScriptVersion PlutusScriptV3
maxBound = AnyPlutusScriptVersion PlutusScriptV4

instance ToCBOR AnyPlutusScriptVersion where
toCBOR = toCBOR . fromEnum
Expand Down Expand Up @@ -358,7 +360,8 @@ parsePlutusScriptVersion t =
"PlutusScriptV1" -> return (AnyPlutusScriptVersion PlutusScriptV1)
"PlutusScriptV2" -> return (AnyPlutusScriptVersion PlutusScriptV2)
"PlutusScriptV3" -> return (AnyPlutusScriptVersion PlutusScriptV3)
_ -> fail "Expected PlutusScriptVX, for X = 1, 2, or 3"
"PlutusScriptV4" -> return (AnyPlutusScriptVersion PlutusScriptV4)
_ -> fail "Expected PlutusScriptVX, for X = 1, 2, 3, or 4"

instance FromJSON AnyPlutusScriptVersion where
parseJSON = Aeson.withText "PlutusScriptVersion" parsePlutusScriptVersion
Expand All @@ -385,7 +388,7 @@ fromAlonzoLanguage :: Plutus.Language -> AnyPlutusScriptVersion
fromAlonzoLanguage Plutus.PlutusV1 = AnyPlutusScriptVersion PlutusScriptV1
fromAlonzoLanguage Plutus.PlutusV2 = AnyPlutusScriptVersion PlutusScriptV2
fromAlonzoLanguage Plutus.PlutusV3 = AnyPlutusScriptVersion PlutusScriptV3
fromAlonzoLanguage Plutus.PlutusV4 = AnyPlutusScriptVersion PlutusScriptV3
fromAlonzoLanguage Plutus.PlutusV4 = AnyPlutusScriptVersion PlutusScriptV4

class HasTypeProxy lang => IsScriptLanguage lang where
scriptLanguage :: ScriptLanguage lang
Expand Down Expand Up @@ -1294,20 +1297,16 @@ toShelleyScript
Plutus.PlutusBinary script
toShelleyScript
( ScriptInEra
_langInEra
langInEra
( PlutusScript
PlutusScriptV4
(PlutusScriptSerialised _script)
(PlutusScriptSerialised script)
)
) = error "toShelleyScript: PlutusV4 not implemented yet."

-- TODO: Ledger needs to introduce a plutusV4 constructor
-- case langInEra of
-- PlutusScriptV4InConway ->
-- Alonzo.PlutusScript . Conway.ConwayPlutusV3 . Plutus.Plutus $ Plutus.PlutusBinary script
-- PlutusScriptV4InDijkstra ->
-- Alonzo.PlutusScript . Dijkstra.MkDijkstraPlutusScript . Conway.ConwayPlutusV3 . Plutus.Plutus $
-- Plutus.PlutusBinary script
) =
case langInEra of
PlutusScriptV4InDijkstra ->
Alonzo.PlutusScript . Dijkstra.DijkstraPlutusV4 . Plutus.Plutus $
Plutus.PlutusBinary script
Comment on lines 1298 to +1309

fromShelleyBasedScript
:: ShelleyBasedEra era
Expand Down Expand Up @@ -1391,8 +1390,8 @@ fromShelleyBasedScript sbe script =
$ PlutusScriptSerialised s
Dijkstra.DijkstraPlutusV4 (PlutusScriptBinary s) ->
ScriptInEra
PlutusScriptV3InDijkstra
. PlutusScript PlutusScriptV3
PlutusScriptV4InDijkstra
. PlutusScript PlutusScriptV4
$ PlutusScriptSerialised s
Alonzo.NativeScript s ->
ScriptInEra SimpleScriptInDijkstra
Expand Down
Loading