From 1e2b20dfefd0aad425853137d2b4d2cb899bd6d7 Mon Sep 17 00:00:00 2001 From: fanghr Date: Fri, 29 Apr 2022 17:22:44 +0800 Subject: [PATCH] reimplement `mustFindDatum'` with `PTryFrom` --- agora/Agora/Governor.hs | 10 ++++------ agora/Agora/Utils.hs | 14 ++++++-------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/agora/Agora/Governor.hs b/agora/Agora/Governor.hs index 10e4131..8839868 100644 --- a/agora/Agora/Governor.hs +++ b/agora/Agora/Governor.hs @@ -119,7 +119,7 @@ import Plutarch.Map.Extra (pkeys, plookup, plookup') import Plutarch.Monadic qualified as P import Plutarch.SafeMoney (PDiscrete, Tagged (..), puntag, pvalueDiscrete) import Plutarch.Unsafe (punsafeCoerce) -import Plutarch.TryFrom(PTryFrom(..)) +import Plutarch.TryFrom(PTryFrom(..), ptryFrom) -------------------------------------------------------------------------------- @@ -356,8 +356,7 @@ In this case, the script will check governorValidator :: Governor -> ClosedTerm PValidator governorValidator gov = plam $ \datum' redeemer' ctx' -> P.do - -- TODO: use ptryFrom - redeemer <- pmatch $ pfromData @PGovernorRedeemer $ punsafeCoerce redeemer' + (pfromData -> redeemer, _) <- ptryFrom redeemer' ctx <- pletFields @'["txInfo", "purpose"] ctx' txInfo' <- plet $ pfromData $ ctx.txInfo @@ -374,8 +373,7 @@ governorValidator gov = ownInput <- pletFields @'["address", "value"] ownInput' let selfAddress = pfromData $ ownInput.address - -- TODO: use ptryFrom - let oldParams' = pfromData @PGovernorDatum $ punsafeCoerce datum' + (pfromData -> (oldParams' :: Term _ PGovernorDatum), _) <- ptryFrom datum' oldParams <- pletFields @'["proposalThresholds", "nextProposalId"] oldParams' let ownInputGSTAmount = stateTokenValueOf # ownInput.value @@ -402,7 +400,7 @@ governorValidator gov = mustBePJust # "Ouput governor state datum not found" #$ pfindDatum # outputGovernorStateDatumHash # txInfo' - case redeemer of + pmatch redeemer $ \case PCreateProposal _ -> P.do let expectedNextProposalId = pgetNextProposalId # oldParams.nextProposalId expectedNewDatum = diff --git a/agora/Agora/Utils.hs b/agora/Agora/Utils.hs index 2ad5d86..a1b88b3 100644 --- a/agora/Agora/Utils.hs +++ b/agora/Agora/Utils.hs @@ -529,13 +529,10 @@ hasOnlyOneTokenOfCurrencySymbol = phoistAcyclic $ psymbolValueOf # cs # vs #== 1 #&& (plength #$ pto $ pto $ pto vs) #== 1 -{- Find datum given a maybe datum hash, in an unsafe manner. - - FIXME: reimplement using 'ptryFrom'. --} +-- | Find datum given a maybe datum hash mustFindDatum' :: forall (datum :: PType). - PIsData datum => + (PIsData datum, PTryFrom PData (PAsData datum))=> forall s. Term s @@ -545,9 +542,10 @@ mustFindDatum' :: ) mustFindDatum' = phoistAcyclic $ plam $ \mdh datums -> P.do - PDJust ((pfield @"_0" #) -> dh) <- pmatch mdh - PJust dt <- pmatch $ plookupTuple # dh # datums - punsafeCoerce dt + let dh = mustBePDJust # "Given TxOut dones't have a datum" # mdh + dt = mustBePJust # "Datum not found in the transaction" #$ plookupTuple # dh # datums + (d, _ ) <- ptryFrom $ pforgetData $ pdata dt + pfromData d {- | Extract the value stored in a PMaybe container. If there's no value, throw an error with the given message.