Skip to content

Commit 9902bb2

Browse files
committed
Handled array
1 parent afd27f3 commit 9902bb2

File tree

2 files changed

+18
-34
lines changed

2 files changed

+18
-34
lines changed

coop-plutus/resources/sample.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
"null": null,
99
"integer": 123,
1010
"big_integer": 12300000000000000000000000,
11-
"real": 123.123,
11+
"real": 123.123,
1212
"big_real": 12300000000000000000000000.123,
1313
"object": {
1414
"a": "b",
1515
"c": "d"
1616
},
1717
"string": "Hello World"
18-
}
18+
}

coop-plutus/src/Coop/Plutus.hs

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,18 @@ module Coop.Plutus (
1414
import Coop.Plutus.Aux (pcurrencyTokenQuantity, pcurrencyValue, pdatumFromTxOut, pdjust, pdnothing, pfindMap, pfoldTxInputs, pfoldTxOutputs, pfoldTxRefs, phasCurrency, pmaybeData, pmustBeSignedBy, pmustBurnOwnSingletonValue, pmustMintCurrency, pmustPayCurrencyWithDatumTo, pmustSpendAtLeast, pmustValidateAfter, pownCurrencySymbol, ptryFromData, punit)
1515
import Coop.Plutus.Types (PAuthMpParams, PAuthMpRedeemer (PAuthMpBurn, PAuthMpMint), PAuthParams, PCertDatum, PCertMpParams, PCertMpRedeemer (PCertMpBurn, PCertMpMint), PFsDatum, PFsMpParams, PFsMpRedeemer (PFsMpBurn, PFsMpMint))
1616
import Plutarch (POpaque, pmatch, popaque)
17+
import Plutarch.Api.V1.AssocMap (plookup)
1718
import Plutarch.Api.V1.Value (passertPositive, pnormalize, pvalueOf)
1819
import 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)
3221
import Plutarch.Api.V2.Contexts (PScriptContext)
3322
import Plutarch.Bool (pif)
3423
import Plutarch.Crypto (pblake2b_256)
3524
import Plutarch.Extra.Interval (pcontains)
25+
import Plutarch.List (pmap)
3626
import Plutarch.Monadic qualified as P
3727
import 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 (:-->))
3929
import PlutusTx.Prelude (Group (inv))
4030
import 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

Comments
 (0)