@@ -14,28 +14,18 @@ module Coop.Plutus (
1414import Coop.Plutus.Aux (pcurrencyTokenQuantity , pcurrencyValue , pdatumFromTxOut , pdjust , pdnothing , pfindMap , pfoldTxInputs , pfoldTxOutputs , pfoldTxRefs , phasCurrency , pmaybeData , pmustBeSignedBy , pmustBurnOwnSingletonValue , pmustMintCurrency , pmustPayCurrencyWithDatumTo , pmustSpendAtLeast , pmustValidateAfter , pownCurrencySymbol , ptryFromData , punit )
1515import Coop.Plutus.Types (PAuthMpParams , PAuthMpRedeemer (PAuthMpBurn , PAuthMpMint ), PAuthParams , PCertDatum , PCertMpParams , PCertMpRedeemer (PCertMpBurn , PCertMpMint ), PFsDatum , PFsMpParams , PFsMpRedeemer (PFsMpBurn , PFsMpMint ))
1616import Plutarch (POpaque , pmatch , popaque )
17+ import Plutarch.Api.V1.AssocMap (plookup )
1718import Plutarch.Api.V1.Value (passertPositive , pnormalize , pvalueOf )
1819import Plutarch.Api.V1.Value qualified as PValue
19- import Plutarch.Api.V2 (
20- AmountGuarantees (NonZero , Positive ),
21- KeyGuarantees (Sorted ),
22- PCurrencySymbol ,
23- PMaybeData ,
24- PMintingPolicy ,
25- PTokenName (PTokenName ),
26- PTuple ,
27- PTxInInfo ,
28- PTxOut ,
29- PValidator ,
30- PValue ,
31- )
20+ import Plutarch.Api.V2 (AmountGuarantees (NonZero , Positive ), KeyGuarantees (Sorted , Unsorted ), PCurrencySymbol , PMap , PMaybeData , PMintingPolicy , PTokenName (PTokenName ), PTuple , PTxInInfo , PTxOut , PValidator , PValue )
3221import Plutarch.Api.V2.Contexts (PScriptContext )
3322import Plutarch.Bool (pif )
3423import Plutarch.Crypto (pblake2b_256 )
3524import Plutarch.Extra.Interval (pcontains )
25+ import Plutarch.List (pmap )
3626import Plutarch.Monadic qualified as P
3727import Plutarch.Num (PNum (pnegate , (#+) ))
38- import Plutarch.Prelude (ClosedTerm , PAsData , PBuiltinList , PByteString , PEq ((#==) ), PInteger , PListLike (pcons , phead , pnil ), PPair (PPair ), PPartialOrd ((#<) , (#<=) ), Term , pcon , pconsBS , pfield , pfoldl , pfromData , phoistAcyclic , plam , plet , pletFields , ptrace , ptraceError , (#) , (#$) , type (:--> ))
28+ import Plutarch.Prelude (ClosedTerm , PAsData , PBuiltinList , PByteString , PData , PEq ((#==) ), PInteger , PListLike (pcons , phead , pnil ), PMaybe ( PJust ), PPair (PPair ), PPartialOrd ((#<) , (#<=) ), Term , pcon , pconsBS , pconstant , pfield , pfoldl , pfromData , phoistAcyclic , plam , plet , pletFields , ptrace , ptraceError , (#) , (#$) , type (:--> ))
3929import PlutusTx.Prelude (Group (inv ))
4030import Prelude (Monoid (mempty ), Semigroup ((<>) ), ($) )
4131
@@ -616,26 +606,20 @@ exampleConsumer = phoistAcyclic $
616606 ( ptrace
617607 " exampleConsumer: Found an authentic Fact Statement reference input from a trusted COOP Oracle"
618608 P. do
609+ -- Parse the FsDatum available in the referenced input
619610 fsDatum <- pletFields @ '[" fd'fs" , " fd'submitter" , " fd'gcAfter" , " fd'fsId" ] $ pdatumFromTxOut @ PFsDatum # ctx # refInput. resolved
620- fs <- plet $ pfromData $ fsDatum. fd'fs
621- ptrace " FsMpBurn: Valid FsDatum attached"
611+
612+ -- Take the Fact Statement payload in `fd'fs` field and try to parse it as a PlutusData Map
613+ factStatement :: Term s (PMap 'Unsorted PByteString PData ) <- plet $ pfromData $ ptryFromData fsDatum. fd'fs
614+
615+ -- Take the "array" field in the Fact Statement and assert that it is [1,2,3]
616+ PJust arrayNumbersPd <- pmatch $ plookup # pconstant " array" # factStatement
617+ -- Parse it as Plutus List
618+ arrayNumbers :: Term s (PBuiltinList (PAsData PInteger )) <- plet $ pfromData $ ptryFromData arrayNumbersPd
619+ -- Parse the elements within as Plutus Integer
620+ arrayNumbers' <- plet $ pmap # plam pfromData # arrayNumbers
621+ _ <- plet $ pif (arrayNumbers' #== pconstant [1 , 2 , 3 ]) (popaque punit) (ptraceError " Expected a Plutus List [1,2,3]" )
622622
623623 ptrace " exampleConsumer: Must have a Fact Statement reference input from a trusted COOP Oracle" $ popaque punit
624624 )
625625 (ptraceError " exampleConsumer: Must have a Fact Statement reference input from a trusted COOP Oracle" )
626-
627- -- -- | Parses a datum from a TxOut or fails hard
628- -- pdatumFromTxOut :: forall a (s :: S). (PIsData a, PTryFrom PData (PAsData a)) => Term s (PScriptContext :--> PTxOut :--> a)
629- -- pdatumFromTxOut = phoistAcyclic $
630- -- plam $ \ctx txOut -> ptrace "pdatumFromTxOut" P.do
631- -- datum <- plet $ pmatch (pfield @"datum" # txOut) \case
632- -- PNoOutputDatum _ -> ptraceError "pDatumFromTxOut: Must have a datum present in the output"
633- -- POutputDatumHash r -> ptrace "pDatumFromTxOut: Got a datum hash" P.do
634- -- ctx' <- pletFields @'["txInfo"] ctx
635- -- txInfo <- pletFields @'["datums"] ctx'.txInfo
636- -- pmatch (plookup # pfromData (pfield @"datumHash" # r) # txInfo.datums) \case
637- -- PNothing -> ptraceError "pDatumFromTxOut: Datum with a given hash must be present in the transaction datums"
638- -- PJust datum -> ptrace "pDatumFromTxOut: Found a datum" datum
639- -- POutputDatum r -> ptrace "pDatumFromTxOut: Got an inline datum" $ pfield @"outputDatum" # r
640-
641- -- pfromData (ptryFromData @a (pto datum))
0 commit comments