prevent minting multiple into one UTxO; regression tests

This commit is contained in:
Hongrui Fang 2022-11-09 17:42:18 +08:00
parent 0eacf1f6f2
commit 287054d95e
8 changed files with 215 additions and 123 deletions

View file

@ -36,12 +36,13 @@ module Sample.Proposal.Advance (
mkBadGovernorOutputDatumBundle,
mkUnexpectedOutputStakeBundles,
mkFastforwardToFinishBundles,
mkBadGovernorRedeemerBundle,
) where
import Agora.Governor (
Governor (..),
GovernorDatum (..),
GovernorRedeemer (MintGATs),
GovernorRedeemer (CreateProposal, MintGATs),
)
import Agora.Proposal (
ProposalDatum (..),
@ -85,6 +86,7 @@ import Plutarch.Context (
timeRange,
withDatum,
withInlineDatum,
withRedeemer,
withRef,
withValue,
)
@ -101,6 +103,7 @@ import PlutusLedgerApi.V2 (
TxOutRef (TxOutRef),
ValidatorHash,
)
import PlutusTx qualified
import Sample.Proposal.Shared (
governorTxRef,
proposalTxRef,
@ -165,9 +168,18 @@ data ParameterBundle = ParameterBundle
}
-- | Everything about the generated governor stuff.
newtype GovernorParameters = GovernorParameters
data GovernorParameters = forall
(redeemer :: Type)
(predeemer :: PType).
( PUnsafeLiftDecl predeemer
, PLifted predeemer ~ redeemer
, PIsData predeemer
, PlutusTx.ToData redeemer
) =>
GovernorParameters
{ invalidGovernorOutputDatum :: Bool
-- ^ The output governor datum will be changed.
, governorRedeemer :: redeemer
}
-- | Everything about the generated authority token stuff.
@ -432,7 +444,7 @@ governorRef = TxOutRef governorTxRef 2
governor validator.
-}
mkGovernorBuilder :: forall b. CombinableBuilder b => GovernorParameters -> b
mkGovernorBuilder ps =
mkGovernorBuilder ps@(GovernorParameters _ redeemer) =
let gst = assetClassValue governorAssetClass 1
value = sortValue $ gst <> minAda
in mconcat
@ -442,6 +454,7 @@ mkGovernorBuilder ps =
, withValue value
, withRef governorRef
, withDatum governorInputDatum
, withRedeemer redeemer
]
, output $
mconcat
@ -452,12 +465,6 @@ mkGovernorBuilder ps =
]
]
{- | The proposal redeemer used to spend the governor UTXO, which is always
'MintGATs' in this case.
-}
governorRedeemer :: GovernorRedeemer
governorRedeemer = MintGATs
--------------------------------------------------------------------------------
-- * Authority Token
@ -538,16 +545,19 @@ mkTestTree name pb val =
proposalInputDatum
proposalRedeemer
(spend proposalRef)
governor =
maybe [] singleton $
testValidator
(fromJust val.forGovernorValidator)
"governor"
governorValidator
governorInputDatum
governorRedeemer
(spend governorRef)
<$ pb.governorParameters
( \(GovernorParameters _ governorRedeemer) ->
testValidator
(fromJust val.forGovernorValidator)
"governor"
governorValidator
governorInputDatum
governorRedeemer
(spend governorRef)
)
<$> pb.governorParameters
authority = case pb.authorityTokenParameters of
[] -> []
@ -827,6 +837,7 @@ mkValidToNextStateBundle nCosigners nEffects authScript from =
gov =
GovernorParameters
{ invalidGovernorOutputDatum = False
, governorRedeemer = MintGATs
}
in b
{ governorParameters = Just gov
@ -1066,7 +1077,19 @@ mkBadGovernorOutputDatumBundle nCosigners nEffects =
}
where
template = mkValidFromLockedBundle nCosigners nEffects
gov = GovernorParameters True
gov = GovernorParameters True MintGATs
mkBadGovernorRedeemerBundle ::
Word ->
Word ->
ParameterBundle
mkBadGovernorRedeemerBundle nCosigners nEffects =
template
{ governorParameters = Just gov
}
where
template = mkValidFromLockedBundle nCosigners nEffects
gov = GovernorParameters False CreateProposal
mkFastforwardToFinishBundles ::
Word ->

View file

@ -19,12 +19,17 @@ module Sample.Proposal.Create (
invalidProposalStatusParameters,
fakeSSTParameters,
wrongGovernorRedeemer,
wrongGovernorRedeemer1,
) where
import Agora.Governor (
Governor (..),
GovernorDatum (..),
GovernorRedeemer (CreateProposal, MutateGovernor),
GovernorRedeemer (
CreateProposal,
MintGATs,
MutateGovernor
),
)
import Agora.Proposal (
ProposalDatum (..),
@ -71,6 +76,8 @@ import PlutusLedgerApi.V2 (
Credential (PubKeyCredential),
POSIXTime (POSIXTime),
POSIXTimeRange,
Redeemer (Redeemer),
ToData (toBuiltinData),
TxOutRef (TxOutRef),
always,
)
@ -123,8 +130,8 @@ data Parameters = Parameters
-- ^ The status of the newly created proposal.
, fakeSST :: Bool
-- ^ Whether to use SST that doesn't belong to the stake validator.
, wrongGovernorRedeemer :: Bool
-- ^ Use 'MutateGovernor' as the governor redeemer
, governorRedeemer :: Redeemer
-- ^ The redeemer used to spend the governor.
}
--------------------------------------------------------------------------------
@ -358,7 +365,7 @@ createProposal ps = builder
[ script governorValidatorHash
, withValue governorValue
, withDatum governorInputDatum
, withRedeemer $ mkGovernorRedeemer ps
, withRedeemer ps.governorRedeemer
, withRef governorRef
]
, output $
@ -418,13 +425,6 @@ createProposal ps = builder
stakeRedeemer :: StakeRedeemer
stakeRedeemer = PermitVote
-- | Spend the governor with the 'CreateProposal' redeemer.
mkGovernorRedeemer :: Parameters -> GovernorRedeemer
mkGovernorRedeemer ps =
if ps.wrongGovernorRedeemer
then MutateGovernor
else CreateProposal
-- | Mint the PST with an arbitrary redeemer. Doesn't really matter.
proposalPolicyRedeemer :: ()
proposalPolicyRedeemer = ()
@ -443,7 +443,7 @@ totallyValidParameters =
, timeRangeClosed = True
, proposalStatus = Draft
, fakeSST = False
, wrongGovernorRedeemer = False
, governorRedeemer = Redeemer $ toBuiltinData CreateProposal
}
invalidOutputGovernorDatumParameters :: Parameters
@ -505,7 +505,13 @@ fakeSSTParameters =
wrongGovernorRedeemer :: Parameters
wrongGovernorRedeemer =
totallyValidParameters
{ wrongGovernorRedeemer = True
{ governorRedeemer = Redeemer $ toBuiltinData MintGATs
}
wrongGovernorRedeemer1 :: Parameters
wrongGovernorRedeemer1 =
totallyValidParameters
{ governorRedeemer = Redeemer $ toBuiltinData MutateGovernor
}
--------------------------------------------------------------------------------
@ -540,7 +546,7 @@ mkTestTree
"governor"
governorValidator
governorInputDatum
(mkGovernorRedeemer ps)
ps.governorRedeemer
(spend governorRef)
stakeTest =