reimplement mustFindDatum' with PTryFrom

This commit is contained in:
fanghr 2022-04-29 17:22:44 +08:00
parent 3da721b876
commit 750761ed0d
2 changed files with 10 additions and 14 deletions

View file

@ -119,7 +119,7 @@ import Plutarch.Map.Extra (pkeys, plookup, plookup')
import Plutarch.Monadic qualified as P import Plutarch.Monadic qualified as P
import Plutarch.SafeMoney (PDiscrete, Tagged (..), puntag, pvalueDiscrete) import Plutarch.SafeMoney (PDiscrete, Tagged (..), puntag, pvalueDiscrete)
import Plutarch.Unsafe (punsafeCoerce) 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 :: Governor -> ClosedTerm PValidator
governorValidator gov = governorValidator gov =
plam $ \datum' redeemer' ctx' -> P.do plam $ \datum' redeemer' ctx' -> P.do
-- TODO: use ptryFrom (pfromData -> redeemer, _) <- ptryFrom redeemer'
redeemer <- pmatch $ pfromData @PGovernorRedeemer $ punsafeCoerce redeemer'
ctx <- pletFields @'["txInfo", "purpose"] ctx' ctx <- pletFields @'["txInfo", "purpose"] ctx'
txInfo' <- plet $ pfromData $ ctx.txInfo txInfo' <- plet $ pfromData $ ctx.txInfo
@ -374,8 +373,7 @@ governorValidator gov =
ownInput <- pletFields @'["address", "value"] ownInput' ownInput <- pletFields @'["address", "value"] ownInput'
let selfAddress = pfromData $ ownInput.address let selfAddress = pfromData $ ownInput.address
-- TODO: use ptryFrom (pfromData -> (oldParams' :: Term _ PGovernorDatum), _) <- ptryFrom datum'
let oldParams' = pfromData @PGovernorDatum $ punsafeCoerce datum'
oldParams <- pletFields @'["proposalThresholds", "nextProposalId"] oldParams' oldParams <- pletFields @'["proposalThresholds", "nextProposalId"] oldParams'
let ownInputGSTAmount = stateTokenValueOf # ownInput.value let ownInputGSTAmount = stateTokenValueOf # ownInput.value
@ -402,7 +400,7 @@ governorValidator gov =
mustBePJust # "Ouput governor state datum not found" mustBePJust # "Ouput governor state datum not found"
#$ pfindDatum # outputGovernorStateDatumHash # txInfo' #$ pfindDatum # outputGovernorStateDatumHash # txInfo'
case redeemer of pmatch redeemer $ \case
PCreateProposal _ -> P.do PCreateProposal _ -> P.do
let expectedNextProposalId = pgetNextProposalId # oldParams.nextProposalId let expectedNextProposalId = pgetNextProposalId # oldParams.nextProposalId
expectedNewDatum = expectedNewDatum =

View file

@ -529,13 +529,10 @@ hasOnlyOneTokenOfCurrencySymbol = phoistAcyclic $
psymbolValueOf # cs # vs #== 1 psymbolValueOf # cs # vs #== 1
#&& (plength #$ pto $ pto $ pto vs) #== 1 #&& (plength #$ pto $ pto $ pto vs) #== 1
{- Find datum given a maybe datum hash, in an unsafe manner. -- | Find datum given a maybe datum hash
FIXME: reimplement using 'ptryFrom'.
-}
mustFindDatum' :: mustFindDatum' ::
forall (datum :: PType). forall (datum :: PType).
PIsData datum => (PIsData datum, PTryFrom PData (PAsData datum))=>
forall s. forall s.
Term Term
s s
@ -545,9 +542,10 @@ mustFindDatum' ::
) )
mustFindDatum' = phoistAcyclic $ mustFindDatum' = phoistAcyclic $
plam $ \mdh datums -> P.do plam $ \mdh datums -> P.do
PDJust ((pfield @"_0" #) -> dh) <- pmatch mdh let dh = mustBePDJust # "Given TxOut dones't have a datum" # mdh
PJust dt <- pmatch $ plookupTuple # dh # datums dt = mustBePJust # "Datum not found in the transaction" #$ plookupTuple # dh # datums
punsafeCoerce dt (d, _ ) <- ptryFrom $ pforgetData $ pdata dt
pfromData d
{- | Extract the value stored in a PMaybe container. {- | Extract the value stored in a PMaybe container.
If there's no value, throw an error with the given message. If there's no value, throw an error with the given message.