|
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. |
2 | 5 | module Cardano.Api.Plutus |
3 | 6 | ( DebugPlutusFailure (..) |
4 | 7 | , renderDebugPlutusFailure |
| 8 | + , collectPlutusScriptHashes |
5 | 9 | ) |
6 | 10 | where |
7 | 11 |
|
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 (..)) |
9 | 23 |
|
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 |
11 | 26 | import Cardano.Ledger.Binary.Encoding (serialize') |
12 | 27 | import Cardano.Ledger.Binary.Plain (serializeAsHexText) |
13 | 28 | import qualified Cardano.Ledger.Plutus.Evaluate as Plutus |
14 | 29 | import qualified Cardano.Ledger.Plutus.ExUnits as Plutus |
15 | 30 | import qualified Cardano.Ledger.Plutus.Language as Plutus |
| 31 | +import qualified Cardano.Ledger.UTxO as L |
16 | 32 | import qualified PlutusLedgerApi.V1 as Plutus |
17 | 33 |
|
| 34 | +import Data.Bifunctor (Bifunctor (..)) |
18 | 35 | 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 |
20 | 39 | import Data.Text (Text) |
21 | 40 | import qualified Data.Text as Text |
22 | 41 | import qualified Data.Text.Encoding as Text |
23 | | -import Prettyprinter |
| 42 | +import Lens.Micro ((^.)) |
| 43 | +import Prettyprinter (indent, line) |
24 | 44 |
|
25 | 45 | -- | A structured representation of Plutus script validation failures, |
26 | 46 | -- providing detailed information about the failed execution for debugging purposes. |
@@ -80,3 +100,36 @@ lookupPlutusErrorCode code = |
80 | 100 | Just err -> Text.pack err |
81 | 101 | Nothing -> "Unknown error code: " <> code |
82 | 102 | -} |
| 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 |
0 commit comments