clean up proposal output validation
This commit is contained in:
parent
759c6a0aa5
commit
139f8add30
1 changed files with 44 additions and 32 deletions
|
|
@ -53,10 +53,10 @@ import Plutarch.Api.V2 (
|
||||||
)
|
)
|
||||||
import Plutarch.Extra.AssetClass (passetClass, passetClassValueOf)
|
import Plutarch.Extra.AssetClass (passetClass, passetClassValueOf)
|
||||||
import Plutarch.Extra.Comonad (pextract)
|
import Plutarch.Extra.Comonad (pextract)
|
||||||
import Plutarch.Extra.Field (pletAllC)
|
import Plutarch.Extra.Field (pletAll, pletAllC)
|
||||||
import Plutarch.Extra.List (pisUniq', pmapMaybe, pmergeBy, pmsortBy)
|
import Plutarch.Extra.List (pfirstJust, pisUniq', pmapMaybe, pmergeBy, pmsortBy)
|
||||||
import Plutarch.Extra.Map (plookup, pupdate)
|
import Plutarch.Extra.Map (plookup, pupdate)
|
||||||
import Plutarch.Extra.Maybe (passertPJust, pfromJust, pisJust)
|
import Plutarch.Extra.Maybe (passertPJust, pfromJust, pisJust, pjust, pnothing)
|
||||||
import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=))
|
import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=))
|
||||||
import Plutarch.Extra.ScriptContext (
|
import Plutarch.Extra.ScriptContext (
|
||||||
pfindTxInByTxOutRef,
|
pfindTxInByTxOutRef,
|
||||||
|
|
@ -176,7 +176,11 @@ proposalValidator as maximumCosigners =
|
||||||
txInfo'
|
txInfo'
|
||||||
PSpending ((pfield @"_0" #) -> txOutRef) <- pmatchC $ pfromData ctx.purpose
|
PSpending ((pfield @"_0" #) -> txOutRef) <- pmatchC $ pfromData ctx.purpose
|
||||||
|
|
||||||
PJust ((pfield @"resolved" #) -> txOut) <- pmatchC $ pfindTxInByTxOutRef # txOutRef # txInfoF.inputs
|
PJust ((pfield @"resolved" #) -> txOut) <-
|
||||||
|
pmatchC $
|
||||||
|
pfindTxInByTxOutRef
|
||||||
|
# txOutRef
|
||||||
|
# txInfoF.inputs
|
||||||
txOutF <- pletFieldsC @'["address", "value"] $ txOut
|
txOutF <- pletFieldsC @'["address", "value"] $ txOut
|
||||||
|
|
||||||
proposalDatum <- pfromData . fst <$> ptryFromC @(PAsData PProposalDatum) datum
|
proposalDatum <- pfromData . fst <$> ptryFromC @(PAsData PProposalDatum) datum
|
||||||
|
|
@ -203,36 +207,44 @@ proposalValidator as maximumCosigners =
|
||||||
--
|
--
|
||||||
-- We match the proposal id here so that we can support multiple
|
-- We match the proposal id here so that we can support multiple
|
||||||
-- proposal inputs in one thansaction.
|
-- proposal inputs in one thansaction.
|
||||||
ownOutput <-
|
|
||||||
pletC $
|
|
||||||
passertPJust # "Own output should be present" #$ pfind
|
|
||||||
# plam
|
|
||||||
( \input -> unTermCont $ do
|
|
||||||
inputF <- pletAllC input
|
|
||||||
|
|
||||||
-- TODO: this is highly inefficient: O(n) for every output,
|
|
||||||
-- Maybe we can cache the sorted datum map?
|
|
||||||
let datum =
|
|
||||||
pfromData $
|
|
||||||
pfromOutputDatum @(PAsData PProposalDatum)
|
|
||||||
# inputF.datum
|
|
||||||
# txInfoF.datums
|
|
||||||
|
|
||||||
proposalId = pfield @"proposalId" # pto datum
|
|
||||||
|
|
||||||
pure $
|
|
||||||
inputF.address #== ownAddress
|
|
||||||
#&& psymbolValueOf # stCurrencySymbol # inputF.value #== 1
|
|
||||||
#&& proposalId #== proposalF.proposalId
|
|
||||||
)
|
|
||||||
# pfromData txInfoF.outputs
|
|
||||||
|
|
||||||
proposalOut <-
|
proposalOut <-
|
||||||
pletC $
|
pletC $
|
||||||
pfromData $
|
passertPJust
|
||||||
pfromOutputDatum @(PAsData PProposalDatum)
|
# "Own output should be present"
|
||||||
# (pfield @"datum" # ownOutput)
|
#$ pfirstJust
|
||||||
# txInfoF.datums
|
# plam
|
||||||
|
( flip pletAll $ \outputF ->
|
||||||
|
let isProposalUTxO =
|
||||||
|
foldl1
|
||||||
|
(#&&)
|
||||||
|
[ ptraceIfFalse "Own by proposal validator" $
|
||||||
|
outputF.address #== ownAddress
|
||||||
|
, ptraceIfFalse "Has proposal ST" $
|
||||||
|
psymbolValueOf # stCurrencySymbol # outputF.value #== 1
|
||||||
|
]
|
||||||
|
|
||||||
|
handleProposalUTxO = unTermCont $ do
|
||||||
|
-- Using inline datum to avoid O(n^2) lookup.
|
||||||
|
datum <-
|
||||||
|
pletC $
|
||||||
|
pfromData $
|
||||||
|
pfromOutputDatum @(PAsData PProposalDatum)
|
||||||
|
# outputF.datum
|
||||||
|
# txInfoF.datums
|
||||||
|
|
||||||
|
pure $
|
||||||
|
pif
|
||||||
|
( pfield @"proposalId" # pto datum
|
||||||
|
#== proposalF.proposalId
|
||||||
|
)
|
||||||
|
(pjust # datum)
|
||||||
|
pnothing
|
||||||
|
in pif
|
||||||
|
isProposalUTxO
|
||||||
|
handleProposalUTxO
|
||||||
|
pnothing
|
||||||
|
)
|
||||||
|
# pfromData txInfoF.outputs
|
||||||
|
|
||||||
proposalUnchanged <- pletC $ proposalOut #== proposalDatum
|
proposalUnchanged <- pletC $ proposalOut #== proposalDatum
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue