From 17f670fe8de2558ed221e3365731846a884e7423 Mon Sep 17 00:00:00 2001 From: sourabhxyz Date: Fri, 18 Aug 2023 21:17:02 +0530 Subject: [PATCH 01/17] Updating PSM for node 8.1.1 --- cardano-simple/cardano-simple.cabal | 5 +- .../src/Cardano/Simple/Cardano/Babbage.hs | 13 +- .../src/Cardano/Simple/Cardano/Class.hs | 2 +- .../src/Cardano/Simple/Cardano/Common.hs | 32 +- cardano-simple/src/Cardano/Simple/Eval.hs | 43 +- .../src/Cardano/Simple/Ledger/Scripts.hs | 7 +- .../src/Cardano/Simple/Ledger/Slot.hs | 8 +- .../src/Cardano/Simple/Ledger/Tx.hs | 3 +- .../Simple/PlutusLedgerApi/V1/Scripts.hs | 67 +- flake.lock | 4487 ----------------- flake.nix | 39 - psm/plutus-simple-model.cabal | 4 +- psm/src/Plutus/Model/Mint.hs | 69 +- psm/src/Plutus/Model/Validator/V1.hs | 17 - psm/src/Plutus/Model/Validator/V2.hs | 17 - psm/test/Spec.hs | 2 - psm/test/Suites/Plutarch.hs | 72 - 17 files changed, 85 insertions(+), 4802 deletions(-) delete mode 100644 flake.lock delete mode 100644 flake.nix delete mode 100644 psm/test/Suites/Plutarch.hs diff --git a/cardano-simple/cardano-simple.cabal b/cardano-simple/cardano-simple.cabal index ea8b977..3813c01 100644 --- a/cardano-simple/cardano-simple.cabal +++ b/cardano-simple/cardano-simple.cabal @@ -75,9 +75,13 @@ common deps , cardano-binary , cardano-crypto , cardano-crypto-class + , cardano-ledger-api + , cardano-ledger-allegra + , cardano-ledger-mary , cardano-ledger-alonzo , cardano-ledger-babbage , cardano-ledger-core + , cardano-ledger-core:testlib , cardano-ledger-shelley , cardano-ledger-shelley-ma , cardano-slotting @@ -92,7 +96,6 @@ common deps , http-api-data , memory , mtl - , plutarch , plutus-core , plutus-ledger-api , plutus-tx diff --git a/cardano-simple/src/Cardano/Simple/Cardano/Babbage.hs b/cardano-simple/src/Cardano/Simple/Cardano/Babbage.hs index ec89e6b..44050db 100644 --- a/cardano-simple/src/Cardano/Simple/Cardano/Babbage.hs +++ b/cardano-simple/src/Cardano/Simple/Cardano/Babbage.hs @@ -6,13 +6,14 @@ module Cardano.Simple.Cardano.Babbage ( toBabbageTx, ) where +import Data.Functor.Identity (Identity) import Data.Map.Strict (Map) import Data.Map.Strict qualified as Map import Data.Sequence.Strict qualified as Seq import Prelude import Cardano.Ledger.Alonzo.Data qualified as C -import Cardano.Ledger.Alonzo.TxWitness qualified as C +import Cardano.Ledger.Alonzo.TxWits qualified as C import Cardano.Ledger.Babbage (BabbageEra) import Cardano.Ledger.Babbage.PParams qualified as C import Cardano.Ledger.Babbage.Tx qualified as C @@ -62,7 +63,7 @@ instance IsCardanoTx Era where toBabbageTx :: Network -> - C.BabbagePParams Era -> + C.BabbagePParams Identity Era -> P.Extra -> Plutus.Tx -> Either ToCardanoError (C.AlonzoTx Era) @@ -84,8 +85,8 @@ toBabbageTx network params extra tx = do txcerts <- getDCerts network - (C._poolDeposit params) - (C._minPoolCost params) + (C.bppPoolDeposit params) + (C.bppMinPoolCost params) extra txwdrls <- getWdrl network extra let txfee = getFee tx @@ -209,14 +210,14 @@ toWits :: SafeHash StandardCrypto C.EraIndependentTxBody -> P.Extra -> Plutus.Tx -> - Either ToCardanoError (C.TxWitness Era) + Either ToCardanoError (C.AlonzoTxWits Era) toWits txBodyHash extra tx = do let bootstrapWits = mempty datumWits <- toDatumWitness tx let redeemerWits = toRedeemerWitness extra tx scriptWits <- toScriptWitness extra tx pure $ - C.TxWitness + C.AlonzoTxWits (toKeyWitness txBodyHash tx) bootstrapWits scriptWits diff --git a/cardano-simple/src/Cardano/Simple/Cardano/Class.hs b/cardano-simple/src/Cardano/Simple/Cardano/Class.hs index b01648a..4f69889 100644 --- a/cardano-simple/src/Cardano/Simple/Cardano/Class.hs +++ b/cardano-simple/src/Cardano/Simple/Cardano/Class.hs @@ -19,7 +19,7 @@ import Data.Map (Map) import Data.Map qualified as Map import PlutusLedgerApi.V2 qualified as P -class (C.Crypto era ~ StandardCrypto) => IsCardanoTx era where +class (C.EraCrypto era ~ StandardCrypto) => IsCardanoTx era where toCardanoTx :: Network -> C.PParams era -> diff --git a/cardano-simple/src/Cardano/Simple/Cardano/Common.hs b/cardano-simple/src/Cardano/Simple/Cardano/Common.hs index d886d34..7fddc28 100644 --- a/cardano-simple/src/Cardano/Simple/Cardano/Common.hs +++ b/cardano-simple/src/Cardano/Simple/Cardano/Common.hs @@ -46,16 +46,17 @@ import Data.Set qualified as Set import Cardano.Crypto.Hash.Class qualified as C import Cardano.Crypto.Hash.Class qualified as Crypto -import Cardano.Ledger.Alonzo.Data qualified as C +import Cardano.Ledger.Alonzo.Scripts.Data qualified as C import Cardano.Ledger.Alonzo.Scripts qualified as C import Cardano.Ledger.Alonzo.TxInfo qualified as C -import Cardano.Ledger.Alonzo.TxWitness qualified as C +import Cardano.Ledger.Alonzo.TxWits qualified as C import Cardano.Ledger.BaseTypes import Cardano.Ledger.Crypto (StandardCrypto) import Cardano.Ledger.Era qualified as C import Cardano.Ledger.Hashes qualified as C import Cardano.Ledger.Keys qualified as C import Cardano.Ledger.Keys.WitVKey +import qualified Test.Cardano.Ledger.Core.KeyPair as TC import Cardano.Ledger.Mary.Value qualified as C import Cardano.Ledger.SafeHash import Cardano.Ledger.Shelley.API.Types qualified as C ( @@ -67,12 +68,11 @@ import Cardano.Ledger.Shelley.API.Types qualified as C ( RewardAcnt (..), StakeReference (..), StrictMaybe (..), - Wdrl (..), + Withdrawals (..), ) import Cardano.Ledger.Shelley.API.Types qualified as Shelley (Hash) import Cardano.Ledger.Shelley.Delegation.Certificates qualified as C -import Cardano.Ledger.Shelley.UTxO qualified as C -import Cardano.Ledger.ShelleyMA.Timelocks qualified as C +import Cardano.Ledger.Allegra.Scripts qualified as C import Cardano.Ledger.Slot qualified as C import Cardano.Ledger.TxIn qualified as C import Cardano.Simple.Ledger.Scripts qualified as C @@ -121,7 +121,7 @@ getDCerts network poolDeposit minPoolCost = . mapM (toDCert network poolDeposit minPoolCost . P.certificate'dcert) . P.extra'certificates -getWdrl :: Network -> P.Extra -> Either ToCardanoError (C.Wdrl StandardCrypto) +getWdrl :: Network -> P.Extra -> Either ToCardanoError (C.Withdrawals StandardCrypto) getWdrl network = toWdrl network . P.extra'withdraws @@ -129,7 +129,7 @@ getWdrl network = getSignatories :: Plutus.Tx -> Set.Set (C.KeyHash 'C.Witness StandardCrypto) getSignatories = Set.fromList - . fmap (C.hashKey . C.vKey) + . fmap (C.hashKey . TC.vKey) . Map.elems . Plutus.txSignatures @@ -232,8 +232,8 @@ toCredential = \case P.PubKeyCredential pubKeyHash -> C.KeyHashObj <$> toPubKeyHash pubKeyHash P.ScriptCredential validatorHash -> C.ScriptHashObj <$> toScriptHash validatorHash -toWdrl :: Network -> [P.Withdraw] -> Either ToCardanoError (C.Wdrl StandardCrypto) -toWdrl network ws = C.Wdrl . Map.fromList <$> mapM to ws +toWdrl :: Network -> [P.Withdraw] -> Either ToCardanoError (C.Withdrawals StandardCrypto) +toWdrl network ws = C.Withdrawals . Map.fromList <$> mapM to ws where to (P.Withdraw scred amount _) = case scred of @@ -284,11 +284,11 @@ toKeyWitness :: Set (WitVKey 'C.Witness StandardCrypto) toKeyWitness txBodyHash tx = Set.fromList $ - fmap (C.makeWitnessVKey txBodyHash) $ + fmap (TC.mkWitnessVKey txBodyHash) $ Map.elems $ Plutus.txSignatures tx -toDatumWitness :: (C.Era era, C.Crypto era ~ StandardCrypto) => Plutus.Tx -> Either ToCardanoError (C.TxDats era) +toDatumWitness :: (C.Era era, C.EraCrypto era ~ StandardCrypto) => Plutus.Tx -> Either ToCardanoError (C.TxDats era) toDatumWitness tx = do datumWits1 <- Map.fromList <$> mapM (\d -> (,toDatum d) <$> toDataHash (C.datumHash d)) validatorDatums1 datumWits2 <- Map.fromList <$> mapM (\(dh, d) -> (,toDatum d) <$> toDataHash dh) validatorDatums2 @@ -340,7 +340,7 @@ toRedeemerWitness extra tx = certRedeemers = redeemersBy C.Cert (fmap P.certificate'script . P.extra'certificates) withdrawRedeemers = redeemersBy C.Rewrd (fmap P.withdraw'script . P.extra'withdraws) - redeemersBy :: C.Tag -> (P.Extra -> [Maybe (P.Redeemer, a)]) -> Map.Map C.RdmrPtr (C.Data era, C.ExUnits) + redeemersBy :: C.Era era => C.Tag -> (P.Extra -> [Maybe (P.Redeemer, a)]) -> Map.Map C.RdmrPtr (C.Data era, C.ExUnits) redeemersBy scriptTag extract = Map.fromList $ mapMaybe toWithdraw $ @@ -354,10 +354,10 @@ toRedeemerWitness extra tx = addDefaultExUnits rdm = (rdm, C.ExUnits 1 1) toScriptWitness :: - (C.Crypto era ~ StandardCrypto) => + (C.EraCrypto era ~ StandardCrypto) => P.Extra -> Plutus.Tx -> - Either ToCardanoError (Map (C.ScriptHash (C.Crypto era)) (C.AlonzoScript era)) + Either ToCardanoError (Map (C.ScriptHash (C.EraCrypto era)) (C.AlonzoScript era)) toScriptWitness extra tx = Map.fromList <$> mapM (\s -> (,C.toScript s) <$> toScriptHash (C.validatorHash (fmap P.Validator s))) allScripts where @@ -382,8 +382,8 @@ toScriptWitness extra tx = (fromInType <=< Plutus.txInType) (Set.toList $ Plutus.txInputs tx) -toDatum :: P.Datum -> C.Data era +toDatum :: C.Era era => P.Datum -> C.Data era toDatum (P.Datum (P.BuiltinData d)) = C.Data d -toRedeemer :: P.Redeemer -> C.Data era +toRedeemer :: C.Era era => P.Redeemer -> C.Data era toRedeemer (P.Redeemer (P.BuiltinData d)) = C.Data d diff --git a/cardano-simple/src/Cardano/Simple/Eval.hs b/cardano-simple/src/Cardano/Simple/Eval.hs index 75dad19..bdb1f71 100644 --- a/cardano-simple/src/Cardano/Simple/Eval.hs +++ b/cardano-simple/src/Cardano/Simple/Eval.hs @@ -3,20 +3,18 @@ module Cardano.Simple.Eval ( utxoForTransaction, txBalance, evaluateScriptsInTx, - toAlonzoCostModels, ) where import Prelude -import Data.Array qualified as Array import Data.Either (lefts, rights) import Data.Map.Strict (Map) import Data.Map.Strict qualified as Map import Data.Set qualified as Set import Data.Time.Clock.POSIX (posixSecondsToUTCTime) -import GHC.Records (HasField (getField)) +import GHC.Records (HasField) -import Cardano.Ledger.Alonzo.Data qualified as Ledger +import Cardano.Ledger.Alonzo.Scripts.Data qualified as Ledger import Cardano.Ledger.Alonzo.Tx qualified as Ledger import Cardano.Ledger.BaseTypes qualified as Ledger import Cardano.Ledger.Core qualified as Ledger @@ -27,13 +25,13 @@ import Cardano.Ledger.Slot (EpochSize (..)) import Cardano.Slotting.EpochInfo.Impl (fixedEpochInfo) import Cardano.Slotting.Time (SystemStart (..), slotLengthFromMillisec) -import Cardano.Ledger.Alonzo.Tools (evaluateTransactionExecutionUnits) +import Cardano.Ledger.Api.Tx (evalTxExUnits) import Cardano.Ledger.Alonzo.TxInfo (ExtendedUTxO, TranslationError) -import Cardano.Ledger.Shelley.API (CLI, evaluateTransactionBalance) +import Cardano.Ledger.Api.Tx.Body (evalBalanceTxBody) import Cardano.Ledger.Shelley.TxBody (ShelleyEraTxBody) -import Cardano.Ledger.Alonzo.Language qualified as Alonzo import Cardano.Ledger.Alonzo.Scripts qualified as Alonzo +import Cardano.Ledger.Alonzo.UTxO qualified as Alonzo import Cardano.Simple.Cardano.Class ( IsCardanoTx, @@ -73,6 +71,7 @@ evalScript lang pparams cm script args = where toPlutusLang Ledger.PlutusV1 = Plutus.PlutusV1 toPlutusLang Ledger.PlutusV2 = Plutus.PlutusV2 + toPlutusLang Ledger.PlutusV3 = Plutus.PlutusV3 utxoForTransaction :: forall era. @@ -101,8 +100,8 @@ utxoForTransaction utxos network tx = txBalance :: forall era. ( IsCardanoTx era - , CLI era , ShelleyEraTxBody era + , Ledger.EraUTxO era ) => Map TxOutRef TxOut -> Ledger.PParams era -> @@ -114,24 +113,27 @@ txBalance utxos pparams network tx extra = do utxo <- utxoForTransaction @era utxos network tx ltx <- toCardanoTx @era network pparams extra tx pure $ - evaluateTransactionBalance @era + evalBalanceTxBody @era pparams - utxo - (const True) + (const Nothing) + -- TODO this is sort of wrong + -- if psm starts supporting staking + -- this would need to be fixed + (const False) -- TODO this is sort of wrong -- if psm starts supporting staking -- this would need to be fixed + utxo (getTxBody @era ltx) evaluateScriptsInTx :: forall era. - ( HasField "_protocolVersion" (Ledger.PParams era) Ledger.ProtVer - , HasField "_maxTxExUnits" (Ledger.PParams era) Alonzo.ExUnits - , HasField "_costmdls" (Ledger.PParams era) Alonzo.CostModels - , Ledger.AlonzoEraTx era + ( Ledger.AlonzoEraTx era , Ledger.Script era ~ Alonzo.AlonzoScript era + , Ledger.ScriptsNeeded era ~ Alonzo.AlonzoScriptsNeeded era , ExtendedUTxO era , IsCardanoTx era + , Ledger.EraUTxO era ) => Map TxOutRef TxOut -> Ledger.PParams era -> @@ -140,14 +142,14 @@ evaluateScriptsInTx :: Extra -> SlotConfig -> Either - (Either ToCardanoError (TranslationError (Ledger.Crypto era))) + (Either ToCardanoError (TranslationError (Ledger.EraCrypto era))) Alonzo.ExUnits evaluateScriptsInTx utxos pparams network tx extra slotCfg = do ltx <- leftMap Left $ toCardanoTx @era network pparams extra tx utxo <- leftMap Left $ utxoForTransaction @era utxos network tx res <- leftMap Right $ - evaluateTransactionExecutionUnits @era + evalTxExUnits @era pparams ltx utxo @@ -162,7 +164,6 @@ evaluateScriptsInTx utxos pparams network tx extra slotCfg = do getPOSIXTime $ scSlotZeroTime slotCfg ) - (toAlonzoCostModels $ getField @"_costmdls" pparams) let res' = (\(k, v) -> fmap (k,) v) <$> Map.toList res errs = lefts res' cost = foldMap snd . rights $ res' @@ -170,11 +171,5 @@ evaluateScriptsInTx utxos pparams network tx extra slotCfg = do then pure cost else Left . Left $ show errs -toAlonzoCostModels :: - Alonzo.CostModels -> - Array.Array Alonzo.Language Alonzo.CostModel -toAlonzoCostModels (Alonzo.CostModels costmodels) = - Array.array (minBound, maxBound) $ Map.toList costmodels - leftMap :: (a -> b) -> Either a c -> Either b c leftMap f = either (Left . f) Right diff --git a/cardano-simple/src/Cardano/Simple/Ledger/Scripts.hs b/cardano-simple/src/Cardano/Simple/Ledger/Scripts.hs index 9457aab..ad975c1 100644 --- a/cardano-simple/src/Cardano/Simple/Ledger/Scripts.hs +++ b/cardano-simple/src/Cardano/Simple/Ledger/Scripts.hs @@ -20,14 +20,11 @@ import Data.Coerce import GHC.Generics import Prelude -import Codec.Serialise (serialise) -import Data.ByteString.Lazy qualified as BSL -import Data.ByteString.Short qualified as SBS import Cardano.Crypto.Hash.Class qualified as C import Cardano.Ledger.Alonzo (AlonzoEra) import Cardano.Ledger.Alonzo qualified as C -import Cardano.Ledger.Alonzo.Data qualified as C +import Cardano.Ledger.Alonzo.Scripts.Data qualified as C import Cardano.Ledger.Alonzo.Language qualified as C import Cardano.Ledger.Alonzo.Scripts qualified as C import Cardano.Ledger.Alonzo.TxInfo qualified as C @@ -106,4 +103,4 @@ scriptCurrencySymbol policy = toScript :: Versioned P.Script -> C.AlonzoScript era toScript (Versioned lang script) = - C.PlutusScript lang $ SBS.toShort $ BSL.toStrict $ serialise script + C.PlutusScript lang $ coerce $ script diff --git a/cardano-simple/src/Cardano/Simple/Ledger/Slot.hs b/cardano-simple/src/Cardano/Simple/Ledger/Slot.hs index 3e11b95..d069f35 100644 --- a/cardano-simple/src/Cardano/Simple/Ledger/Slot.hs +++ b/cardano-simple/src/Cardano/Simple/Ledger/Slot.hs @@ -71,22 +71,22 @@ width (Interval (LowerBound (Finite (Slot s1)) in1) (UpperBound (Finite (Slot s2 -- Infinity is involved! width _ = Nothing -deriving anyclass instance (Hashable a) => Hashable (Interval a) +deriving anyclass instance (Hashable a, Enum a, Ord a) => Hashable (Interval a) deriving anyclass instance (Serialise a) => Serialise (Interval a) deriving anyclass instance (ToJSON a) => ToJSON (Interval a) deriving anyclass instance (FromJSON a) => FromJSON (Interval a) -deriving anyclass instance (Hashable a) => Hashable (LowerBound a) +deriving anyclass instance (Hashable a, Enum a, Ord a) => Hashable (LowerBound a) deriving anyclass instance (Serialise a) => Serialise (LowerBound a) deriving anyclass instance (ToJSON a) => ToJSON (LowerBound a) deriving anyclass instance (FromJSON a) => FromJSON (LowerBound a) -deriving anyclass instance (Hashable a) => Hashable (UpperBound a) +deriving anyclass instance (Hashable a, Enum a, Ord a) => Hashable (UpperBound a) deriving anyclass instance (Serialise a) => Serialise (UpperBound a) deriving anyclass instance (ToJSON a) => ToJSON (UpperBound a) deriving anyclass instance (FromJSON a) => FromJSON (UpperBound a) -deriving anyclass instance (Hashable a) => Hashable (Extended a) +deriving anyclass instance (Hashable a, Enum a, Ord a) => Hashable (Extended a) deriving anyclass instance (Serialise a) => Serialise (Extended a) deriving anyclass instance (ToJSON a) => ToJSON (Extended a) deriving anyclass instance (FromJSON a) => FromJSON (Extended a) diff --git a/cardano-simple/src/Cardano/Simple/Ledger/Tx.hs b/cardano-simple/src/Cardano/Simple/Ledger/Tx.hs index ae03e9c..ffbd754 100644 --- a/cardano-simple/src/Cardano/Simple/Ledger/Tx.hs +++ b/cardano-simple/src/Cardano/Simple/Ledger/Tx.hs @@ -21,6 +21,7 @@ import GHC.Generics (Generic) import Cardano.Crypto.Hash (SHA256, digest) import Cardano.Ledger.Crypto qualified as C (StandardCrypto) import Cardano.Ledger.Keys qualified as C +import qualified Test.Cardano.Ledger.Core.KeyPair as TC import Codec.CBOR.Write qualified as Write import Codec.Serialise import PlutusLedgerApi.V2 @@ -54,7 +55,7 @@ data Tx = Tx -- ^ The 'SlotRange' during which this transaction may be validated. , txMintScripts :: Set.Set (Versioned MintingPolicy) -- ^ The scripts that must be run to check minting conditions. - , txSignatures :: Map.Map PubKeyHash (C.KeyPair 'C.Witness C.StandardCrypto) + , txSignatures :: Map.Map PubKeyHash (TC.KeyPair 'C.Witness C.StandardCrypto) -- ^ Signatures of this transaction. , txRedeemers :: Redeemers -- ^ Redeemers of the minting scripts. diff --git a/cardano-simple/src/Cardano/Simple/PlutusLedgerApi/V1/Scripts.hs b/cardano-simple/src/Cardano/Simple/PlutusLedgerApi/V1/Scripts.hs index c0c8eb3..416937b 100644 --- a/cardano-simple/src/Cardano/Simple/PlutusLedgerApi/V1/Scripts.hs +++ b/cardano-simple/src/Cardano/Simple/PlutusLedgerApi/V1/Scripts.hs @@ -3,9 +3,6 @@ module Cardano.Simple.PlutusLedgerApi.V1.Scripts ( mkValidatorScript, mkMintingPolicyScript, mkStakeValidatorScript, - mkValidatorScriptPlutarch, - mkMintingPolicyScriptPlutarch, - mkStakeValidatorScriptPlutarch, Script (..), Validator (..), MintingPolicy (..), @@ -17,45 +14,26 @@ module Cardano.Simple.PlutusLedgerApi.V1.Scripts ( import Prelude qualified as Haskell -import Codec.CBOR.Decoding as CBOR -import Codec.Serialise (Serialise (..), serialise) +import Codec.Serialise (Serialise (..)) import Control.DeepSeq (NFData) -import Data.ByteString.Lazy qualified as BSL -import Data.Text (Text) -import Flat qualified -import Flat.Decoder qualified as Flat import GHC.Generics (Generic) -import Plutarch (ClosedTerm, Config, compile) -import Plutarch.Script qualified as Plutarch -import PlutusCore qualified as PLC -import PlutusPrelude (over) -import PlutusTx (CompiledCode, getPlc) +import PlutusTx (CompiledCode) import PlutusTx.Builtins as Builtins import PlutusTx.Prelude -import UntypedPlutusCore qualified as UPLC +import PlutusLedgerApi.Common (serialiseCompiledCode, SerialisedScript) -- | A script on the chain. This is an opaque type as far as the chain is concerned. -newtype Script = Script {unScript :: UPLC.Program UPLC.DeBruijn PLC.DefaultUni PLC.DefaultFun ()} +newtype Script = Script {unScript :: SerialisedScript} deriving stock (Generic) + deriving newtype (Haskell.Eq, Haskell.Ord) deriving anyclass (NFData) - deriving (Serialise) via (SerialiseViaFlat (UPLC.Program UPLC.DeBruijn PLC.DefaultUni PLC.DefaultFun ())) - -instance Haskell.Eq Script where - a == b = Builtins.toBuiltin (BSL.toStrict (serialise a)) == Builtins.toBuiltin (BSL.toStrict (serialise b)) -instance Haskell.Ord Script where - a `compare` b = Builtins.toBuiltin (BSL.toStrict (serialise a)) `compare` Builtins.toBuiltin (BSL.toStrict (serialise b)) instance Haskell.Show Script where showsPrec _ _ = Haskell.showString "