Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions cabal.project
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ repository cardano-haskell-packages
-- See CONTRIBUTING for information about these, including some Nix commands
-- you need to run if you change them
index-state:
, hackage.haskell.org 2025-11-05T09:40:54Z
, cardano-haskell-packages 2025-11-24T10:27:41Z
, hackage.haskell.org 2025-12-02T22:23:29Z
, cardano-haskell-packages 2025-12-16T19:04:42Z

packages:
cardano-cli
Expand Down Expand Up @@ -66,3 +66,11 @@ if impl (ghc >= 9.12)
-- IMPORTANT
-- Do NOT add more source-repository-package stanzas here unless they are strictly
-- temporary! Please read the section in CONTRIBUTING about updating dependencies.


source-repository-package
type: git
location: https://github.com/IntersectMBO/cardano-api.git
tag: fa9ba0cd61fccccd8ffd0052f273033d5828c0e1
--sha256: sha256-7qB1cCRwQ9IflrTpenZ0sLB9wv6F1w+KgbwRLYGsuZc=
subdir: cardano-api
4 changes: 3 additions & 1 deletion cardano-cli/cardano-cli.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ library
Cardano.CLI.Compatible.Governance.Types
Cardano.CLI.Compatible.Json.Friendly
Cardano.CLI.Compatible.Option
Cardano.CLI.Compatible.Read
Cardano.CLI.Compatible.Run
Cardano.CLI.Compatible.StakeAddress.Command
Cardano.CLI.Compatible.StakeAddress.Option
Expand Down Expand Up @@ -241,7 +242,7 @@ library
binary,
bytestring,
canonical-json,
cardano-api ^>=10.20,
cardano-api ^>=10.21,
cardano-binary,
cardano-crypto,
cardano-crypto-class ^>=2.2.3.2,
Expand Down Expand Up @@ -280,6 +281,7 @@ library
network,
network-uri,
optparse-applicative-fork,
ordered-containers,
ouroboros-consensus,
ouroboros-consensus-cardano,
prettyprinter,
Expand Down
3 changes: 1 addition & 2 deletions cardano-cli/src/Cardano/CLI/Compatible/Command.hs
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,9 @@ import Cardano.CLI.Compatible.StakePool.Command
import Cardano.CLI.Compatible.Transaction.Command

import Data.Text
import Data.Typeable (Typeable)

data AnyCompatibleCommand where
AnyCompatibleCommand :: Typeable era => CompatibleCommand era -> AnyCompatibleCommand
AnyCompatibleCommand :: CompatibleCommand era -> AnyCompatibleCommand

renderAnyCompatibleCommand :: AnyCompatibleCommand -> Text
renderAnyCompatibleCommand = \case
Expand Down
112 changes: 112 additions & 0 deletions cardano-cli/src/Cardano/CLI/Compatible/Read.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}

module Cardano.CLI.Compatible.Read
( AnyPlutusScript (..)
, readFilePlutusScript
, readFileSimpleScript
)
where

import Cardano.Api as Api

import Cardano.CLI.Compatible.Exception
import Cardano.CLI.Read (readFileCli)
import Cardano.CLI.Type.Error.ScriptDecodeError
import Prelude

import Data.Aeson qualified as Aeson
import Data.ByteString qualified as BS

import Cardano.CLI.Type.Error.PlutusScriptDecodeError

import Data.Bifunctor

import Data.Text qualified as Text


readFileSimpleScript
:: FilePath
-> CIO e (Script SimpleScript')
readFileSimpleScript file = do
scriptBytes <- readFileCli file
fromEitherCli $
deserialiseSimpleScript scriptBytes


deserialiseSimpleScript
:: BS.ByteString
-> Either ScriptDecodeError (Script SimpleScript')
deserialiseSimpleScript bs =
case deserialiseFromJSON bs of
Left _ ->
-- In addition to the TextEnvelope format, we also try to
-- deserialize the JSON representation of SimpleScripts.
case Aeson.eitherDecodeStrict' bs of
Left err -> Left (ScriptDecodeSimpleScriptError $ JsonDecodeError err)
Right script -> Right $ SimpleScript script
Right te ->
case deserialiseFromTextEnvelopeAnyOf [teType'] te of
Left err -> Left (ScriptDecodeTextEnvelopeError err)
Right script -> Right script
where
teType' :: FromSomeType HasTextEnvelope (Script SimpleScript')
teType' = FromSomeType (AsScript AsSimpleScript) id



data AnyPlutusScript where
AnyPlutusScript
:: IsPlutusScriptLanguage lang => PlutusScriptVersion lang -> PlutusScript lang -> AnyPlutusScript

readFilePlutusScript
:: FilePath
-> CIO e AnyPlutusScript
readFilePlutusScript plutusScriptFp = do
bs <-
readFileCli plutusScriptFp
fromEitherCli $ deserialisePlutusScript bs

deserialisePlutusScript
:: BS.ByteString
-> Either PlutusScriptDecodeError AnyPlutusScript
deserialisePlutusScript bs = do
te <- first PlutusScriptJsonDecodeError $ deserialiseFromJSON bs
case teType te of
TextEnvelopeType s -> case s of
sVer@"PlutusScriptV1" -> deserialiseAnyPlutusScriptVersion sVer PlutusScriptV1 te
sVer@"PlutusScriptV2" -> deserialiseAnyPlutusScriptVersion sVer PlutusScriptV2 te
sVer@"PlutusScriptV3" -> deserialiseAnyPlutusScriptVersion sVer PlutusScriptV3 te
unknownScriptVersion ->
Left . PlutusScriptDecodeErrorUnknownVersion $ Text.pack unknownScriptVersion
where
deserialiseAnyPlutusScriptVersion
:: IsPlutusScriptLanguage lang
=> String
-> PlutusScriptVersion lang
-> TextEnvelope
-> Either PlutusScriptDecodeError AnyPlutusScript
deserialiseAnyPlutusScriptVersion v lang tEnv =
if v == show lang
then
first PlutusScriptDecodeTextEnvelopeError $
deserialiseFromTextEnvelopeAnyOf [teTypes (AnyPlutusScriptVersion lang)] tEnv
else Left $ PlutusScriptDecodeErrorVersionMismatch (Text.pack v) (AnyPlutusScriptVersion lang)

teTypes :: AnyPlutusScriptVersion -> FromSomeType HasTextEnvelope AnyPlutusScript
teTypes =
\case
AnyPlutusScriptVersion PlutusScriptV1 ->
FromSomeType (AsPlutusScript AsPlutusScriptV1) (AnyPlutusScript PlutusScriptV1)
AnyPlutusScriptVersion PlutusScriptV2 ->
FromSomeType (AsPlutusScript AsPlutusScriptV2) (AnyPlutusScript PlutusScriptV2)
AnyPlutusScriptVersion PlutusScriptV3 ->
FromSomeType (AsPlutusScript AsPlutusScriptV3) (AnyPlutusScript PlutusScriptV3)
AnyPlutusScriptVersion PlutusScriptV4 ->
FromSomeType (AsPlutusScript AsPlutusScriptV4) (AnyPlutusScript PlutusScriptV4)
Loading
Loading