Skip to content

Commit 87afbdd

Browse files
authored
Merge pull request #735 from IntersectMBO/plutus-script-cost-calculation-cmd
Add function `collectPlutusScriptHashes` to collect script hashes needed to validate a given transaction
2 parents 7005f4d + 6e17447 commit 87afbdd

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

cardano-api/internal/Cardano/Api/Plutus.hs

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,46 @@
1-
-- | This module provides an error to conveniently render plutus related failures.
1+
{-# LANGUAGE GADTs #-}
2+
{-# LANGUAGE TypeOperators #-}
3+
4+
-- | This module provides utilities to render the result of plutus execution.
25
module Cardano.Api.Plutus
36
( DebugPlutusFailure (..)
47
, renderDebugPlutusFailure
8+
, collectPlutusScriptHashes
59
)
610
where
711

8-
import Cardano.Api.Pretty
12+
import Cardano.Api.Eon.AlonzoEraOnwards (AlonzoEraOnwards (..),
13+
alonzoEraOnwardsConstraints)
14+
import Cardano.Api.Eon.Convert (convert)
15+
import Cardano.Api.Eon.ShelleyBasedEra (ShelleyLedgerEra)
16+
import Cardano.Api.Pretty (Pretty (pretty), docToText)
17+
import Cardano.Api.Query (UTxO, toLedgerUTxO)
18+
import qualified Cardano.Api.ReexposeLedger as L
19+
import Cardano.Api.Script (ScriptHash, fromShelleyScriptHash)
20+
import qualified Cardano.Api.Script as Api
21+
import Cardano.Api.Tx.Body (ScriptWitnessIndex (..), toScriptIndex)
22+
import Cardano.Api.Tx.Sign (Tx (..))
923

10-
import qualified Cardano.Ledger.Api as L
24+
import qualified Cardano.Ledger.Alonzo.Scripts as L
25+
import qualified Cardano.Ledger.Alonzo.UTxO as Alonzo
1126
import Cardano.Ledger.Binary.Encoding (serialize')
1227
import Cardano.Ledger.Binary.Plain (serializeAsHexText)
1328
import qualified Cardano.Ledger.Plutus.Evaluate as Plutus
1429
import qualified Cardano.Ledger.Plutus.ExUnits as Plutus
1530
import qualified Cardano.Ledger.Plutus.Language as Plutus
31+
import qualified Cardano.Ledger.UTxO as L
1632
import qualified PlutusLedgerApi.V1 as Plutus
1733

34+
import Data.Bifunctor (Bifunctor (..))
1835
import qualified Data.ByteString.Base64 as B64
19-
import Data.ByteString.Short as BSS
36+
import qualified Data.ByteString.Short as BSS
37+
import Data.Map (Map)
38+
import qualified Data.Map as Map
2039
import Data.Text (Text)
2140
import qualified Data.Text as Text
2241
import qualified Data.Text.Encoding as Text
23-
import Prettyprinter
42+
import Lens.Micro ((^.))
43+
import Prettyprinter (indent, line)
2444

2545
-- | A structured representation of Plutus script validation failures,
2646
-- providing detailed information about the failed execution for debugging purposes.
@@ -80,3 +100,36 @@ lookupPlutusErrorCode code =
80100
Just err -> Text.pack err
81101
Nothing -> "Unknown error code: " <> code
82102
-}
103+
104+
-- | Collect all plutus script hashes that are needed to validate the given transaction
105+
-- and return them in a map with their corresponding 'ScriptWitnessIndex' as key.
106+
collectPlutusScriptHashes
107+
:: AlonzoEraOnwards era
108+
-> Tx era
109+
-> UTxO era
110+
-> Map ScriptWitnessIndex ScriptHash
111+
collectPlutusScriptHashes aeo tx utxo =
112+
alonzoEraOnwardsConstraints aeo $
113+
let ShelleyTx _ ledgerTx' = tx
114+
ledgerUTxO = toLedgerUTxO (convert aeo) utxo
115+
in getPurposes aeo $ L.getScriptsNeeded ledgerUTxO (ledgerTx' ^. L.bodyTxL)
116+
where
117+
getPurposes
118+
:: L.EraCrypto (ShelleyLedgerEra era) ~ L.StandardCrypto
119+
=> AlonzoEraOnwards era
120+
-> Alonzo.AlonzoScriptsNeeded (ShelleyLedgerEra era)
121+
-> Map ScriptWitnessIndex Api.ScriptHash
122+
getPurposes aeo' (Alonzo.AlonzoScriptsNeeded purposes) =
123+
alonzoEraOnwardsConstraints aeo $
124+
Map.fromList $
125+
Prelude.map
126+
(bimap (toScriptIndex aeo' . purposeAsIxItemToAsIx aeo') fromShelleyScriptHash)
127+
purposes
128+
129+
purposeAsIxItemToAsIx
130+
:: AlonzoEraOnwards era
131+
-> L.PlutusPurpose L.AsIxItem (ShelleyLedgerEra era)
132+
-> L.PlutusPurpose L.AsIx (ShelleyLedgerEra era)
133+
purposeAsIxItemToAsIx onwards purpose =
134+
alonzoEraOnwardsConstraints onwards $
135+
L.hoistPlutusPurpose L.toAsIx purpose

cardano-api/src/Cardano/Api.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ module Cardano.Api
611611
, examplePlutusScriptAlwaysFails
612612

613613
-- ** Script data
614+
, collectPlutusScriptHashes
614615
, HashableScriptData
615616
, hashScriptDataBytes
616617
, getOriginalScriptDataBytes
@@ -1122,6 +1123,7 @@ import Cardano.Api.Monad.Error
11221123
import Cardano.Api.NetworkId
11231124
import Cardano.Api.OperationalCertificate
11241125
import Cardano.Api.Orphans ()
1126+
import Cardano.Api.Plutus (collectPlutusScriptHashes)
11251127
import Cardano.Api.Pretty
11261128
import Cardano.Api.Protocol
11271129
import Cardano.Api.ProtocolParameters

0 commit comments

Comments
 (0)