1- module BotPlutusInterface.UtxoParser
2- {-# DEPRECATED "This parser doesn't parses utxo(s) with inline datum, use 'utxosAt' from BotPlutusInterface.CardanoNode.Effects.hs instead." #-}
3- (
4- chainIndexTxOutParser ,
1+ module BotPlutusInterface.UtxoParser (
52 feeParser ,
6- utxoParser ,
7- utxoMapParser ,
83 tokenNameParser ,
94) where
105
11- import Control.Applicative (many , optional , (<|>) )
6+ import Control.Applicative (optional )
127import Control.Monad (mzero , void )
138import Data.Aeson.Extras (tryDecode )
149import Data.Attoparsec.ByteString.Char8 (isSpace )
1510import Data.Attoparsec.Text (
1611 Parser ,
1712 char ,
1813 choice ,
19- count ,
2014 decimal ,
21- inClass ,
22- isEndOfLine ,
2315 option ,
24- sepBy ,
2516 signed ,
2617 skipSpace ,
27- skipWhile ,
2818 string ,
2919 takeWhile ,
30- (<?>) ,
3120 )
32- import Data.Functor (($>) )
3321import Data.Text (Text )
34- import Ledger (Address (addressCredential ), Datum )
35- import Ledger.Ada qualified as Ada
36- import Ledger.Scripts (DatumHash (.. ))
37- import Ledger.Tx (ChainIndexTxOut (PublicKeyChainIndexTxOut , ScriptChainIndexTxOut ), TxId (.. ), TxOutRef (.. ))
38- import Ledger.Value (AssetClass , Value )
39- import Ledger.Value qualified as Value
40- import Plutus.Script.Utils.Scripts qualified as ScriptUtils
4122import Plutus.V1.Ledger.Api (
4223 BuiltinByteString ,
43- Credential (PubKeyCredential , ScriptCredential ),
44- CurrencySymbol (.. ),
4524 TokenName (.. ),
4625 )
47- import Plutus.V2.Ledger.Api (OutputDatum (NoOutputDatum , OutputDatum , OutputDatumHash ))
4826import PlutusTx.Builtins (toBuiltin )
4927import Prelude hiding (takeWhile )
5028
51- {-# DEPRECATED utxoMapParser "use 'utxosAt' from BotPlutusInterface.CardanoNode.Effects.hs" #-}
52- utxoMapParser :: Address -> Parser [(TxOutRef , ChainIndexTxOut )]
53- utxoMapParser address = do
54- skipLine 2
55- many (utxoParser address)
56-
57- skipLine :: Int -> Parser ()
58- skipLine n =
59- void $
60- count n $ do
61- skipWhile (not . isEndOfLine)
62- skipWhile isEndOfLine
63-
64- utxoParser :: Address -> Parser (TxOutRef , ChainIndexTxOut )
65- utxoParser address =
66- (,) <$> (txOutRefParser <?> " TxOutRef" ) <* skipSpace
67- <*> (chainIndexTxOutParser address <?> " ChainIndexTxOut" ) <* skipWhile isEndOfLine
68-
69- txOutRefParser :: Parser TxOutRef
70- txOutRefParser = do
71- txId <- TxId <$> decodeHash (takeWhile (/= ' ' ))
72-
73- skipSpace
74- txIx <- decimal
75- pure $ TxOutRef txId txIx
76-
77- chainIndexTxOutParser :: Address -> Parser ChainIndexTxOut
78- chainIndexTxOutParser address = do
79- value <- mconcat <$> (valueParser <?> " Value" ) `sepBy` " + "
80- void " + "
81-
82- case addressCredential address of
83- ScriptCredential validatorHash -> do
84- datumHash <- datumHashParser <?> " DatumHash"
85- pure $
86- ScriptChainIndexTxOut
87- address
88- value
89- (datumHash, Nothing )
90- Nothing
91- (validatorHash, Nothing )
92- PubKeyCredential _ -> do
93- outputDatum <- outputDatumParser <?> " OutputDatum"
94- pure $
95- PublicKeyChainIndexTxOut
96- address
97- value
98- (convertOutputDatum outputDatum)
99- Nothing
100-
101- valueParser :: Parser Value
102- valueParser = do
103- amt <- signed decimal
104- skipSpace
105- assetClass <- assetClassParser <?> " AssetClass"
106- pure $ Value. assetClassValue assetClass amt
107-
108- assetClassParser :: Parser AssetClass
109- assetClassParser =
110- choice [adaAssetClass, otherAssetClass]
111- where
112- adaAssetClass = Value. assetClass Ada. adaSymbol Ada. adaToken <$ " lovelace"
113- otherAssetClass = do
114- curSymbol <- CurrencySymbol <$> decodeHash (takeWhile (not . inClass " ." )) <?> " CurrencySymbol"
115- tokenname <- tokenNameParser <?> " TokenName"
116- pure $ Value. assetClass curSymbol tokenname
117-
11829tokenNameParser :: Parser TokenName
11930tokenNameParser = do
12031 option " " tokenName
@@ -124,26 +35,6 @@ tokenNameParser = do
12435 void $ optional $ string " 0x"
12536 TokenName <$> decodeHash (takeWhile (not . isSpace))
12637
127- convertOutputDatum :: OutputDatum -> Maybe (DatumHash , Maybe Datum )
128- convertOutputDatum = \ case
129- NoOutputDatum -> Nothing
130- OutputDatumHash dh -> Just (dh, Nothing )
131- OutputDatum d -> Just (ScriptUtils. datumHash d, Just d)
132-
133- {-# DEPRECATED outputDatumParser "This will fail on inline datum, since we don't parse that utxo(s)." #-}
134- outputDatumParser :: Parser OutputDatum
135- outputDatumParser =
136- OutputDatumHash <$> datumHashParser
137- <|> " TxOutDatumNone" $> NoOutputDatum
138-
139- datumHashParser :: Parser DatumHash
140- datumHashParser = do
141- void " TxOutDatumHash"
142- skipSpace
143- void $ " ScriptDataInAlonzoEra" <|> " ScriptDataInBabbageEra"
144- skipSpace
145- char ' \" ' *> (DatumHash <$> decodeHash (takeWhile (/= ' \" ' ))) <* char ' \" '
146-
14738decodeHash :: Parser Text -> Parser BuiltinByteString
14839decodeHash rawParser =
14940 rawParser >>= \ parsed -> either (const mzero) (pure . toBuiltin) (tryDecode parsed)
0 commit comments