Skip to content

Commit 8fd0b2a

Browse files
committed
Fail V1-V3 translation for presence of ScriptHash in guardsTxBody
1 parent 4162fa2 commit 8fd0b2a

2 files changed

Lines changed: 43 additions & 5 deletions

File tree

eras/dijkstra/impl/src/Cardano/Ledger/Dijkstra/TxInfo.hs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import Cardano.Ledger.Conway.TxInfo (
4646
transTxInInfoV3,
4747
)
4848
import qualified Cardano.Ledger.Conway.TxInfo as Conway
49-
import Cardano.Ledger.Credential (StakeReference (..))
49+
import Cardano.Ledger.Credential (Credential (..), StakeReference (..))
5050
import Cardano.Ledger.Dijkstra.Core
5151
import Cardano.Ledger.Dijkstra.Era (DijkstraEra)
5252
import Cardano.Ledger.Dijkstra.Scripts (
@@ -104,8 +104,10 @@ data DijkstraContextError era
104104
DirectDepositsNotSupported DirectDeposits
105105
| -- | Attempt to use PlutusV1-V3 with non-empty account balance intervals will result in this failure
106106
AccountBalanceIntervalsNotSupported (AccountBalanceIntervals era)
107-
| -- | Attempt to use sub-transactions with PlutusV1-V3 scripts at the top level
107+
| -- | Attempt to use sub-transactions with PlutusV1-V3 scripts at the top level will result in this failure
108108
SubTxsAreNotSupported (NonEmpty TxId)
109+
| -- | Attempt to use PlutusV1-V3 with script hashes in guards will result in this failure
110+
GuardScriptHashesNotSupported (NonEmpty ScriptHash)
109111
deriving (Generic)
110112

111113
deriving instance
@@ -163,6 +165,8 @@ instance
163165
kindObject "AccountBalanceIntervalsNotSupported" ["account_balance_intervals" .= show abi]
164166
SubTxsAreNotSupported txIds ->
165167
kindObject "SubTxsAreNotSupported" ["txIds" .= toJSON txIds]
168+
GuardScriptHashesNotSupported scriptHashes ->
169+
kindObject "GuardScriptHashesNotSupported" ["script_hashes" .= toJSON scriptHashes]
166170

167171
instance
168172
( EraPParams era
@@ -182,6 +186,7 @@ instance
182186
20 -> SumD DirectDepositsNotSupported <! From
183187
21 -> SumD AccountBalanceIntervalsNotSupported <! From
184188
22 -> SumD SubTxsAreNotSupported <! From
189+
23 -> SumD GuardScriptHashesNotSupported <! From
185190
k -> Invalid k
186191

187192
instance
@@ -204,6 +209,8 @@ instance
204209
DirectDepositsNotSupported dd -> Sum DirectDepositsNotSupported 20 !> To dd
205210
AccountBalanceIntervalsNotSupported abi -> Sum AccountBalanceIntervalsNotSupported 21 !> To abi
206211
SubTxsAreNotSupported txIds -> Sum SubTxsAreNotSupported 22 !> To txIds
212+
GuardScriptHashesNotSupported scriptHashes ->
213+
Sum GuardScriptHashesNotSupported 23 !> To scriptHashes
207214

208215
instance Inject (ConwayContextError era) (DijkstraContextError era) where
209216
inject = ConwayContextError
@@ -423,6 +430,7 @@ guardDijkstraFeaturesForPlutusV1toV3 tx = do
423430
directDeposits = txBody ^. directDepositsTxBodyL
424431
accountBalanceIntervals = txBody ^. accountBalanceIntervalsTxBodyL
425432
subTransactions = txBody ^. subTransactionsTxBodyL
433+
scriptHashes = [sh | ScriptHashObj sh <- toList (txBody ^. guardsTxBodyL)]
426434
unless (null $ unDirectDeposits directDeposits) $
427435
Left $
428436
inject $
@@ -437,6 +445,12 @@ guardDijkstraFeaturesForPlutusV1toV3 tx = do
437445
Left $
438446
inject $
439447
SubTxsAreNotSupported @era subTxIds
448+
case NE.nonEmpty scriptHashes of
449+
Nothing -> Right ()
450+
Just neScriptHashes ->
451+
Left $
452+
inject $
453+
GuardScriptHashesNotSupported @era neScriptHashes
440454

441455
transFailUnsupportedScriptInSubTx ::
442456
forall l era.

eras/dijkstra/impl/testlib/Test/Cardano/Ledger/Dijkstra/TxInfoSpec.hs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
{-# LANGUAGE DataKinds #-}
33
{-# LANGUAGE FlexibleContexts #-}
44
{-# LANGUAGE OverloadedLists #-}
5-
{-# LANGUAGE PatternSynonyms #-}
65
{-# LANGUAGE RankNTypes #-}
76
{-# LANGUAGE ScopedTypeVariables #-}
87
{-# LANGUAGE TypeApplications #-}
@@ -18,15 +17,19 @@ import Cardano.Ledger.Alonzo.Plutus.Context (
1817
)
1918
import Cardano.Ledger.Alonzo.Scripts (AsPurpose (..))
2019
import Cardano.Ledger.BaseTypes (Globals (..), Inject (..), Network (..), ProtVer (..))
21-
import Cardano.Ledger.Credential (StakeReference (..))
20+
import Cardano.Ledger.Credential (Credential (..), StakeReference (..))
2221
import Cardano.Ledger.Dijkstra.Core
23-
import Cardano.Ledger.Dijkstra.Scripts (AccountBalanceIntervals (..))
22+
import Cardano.Ledger.Dijkstra.Scripts (
23+
AccountBalanceIntervals (..),
24+
)
2425
import Cardano.Ledger.Dijkstra.State (UTxO (..))
2526
import Cardano.Ledger.Dijkstra.TxInfo (DijkstraContextError (..))
2627
import Cardano.Ledger.Plutus (Language (..), SLanguage (..), plutusLanguage)
28+
import Data.List.NonEmpty (NonEmpty (..))
2729
import qualified Data.Map.NonEmpty as NEM
2830
import qualified Data.Map.Strict as Map
2931
import qualified Data.OMap.Strict as OMap
32+
import qualified Data.OSet.Strict as OSet
3033
import Lens.Micro ((&), (.~))
3134
import Test.Cardano.Ledger.Common
3235
import Test.Cardano.Ledger.Core.Utils (testGlobals)
@@ -165,3 +168,24 @@ spec = describe "TxInfo" $ do
165168
<$> unPlutusTxInfoResult (toPlutusTxInfo slang ledgerTxInfo)
166169
txInfoResult
167170
`shouldBeLeft` inject (SubTxsAreNotSupported @era (pure (txIdTx subTx)))
171+
prop "GuardScriptHashesNotSupported" $ \(scriptHash :: ScriptHash) ->
172+
let
173+
neScriptHashes = scriptHash :| []
174+
guards = OSet.fromList [ScriptHashObj scriptHash]
175+
tx =
176+
mkBasicTx @era @TopTx $
177+
mkBasicTxBody & guardsTxBodyL .~ guards
178+
ledgerTxInfo =
179+
LedgerTxInfo
180+
{ ltiProtVer = ProtVer (eraProtVerLow @era) 0
181+
, ltiEpochInfo = epochInfo testGlobals
182+
, ltiSystemStart = systemStart testGlobals
183+
, ltiUTxO = mempty
184+
, ltiTx = tx
185+
, ltiMemoizedSubTransactions = mempty
186+
}
187+
txInfoResult =
188+
($ SpendingPurpose AsPurpose)
189+
<$> unPlutusTxInfoResult (toPlutusTxInfo slang ledgerTxInfo)
190+
in
191+
txInfoResult `shouldBeLeft` inject (GuardScriptHashesNotSupported @era neScriptHashes)

0 commit comments

Comments
 (0)