diff --git a/cardano-api/cardano-api.cabal b/cardano-api/cardano-api.cabal index 776691e9c0..9d0a927ed7 100644 --- a/cardano-api/cardano-api.cabal +++ b/cardano-api/cardano-api.cabal @@ -123,6 +123,7 @@ library internal Cardano.Api.NetworkId Cardano.Api.OperationalCertificate Cardano.Api.Orphans + Cardano.Api.Plutus Cardano.Api.Pretty Cardano.Api.Protocol Cardano.Api.ProtocolParameters @@ -161,6 +162,7 @@ library internal attoparsec, base16-bytestring >=1.0, base58-bytestring, + base64-bytestring, bech32 >=1.1.0, bytestring, cardano-binary, @@ -380,6 +382,7 @@ test-suite cardano-api-golden type: exitcode-stdio-1.0 build-depends: aeson, + base64-bytestring, bech32 >=1.1.0, bytestring, cardano-api, @@ -391,6 +394,7 @@ test-suite cardano-api-golden cardano-ledger-alonzo, cardano-ledger-api ^>=1.9, cardano-ledger-babbage >=1.9, + cardano-ledger-binary, cardano-ledger-core:{cardano-ledger-core, testlib} >=1.14, cardano-ledger-shelley, cardano-ledger-shelley-test >=1.2.0.1, @@ -403,7 +407,7 @@ test-suite cardano-api-golden microlens, parsec, plutus-core ^>=1.36, - plutus-ledger-api ^>=1.36, + plutus-ledger-api, tasty, tasty-hedgehog, text, diff --git a/cardano-api/internal/Cardano/Api/Fees.hs b/cardano-api/internal/Cardano/Api/Fees.hs index eb0b917714..fac558c5fd 100644 --- a/cardano-api/internal/Cardano/Api/Fees.hs +++ b/cardano-api/internal/Cardano/Api/Fees.hs @@ -63,6 +63,7 @@ import qualified Cardano.Api.Experimental.Eras as Exp import Cardano.Api.Experimental.Tx import Cardano.Api.Feature import qualified Cardano.Api.Ledger.Lens as A +import Cardano.Api.Plutus import Cardano.Api.Pretty import Cardano.Api.ProtocolParameters import Cardano.Api.Query @@ -84,7 +85,6 @@ import qualified Cardano.Ledger.Keys as Ledger import qualified Cardano.Ledger.Plutus.Language as Plutus import qualified Cardano.Ledger.Val as L import qualified Ouroboros.Consensus.HardFork.History as Consensus -import qualified PlutusLedgerApi.V1 as Plutus import Control.Monad import Data.Bifunctor (bimap, first, second) @@ -99,7 +99,6 @@ import Data.Ratio import Data.Set (Set) import qualified Data.Set as Set import Data.Text (Text) -import qualified Data.Text as Text import GHC.Exts (IsList (..)) import Lens.Micro ((.~), (^.)) @@ -540,7 +539,7 @@ data ScriptExecutionError -- (which is not possible for 'evaluateTransactionExecutionUnits' since -- the whole point of it is to discover how many execution units are -- needed). - ScriptErrorEvaluationFailed Plutus.EvaluationError [Text.Text] + ScriptErrorEvaluationFailed DebugPlutusFailure | -- | The execution units overflowed a 64bit word. Congratulations if -- you encounter this error. With the current style of cost model this -- would need a script to run for over 7 months, which is somewhat more @@ -581,11 +580,8 @@ instance Error ScriptExecutionError where [ "The Plutus script witness has the wrong datum (according to the UTxO). " , "The expected datum value has hash " <> pshow dh ] - ScriptErrorEvaluationFailed evalErr logs -> - mconcat - [ "The Plutus script evaluation failed: " <> pretty evalErr - , "\nScript debugging logs: " <> mconcat (map (\t -> pretty $ t `Text.append` "\n") logs) - ] + ScriptErrorEvaluationFailed plutusDebugFailure -> + pretty $ renderDebugPlutusFailure plutusDebugFailure ScriptErrorExecutionUnitsOverflow -> mconcat [ "The execution units required by this Plutus script overflows a 64bit " @@ -740,9 +736,8 @@ evaluateTransactionExecutionUnitsShelley sbe systemstart epochInfo (LedgerProtoc where txin' = fromShelleyTxIn txin L.MissingDatum dh -> ScriptErrorWrongDatum (ScriptDataHash dh) - L.ValidationFailure _ evalErr logs _ -> - -- TODO: Include additional information from ValidationFailure - ScriptErrorEvaluationFailed evalErr logs + L.ValidationFailure execUnits evalErr logs scriptWithContext -> + ScriptErrorEvaluationFailed $ DebugPlutusFailure evalErr scriptWithContext execUnits logs L.IncompatibleBudget _ -> ScriptErrorExecutionUnitsOverflow L.RedeemerPointsToUnknownScriptHash rdmrPtr -> ScriptErrorRedeemerPointsToUnknownScriptHash $ toScriptIndex aOnwards rdmrPtr diff --git a/cardano-api/internal/Cardano/Api/Plutus.hs b/cardano-api/internal/Cardano/Api/Plutus.hs new file mode 100644 index 0000000000..55afae8350 --- /dev/null +++ b/cardano-api/internal/Cardano/Api/Plutus.hs @@ -0,0 +1,88 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE UndecidableInstances #-} + +-- | This module provides an error to conveniently render plutus related failures. +module Cardano.Api.Plutus + ( DebugPlutusFailure (..) + , renderDebugPlutusFailure + ) +where + +import Cardano.Api.Pretty + +import qualified Cardano.Ledger.Api as L +import Cardano.Ledger.Binary.Encoding (serialize') +import Cardano.Ledger.Binary.Plain (serializeAsHexText) +import qualified Cardano.Ledger.Plutus.Evaluate as Plutus +import qualified Cardano.Ledger.Plutus.ExUnits as Plutus +import qualified Cardano.Ledger.Plutus.Language as Plutus +import qualified PlutusLedgerApi.V1 as Plutus + +import qualified Data.ByteString.Base64 as B64 +import Data.ByteString.Short as BSS +import Data.Text (Text) +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text +import Prettyprinter + +-- | A structured representation of Plutus script validation failures, +-- providing detailed information about the failed execution for debugging purposes. +-- This type contains the same information as the data constructor +-- 'Cardano.Ledger.Alonzo.Plutus.Evaluate.TransactionScriptFailure.ValidationFailure' +-- but with named fields and fixed crypto parameters for easier debugging and +-- error reporting. +data DebugPlutusFailure + = DebugPlutusFailure + { dpfEvaluationError :: Plutus.EvaluationError + , dpfScriptWithContext :: Plutus.PlutusWithContext L.StandardCrypto + , dpfExecutionUnits :: Plutus.ExUnits + , dpfExecutionLogs :: [Text] + } + deriving (Eq, Show) + +renderDebugPlutusFailure :: DebugPlutusFailure -> Text +renderDebugPlutusFailure dpf = + let pwc = dpfScriptWithContext dpf + lang = case pwc of + Plutus.PlutusWithContext{Plutus.pwcScript = script} -> + either Plutus.plutusLanguage Plutus.plutusLanguage script + + scriptArgs = case pwc of + Plutus.PlutusWithContext{Plutus.pwcArgs = args} -> + line <> indent 3 (pretty args) + protocolVersion = Plutus.pwcProtocolVersion pwc + scriptArgsBase64 = case pwc of + Plutus.PlutusWithContext{Plutus.pwcArgs = args} -> + Text.decodeUtf8 $ B64.encode $ serialize' protocolVersion args + evalError = dpfEvaluationError dpf + binaryScript = case pwc of + Plutus.PlutusWithContext{Plutus.pwcScript = scr} -> + let Plutus.Plutus bytes = either id Plutus.plutusFromRunnable scr + in Text.decodeUtf8 . B64.encode . BSS.fromShort $ Plutus.unPlutusBinary bytes + in Text.unlines + [ "Script hash: " <> serializeAsHexText (Plutus.pwcScriptHash pwc) + , "Script language: " <> Text.pack (show lang) + , "Protocol version: " <> Text.pack (show protocolVersion) + , "Script arguments: " <> docToText scriptArgs + , "Script evaluation error: " <> docToText (pretty evalError) + , "Script execution logs: " <> Text.unlines (dpfExecutionLogs dpf) + , "Script base64 encoded arguments: " <> scriptArgsBase64 + , "Script base64 encoded bytes: " <> binaryScript + ] + +{- +-- Should be used on `dpfExecutionLogs dpf`. Disabled until next plutus release. +See: https://github.com/IntersectMBO/cardano-api/pull/672#issuecomment-2455909946 + +PlutusTx.ErrorCodes.plutusPreludeErrorCodes + +lookupPlutusErrorCode :: Text -> Text +lookupPlutusErrorCode code = + let codeString = PlutusTx.stringToBuiltinString $ Text.unpack code + in case Map.lookup codeString plutusPreludeErrorCodes of + Just err -> Text.pack err + Nothing -> "Unknown error code: " <> code +-} diff --git a/cardano-api/test/cardano-api-golden/Test/Golden/ErrorsSpec.hs b/cardano-api/test/cardano-api-golden/Test/Golden/ErrorsSpec.hs index 19cc093595..b86611c8bb 100644 --- a/cardano-api/test/cardano-api-golden/Test/Golden/ErrorsSpec.hs +++ b/cardano-api/test/cardano-api-golden/Test/Golden/ErrorsSpec.hs @@ -1,7 +1,8 @@ +{-# LANGUAGE DataKinds #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TupleSections #-} {-# LANGUAGE TypeApplications #-} -{- HLINT ignore "Redundant do" -} {-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-} module Test.Golden.ErrorsSpec @@ -30,15 +31,21 @@ module Test.Golden.ErrorsSpec where import Cardano.Api +import Cardano.Api.Plutus import Cardano.Api.Shelley import Cardano.Binary as CBOR import qualified Cardano.Crypto.Seed as Crypto import qualified Cardano.Ledger.Alonzo.Plutus.TxInfo as Ledger import qualified Cardano.Ledger.Api.Era as Ledger +import qualified Cardano.Ledger.Binary.Decoding as Binary +import Cardano.Ledger.Binary.Version import qualified Cardano.Ledger.Coin as L import Cardano.Ledger.Crypto (StandardCrypto) -import qualified Cardano.Ledger.Plutus.Language as Plutus +import qualified Cardano.Ledger.Plutus.CostModels as Plutus +import Cardano.Ledger.Plutus.Evaluate +import Cardano.Ledger.Plutus.ExUnits +import qualified Cardano.Ledger.Plutus.Language as Language import qualified PlutusCore.Evaluation.Machine.CostModelInterface as Plutus import qualified PlutusLedgerApi.Common as Plutus hiding (PlutusV2) @@ -46,12 +53,15 @@ import qualified Codec.Binary.Bech32 as Bech32 import Control.Error.Util (hush) import qualified Data.Aeson as Aeson import Data.ByteString (ByteString) +import qualified Data.ByteString.Base64 as B64 import qualified Data.ByteString.Lazy as LBS import Data.Data import qualified Data.Map as Map -import Data.Maybe (fromJust) +import Data.Maybe import qualified Data.Set as Set import Data.Text (Text) +import qualified Data.Text.Encoding as Text +import Data.Word import GHC.Exts (IsList (..)) import GHC.Stack (HasCallStack) @@ -272,7 +282,12 @@ test_ScriptExecutionError = , ("ScriptErrorWrongDatum", ScriptErrorWrongDatum hashScriptData1) , ( "ScriptErrorEvaluationFailed" - , ScriptErrorEvaluationFailed Plutus.CostModelParameterMismatch (replicate 5 text) + , ScriptErrorEvaluationFailed $ + DebugPlutusFailure + Plutus.CostModelParameterMismatch + examplePlutusWithContext + (ExUnits 1 1) + ["Example logs"] ) , ("ScriptErrorExecutionUnitsOverflow", ScriptErrorExecutionUnitsOverflow) , @@ -289,10 +304,55 @@ test_ScriptExecutionError = (ScriptWitnessIndexMint 0) (ResolvablePointers ShelleyBasedEraBabbage Map.empty) -- TODO CIP-1694 make work in all eras ) - , ("ScriptErrorMissingCostModel", ScriptErrorMissingCostModel Plutus.PlutusV2) + , ("ScriptErrorMissingCostModel", ScriptErrorMissingCostModel Language.PlutusV2) , ("ScriptErrorTranslationError", ScriptErrorTranslationError testPastHorizonValue) ] +examplePlutusWithContext :: PlutusWithContext StandardCrypto +examplePlutusWithContext = + PlutusWithContext + { pwcProtocolVersion = defaultVersion + , pwcScript = Left examplePlutusScript + , pwcScriptHash = Language.hashPlutusScript examplePlutusScript + , pwcArgs = examplePlutusScriptArgs + , pwcExUnits = ExUnits 1 1 + , pwcCostModel = defaultCostModel + } + +defaultCostModel :: Plutus.CostModel +defaultCostModel = + fromJust + $ Plutus.costModelFromMap + Language.PlutusV3 + $ fromList + $ map (,0) (Plutus.costModelParamNames Language.PlutusV3) + +defaultVersion :: Version +defaultVersion = fromJust $ mkVersion @Word64 9 + +-- Try decoding to api's PlutusScript first then convert to ledger types +examplePlutusScript :: Language.Plutus Language.PlutusV3 +examplePlutusScript = + let cborBytes = Text.encodeUtf8 hexPlutusScriptBytes + in case deserialiseFromRawBytes (AsPlutusScript AsPlutusScriptV3) cborBytes of + Left e -> error $ "examplePlutusScript: Failed to decode Plutus script: " <> show e + Right (PlutusScriptSerialised script) -> Language.Plutus $ Language.PlutusBinary script + +examplePlutusScriptArgs :: Language.PlutusArgs Language.PlutusV3 +examplePlutusScriptArgs = + let cborBytes = B64.decodeLenient $ Text.encodeUtf8 base64PlutusScriptArgsBytes + in case Binary.decodeFull' defaultVersion cborBytes of + Left _ -> error "examplePlutusScriptArgs: Failed to decode Plutus script args" + Right args -> args + +base64PlutusScriptArgsBytes :: Text +base64PlutusScriptArgsBytes = + "2Hmf2Hmfn9h5n9h5n1ggp4nVTEZsdm+0vF4Jy816CkYJdWfk/2BiCVVip0BLnL8A/9h5n9h5n9h6n1gcxhv6HBOFJLafN4vGlQQyLzkonOVU1UnbTR4rUP/YeoD/oUChQBoATEtA2HqfWCADFwoudZe3t+PYTAU5HROaYrFX54eG2MCC8p3PTBETFP/YeoD///+An9h5n9h5n9h5n1gcxbyvlPIHUatyym5imViDpytwsNh06mjqCXkOk//YeoD/okChQBoAHoSAWBzGG/ocE4Uktp83i8aVBDIvOSic5VTVSdtNHitQoUpNaWxsYXJDb2luBdh5gNh6gP/YeZ/YeZ/YeZ9YHMW8r5TyB1GrcspuYplYg6crcLDYdOpo6gl5DpP/2HqA/6FAoUAaAA9CQNh6n1gg7hVazpxAKSB0y2r/jJzN0nPIFkj/EUnvNrzqbruKPiX/2HqA/9h5n9h5n9h5n1gcKSM+X/Qw3SW5FG9fON4SNYYd6scERBygsGr5Ev/YeoD/oUChQBsAAA2kdfg7QNh5gNh6gP//AKFYHMYb+hwThSS2nzeLxpUEMi85KJzlVNVJ200eK1ChSk1pbGxhckNvaW4Fn9h5n9h6n1gcxhv6HBOFJLafN4vGlQQyLzkonOVU1UnbTR4rUP/YeZ8aAAYagP///6DYeZ/YeZ/YeYDYeoD/2Hmf2HuA2HqA//+Ao9h6n9h5n1ggp4nVTEZsdm+0vF4Jy816CkYJdWfk/2BiCVVip0BLnL8A//8A2HmfWBzGG/ocE4Uktp83i8aVBDIvOSic5VTVSdtNHitQ/wDYfJ8A2Hmf2HqfWBzGG/ocE4Uktp83i8aVBDIvOSic5VTVSdtNHitQ/9h5nxoABhqA////AKJYIAMXCi51l7e349hMBTkdE5pisVfnh4bYwILync9MERMUAFgg7hVazpxAKSB0y2r/jJzN0nPIFkj/EUnvNrzqbruKPiUBWCDYftkmm+fgwSsSsBQx2QwFWHhnvtoPcpBPuBHJ7A+Z0KCA2HqA2HqA/wDYfJ8A2Hmf2HqfWBzGG/ocE4Uktp83i8aVBDIvOSic5VTVSdtNHitQ/9h5nxoABhqA/////w==" + +hexPlutusScriptBytes :: Text +hexPlutusScriptBytes = + "590e73590e7001000032323322332233223232323232323232323232323225335533535353232325335333573466e1d200000201301213232323232333222123330010040030023232325335333573466e1d200000201b01a1323232323232323232323232323232323333333333332333233233222222222222222212333333333333333300101101000f00e00d00c00b00a00900800700600500400300230013574202860026ae8404cc0948c8c8c94cd4ccd5cd19b87480000080c40c04cc8848cc00400c008c074d5d080098029aba135744002260589201035054310035573c0046aae74004dd5000998128009aba101123232325335333573466e1d200000203002f13232333322221233330010050040030023232325335333573466e1d2000002035034133221233001003002302e357420026605e4646464a66a666ae68cdc3a4000004072070264244600400660646ae8400454cd4ccd5cd19b87480080080e40e04c8ccc888488ccc00401401000cdd69aba1002375a6ae84004dd69aba1357440026ae880044c0d12401035054310035573c0046aae74004dd50009aba135744002260609201035054310035573c0046aae74004dd51aba1003300735742004646464a66a666ae68cdc3a400000406a068224440062a66a666ae68cdc3a400400406a068264244460020086eb8d5d08008a99a999ab9a3370e900200101a81a099091118010021aba1001130304901035054310035573c0046aae74004dd51aba10013302c75c6ae84d5d10009aba200135744002260569201035054310035573c0046aae74004dd50009bad3574201e60026ae84038c008c009d69981180a9aba100c33302702475a6ae8402cc8c8c94cd4ccd5cd19b87480000080b80b44cc8848cc00400c008c8c8c94cd4ccd5cd19b87480000080c40c04cc8848cc00400c008cc09dd69aba10013026357426ae880044c0b1241035054310035573c0046aae74004dd51aba10013232325335333573466e1d20000020310301332212330010030023302775a6ae84004c098d5d09aba20011302c491035054310035573c0046aae74004dd51aba13574400226052921035054310035573c0046aae74004dd51aba100a3302375c6ae84024ccc09c8c8c8c94cd4ccd5cd19b87480000080bc0b84c84888888c01401cdd71aba100115335333573466e1d200200202f02e13212222223002007301b357420022a66a666ae68cdc3a400800405e05c2642444444600600e60506ae8400454cd4ccd5cd19b87480180080bc0b84cc884888888cc01802001cdd69aba10013019357426ae8800454cd4ccd5cd19b87480200080bc0b84c84888888c00401cc068d5d08008a99a999ab9a3370e9005001017817099910911111198020040039bad3574200260306ae84d5d1000898152481035054310035573c0046aae74004dd500080f9aba10083300201f3574200e6eb8d5d080319981380b198138111191919299a999ab9a3370e9000001017817089110010a99a999ab9a3370e9001001017817089110008a99a999ab9a3370e900200101781708911001898152481035054310035573c0046aae74004dd50009aba1005330230143574200860026ae8400cc004d5d09aba2003302475a604aeb8d5d10009aba2001357440026ae88004d5d10009aba2001357440026ae88004d5d10009aba2001357440026ae88004d5d10009aba200113016491035054310035573c0046aae74004dd51aba10063574200a646464a66a666ae68cdc3a40000040360342642444444600a00e6eb8d5d08008a99a999ab9a3370e900100100d80d0999109111111980100400398039aba10013301500f357426ae8800454cd4ccd5cd19b874801000806c0684c84888888c00c01cc050d5d08008a99a999ab9a3370e900300100d80d099910911111198030040039bad35742002600a6ae84d5d10008a99a999ab9a3370e900400100d80d0990911111180080398031aba100115335333573466e1d200a00201b01a13322122222233004008007375a6ae84004c010d5d09aba2001130164901035054310035573c0046aae74004dd51aba13574400a4646464a66a666ae68cdc3a4000004036034264666444246660020080060046eb4d5d0801180a9aba10013232325335333573466e1d200000201f01e1323332221222222233300300a0090083301a017357420046ae84004cc069d71aba1357440026ae8800454cd4ccd5cd19b874800800807c0784cc8848888888cc01c024020cc064058d5d0800991919299a999ab9a3370e90000010110108999109198008018011bad357420026eb4d5d09aba20011301d491035054310035573c0046aae74004dd51aba1357440022a66a666ae68cdc3a400800403e03c266442444444466004012010666036030eb4d5d08009980cbae357426ae8800454cd4ccd5cd19b874801800807c0784c848888888c010020cc064058d5d08008a99a999ab9a3370e900400100f80f09919199991110911111119998008058050048041980d80c1aba10033301901a3574200466603a034eb4d5d08009a991919299a999ab9a3370e90000010120118998149bad357420026eb4d5d09aba20011301f4901035054310035573c0046aae74004dd51aba135744002446602a0040026ae88004d5d10008a99a999ab9a3370e900500100f80f0999109111111198028048041980c80b1aba10013232325335333573466e1d200000202202113301c75c6ae840044c075241035054310035573c0046aae74004dd51aba1357440022a66a666ae68cdc3a401800403e03c22444444400c26034921035054310035573c0046aae74004dd51aba1357440026ae880044c059241035054310035573c0046aae74004dd50009191919299a999ab9a3370e900000100d00c899910911111111111980280680618099aba10013301475a6ae84d5d10008a99a999ab9a3370e900100100d00c899910911111111111980100680618099aba10013301475a6ae84d5d10008a9919a999ab9a3370e900200180d80d0999109111111111119805006806180a1aba10023001357426ae8800854cd4ccd5cd19b874801800c06c0684c8ccc888488888888888ccc018038034030c054d5d080198011aba1001375a6ae84d5d10009aba200215335333573466e1d200800301b01a133221222222222223300700d00c3014357420046eb4d5d09aba200215335333573466e1d200a00301b01a132122222222222300100c3014357420042a66a666ae68cdc3a4018006036034266442444444444446600601a01860286ae84008dd69aba1357440042a66a666ae68cdc3a401c006036034266442444444444446601201a0186eb8d5d08011bae357426ae8800854cd4ccd5cd19b874804000c06c0684cc88488888888888cc020034030dd71aba1002375a6ae84d5d10010a99a999ab9a3370e900900180d80d0999109111111111119805806806180a1aba10023014357426ae8800854cd4ccd5cd19b874805000c06c0684c8488888888888c010030c050d5d08010980b2481035054310023232325335333573466e1d200000201e01d13212223003004375c6ae8400454c8cd4ccd5cd19b874800800c07c0784c84888c004010c004d5d08010a99a999ab9a3370e900200180f80f099910911198010028021bae3574200460026ae84d5d10010980d2481035054310023232325335333573466e1d200000202202113212223003004301b357420022a66a666ae68cdc3a4004004044042224440042a66a666ae68cdc3a4008004044042224440022603a921035054310035573c0046aae74004dd50009aab9e00235573a0026ea8004d55cf0011aab9d00137540024646464a66a666ae68cdc3a40000040320302642444600600860246ae8400454cd4ccd5cd19b87480080080640604c84888c008010c048d5d08008a99a999ab9a3370e900200100c80c099091118008021bae3574200226028921035054310035573c0046aae74004dd50009191919299a999ab9a3370e900000100c00b8999109198008018011bae357420026eb4d5d09aba200113013491035054310035573c0046aae74004dd50009aba20011300e491035054310035573c0046aae74004dd50009110019111111111111111180f0031080888078a4c26016921035054350030142225335333573466e1d20000010110101300c491035054330015335333573466e20005200001101013300333702900000119b81480000044c8cc8848cc00400c008cdc200180099b840020013300400200130132225335333573466e1d200000101000f10021330030013370c00400240024646464a66a666ae68cdc3a400000401e01c201c2a66a666ae68cdc3a400400401e01c201e260149201035054310035573c0046aae74004dd500091191919299a999ab9a3370e9000001007807089110010a99a999ab9a3370e90010010078070990911180180218029aba100115335333573466e1d200400200f00e112220011300a4901035054310035573c0046aae74004dd50009191919299a999ab9a3370e90000010068060999109198008018011bae357420026eb4d5d09aba200113008491035054310035573c0046aae74004dd5000919118011bac001300f2233335573e002401c466a01a60086ae84008c00cd5d10010041191919299a999ab9a3370e900000100580509909118010019bae357420022a66a666ae68cdc3a400400401601426424460020066eb8d5d0800898032481035054310035573c0046aae74004dd500091191919299a999ab9a3370e90010010058050a8070a99a999ab9a3370e90000010058050980798029aba1001130064901035054310035573c0046aae74004dd5000919319ab9c00100322322300237560026018446666aae7c004802c8c8cd402ccc03cc018d55ce80098029aab9e0013004357440066ae8400801448004c020894cd40045401c884d4008894cd4ccd5cd19b8f4881210104312775add93ed57c301fab7501f74beb3dbc3a70a659ef36bcea6ebb8a3e25000020080071300c001130060031220021220011220021221223300100400321223002003112200122123300100300223230010012300223300200200101" + test_StakePoolMetadataValidationError :: TestTree test_StakePoolMetadataValidationError = testAllErrorMessages @StakePoolMetadataValidationError diff --git a/cardano-api/test/cardano-api-golden/files/golden/errors/Cardano.Api.Fees.ScriptExecutionError/ScriptErrorEvaluationFailed.txt b/cardano-api/test/cardano-api-golden/files/golden/errors/Cardano.Api.Fees.ScriptExecutionError/ScriptErrorEvaluationFailed.txt index 660b0bb374..1ab8477c1c 100644 --- a/cardano-api/test/cardano-api-golden/files/golden/errors/Cardano.Api.Fees.ScriptExecutionError/ScriptErrorEvaluationFailed.txt +++ b/cardano-api/test/cardano-api-golden/files/golden/errors/Cardano.Api.Fees.ScriptExecutionError/ScriptErrorEvaluationFailed.txt @@ -1,6 +1,59 @@ -The Plutus script evaluation failed: Cost model parameters were not as we expected -Script debugging logs: - - - - +Script hash: 581c6df41fc4a246b092be25af52ef47626f1d33d244c98d3885250f42ce +Script language: PlutusV3 +Protocol version: Version 9 +Script arguments: + ScriptInfo: CertifyingScript 0 (TxCertRegStaking (ScriptCredential c61bfa1c138524b69f378bc69504322f39289ce554d549db4d1e2b50) (Just 400000)) + TxInfo: + TxId: d87ed9269be7e0c12b12b01431d90c05587867beda0f72904fb811c9ec0f99d0 + Inputs: [ a789d54c466c766fb4bc5e09cbcd7a0a46097567e4ff6062095562a7404b9cbf!0 -> - Value {getValue = Map {unMap = [(,Map {unMap = [("",5000000)]})]}} addressed to + ScriptCredential: c61bfa1c138524b69f378bc69504322f39289ce554d549db4d1e2b50 (no staking credential) + with datum + datum hash: 03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314 + with referenceScript + ] + Reference inputs: [] + Outputs: [ - Value {getValue = Map {unMap = [(,Map {unMap = [("",2000000)]}),(c61bfa1c138524b69f378bc69504322f39289ce554d549db4d1e2b50,Map {unMap = [("MillarCoin",5)]})]}} addressed to + PubKeyCredential: c5bcaf94f20751ab72ca6e62995883a72b70b0d874ea68ea09790e93 (no staking credential) + with datum + no datum + with referenceScript + + , - Value {getValue = Map {unMap = [(,Map {unMap = [("",1000000)]})]}} addressed to + PubKeyCredential: c5bcaf94f20751ab72ca6e62995883a72b70b0d874ea68ea09790e93 (no staking credential) + with datum + datum hash: ee155ace9c40292074cb6aff8c9ccdd273c81648ff1149ef36bcea6ebb8a3e25 + with referenceScript + + , - Value {getValue = Map {unMap = [(,Map {unMap = [("",15000005000000)]})]}} addressed to + PubKeyCredential: 29233e5ff430dd25b9146f5f38de1235861deac704441ca0b06af912 (no staking credential) + with datum + no datum + with referenceScript + ] + Fee: 0 + Value minted: Value {getValue = Map {unMap = [(c61bfa1c138524b69f378bc69504322f39289ce554d549db4d1e2b50,Map {unMap = [("MillarCoin",5)]})]}} + TxCerts: [ TxCertRegStaking (ScriptCredential c61bfa1c138524b69f378bc69504322f39289ce554d549db4d1e2b50) (Just 400000) ] + Wdrl: [] + Valid range: (-∞ , +∞) + Signatories: [] + Redeemers: [ ( Spending (TxOutRef {txOutRefId = a789d54c466c766fb4bc5e09cbcd7a0a46097567e4ff6062095562a7404b9cbf, txOutRefIdx = 0}) + , 0 ) + , ( Minting c61bfa1c138524b69f378bc69504322f39289ce554d549db4d1e2b50 + , 0 ) + , ( Certifying 0 (TxCertRegStaking (ScriptCredential c61bfa1c138524b69f378bc69504322f39289ce554d549db4d1e2b50) (Just 400000)) + , 0 ) ] + Datums: [ ( 03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314 + , 0 ) + , ( ee155ace9c40292074cb6aff8c9ccdd273c81648ff1149ef36bcea6ebb8a3e25 + , 1 ) ] + Votes: [] + Proposal Procedures: [] + Current Treasury Amount: + Treasury Donation: + Redeemer: + 0 +Script evaluation error: Cost model parameters were not as we expected +Script execution logs: Example logs + +Script base64 encoded arguments: 2Hmf2Hmfn9h5n9h5n1ggp4nVTEZsdm+0vF4Jy816CkYJdWfk/2BiCVVip0BLnL8A/9h5n9h5n9h6n1gcxhv6HBOFJLafN4vGlQQyLzkonOVU1UnbTR4rUP/YeoD/oUChQBoATEtA2HqfWCADFwoudZe3t+PYTAU5HROaYrFX54eG2MCC8p3PTBETFP/YeoD///+An9h5n9h5n9h5n1gcxbyvlPIHUatyym5imViDpytwsNh06mjqCXkOk//YeoD/okChQBoAHoSAWBzGG/ocE4Uktp83i8aVBDIvOSic5VTVSdtNHitQoUpNaWxsYXJDb2luBdh5gNh6gP/YeZ/YeZ/YeZ9YHMW8r5TyB1GrcspuYplYg6crcLDYdOpo6gl5DpP/2HqA/6FAoUAaAA9CQNh6n1gg7hVazpxAKSB0y2r/jJzN0nPIFkj/EUnvNrzqbruKPiX/2HqA/9h5n9h5n9h5n1gcKSM+X/Qw3SW5FG9fON4SNYYd6scERBygsGr5Ev/YeoD/oUChQBsAAA2kdfg7QNh5gNh6gP//AKFYHMYb+hwThSS2nzeLxpUEMi85KJzlVNVJ200eK1ChSk1pbGxhckNvaW4Fn9h5n9h6n1gcxhv6HBOFJLafN4vGlQQyLzkonOVU1UnbTR4rUP/YeZ8aAAYagP///6DYeZ/YeZ/YeYDYeoD/2Hmf2HuA2HqA//+Ao9h6n9h5n1ggp4nVTEZsdm+0vF4Jy816CkYJdWfk/2BiCVVip0BLnL8A//8A2HmfWBzGG/ocE4Uktp83i8aVBDIvOSic5VTVSdtNHitQ/wDYfJ8A2Hmf2HqfWBzGG/ocE4Uktp83i8aVBDIvOSic5VTVSdtNHitQ/9h5nxoABhqA////AKJYIAMXCi51l7e349hMBTkdE5pisVfnh4bYwILync9MERMUAFgg7hVazpxAKSB0y2r/jJzN0nPIFkj/EUnvNrzqbruKPiUBWCDYftkmm+fgwSsSsBQx2QwFWHhnvtoPcpBPuBHJ7A+Z0KCA2HqA2HqA/wDYfJ8A2Hmf2HqfWBzGG/ocE4Uktp83i8aVBDIvOSic5VTVSdtNHitQ/9h5nxoABhqA/////w== +Script base64 encoded bytes: NTkwZTczNTkwZTcwMDEwMDAwMzIzMjMzMjIzMzIyMzMyMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMjUzMzU1MzM1MzUzNTMyMzIzMjUzMzUzMzM1NzM0NjZlMWQyMDAwMDAyMDEzMDEyMTMyMzIzMjMyMzIzMzMyMjIxMjMzMzAwMTAwNDAwMzAwMjMyMzIzMjUzMzUzMzM1NzM0NjZlMWQyMDAwMDAyMDFiMDFhMTMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzIzMjMyMzMzMzMzMzMzMzMzMjMzMzIzMzIzMzIyMjIyMjIyMjIyMjIyMjIxMjMzMzMzMzMzMzMzMzMzMzMwMDEwMTEwMTAwMGYwMGUwMGQwMGMwMGIwMGEwMDkwMDgwMDcwMDYwMDUwMDQwMDMwMDIzMDAxMzU3NDIwMjg2MDAyNmFlODQwNGNjMDk0OGM4YzhjOTRjZDRjY2Q1Y2QxOWI4NzQ4MDAwMDA4MGM0MGMwNGNjODg0OGNjMDA0MDBjMDA4YzA3NGQ1ZDA4MDA5ODAyOWFiYTEzNTc0NDAwMjI2MDU4OTIwMTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUwMDA5OTgxMjgwMDlhYmExMDExMjMyMzIzMjUzMzUzMzM1NzM0NjZlMWQyMDAwMDAyMDMwMDJmMTMyMzIzMzMzMjIyMjEyMzMzMzAwMTAwNTAwNDAwMzAwMjMyMzIzMjUzMzUzMzM1NzM0NjZlMWQyMDAwMDAyMDM1MDM0MTMzMjIxMjMzMDAxMDAzMDAyMzAyZTM1NzQyMDAyNjYwNWU0NjQ2NDY0YTY2YTY2NmFlNjhjZGMzYTQwMDAwMDQwNzIwNzAyNjQyNDQ2MDA0MDA2NjA2NDZhZTg0MDA0NTRjZDRjY2Q1Y2QxOWI4NzQ4MDA4MDA4MGU0MGUwNGM4Y2NjODg4NDg4Y2NjMDA0MDE0MDEwMDBjZGQ2OWFiYTEwMDIzNzVhNmFlODQwMDRkZDY5YWJhMTM1NzQ0MDAyNmFlODgwMDQ0YzBkMTI0MDEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MDAwOWFiYTEzNTc0NDAwMjI2MDYwOTIwMTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUxYWJhMTAwMzMwMDczNTc0MjAwNDY0NjQ2NGE2NmE2NjZhZTY4Y2RjM2E0MDAwMDA0MDZhMDY4MjI0NDQwMDYyYTY2YTY2NmFlNjhjZGMzYTQwMDQwMDQwNmEwNjgyNjQyNDQ0NjAwMjAwODZlYjhkNWQwODAwOGE5OWE5OTlhYjlhMzM3MGU5MDAyMDAxMDFhODFhMDk5MDkxMTE4MDEwMDIxYWJhMTAwMTEzMDMwNDkwMTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUxYWJhMTAwMTMzMDJjNzVjNmFlODRkNWQxMDAwOWFiYTIwMDEzNTc0NDAwMjI2MDU2OTIwMTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUwMDA5YmFkMzU3NDIwMWU2MDAyNmFlODQwMzhjMDA4YzAwOWQ2OTk4MTE4MGE5YWJhMTAwYzMzMzAyNzAyNDc1YTZhZTg0MDJjYzhjOGM5NGNkNGNjZDVjZDE5Yjg3NDgwMDAwMDgwYjgwYjQ0Y2M4ODQ4Y2MwMDQwMGMwMDhjOGM4Yzk0Y2Q0Y2NkNWNkMTliODc0ODAwMDAwODBjNDBjMDRjYzg4NDhjYzAwNDAwYzAwOGNjMDlkZDY5YWJhMTAwMTMwMjYzNTc0MjZhZTg4MDA0NGMwYjEyNDEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MWFiYTEwMDEzMjMyMzI1MzM1MzMzNTczNDY2ZTFkMjAwMDAwMjAzMTAzMDEzMzIyMTIzMzAwMTAwMzAwMjMzMDI3NzVhNmFlODQwMDRjMDk4ZDVkMDlhYmEyMDAxMTMwMmM0OTEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MWFiYTEzNTc0NDAwMjI2MDUyOTIxMDM1MDU0MzEwMDM1NTczYzAwNDZhYWU3NDAwNGRkNTFhYmExMDBhMzMwMjM3NWM2YWU4NDAyNGNjYzA5YzhjOGM4Yzk0Y2Q0Y2NkNWNkMTliODc0ODAwMDAwODBiYzBiODRjODQ4ODg4ODhjMDE0MDFjZGQ3MWFiYTEwMDExNTMzNTMzMzU3MzQ2NmUxZDIwMDIwMDIwMmYwMmUxMzIxMjIyMjIyMzAwMjAwNzMwMWIzNTc0MjAwMjJhNjZhNjY2YWU2OGNkYzNhNDAwODAwNDA1ZTA1YzI2NDI0NDQ0NDQ2MDA2MDBlNjA1MDZhZTg0MDA0NTRjZDRjY2Q1Y2QxOWI4NzQ4MDE4MDA4MGJjMGI4NGNjODg0ODg4ODg4Y2MwMTgwMjAwMWNkZDY5YWJhMTAwMTMwMTkzNTc0MjZhZTg4MDA0NTRjZDRjY2Q1Y2QxOWI4NzQ4MDIwMDA4MGJjMGI4NGM4NDg4ODg4OGMwMDQwMWNjMDY4ZDVkMDgwMDhhOTlhOTk5YWI5YTMzNzBlOTAwNTAwMTAxNzgxNzA5OTkxMDkxMTExMTE5ODAyMDA0MDAzOWJhZDM1NzQyMDAyNjAzMDZhZTg0ZDVkMTAwMDg5ODE1MjQ4MTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUwMDA4MGY5YWJhMTAwODMzMDAyMDFmMzU3NDIwMGU2ZWI4ZDVkMDgwMzE5OTgxMzgwYjE5ODEzODExMTE5MTkxOTI5OWE5OTlhYjlhMzM3MGU5MDAwMDAxMDE3ODE3MDg5MTEwMDEwYTk5YTk5OWFiOWEzMzcwZTkwMDEwMDEwMTc4MTcwODkxMTAwMDhhOTlhOTk5YWI5YTMzNzBlOTAwMjAwMTAxNzgxNzA4OTExMDAxODk4MTUyNDgxMDM1MDU0MzEwMDM1NTczYzAwNDZhYWU3NDAwNGRkNTAwMDlhYmExMDA1MzMwMjMwMTQzNTc0MjAwODYwMDI2YWU4NDAwY2MwMDRkNWQwOWFiYTIwMDMzMDI0NzVhNjA0YWViOGQ1ZDEwMDA5YWJhMjAwMTM1NzQ0MDAyNmFlODgwMDRkNWQxMDAwOWFiYTIwMDEzNTc0NDAwMjZhZTg4MDA0ZDVkMTAwMDlhYmEyMDAxMzU3NDQwMDI2YWU4ODAwNGQ1ZDEwMDA5YWJhMjAwMTEzMDE2NDkxMDM1MDU0MzEwMDM1NTczYzAwNDZhYWU3NDAwNGRkNTFhYmExMDA2MzU3NDIwMGE2NDY0NjRhNjZhNjY2YWU2OGNkYzNhNDAwMDAwNDAzNjAzNDI2NDI0NDQ0NDQ2MDBhMDBlNmViOGQ1ZDA4MDA4YTk5YTk5OWFiOWEzMzcwZTkwMDEwMDEwMGQ4MGQwOTk5MTA5MTExMTExOTgwMTAwNDAwMzk4MDM5YWJhMTAwMTMzMDE1MDBmMzU3NDI2YWU4ODAwNDU0Y2Q0Y2NkNWNkMTliODc0ODAxMDAwODA2YzA2ODRjODQ4ODg4ODhjMDBjMDFjYzA1MGQ1ZDA4MDA4YTk5YTk5OWFiOWEzMzcwZTkwMDMwMDEwMGQ4MGQwOTk5MTA5MTExMTExOTgwMzAwNDAwMzliYWQzNTc0MjAwMjYwMGE2YWU4NGQ1ZDEwMDA4YTk5YTk5OWFiOWEzMzcwZTkwMDQwMDEwMGQ4MGQwOTkwOTExMTExMTgwMDgwMzk4MDMxYWJhMTAwMTE1MzM1MzMzNTczNDY2ZTFkMjAwYTAwMjAxYjAxYTEzMzIyMTIyMjIyMjMzMDA0MDA4MDA3Mzc1YTZhZTg0MDA0YzAxMGQ1ZDA5YWJhMjAwMTEzMDE2NDkwMTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUxYWJhMTM1NzQ0MDBhNDY0NjQ2NGE2NmE2NjZhZTY4Y2RjM2E0MDAwMDA0MDM2MDM0MjY0NjY2NDQ0MjQ2NjYwMDIwMDgwMDYwMDQ2ZWI0ZDVkMDgwMTE4MGE5YWJhMTAwMTMyMzIzMjUzMzUzMzM1NzM0NjZlMWQyMDAwMDAyMDFmMDFlMTMyMzMzMjIyMTIyMjIyMjIzMzMwMDMwMGEwMDkwMDgzMzAxYTAxNzM1NzQyMDA0NmFlODQwMDRjYzA2OWQ3MWFiYTEzNTc0NDAwMjZhZTg4MDA0NTRjZDRjY2Q1Y2QxOWI4NzQ4MDA4MDA4MDdjMDc4NGNjODg0ODg4ODg4OGNjMDFjMDI0MDIwY2MwNjQwNThkNWQwODAwOTkxOTE5Mjk5YTk5OWFiOWEzMzcwZTkwMDAwMDEwMTEwMTA4OTk5MTA5MTk4MDA4MDE4MDExYmFkMzU3NDIwMDI2ZWI0ZDVkMDlhYmEyMDAxMTMwMWQ0OTEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MWFiYTEzNTc0NDAwMjJhNjZhNjY2YWU2OGNkYzNhNDAwODAwNDAzZTAzYzI2NjQ0MjQ0NDQ0NDQ2NjAwNDAxMjAxMDY2NjAzNjAzMGViNGQ1ZDA4MDA5OTgwY2JhZTM1NzQyNmFlODgwMDQ1NGNkNGNjZDVjZDE5Yjg3NDgwMTgwMDgwN2MwNzg0Yzg0ODg4ODg4OGMwMTAwMjBjYzA2NDA1OGQ1ZDA4MDA4YTk5YTk5OWFiOWEzMzcwZTkwMDQwMDEwMGY4MGYwOTkxOTE5OTk5MTExMDkxMTExMTExOTk5ODAwODA1ODA1MDA0ODA0MTk4MGQ4MGMxYWJhMTAwMzMzMDE5MDFhMzU3NDIwMDQ2NjYwM2EwMzRlYjRkNWQwODAwOWE5OTE5MTkyOTlhOTk5YWI5YTMzNzBlOTAwMDAwMTAxMjAxMTg5OTgxNDliYWQzNTc0MjAwMjZlYjRkNWQwOWFiYTIwMDExMzAxZjQ5MDEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MWFiYTEzNTc0NDAwMjQ0NjYwMmEwMDQwMDI2YWU4ODAwNGQ1ZDEwMDA4YTk5YTk5OWFiOWEzMzcwZTkwMDUwMDEwMGY4MGYwOTk5MTA5MTExMTExMTk4MDI4MDQ4MDQxOTgwYzgwYjFhYmExMDAxMzIzMjMyNTMzNTMzMzU3MzQ2NmUxZDIwMDAwMDIwMjIwMjExMzMwMWM3NWM2YWU4NDAwNDRjMDc1MjQxMDM1MDU0MzEwMDM1NTczYzAwNDZhYWU3NDAwNGRkNTFhYmExMzU3NDQwMDIyYTY2YTY2NmFlNjhjZGMzYTQwMTgwMDQwM2UwM2MyMjQ0NDQ0NDQwMGMyNjAzNDkyMTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUxYWJhMTM1NzQ0MDAyNmFlODgwMDQ0YzA1OTI0MTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUwMDA5MTkxOTE5Mjk5YTk5OWFiOWEzMzcwZTkwMDAwMDEwMGQwMGM4OTk5MTA5MTExMTExMTExMTE5ODAyODA2ODA2MTgwOTlhYmExMDAxMzMwMTQ3NWE2YWU4NGQ1ZDEwMDA4YTk5YTk5OWFiOWEzMzcwZTkwMDEwMDEwMGQwMGM4OTk5MTA5MTExMTExMTExMTE5ODAxMDA2ODA2MTgwOTlhYmExMDAxMzMwMTQ3NWE2YWU4NGQ1ZDEwMDA4YTk5MTlhOTk5YWI5YTMzNzBlOTAwMjAwMTgwZDgwZDA5OTkxMDkxMTExMTExMTExMTk4MDUwMDY4MDYxODBhMWFiYTEwMDIzMDAxMzU3NDI2YWU4ODAwODU0Y2Q0Y2NkNWNkMTliODc0ODAxODAwYzA2YzA2ODRjOGNjYzg4ODQ4ODg4ODg4ODg4OGNjYzAxODAzODAzNDAzMGMwNTRkNWQwODAxOTgwMTFhYmExMDAxMzc1YTZhZTg0ZDVkMTAwMDlhYmEyMDAyMTUzMzUzMzM1NzM0NjZlMWQyMDA4MDAzMDFiMDFhMTMzMjIxMjIyMjIyMjIyMjIzMzAwNzAwZDAwYzMwMTQzNTc0MjAwNDZlYjRkNWQwOWFiYTIwMDIxNTMzNTMzMzU3MzQ2NmUxZDIwMGEwMDMwMWIwMWExMzIxMjIyMjIyMjIyMjIzMDAxMDBjMzAxNDM1NzQyMDA0MmE2NmE2NjZhZTY4Y2RjM2E0MDE4MDA2MDM2MDM0MjY2NDQyNDQ0NDQ0NDQ0NDQ2NjAwNjAxYTAxODYwMjg2YWU4NDAwOGRkNjlhYmExMzU3NDQwMDQyYTY2YTY2NmFlNjhjZGMzYTQwMWMwMDYwMzYwMzQyNjY0NDI0NDQ0NDQ0NDQ0NDY2MDEyMDFhMDE4NmViOGQ1ZDA4MDExYmFlMzU3NDI2YWU4ODAwODU0Y2Q0Y2NkNWNkMTliODc0ODA0MDAwYzA2YzA2ODRjYzg4NDg4ODg4ODg4ODg4Y2MwMjAwMzQwMzBkZDcxYWJhMTAwMjM3NWE2YWU4NGQ1ZDEwMDEwYTk5YTk5OWFiOWEzMzcwZTkwMDkwMDE4MGQ4MGQwOTk5MTA5MTExMTExMTExMTE5ODA1ODA2ODA2MTgwYTFhYmExMDAyMzAxNDM1NzQyNmFlODgwMDg1NGNkNGNjZDVjZDE5Yjg3NDgwNTAwMGMwNmMwNjg0Yzg0ODg4ODg4ODg4ODhjMDEwMDMwYzA1MGQ1ZDA4MDEwOTgwYjI0ODEwMzUwNTQzMTAwMjMyMzIzMjUzMzUzMzM1NzM0NjZlMWQyMDAwMDAyMDFlMDFkMTMyMTIyMjMwMDMwMDQzNzVjNmFlODQwMDQ1NGM4Y2Q0Y2NkNWNkMTliODc0ODAwODAwYzA3YzA3ODRjODQ4ODhjMDA0MDEwYzAwNGQ1ZDA4MDEwYTk5YTk5OWFiOWEzMzcwZTkwMDIwMDE4MGY4MGYwOTk5MTA5MTExOTgwMTAwMjgwMjFiYWUzNTc0MjAwNDYwMDI2YWU4NGQ1ZDEwMDEwOTgwZDI0ODEwMzUwNTQzMTAwMjMyMzIzMjUzMzUzMzM1NzM0NjZlMWQyMDAwMDAyMDIyMDIxMTMyMTIyMjMwMDMwMDQzMDFiMzU3NDIwMDIyYTY2YTY2NmFlNjhjZGMzYTQwMDQwMDQwNDQwNDIyMjQ0NDAwNDJhNjZhNjY2YWU2OGNkYzNhNDAwODAwNDA0NDA0MjIyNDQ0MDAyMjYwM2E5MjEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MDAwOWFhYjllMDAyMzU1NzNhMDAyNmVhODAwNGQ1NWNmMDAxMWFhYjlkMDAxMzc1NDAwMjQ2NDY0NjRhNjZhNjY2YWU2OGNkYzNhNDAwMDAwNDAzMjAzMDI2NDI0NDQ2MDA2MDA4NjAyNDZhZTg0MDA0NTRjZDRjY2Q1Y2QxOWI4NzQ4MDA4MDA4MDY0MDYwNGM4NDg4OGMwMDgwMTBjMDQ4ZDVkMDgwMDhhOTlhOTk5YWI5YTMzNzBlOTAwMjAwMTAwYzgwYzA5OTA5MTExODAwODAyMWJhZTM1NzQyMDAyMjYwMjg5MjEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MDAwOTE5MTkxOTI5OWE5OTlhYjlhMzM3MGU5MDAwMDAxMDBjMDBiODk5OTEwOTE5ODAwODAxODAxMWJhZTM1NzQyMDAyNmViNGQ1ZDA5YWJhMjAwMTEzMDEzNDkxMDM1MDU0MzEwMDM1NTczYzAwNDZhYWU3NDAwNGRkNTAwMDlhYmEyMDAxMTMwMGU0OTEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MDAwOTExMDAxOTExMTExMTExMTExMTExMTE4MGYwMDMxMDgwODg4MDc4YTRjMjYwMTY5MjEwMzUwNTQzNTAwMzAxNDIyMjUzMzUzMzM1NzM0NjZlMWQyMDAwMDAxMDExMDEwMTMwMGM0OTEwMzUwNTQzMzAwMTUzMzUzMzM1NzM0NjZlMjAwMDUyMDAwMDExMDEwMTMzMDAzMzM3MDI5MDAwMDAxMTliODE0ODAwMDAwNDRjOGNjODg0OGNjMDA0MDBjMDA4Y2RjMjAwMTgwMDk5Yjg0MDAyMDAxMzMwMDQwMDIwMDEzMDEzMjIyNTMzNTMzMzU3MzQ2NmUxZDIwMDAwMDEwMTAwMGYxMDAyMTMzMDAzMDAxMzM3MGMwMDQwMDI0MDAyNDY0NjQ2NGE2NmE2NjZhZTY4Y2RjM2E0MDAwMDA0MDFlMDFjMjAxYzJhNjZhNjY2YWU2OGNkYzNhNDAwNDAwNDAxZTAxYzIwMWUyNjAxNDkyMDEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MDAwOTExOTE5MTkyOTlhOTk5YWI5YTMzNzBlOTAwMDAwMTAwNzgwNzA4OTExMDAxMGE5OWE5OTlhYjlhMzM3MGU5MDAxMDAxMDA3ODA3MDk5MDkxMTE4MDE4MDIxODAyOWFiYTEwMDExNTMzNTMzMzU3MzQ2NmUxZDIwMDQwMDIwMGYwMGUxMTIyMjAwMTEzMDBhNDkwMTAzNTA1NDMxMDAzNTU3M2MwMDQ2YWFlNzQwMDRkZDUwMDA5MTkxOTE5Mjk5YTk5OWFiOWEzMzcwZTkwMDAwMDEwMDY4MDYwOTk5MTA5MTk4MDA4MDE4MDExYmFlMzU3NDIwMDI2ZWI0ZDVkMDlhYmEyMDAxMTMwMDg0OTEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MDAwOTE5MTE4MDExYmFjMDAxMzAwZjIyMzMzMzU1NzNlMDAyNDAxYzQ2NmEwMWE2MDA4NmFlODQwMDhjMDBjZDVkMTAwMTAwNDExOTE5MTkyOTlhOTk5YWI5YTMzNzBlOTAwMDAwMTAwNTgwNTA5OTA5MTE4MDEwMDE5YmFlMzU3NDIwMDIyYTY2YTY2NmFlNjhjZGMzYTQwMDQwMDQwMTYwMTQyNjQyNDQ2MDAyMDA2NmViOGQ1ZDA4MDA4OTgwMzI0ODEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MDAwOTExOTE5MTkyOTlhOTk5YWI5YTMzNzBlOTAwMTAwMTAwNTgwNTBhODA3MGE5OWE5OTlhYjlhMzM3MGU5MDAwMDAxMDA1ODA1MDk4MDc5ODAyOWFiYTEwMDExMzAwNjQ5MDEwMzUwNTQzMTAwMzU1NzNjMDA0NmFhZTc0MDA0ZGQ1MDAwOTE5MzE5YWI5YzAwMTAwMzIyMzIyMzAwMjM3NTYwMDI2MDE4NDQ2NjY2YWFlN2MwMDQ4MDJjOGM4Y2Q0MDJjY2MwM2NjMDE4ZDU1Y2U4MDA5ODAyOWFhYjllMDAxMzAwNDM1NzQ0MDA2NmFlODQwMDgwMTQ0ODAwNGMwMjA4OTRjZDQwMDQ1NDAxYzg4NGQ0MDA4ODk0Y2Q0Y2NkNWNkMTliOGY0ODgxMjEwMTA0MzEyNzc1YWRkOTNlZDU3YzMwMWZhYjc1MDFmNzRiZWIzZGJjM2E3MGE2NTllZjM2YmNlYTZlYmI4YTNlMjUwMDAwMjAwODAwNzEzMDBjMDAxMTMwMDYwMDMxMjIwMDIxMjIwMDExMjIwMDIxMjIxMjIzMzAwMTAwNDAwMzIxMjIzMDAyMDAzMTEyMjAwMTIyMTIzMzAwMTAwMzAwMjIzMjMwMDEwMDEyMzAwMjIzMzAwMjAwMjAwMTAx