diff --git a/CHANGELOG.md b/CHANGELOG.md index 70dbaee..75888eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,26 @@ This format is based on [Keep A Changelog](https://keepachangelog.com/en/1.0.0). ### Modified +- Fix several vulnerabilities and bugs found by auditors. + + Including: + - A bug that allows multiple GATs to be minted into a single UTxO and sent + to a malicious script. + - A bug that allows delegates to create or cosign proposals with delegated + stakes. + - Potential DDoS attack: calling `UnlockStake` without any stake. + - Potential DDoS attack: calling `UnlockStake` on a `VotingReady` proposal + without actually changing the votes. + - Ignore staking credential in proposal, stake and governor. + - Improve naming and doc strings to avoid confusion. + + Included by [#208](https://github.com/Liqwid-Labs/agora/pull/208) + +- Allow delegates to vote and retract vote with their stakes along side with + stakes delegated to them in the same transaction. + + Included by [#208](https://github.com/Liqwid-Labs/agora/pull/208) + - Fix several vulnerabilities and bugs found in both proposal and governor scripts. Including: @@ -150,7 +170,7 @@ the stake validator easily. The behaviour of the default stake validator remains Included by [#146](https://github.com/Liqwid-Labs/agora/pull/146). -- Draft phase and cosigning for Proposals. +- Draft phase and cosigning for Proposals. Included by [#136](https://github.com/Liqwid-Labs/agora/pull/136). @@ -158,7 +178,7 @@ the stake validator easily. The behaviour of the default stake validator remains Included by [#134](https://github.com/Liqwid-Labs/agora/pull/134). -- Fixed bug that made it impossible to create proposals. Added new stake locking mechanism for creating proposals. +- Fixed bug that made it impossible to create proposals. Added new stake locking mechanism for creating proposals. Included by [#142](https://github.com/Liqwid-Labs/agora/pull/142). diff --git a/agora-scripts/Main.hs b/agora-scripts/Main.hs index c56740b..e1aa7f5 100644 --- a/agora-scripts/Main.hs +++ b/agora-scripts/Main.hs @@ -9,10 +9,13 @@ module Main (main) where import Agora.Bootstrap qualified as Bootstrap -import Agora.Linker +import Agora.Linker (linker) import Data.Default (def) -import ScriptExport.Export -import ScriptExport.Types +import ScriptExport.Export (exportMain) +import ScriptExport.Types ( + Builders, + insertScriptExportWithLinker, + ) main :: IO () main = exportMain builders diff --git a/agora-specs/Property/Governor.hs b/agora-specs/Property/Governor.hs index 5e5547c..1c85e6e 100644 --- a/agora-specs/Property/Governor.hs +++ b/agora-specs/Property/Governor.hs @@ -15,7 +15,7 @@ import Agora.Governor ( GovernorDatum ( GovernorDatum, createProposalTimeRangeMaxWidth, - maximumProposalsPerStake, + maximumCreatedProposalsPerStake, nextProposalId, proposalThresholds, proposalTimings @@ -274,7 +274,7 @@ mkGovMintingCasePropertyTest name case' positiveCaseName negativeCaseName = , nextProposalId = ProposalId 0 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } gst = assetClassValue governorAssetClass 1 diff --git a/agora-specs/Sample/Effect/GovernorMutation.hs b/agora-specs/Sample/Effect/GovernorMutation.hs index 7739d80..dd25bed 100644 --- a/agora-specs/Sample/Effect/GovernorMutation.hs +++ b/agora-specs/Sample/Effect/GovernorMutation.hs @@ -114,7 +114,7 @@ mkEffectTxInfo newGovDatum = , nextProposalId = ProposalId 0 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } governorInputDatum :: Datum governorInputDatum = Datum $ toBuiltinData governorInputDatum' @@ -186,7 +186,7 @@ validNewGovernorDatum = , nextProposalId = ProposalId 42 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } invalidNewGovernorDatum :: GovernorDatum @@ -199,5 +199,5 @@ invalidNewGovernorDatum = , nextProposalId = ProposalId 42 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } diff --git a/agora-specs/Sample/Governor/Initialize.hs b/agora-specs/Sample/Governor/Initialize.hs index e07117d..ec7cce6 100644 --- a/agora-specs/Sample/Governor/Initialize.hs +++ b/agora-specs/Sample/Governor/Initialize.hs @@ -72,7 +72,7 @@ data Parameters = Parameters -- ^ Whether the 'GovernorDatum.proposalThresholds' field of the output -- governor datum is valid or not. , datumMaxTimeRangeWidthValid :: Bool - -- ^ Whether the 'GovernorDatum.maximumProposalsPerStake'field of the + -- ^ Whether the 'GovernorDatum.maximumCreatedProposalsPerStake'field of the -- output governor datum is valid or not. , datumTimingConfigValid :: Bool -- ^ Whether the 'GovernorDatum.proposalTimings'field of the output @@ -96,7 +96,7 @@ validGovernorOutputDatum = , nextProposalId = ProposalId 0 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } invalidProposalThresholds :: ProposalThresholds diff --git a/agora-specs/Sample/Governor/Mutate.hs b/agora-specs/Sample/Governor/Mutate.hs index a2ca582..11577f7 100644 --- a/agora-specs/Sample/Governor/Mutate.hs +++ b/agora-specs/Sample/Governor/Mutate.hs @@ -105,7 +105,7 @@ governorInputDatum = , nextProposalId = ProposalId 0 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } mkGovernorOutputDatum :: @@ -115,7 +115,7 @@ mkGovernorOutputDatum DatumValid = Just $ toData $ governorInputDatum - { maximumProposalsPerStake = 4 + { maximumCreatedProposalsPerStake = 4 } mkGovernorOutputDatum ValueInvalid = let invalidProposalThresholds = diff --git a/agora-specs/Sample/Proposal/Advance.hs b/agora-specs/Sample/Proposal/Advance.hs index 1b5baab..c36a878 100644 --- a/agora-specs/Sample/Proposal/Advance.hs +++ b/agora-specs/Sample/Proposal/Advance.hs @@ -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. @@ -414,14 +426,14 @@ governorInputDatum = , nextProposalId = ProposalId 42 , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = 3 + , maximumCreatedProposalsPerStake = 3 } -- | Create the output governor datum given the parameters. mkGovernorOutputDatum :: GovernorParameters -> GovernorDatum mkGovernorOutputDatum ps = if ps.invalidGovernorOutputDatum - then governorInputDatum {maximumProposalsPerStake = 15} + then governorInputDatum {maximumCreatedProposalsPerStake = 15} else governorInputDatum -- | Reference to the governor UTXO. @@ -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,22 @@ mkTestTree name pb val = proposalInputDatum proposalRedeemer (spend proposalRef) + governor = - maybe [] singleton $ - testValidator - (fromJust val.forGovernorValidator) - "governor" - governorValidator - governorInputDatum - governorRedeemer - (spend governorRef) - <$ pb.governorParameters + maybe + [] + ( singleton + . ( \(GovernorParameters _ governorRedeemer) -> + testValidator + (fromJust val.forGovernorValidator) + "governor" + governorValidator + governorInputDatum + governorRedeemer + (spend governorRef) + ) + ) + (pb.governorParameters) authority = case pb.authorityTokenParameters of [] -> [] @@ -827,6 +840,7 @@ mkValidToNextStateBundle nCosigners nEffects authScript from = gov = GovernorParameters { invalidGovernorOutputDatum = False + , governorRedeemer = MintGATs } in b { governorParameters = Just gov @@ -1066,7 +1080,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 -> diff --git a/agora-specs/Sample/Proposal/Create.hs b/agora-specs/Sample/Proposal/Create.hs index 1ce4ab5..04d4486 100644 --- a/agora-specs/Sample/Proposal/Create.hs +++ b/agora-specs/Sample/Proposal/Create.hs @@ -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,13 +130,13 @@ 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. } -------------------------------------------------------------------------------- --- | See 'GovernorDatum.maximumProposalsPerStake'. +-- | See 'GovernorDatum.maximumCreatedProposalsPerStake'. maxProposalPerStake :: Integer maxProposalPerStake = 3 @@ -174,7 +181,7 @@ governorInputDatum = , nextProposalId = thisProposalId , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = maxProposalPerStake + , maximumCreatedProposalsPerStake = maxProposalPerStake } -- | Create governor output datum given the parameters. @@ -189,7 +196,7 @@ mkGovernorOutputDatum ps = , nextProposalId = nextPid , proposalTimings = def , createProposalTimeRangeMaxWidth = def - , maximumProposalsPerStake = maxProposalPerStake + , maximumCreatedProposalsPerStake = maxProposalPerStake } -------------------------------------------------------------------------------- @@ -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 = diff --git a/agora-specs/Sample/Proposal/Vote.hs b/agora-specs/Sample/Proposal/Vote.hs index 6a6f4e3..8c950d4 100644 --- a/agora-specs/Sample/Proposal/Vote.hs +++ b/agora-specs/Sample/Proposal/Vote.hs @@ -18,6 +18,7 @@ module Sample.Proposal.Vote ( mkTestTree, mkValidOwnerVoteBundle, mkValidDelegateeVoteBundle, + delegateeVoteWithOwnAndDelegatedStakeBundle, transparentAssets, transactionNotAuthorized, voteForNonexistentOutcome, @@ -99,6 +100,7 @@ newtype VoteParameters = VoteParameters {voteFor :: ResultTag} data StakeParameters = StakeParameters { numStakes :: Integer + , mixInDelegateeAsOwner :: Bool , stakeInputParameters :: StakeInputParameters , stakeOutputParameters :: StakeOutputParameters } @@ -257,6 +259,16 @@ vote params = stakeRedeemer = mkStakeRedeemer params.stakeParameters.stakeOutputParameters + mixOwner i datum = + if params.stakeParameters.mixInDelegateeAsOwner + && i == 2 + then + datum + { owner = PubKeyCredential delegatee + , delegatedTo = Nothing + } + else datum + stakeBuilder :: b stakeBuilder = foldMap @@ -266,7 +278,7 @@ vote params = mconcat [ script stakeValidatorHash , withValue stakeInputValue - , withInlineDatum stakeInputDatum + , withInlineDatum $ mixOwner i stakeInputDatum , withRedeemer stakeRedeemer , withRef $ mkStakeRef numProposals' i ] @@ -277,7 +289,7 @@ vote params = mconcat [ script stakeValidatorHash , withValue stakeOutputValue - , withInlineDatum stakeOutputDatum + , withInlineDatum $ mixOwner i stakeOutputDatum ] ] ) @@ -420,6 +432,7 @@ mkValidOwnerVoteBundle stakes = , stakeParameters = StakeParameters { numStakes = stakes + , mixInDelegateeAsOwner = False , stakeInputParameters = StakeInputParameters { perStakeGTs = (def :: ProposalThresholds).vote @@ -453,6 +466,16 @@ mkValidDelegateeVoteBundle stakes = } } +delegateeVoteWithOwnAndDelegatedStakeBundle :: ParameterBundle +delegateeVoteWithOwnAndDelegatedStakeBundle = + let template = mkValidDelegateeVoteBundle 5 + in template + { stakeParameters = + template.stakeParameters + { mixInDelegateeAsOwner = True + } + } + ownerVoteWithSignleStake :: ParameterBundle ownerVoteWithSignleStake = mkValidOwnerVoteBundle 1 diff --git a/agora-specs/Spec/AuthorityToken.hs b/agora-specs/Spec/AuthorityToken.hs index d388c02..b169b42 100644 --- a/agora-specs/Spec/AuthorityToken.hs +++ b/agora-specs/Spec/AuthorityToken.hs @@ -10,6 +10,7 @@ Tests for Authority token functions module Spec.AuthorityToken (specs) where import Agora.AuthorityToken (singleAuthorityTokenBurned) +import Data.Tagged (Tagged (Tagged)) import Plutarch.Extra.Compile (mustCompile) import Plutarch.Unsafe (punsafeCoerce) import PlutusLedgerApi.V1 ( @@ -45,7 +46,7 @@ mkInputs = fmap (TxInInfo (TxOutRef "" 0)) singleAuthorityTokenBurnedTest :: Value -> [TxOut] -> Script singleAuthorityTokenBurnedTest mint outs = let actual :: ClosedTerm PBool - actual = singleAuthorityTokenBurned (pconstant currencySymbol) (punsafeCoerce $ pconstant $ mkInputs outs) (pconstant mint) + actual = singleAuthorityTokenBurned (pconstant $ Tagged currencySymbol) (punsafeCoerce $ pconstant $ mkInputs outs) (pconstant mint) s :: ClosedTerm POpaque s = pif diff --git a/agora-specs/Spec/Proposal.hs b/agora-specs/Spec/Proposal.hs index 4bc3fa8..1bba2ed 100644 --- a/agora-specs/Spec/Proposal.hs +++ b/agora-specs/Spec/Proposal.hs @@ -97,6 +97,12 @@ specs = False False True + , Create.mkTestTree + "wrong governor redeemer" + Create.wrongGovernorRedeemer1 + False + False + True ] ] , group @@ -160,6 +166,10 @@ specs = "transparent non-GT tokens" Vote.transparentAssets (Vote.Validity True True) + , Vote.mkTestTree + "Delegatee vote with own and delegated stakes in one tx" + Vote.delegateeVoteWithOwnAndDelegatedStakeBundle + (Vote.Validity True True) ] , group "illegal" @@ -349,6 +359,15 @@ specs = , forGovernorValidator = Just False , forAuthorityTokenPolicy = Just True } + , Advance.mkTestTree + "wrong governor redeemer" + (Advance.mkBadGovernorRedeemerBundle cs es) + Advance.Validity + { forProposalValidator = True + , forStakeValidator = True + , forGovernorValidator = Just False + , forAuthorityTokenPolicy = Just False + } ] ] , group "unlocking" $ diff --git a/agora/Agora/AuthorityToken.hs b/agora/Agora/AuthorityToken.hs index 0ade9ab..b1bffc0 100644 --- a/agora/Agora/AuthorityToken.hs +++ b/agora/Agora/AuthorityToken.hs @@ -11,6 +11,9 @@ module Agora.AuthorityToken ( singleAuthorityTokenBurned, ) where +import Agora.Governor (PGovernorRedeemer (PMintGATs), presolveGovernorRedeemer) +import Agora.SafeMoney (AuthorityTokenTag, GovernorSTTag) +import Agora.Utils (ptag, ptaggedSymbolValueOf, ptoScottEncodingT, puntag) import Plutarch.Api.V1 ( PCredential (..), PCurrencySymbol (..), @@ -22,18 +25,16 @@ import Plutarch.Api.V2 ( KeyGuarantees, PAddress (PAddress), PMintingPolicy, - PScriptContext (PScriptContext), PScriptPurpose (PMinting), PTxInInfo (PTxInInfo), - PTxInfo (PTxInfo), PTxOut (PTxOut), ) -import Plutarch.Extra.AssetClass (PAssetClassData, ptoScottEncoding) +import Plutarch.Extra.AssetClass (PAssetClassData) import Plutarch.Extra.Bool (passert) import "liqwid-plutarch-extra" Plutarch.Extra.List (plookupAssoc) -import Plutarch.Extra.Maybe (pfromJust) -import Plutarch.Extra.ScriptContext (pisTokenSpent) +import Plutarch.Extra.Maybe (passertPJust, pfromJust) import Plutarch.Extra.Sum (PSum (PSum)) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( pguardC, pletC, @@ -41,7 +42,7 @@ import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( pmatchC, ) import Plutarch.Extra.Traversable (pfoldMap) -import Plutarch.Extra.Value (psymbolValueOf, psymbolValueOf') +import Plutarch.Extra.Value (psymbolValueOf') -------------------------------------------------------------------------------- @@ -63,7 +64,7 @@ import Plutarch.Extra.Value (psymbolValueOf, psymbolValueOf') @since 1.0.0 -} -authorityTokensValidIn :: forall (s :: S). Term s (PCurrencySymbol :--> PTxOut :--> PBool) +authorityTokensValidIn :: forall (s :: S). Term s (PTagged AuthorityTokenTag PCurrencySymbol :--> PTxOut :--> PBool) authorityTokensValidIn = phoistAcyclic $ plam $ \authorityTokenSym txOut'' -> unTermCont $ do PTxOut txOut' <- pmatchC txOut'' @@ -72,7 +73,7 @@ authorityTokensValidIn = phoistAcyclic $ PValue value' <- pmatchC txOut.value PMap value <- pmatchC value' pure $ - pmatch (plookupAssoc # pfstBuiltin # psndBuiltin # pdata authorityTokenSym # value) $ \case + pmatch (plookupAssoc # pfstBuiltin # psndBuiltin # pdata (puntag authorityTokenSym) # value) $ \case PJust (pfromData -> _tokenMap') -> pmatch (pfield @"credential" # address) $ \case PPubKeyCredential _ -> @@ -94,13 +95,13 @@ authorityTokensValidIn = phoistAcyclic $ -} singleAuthorityTokenBurned :: forall (keys :: KeyGuarantees) (amounts :: AmountGuarantees) (s :: S). - Term s PCurrencySymbol -> + Term s (PTagged AuthorityTokenTag PCurrencySymbol) -> Term s (PBuiltinList PTxInInfo) -> Term s (PValue keys amounts) -> Term s PBool singleAuthorityTokenBurned gatCs inputs mint = unTermCont $ do let gatAmountMinted :: Term _ PInteger - gatAmountMinted = psymbolValueOf # gatCs # mint + gatAmountMinted = ptaggedSymbolValueOf # gatCs # mint let inputsWithGAT = pfoldMap @@ -116,12 +117,13 @@ singleAuthorityTokenBurned gatCs inputs mint = unTermCont $ do $ resolved pure . pcon . PSum $ - psymbolValueOf + ptaggedSymbolValueOf # gatCs #$ pfield @"value" #$ resolved ) # inputs + pure $ foldr1 (#&&) @@ -144,35 +146,46 @@ singleAuthorityTokenBurned gatCs inputs mint = unTermCont $ do @since 0.1.0 -} -authorityTokenPolicy :: ClosedTerm (PAssetClassData :--> PMintingPolicy) +authorityTokenPolicy :: ClosedTerm (PTagged GovernorSTTag PAssetClassData :--> PMintingPolicy) authorityTokenPolicy = - plam $ \atAssetClass _redeemer ctx' -> - pmatch ctx' $ \(PScriptContext ctx') -> unTermCont $ do - ctx <- pletFieldsC @'["txInfo", "purpose"] ctx' - PTxInfo txInfo' <- pmatchC $ pfromData ctx.txInfo - txInfo <- pletFieldsC @'["inputs", "mint", "outputs"] txInfo' - let inputs = txInfo.inputs - govTokenSpent = pisTokenSpent # (ptoScottEncoding # atAssetClass) # inputs + plam $ \gstAssetClass _redeemer ctx -> unTermCont $ do + ctxF <- pletFieldsC @'["txInfo", "purpose"] ctx + txInfoF <- + pletFieldsC + @'[ "inputs" + , "mint" + , "outputs" + , "redeemers" + ] + ctxF.txInfo - PMinting ownSymbol' <- pmatchC $ pfromData ctx.purpose + PMinting ownSymbol' <- pmatchC $ pfromData ctxF.purpose - let ownSymbol = pfromData $ pfield @"_0" # ownSymbol' + let ownSymbol = pfromData $ pfield @"_0" # ownSymbol' - PPair mintedATs burntATs <- - pmatchC $ pfromJust #$ psymbolValueOf' # ownSymbol # txInfo.mint + PPair mintedATs burntATs <- + pmatchC $ pfromJust #$ psymbolValueOf' # ownSymbol # txInfoF.mint - pure $ - popaque $ - pif - (0 #< mintedATs) - ( unTermCont $ do - pguardC "No GAT burnt" $ 0 #== burntATs - pguardC "Parent token did not move in minting GATs" govTokenSpent - pguardC "All outputs only emit valid GATs" $ - pall - # plam - (authorityTokensValidIn # ownSymbol #) - # txInfo.outputs - pure $ pconstant () - ) - (passert "No GAT minted" (0 #== mintedATs) (pconstant ())) + pure $ + popaque $ + pif + (0 #< mintedATs) + ( unTermCont $ do + pguardC "No GAT burnt" $ 0 #== burntATs + let governorRedeemer = + passertPJust + # "GST should move" + #$ presolveGovernorRedeemer + # (ptoScottEncodingT # gstAssetClass) + # pfromData txInfoF.inputs + # txInfoF.redeemers + pguardC "Governor redeemr correct" $ + pcon PMintGATs #== governorRedeemer + pguardC "All outputs only emit valid GATs" $ + pall + # plam + (authorityTokensValidIn # ptag ownSymbol #) + # txInfoF.outputs + pure $ pconstant () + ) + (passert "No GAT minted" (0 #== mintedATs) (pconstant ())) diff --git a/agora/Agora/Effect.hs b/agora/Agora/Effect.hs index 0bd0a5c..c81c9bf 100644 --- a/agora/Agora/Effect.hs +++ b/agora/Agora/Effect.hs @@ -8,6 +8,7 @@ Helpers for constructing effects. module Agora.Effect (makeEffect) where import Agora.AuthorityToken (singleAuthorityTokenBurned) +import Agora.SafeMoney (AuthorityTokenTag) import Plutarch.Api.V1 ( PCurrencySymbol, ) @@ -17,6 +18,7 @@ import Plutarch.Api.V2 ( PTxOutRef, PValidator, ) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC, ptryFromC) {- | Helper "template" for creating effect validator. @@ -30,13 +32,13 @@ import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC, pletFiel makeEffect :: forall (datum :: PType) (s :: S). (PTryFrom PData datum, PIsData datum) => - ( Term s PCurrencySymbol -> + ( Term s (PTagged AuthorityTokenTag PCurrencySymbol) -> Term s datum -> Term s PTxOutRef -> Term s (PAsData PTxInfo) -> Term s POpaque ) -> - Term s PCurrencySymbol -> + Term s (PTagged AuthorityTokenTag PCurrencySymbol) -> Term s PValidator makeEffect f atSymbol = plam $ \datum _redeemer ctx' -> unTermCont $ do diff --git a/agora/Agora/Effect/GovernorMutation.hs b/agora/Agora/Effect/GovernorMutation.hs index fc72cf2..2050a28 100644 --- a/agora/Agora/Effect/GovernorMutation.hs +++ b/agora/Agora/Effect/GovernorMutation.hs @@ -25,7 +25,8 @@ import Agora.Governor ( PGovernorDatum, PGovernorRedeemer, ) -import Agora.Plutarch.Orphans () +import Agora.SafeMoney (AuthorityTokenTag, GovernorSTTag) +import Agora.Utils (ptaggedSymbolValueOf) import Plutarch.Api.V1 (PCurrencySymbol, PValidatorHash) import Plutarch.Api.V2 ( PScriptPurpose (PSpending), @@ -38,16 +39,16 @@ import Plutarch.DataRepr ( ) import Plutarch.Extra.Field (pletAll, pletAllC) import "liqwid-plutarch-extra" Plutarch.Extra.List (ptryFromSingleton) -import Plutarch.Extra.Maybe (passertPJust, pdnothing) +import Plutarch.Extra.Maybe (passertPJust, pfromJust) import Plutarch.Extra.Record (mkRecordConstr, (.=)) import Plutarch.Extra.ScriptContext ( - paddressFromValidatorHash, pisScriptAddress, ptryFromOutputDatum, ptryFromRedeemer, + pvalidatorHashFromAddress, ) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC) -import Plutarch.Extra.Value (psymbolValueOf) import Plutarch.Lift (PConstantDecl, PLifted, PUnsafeLiftDecl) import PlutusLedgerApi.V1 (TxOutRef) import PlutusTx qualified @@ -150,8 +151,8 @@ deriving anyclass instance PTryFrom PData PMutateGovernorDatum mutateGovernorValidator :: ClosedTerm ( PValidatorHash - :--> PCurrencySymbol - :--> PCurrencySymbol + :--> PTagged GovernorSTTag PCurrencySymbol + :--> PTagged AuthorityTokenTag PCurrencySymbol :--> PValidator ) mutateGovernorValidator = @@ -182,25 +183,23 @@ mutateGovernorValidator = pany # plam ( flip pletAll $ \inputF -> - let governorAddress = - paddressFromValidatorHash - # govValidatorHash - # pdnothing - - isGovernorInput = + let isGovernorInput = foldl1 (#&&) [ ptraceIfFalse "Governor UTxO should carry GST" $ - psymbolValueOf + ptaggedSymbolValueOf # gstSymbol # (pfield @"value" # inputF.resolved) #== 1 , ptraceIfFalse "Can only modify the pinned governor" $ inputF.outRef #== effectDatumF.governorRef , ptraceIfFalse "Governor validator run" $ - pfield @"address" - # inputF.resolved - #== governorAddress + let inputValidatorHash = + pfromJust + #$ pvalidatorHashFromAddress + #$ pfield @"address" + # inputF.resolved + in inputValidatorHash #== govValidatorHash ] in isGovernorInput ) diff --git a/agora/Agora/Effect/NoOp.hs b/agora/Agora/Effect/NoOp.hs index 6b79621..39f50c2 100644 --- a/agora/Agora/Effect/NoOp.hs +++ b/agora/Agora/Effect/NoOp.hs @@ -8,10 +8,10 @@ A dumb effect that only burns its GAT. module Agora.Effect.NoOp (noOpValidator, PNoOp) where import Agora.Effect (makeEffect) -import Agora.Plutarch.Orphans () +import Agora.SafeMoney (AuthorityTokenTag) import Plutarch.Api.V1 (PCurrencySymbol) import Plutarch.Api.V2 (PValidator) -import Plutarch.Orphans () +import Plutarch.Extra.Tagged (PTagged) {- | Dummy datum for NoOp effect. @@ -40,7 +40,7 @@ instance PTryFrom PData (PAsData PNoOp) @since 1.0.0 -} -noOpValidator :: ClosedTerm (PCurrencySymbol :--> PValidator) +noOpValidator :: ClosedTerm (PTagged AuthorityTokenTag PCurrencySymbol :--> PValidator) noOpValidator = plam $ makeEffect $ \_ (_datum :: Term s (PAsData PNoOp)) _ _ -> popaque (pconstant ()) diff --git a/agora/Agora/Effect/TreasuryWithdrawal.hs b/agora/Agora/Effect/TreasuryWithdrawal.hs index 879e078..4f3c1fd 100644 --- a/agora/Agora/Effect/TreasuryWithdrawal.hs +++ b/agora/Agora/Effect/TreasuryWithdrawal.hs @@ -14,7 +14,7 @@ module Agora.Effect.TreasuryWithdrawal ( ) where import Agora.Effect (makeEffect) -import Agora.Plutarch.Orphans () +import Agora.SafeMoney (AuthorityTokenTag) import Plutarch.Api.V1 ( PCredential, PCurrencySymbol, @@ -36,6 +36,7 @@ import Plutarch.DataRepr ( import Plutarch.Extra.Field (pletAllC) import "liqwid-plutarch-extra" Plutarch.Extra.List (pdeleteFirst) import Plutarch.Extra.ScriptContext (pisPubKey) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC) import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted)) import PlutusLedgerApi.V1.Credential (Credential) @@ -133,7 +134,7 @@ instance PTryFrom PData PTreasuryWithdrawalDatum -} treasuryWithdrawalValidator :: forall (s :: S). - Term s (PCurrencySymbol :--> PValidator) + Term s (PTagged AuthorityTokenTag PCurrencySymbol :--> PValidator) treasuryWithdrawalValidator = plam $ makeEffect $ \_cs (datum :: Term _ PTreasuryWithdrawalDatum) effectInputRef txInfo -> unTermCont $ do diff --git a/agora/Agora/Governor.hs b/agora/Agora/Governor.hs index aa6352c..e7cb192 100644 --- a/agora/Agora/Governor.hs +++ b/agora/Agora/Governor.hs @@ -21,6 +21,7 @@ module Agora.Governor ( pgetNextProposalId, getNextProposalId, pisGovernorDatumValid, + presolveGovernorRedeemer, ) where import Agora.Aeson.Orphans () @@ -39,21 +40,33 @@ import Agora.Proposal.Time ( pisMaxTimeRangeWidthValid, pisProposalTimingConfigValid, ) -import Agora.SafeMoney (GTTag) +import Agora.SafeMoney (GTTag, GovernorSTTag) import Data.Aeson qualified as Aeson import Data.Tagged (Tagged) import Optics.TH (makeFieldLabelsNoPrefix) +import Plutarch.Api.V1.Scripts (PRedeemer) +import Plutarch.Api.V2 (KeyGuarantees (Unsorted), PMap, PScriptPurpose (PSpending), PTxInInfo) import Plutarch.DataRepr ( DerivePConstantViaData (DerivePConstantViaData), PDataFields, ) -import Plutarch.Extra.AssetClass (AssetClass) +import Plutarch.Extra.AssetClass (AssetClass, PAssetClass) +import Plutarch.Extra.Bind (PBind ((#>>=))) +import Plutarch.Extra.Field (pletAll) +import Plutarch.Extra.Function (pflip) +import Plutarch.Extra.Functor (PFunctor (pfmap)) import Plutarch.Extra.IsData ( DerivePConstantViaEnum (DerivePConstantEnum), EnumIsData (EnumIsData), PlutusTypeEnumData, ) +import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust) +import Plutarch.Extra.Maybe (pjust, pnothing) +import Plutarch.Extra.Record (mkRecordConstr, (.=)) +import Plutarch.Extra.ScriptContext (ptryFromRedeemer) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pletFieldsC) +import Plutarch.Extra.Value (passetClassValueOfT) import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted)) import PlutusLedgerApi.V1 (TxOutRef) import PlutusTx qualified @@ -74,9 +87,8 @@ data GovernorDatum = GovernorDatum -- Will get copied over upon the creation of proposals. , createProposalTimeRangeMaxWidth :: MaxTimeRangeWidth -- ^ The maximum valid duration of a transaction that creats a proposal. - , maximumProposalsPerStake :: Integer - -- ^ The maximum number of unfinished proposals that a stake is allowed to be - -- associated to. + , maximumCreatedProposalsPerStake :: Integer + -- ^ The maximum number of proposals created by any given stakes. } deriving stock ( -- | @since 0.1.0 @@ -170,7 +182,7 @@ newtype PGovernorDatum (s :: S) = PGovernorDatum , "nextProposalId" ':= PProposalId , "proposalTimings" ':= PProposalTimingConfig , "createProposalTimeRangeMaxWidth" ':= PMaxTimeRangeWidth - , "maximumProposalsPerStake" ':= PInteger + , "maximumCreatedProposalsPerStake" ':= PInteger ] ) } @@ -285,3 +297,53 @@ pisGovernorDatumValid = phoistAcyclic $ , ptraceIfFalse "time range valid" $ pisMaxTimeRangeWidthValid # datumF.createProposalTimeRangeMaxWidth ] + +{- | Find the governor input and resolve the corresponding governor redeemer, + given the assetclass of GST. + + @since 1.0.0 +-} +presolveGovernorRedeemer :: + forall (s :: S). + Term + s + ( PTagged GovernorSTTag PAssetClass + :--> PBuiltinList PTxInInfo + :--> PMap 'Unsorted PScriptPurpose PRedeemer + :--> PMaybe PGovernorRedeemer + ) +presolveGovernorRedeemer = phoistAcyclic $ + plam $ \gstClass inputs redeemers -> + let governorInputRef = + pfindJust + # plam + ( flip pletAll $ \inputF -> + let value = pfield @"value" # inputF.resolved + isGovernorInput = + passetClassValueOfT + # gstClass + # value + #== 1 + in pif + isGovernorInput + (pjust # inputF.outRef) + pnothing + ) + # inputs + + governorScriptPurpose = + pfmap + # plam + ( \ref -> + mkRecordConstr + PSpending + (#_0 .= ref) + ) + # governorInputRef + + governorRedeemer = + governorScriptPurpose + #>>= pflip + # ptryFromRedeemer @(PAsData PGovernorRedeemer) + # redeemers + in pfmap # plam pfromData # governorRedeemer diff --git a/agora/Agora/Governor/Scripts.hs b/agora/Agora/Governor/Scripts.hs index f80a86a..f417e33 100644 --- a/agora/Agora/Governor/Scripts.hs +++ b/agora/Agora/Governor/Scripts.hs @@ -36,27 +36,29 @@ import Agora.Proposal ( pwinner, ) import Agora.Proposal.Time (validateProposalStartingTime) +import Agora.SafeMoney (AuthorityTokenTag, GovernorSTTag, ProposalSTTag, StakeSTTag) import Agora.Stake ( pnumCreatedProposals, presolveStakeInputDatum, ) -import Plutarch.Api.V1 (PCurrencySymbol) +import Agora.Utils (ptaggedSymbolValueOf, ptoScottEncodingT, puntag) +import Data.Function (on) +import Plutarch.Api.V1 (PCurrencySymbol, PValidatorHash) import Plutarch.Api.V1.AssocMap (plookup) import Plutarch.Api.V1.AssocMap qualified as AssocMap import Plutarch.Api.V2 ( - PAddress, PMintingPolicy, PScriptPurpose (PMinting, PSpending), PTxOut, PTxOutRef, PValidator, ) -import Plutarch.Extra.AssetClass (PAssetClassData, passetClass, ptoScottEncoding) +import Plutarch.Extra.AssetClass (PAssetClassData, passetClass) import Plutarch.Extra.Field (pletAll, pletAllC) import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust, plistEqualsBy, pmapMaybe) import "liqwid-plutarch-extra" Plutarch.Extra.Map (pkeys, ptryLookup) -import Plutarch.Extra.Maybe (passertPJust, pjust, pmaybe, pmaybeData, pnothing) -import Plutarch.Extra.Ord (psort) +import Plutarch.Extra.Maybe (passertPJust, pfromJust, pjust, pmaybeData, pnothing) +import Plutarch.Extra.Ord (POrdering (..), pcompareBy, pfromOrd, psort) import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=)) import Plutarch.Extra.ScriptContext ( pfindTxInByTxOutRef, @@ -65,8 +67,10 @@ import Plutarch.Extra.ScriptContext ( pscriptHashToTokenName, ptryFromDatumHash, ptryFromOutputDatum, + pvalidatorHashFromAddress, pvalueSpent, ) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( pguardC, pletC, @@ -260,15 +264,15 @@ governorPolicy = governorValidator :: -- | Lazy precompiled scripts. ClosedTerm - ( PAddress - :--> PAssetClassData - :--> PCurrencySymbol - :--> PCurrencySymbol - :--> PCurrencySymbol + ( PValidatorHash + :--> PTagged StakeSTTag PAssetClassData + :--> PTagged GovernorSTTag PCurrencySymbol + :--> PTagged ProposalSTTag PCurrencySymbol + :--> PTagged AuthorityTokenTag PCurrencySymbol :--> PValidator ) governorValidator = - plam $ \proposalValidatorAddress sstClass gstSymbol pstSymbol atSymbol datum redeemer ctx -> unTermCont $ do + plam $ \proposalValidatorHash sstClass gstSymbol pstSymbol atSymbol datum redeemer ctx -> unTermCont $ do ctxF <- pletAllC ctx txInfo <- pletC $ pfromData ctxF.txInfo txInfoF <- @@ -313,9 +317,11 @@ governorValidator = foldl1 (#&&) [ ptraceIfFalse "Own by governor validator" $ - outputF.address #== governorInputF.address + ((#==) `on` (pvalidatorHashFromAddress #)) + outputF.address + governorInputF.address , ptraceIfFalse "Has governor ST" $ - psymbolValueOf # gstSymbol # outputF.value #== 1 + ptaggedSymbolValueOf # gstSymbol # outputF.value #== 1 ] datum = @@ -332,15 +338,17 @@ governorValidator = ---------------------------------------------------------------------------- + pstClass <- pletC $ passetClass # pto pstSymbol # pconstant "" + getProposalDatum :: Term _ (PTxOut :--> PMaybe PProposalDatum) <- pletC $ plam $ flip (pletFields @'["value", "datum", "address"]) $ \txOutF -> let isProposalUTxO = - txOutF.address - #== pdata proposalValidatorAddress - #&& psymbolValueOf - # pstSymbol + (pfromJust #$ pvalidatorHashFromAddress # pfromData txOutF.address) + #== proposalValidatorHash + #&& passetClassValueOf + # pstClass # txOutF.value #== 1 @@ -375,8 +383,8 @@ governorValidator = .= governorInputDatumF.proposalTimings .& #createProposalTimeRangeMaxWidth .= governorInputDatumF.createProposalTimeRangeMaxWidth - .& #maximumProposalsPerStake - .= governorInputDatumF.maximumProposalsPerStake + .& #maximumCreatedProposalsPerStake + .= governorInputDatumF.maximumCreatedProposalsPerStake ) pguardC "Only next proposal id gets advanced" $ @@ -385,16 +393,7 @@ governorValidator = -- Check that exactly one proposal token is being minted. pguardC "Exactly one proposal token must be minted" $ - let vMap = pfromData $ pto txInfoF.mint - tnMap = plookup # pstSymbol # vMap - -- Ada and PST - onlyPST = plength # pto vMap #== 2 - onePST = - pmaybe - # pconstant False - # plam (#== AssocMap.psingleton # pconstant "" # 1) - # tnMap - in onlyPST #&& onePST + passetClassValueOf # pstClass # txInfoF.mint #== 1 -- Check that a stake is spent to create the propsal, -- and the value it contains meets the requirement. @@ -404,7 +403,7 @@ governorValidator = # "Stake input should present" #$ pfindJust # ( presolveStakeInputDatum - # (ptoScottEncoding # sstClass) + # (ptoScottEncodingT # sstClass) # txInfoF.datums ) # pfromData txInfoF.inputs @@ -414,7 +413,7 @@ governorValidator = pguardC "Proposals created by the stake must not exceed the limit" $ pnumCreatedProposals # stakeInputDatumF.lockedBy - #< governorInputDatumF.maximumProposalsPerStake + #< governorInputDatumF.maximumCreatedProposalsPerStake let gtThreshold = pfromData $ @@ -422,7 +421,7 @@ governorValidator = # governorInputDatumF.proposalThresholds pguardC "Require minimum amount of GTs" $ - gtThreshold #< stakeInputDatumF.stakedAmount + gtThreshold #<= stakeInputDatumF.stakedAmount -- Check that the newly minted PST is sent to the proposal validator, -- and the datum it carries is legal. @@ -475,7 +474,7 @@ governorValidator = -- Filter out proposal inputs and ouputs using PST and the address of proposal validator. pguardC "The governor can only process one proposal at a time" $ - (psymbolValueOf # pstSymbol #$ pvalueSpent # txInfoF.inputs) #== 1 + (ptaggedSymbolValueOf # pstSymbol #$ pvalueSpent # txInfoF.inputs) #== 1 let proposalInputDatum = passertPJust @@ -507,14 +506,13 @@ governorValidator = ( \output -> unTermCont $ do outputF <- pletFieldsC @'["address", "datum", "value"] output - let isAuthorityUTxO = - psymbolValueOf + let atAmount = + ptaggedSymbolValueOf # atSymbol # outputF.value - #== 1 handleAuthorityUTxO = - unTermCont $ do + do receiverScriptHash <- pletC $ passertPJust @@ -535,7 +533,7 @@ governorValidator = # pconstant "" # plam (pscriptHashToTokenName . pfromData) # effect.scriptHash - gatAssetClass = passetClass # atSymbol # tagToken + gatAssetClass = passetClass # puntag atSymbol # tagToken valueGATCorrect = passetClassValueOf # gatAssetClass @@ -553,13 +551,21 @@ governorValidator = , ptraceIfFalse "Value correctly encodes Auth Check script" valueGATCorrect ] - pure receiverScriptHash + pure $ pjust # receiverScriptHash - pure $ - pif - isAuthorityUTxO - (pjust # handleAuthorityUTxO) - pnothing + pmatchC + ( pcompareBy + # pfromOrd + # atAmount + # 1 + ) + >>= \case + -- atAmount == 1 + PEQ -> handleAuthorityUTxO + -- atAmount < 1 + PLT -> pure pnothing + -- atAmount > 1 + PGT -> pure $ ptraceError "More than one GAT in one UTxO" ) -- The sorted hashes of all the GAT receivers. diff --git a/agora/Agora/Linker.hs b/agora/Agora/Linker.hs index 956dfe1..e4d7bf1 100644 --- a/agora/Agora/Linker.hs +++ b/agora/Agora/Linker.hs @@ -3,14 +3,14 @@ module Agora.Linker (linker, AgoraScriptInfo (..)) where import Agora.Governor (Governor (gstOutRef, gtClassRef, maximumCosigners)) -import Agora.Utils (validatorHashToAddress) +import Agora.SafeMoney (AuthorityTokenTag, GTTag, GovernorSTTag, ProposalSTTag, StakeSTTag) import Data.Aeson qualified as Aeson import Data.Map (fromList) -import Data.Tagged (untag) +import Data.Tagged (Tagged (Tagged)) import Plutarch.Api.V2 (mintingPolicySymbol, validatorHash) import Plutarch.Extra.AssetClass (AssetClass (AssetClass)) import Plutarch.Extra.ScriptContext (validatorHashToTokenName) -import PlutusLedgerApi.V1 (Address, CurrencySymbol, TxOutRef, ValidatorHash) +import PlutusLedgerApi.V1 (CurrencySymbol, TxOutRef, ValidatorHash) import Ply ( ScriptRole (MintingPolicyRole, ValidatorRole), toMintingPolicy, @@ -31,10 +31,10 @@ import Prelude hiding ((#)) @since 1.0.0 -} data AgoraScriptInfo = AgoraScriptInfo - { governorAssetClass :: AssetClass - , authorityTokenSymbol :: CurrencySymbol - , proposalAssetClass :: AssetClass - , stakeAssetClass :: AssetClass + { governorAssetClass :: Tagged GovernorSTTag AssetClass + , authorityTokenSymbol :: Tagged AuthorityTokenTag CurrencySymbol + , proposalAssetClass :: Tagged ProposalSTTag AssetClass + , stakeAssetClass :: Tagged StakeSTTag AssetClass , governor :: Governor } deriving stock (Generic, Show) @@ -46,28 +46,86 @@ data AgoraScriptInfo = AgoraScriptInfo -} linker :: Linker Governor (ScriptExport AgoraScriptInfo) linker = do - govPol <- fetchTS @MintingPolicyRole @'[TxOutRef] "agora:governorPolicy" - govVal <- fetchTS @ValidatorRole @'[Address, AssetClass, CurrencySymbol, CurrencySymbol, CurrencySymbol] "agora:governorValidator" - stkPol <- fetchTS @MintingPolicyRole @'[AssetClass] "agora:stakePolicy" - stkVal <- fetchTS @ValidatorRole @'[CurrencySymbol, AssetClass, AssetClass] "agora:stakeValidator" - prpPol <- fetchTS @MintingPolicyRole @'[AssetClass] "agora:proposalPolicy" - prpVal <- fetchTS @ValidatorRole @'[AssetClass, CurrencySymbol, CurrencySymbol, Integer] "agora:proposalValidator" - treVal <- fetchTS @ValidatorRole @'[CurrencySymbol] "agora:treasuryValidator" - atkPol <- fetchTS @MintingPolicyRole @'[AssetClass] "agora:authorityTokenPolicy" - noOpVal <- fetchTS @ValidatorRole @'[CurrencySymbol] "agora:noOpValidator" - treaWithdrawalVal <- fetchTS @ValidatorRole @'[CurrencySymbol] "agora:treasuryWithdrawalValidator" - mutateGovVal <- fetchTS @ValidatorRole @'[ValidatorHash, CurrencySymbol, CurrencySymbol] "agora:mutateGovernorValidator" + govPol <- + fetchTS + @MintingPolicyRole + @'[TxOutRef] + "agora:governorPolicy" + govVal <- + fetchTS + @ValidatorRole + @'[ ValidatorHash + , Tagged StakeSTTag AssetClass + , Tagged GovernorSTTag CurrencySymbol + , Tagged ProposalSTTag CurrencySymbol + , Tagged AuthorityTokenTag CurrencySymbol + ] + "agora:governorValidator" + stkPol <- + fetchTS + @MintingPolicyRole + @'[Tagged GTTag AssetClass] + "agora:stakePolicy" + stkVal <- + fetchTS + @ValidatorRole + @'[ Tagged StakeSTTag CurrencySymbol + , Tagged ProposalSTTag AssetClass + , Tagged GTTag AssetClass + ] + "agora:stakeValidator" + prpPol <- + fetchTS @MintingPolicyRole + @'[Tagged GovernorSTTag AssetClass] + "agora:proposalPolicy" + prpVal <- + fetchTS + @ValidatorRole + @'[ Tagged StakeSTTag AssetClass + , Tagged GovernorSTTag CurrencySymbol + , Tagged ProposalSTTag CurrencySymbol + , Integer + ] + "agora:proposalValidator" + treVal <- + fetchTS + @ValidatorRole + @'[Tagged AuthorityTokenTag CurrencySymbol] + "agora:treasuryValidator" + atkPol <- + fetchTS + @MintingPolicyRole + @'[Tagged GovernorSTTag AssetClass] + "agora:authorityTokenPolicy" + noOpVal <- + fetchTS + @ValidatorRole + @'[Tagged AuthorityTokenTag CurrencySymbol] + "agora:noOpValidator" + treaWithdrawalVal <- + fetchTS + @ValidatorRole + @'[Tagged AuthorityTokenTag CurrencySymbol] + "agora:treasuryWithdrawalValidator" + mutateGovVal <- + fetchTS + @ValidatorRole + @'[ ValidatorHash + , Tagged GovernorSTTag CurrencySymbol + , Tagged AuthorityTokenTag CurrencySymbol + ] + "agora:mutateGovernorValidator" governor <- getParam let govPol' = govPol # governor.gstOutRef govVal' = govVal - # propValAddress - # sstAssetClass - # gstSymbol - # pstSymbol - # atSymbol + # propValHash + # Tagged sstAssetClass + # Tagged gstSymbol + # Tagged pstSymbol + # Tagged atSymbol gstSymbol = mintingPolicySymbol $ toMintingPolicy @@ -76,34 +134,40 @@ linker = do AssetClass gstSymbol "" govValHash = validatorHash $ toValidator govVal' - at = gstAssetClass - atPol' = atkPol # at + atPol' = atkPol # Tagged gstAssetClass atSymbol = mintingPolicySymbol $ toMintingPolicy atPol' - propPol' = prpPol # gstAssetClass + propPol' = prpPol # Tagged gstAssetClass propVal' = prpVal - # sstAssetClass - # gstSymbol - # pstSymbol + # Tagged sstAssetClass + # Tagged gstSymbol + # Tagged pstSymbol # governor.maximumCosigners - propValAddress = - validatorHashToAddress $ validatorHash $ toValidator propVal' + propValHash = validatorHash $ toValidator propVal' pstSymbol = mintingPolicySymbol $ toMintingPolicy propPol' pstAssetClass = AssetClass pstSymbol "" - stakPol' = stkPol # untag governor.gtClassRef - stakVal' = stkVal # sstSymbol # pstAssetClass # untag governor.gtClassRef + stakPol' = stkPol # governor.gtClassRef + stakVal' = + stkVal + # Tagged sstSymbol + # Tagged pstAssetClass + # governor.gtClassRef sstSymbol = mintingPolicySymbol $ toMintingPolicy stakPol' stakValTokenName = validatorHashToTokenName $ validatorHash $ toValidator stakVal' sstAssetClass = AssetClass sstSymbol stakValTokenName - treaVal' = treVal # atSymbol + treaVal' = treVal # Tagged atSymbol - noOpVal' = noOpVal # atSymbol - treaWithdrawalVal' = treaWithdrawalVal # atSymbol - mutateGovVal' = mutateGovVal # govValHash # gstSymbol # atSymbol + noOpVal' = noOpVal # Tagged atSymbol + treaWithdrawalVal' = treaWithdrawalVal # Tagged atSymbol + mutateGovVal' = + mutateGovVal + # govValHash + # Tagged gstSymbol + # Tagged atSymbol return $ ScriptExport @@ -123,10 +187,10 @@ linker = do ] , information = AgoraScriptInfo - { governorAssetClass = gstAssetClass - , authorityTokenSymbol = atSymbol - , proposalAssetClass = pstAssetClass - , stakeAssetClass = sstAssetClass + { governorAssetClass = Tagged gstAssetClass + , authorityTokenSymbol = Tagged atSymbol + , proposalAssetClass = Tagged pstAssetClass + , stakeAssetClass = Tagged sstAssetClass , governor = governor } } diff --git a/agora/Agora/Plutarch/Orphans.hs b/agora/Agora/Plutarch/Orphans.hs index bf706d7..6cb102e 100644 --- a/agora/Agora/Plutarch/Orphans.hs +++ b/agora/Agora/Plutarch/Orphans.hs @@ -6,10 +6,14 @@ import Plutarch.Lift (PConstantDecl (..), PUnsafeLiftDecl (PLifted)) import Data.Bifunctor (Bifunctor (bimap)) import Data.Map.Strict qualified as StrictMap +import Data.Tagged (Tagged (Tagged)) import Data.Traversable (for) import Plutarch.Api.V1 (KeyGuarantees (Sorted), PMap) +import Plutarch.Extra.Tagged (PTagged) import PlutusTx qualified import PlutusTx.AssocMap qualified as AssocMap +import Ply (PlyArg) +import Ply.Plutarch.Class (PlyArgOf) -- | @since 1.0.0 instance @@ -74,3 +78,9 @@ instance isSorted [] = True isSorted [_] = True isSorted (x : y : xs) = x < y && isSorted (y : xs) + +-- | @since 1.0.0 +type instance PlyArgOf (PTagged tag a) = Tagged tag (PlyArgOf a) + +-- | @since 1.0.0 +deriving newtype instance PlyArg a => PlyArg (Tagged tag a) diff --git a/agora/Agora/Proposal.hs b/agora/Agora/Proposal.hs index 19a86e8..b84f549 100644 --- a/agora/Agora/Proposal.hs +++ b/agora/Agora/Proposal.hs @@ -162,7 +162,7 @@ newtype ResultTag = ResultTag {getResultTag :: Integer} data ProposalStatus = -- | A draft proposal represents a proposal that has yet to be realized. -- - -- In effect, this means one which didn't have enough LQ to be a full + -- In effect, this means one which didn't have enough GT to be a full -- proposal, and needs cosigners to enable that to happen. This is -- similar to a "temperature check", but only useful if multiple people -- want to pool governance tokens together. If the proposal doesn't get to diff --git a/agora/Agora/Proposal/Scripts.hs b/agora/Agora/Proposal/Scripts.hs index 3cc3f0a..b9e0625 100644 --- a/agora/Agora/Proposal/Scripts.hs +++ b/agora/Agora/Proposal/Scripts.hs @@ -10,7 +10,7 @@ module Agora.Proposal.Scripts ( proposalPolicy, ) where -import Agora.Governor (PGovernorRedeemer (PCreateProposal)) +import Agora.Governor (PGovernorRedeemer (PCreateProposal), presolveGovernorRedeemer) import Agora.Proposal ( PProposalDatum (PProposalDatum), PProposalRedeemer (PAdvanceProposal, PCosign, PUnlockStake, PVote), @@ -27,6 +27,7 @@ import Agora.Proposal.Time ( pgetRelation, pisWithin, ) +import Agora.SafeMoney (GovernorSTTag, ProposalSTTag, StakeSTTag) import Agora.Stake ( PStakeDatum, pextractVoteOption, @@ -35,6 +36,8 @@ import Agora.Stake ( pisVoter, presolveStakeInputDatum, ) +import Agora.Utils (ptaggedSymbolValueOf, ptoScottEncodingT) +import Data.Function (on) import Plutarch.Api.V1 (PCredential, PCurrencySymbol) import Plutarch.Api.V1.AssocMap (plookup) import Plutarch.Api.V2 ( @@ -45,7 +48,6 @@ import Plutarch.Api.V2 ( ) import Plutarch.Extra.AssetClass ( PAssetClassData, - ptoScottEncoding, ) import Plutarch.Extra.Category (PCategory (pidentity)) import Plutarch.Extra.Field (pletAll, pletAllC) @@ -69,9 +71,10 @@ import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=)) import Plutarch.Extra.ScriptContext ( pfindTxInByTxOutRef, ptryFromOutputDatum, - ptryFromRedeemer, + pvalidatorHashFromAddress, ) import Plutarch.Extra.Sum (PSum (PSum)) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( pguardC, pletC, @@ -80,7 +83,7 @@ import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( ptryFromC, ) import Plutarch.Extra.Traversable (pfoldMap) -import Plutarch.Extra.Value (passetClassValueOf, psymbolValueOf) +import Plutarch.Extra.Value (psymbolValueOf') import Plutarch.Unsafe (punsafeCoerce) {- | Policy for Proposals. @@ -108,7 +111,7 @@ import Plutarch.Unsafe (punsafeCoerce) @since 1.0.0 -} -proposalPolicy :: ClosedTerm (PAssetClassData :--> PMintingPolicy) +proposalPolicy :: ClosedTerm (PTagged GovernorSTTag PAssetClassData :--> PMintingPolicy) proposalPolicy = plam $ \gstAssetClass _redeemer ctx -> unTermCont $ do ctxF <- pletAllC ctx @@ -116,44 +119,25 @@ proposalPolicy = PMinting ((pfield @"_0" #) -> ownSymbol) <- pmatchC $ pfromData ctxF.purpose - let mintedProposalST = - psymbolValueOf + pguardC "Minted exactly one proposal ST" + $ pmatch + ( pfromJust + #$ psymbolValueOf' # ownSymbol # txInfoF.mint + ) + $ \(PPair minted burnt) -> + minted + #== 1 + #&& ptraceIfFalse "Burning a proposal is not supported" (burnt #== 0) - pguardC "Minted exactly one proposal ST" $ - mintedProposalST #== 1 - - let governorInputRef = + let governorRedeemer = passertPJust # "GST should move" - #$ pfindJust - # plam - ( flip pletAll $ \inputF -> - let value = pfield @"value" # inputF.resolved - isGovernorInput = - passetClassValueOf - # (ptoScottEncoding # gstAssetClass) - # value - #== 1 - in pif - isGovernorInput - (pjust # inputF.outRef) - pnothing - ) + #$ presolveGovernorRedeemer + # (ptoScottEncodingT # gstAssetClass) # pfromData txInfoF.inputs - - governorScriptPurpose = - mkRecordConstr - PSpending - (#_0 .= governorInputRef) - - governorRedeemer = - pfromData $ - pfromJust - #$ ptryFromRedeemer @(PAsData PGovernorRedeemer) - # governorScriptPurpose - # txInfoF.redeemers + # txInfoF.redeemers pguardC "Govenor redeemer correct" $ pcon PCreateProposal #== governorRedeemer @@ -238,9 +222,9 @@ instance DerivePlutusType PStakeInputsContext where -} proposalValidator :: ClosedTerm - ( PAssetClassData - :--> PCurrencySymbol - :--> PCurrencySymbol + ( PTagged StakeSTTag PAssetClassData + :--> PTagged GovernorSTTag PCurrencySymbol + :--> PTagged ProposalSTTag PCurrencySymbol :--> PInteger :--> PValidator ) @@ -299,9 +283,11 @@ proposalValidator = foldl1 (#&&) [ ptraceIfFalse "Own by proposal validator" $ - outputF.address #== proposalInputF.address + ((#==) `on` (pvalidatorHashFromAddress #)) + outputF.address + proposalInputF.address , ptraceIfFalse "Has proposal ST" $ - psymbolValueOf # pstSymbol # outputF.value #== 1 + ptaggedSymbolValueOf # pstSymbol # outputF.value #== 1 ] handleProposalUTxO = @@ -341,18 +327,23 @@ proposalValidator = resolveStakeInputDatum <- pletC $ presolveStakeInputDatum - # (ptoScottEncoding # sstClass) + # (ptoScottEncodingT # sstClass) # txInfoF.datums + spendStakes' :: Term _ ((PStakeInputsContext :--> PUnit) :--> PUnit) <- pletC $ - plam $ - let stakeInputs = - pmapMaybe @PList - # resolveStakeInputDatum - # pfromData txInfoF.inputs + plam $ \val -> unTermCont $ do + stakeInputs <- + pletC $ + pmapMaybe @PList + # resolveStakeInputDatum + # pfromData txInfoF.inputs - ctx = pcon $ PStakeInputsContext stakeInputs - in (# ctx) + pguardC "Stake inputs not null" $ + pnot #$ pnull # stakeInputs + + let ctx = pcon $ PStakeInputsContext stakeInputs + pure $ val # ctx let spendStakes :: ( PStakeInputsContext _ -> @@ -562,40 +553,41 @@ proposalValidator = PUnlockStake _ -> spendStakes $ \sctxF -> do let expectedVotes = - pfoldl - # plam - ( \votes stake -> unTermCont $ do - stakeF <- - pletFieldsC - @'["stakedAmount", "lockedBy"] - stake + pdata $ + pfoldl + # plam + ( \votes stake -> unTermCont $ do + stakeF <- + pletFieldsC + @'["stakedAmount", "lockedBy"] + stake - stakeRoles <- - pletC $ - pgetStakeRoles - # proposalInputDatumF.proposalId - # stakeF.lockedBy + stakeRoles <- + pletC $ + pgetStakeRoles + # proposalInputDatumF.proposalId + # stakeF.lockedBy - pguardC "Stake input should be relevant" $ - pnot #$ pisIrrelevant # stakeRoles + pguardC "Stake input should be relevant" $ + pnot #$ pisIrrelevant # stakeRoles - let canRetractVotes = - pisVoter # stakeRoles + let canRetractVotes = + pisVoter # stakeRoles - voteCount = - pto $ - pfromData stakeF.stakedAmount + voteCount = + pto $ + pfromData stakeF.stakedAmount - newVotes = - pretractVotes - # (pextractVoteOption # stakeRoles) - # voteCount - # votes + newVotes = + pretractVotes + # (pextractVoteOption # stakeRoles) + # voteCount + # votes - pure $ pif canRetractVotes newVotes votes - ) - # proposalInputDatumF.votes - # sctxF.inputStakes + pure $ pif canRetractVotes newVotes votes + ) + # proposalInputDatumF.votes + # sctxF.inputStakes inVotingPeriod = pisWithin # getTimingRelation PVotingPeriod @@ -624,14 +616,19 @@ proposalValidator = .& #thresholds .= proposalInputDatumF.thresholds .& #votes - .= pdata expectedVotes + .= expectedVotes .& #timingConfig .= proposalInputDatumF.timingConfig .& #startingTime .= proposalInputDatumF.startingTime ) - in ptraceIfFalse "Update votes" $ - expectedProposalOut #== proposalOutputDatum + in foldl1 + (#&&) + [ ptraceIfFalse "Votes changed" $ + pnot #$ expectedVotes #== proposalInputDatumF.votes + , ptraceIfFalse "Proposal update correct" $ + expectedProposalOut #== proposalOutputDatum + ] ) -- No change to the proposal is allowed. ( ptraceIfFalse "Proposal unchanged" $ @@ -727,7 +724,7 @@ proposalValidator = . (pfield @"resolved" #) -> value ) -> - psymbolValueOf # gstSymbol # value #== 1 + ptaggedSymbolValueOf # gstSymbol # value #== 1 ) # pfromData txInfoF.inputs diff --git a/agora/Agora/Stake.hs b/agora/Agora/Stake.hs index f35e4d5..19c232a 100644 --- a/agora/Agora/Stake.hs +++ b/agora/Agora/Stake.hs @@ -49,7 +49,7 @@ import Agora.Proposal ( ProposalId, ResultTag, ) -import Agora.SafeMoney (GTTag) +import Agora.SafeMoney (GTTag, StakeSTTag) import Data.Tagged (Tagged) import Generics.SOP qualified as SOP import Plutarch.Api.V1 (PCredential) @@ -79,9 +79,8 @@ import Plutarch.Extra.ScriptContext (ptryFromOutputDatum) import Plutarch.Extra.Sum (PSum (PSum)) import Plutarch.Extra.Tagged (PTagged) import Plutarch.Extra.Traversable (pfoldMap) -import Plutarch.Extra.Value (passetClassValueOf) +import Plutarch.Extra.Value (passetClassValueOfT) import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted)) -import Plutarch.Orphans () import PlutusLedgerApi.V2 (Credential) import PlutusTx qualified @@ -160,7 +159,7 @@ data StakeRedeemer = -- | Deposit or withdraw a discrete amount of the staked governance token. -- Stake must be unlocked. DepositWithdraw (Tagged GTTag Integer) - | -- | Destroy a stake, retrieving its LQ, the minimum ADA and any other assets. + | -- | Destroy a stake, retrieving its GT, the minimum ADA and any other assets. -- Stake must be unlocked. Destroy | -- | Permit a Vote to be added onto a 'Agora.Proposal.Proposal'. @@ -291,7 +290,7 @@ instance PTryFrom PData (PAsData PStakeDatum) data PStakeRedeemer (s :: S) = -- | Deposit or withdraw a discrete amount of the staked governance token. PDepositWithdraw (Term s (PDataRecord '["delta" ':= PTagged GTTag PInteger])) - | -- | Destroy a stake, retrieving its LQ, the minimum ADA and any other assets. + | -- | Destroy a stake, retrieving its GT, the minimum ADA and any other assets. PDestroy (Term s (PDataRecord '[])) | PPermitVote (Term s (PDataRecord '[])) | PRetractVotes (Term s (PDataRecord '[])) @@ -715,7 +714,7 @@ presolveStakeInputDatum :: forall (s :: S). Term s - ( PAssetClass + ( PTagged StakeSTTag PAssetClass :--> PMap 'Unsorted PDatumHash PDatum :--> PTxInInfo :--> PMaybe PStakeDatum @@ -726,7 +725,7 @@ presolveStakeInputDatum = phoistAcyclic $ (pletFields @'["value", "datum", "address"]) ( \txOutF -> let isStakeUTxO = - passetClassValueOf + passetClassValueOfT # sstClass # txOutF.value #== 1 diff --git a/agora/Agora/Stake/Redeemers.hs b/agora/Agora/Stake/Redeemers.hs index 40f9b11..c0445f5 100644 --- a/agora/Agora/Stake/Redeemers.hs +++ b/agora/Agora/Stake/Redeemers.hs @@ -50,6 +50,7 @@ import Agora.Stake ( ) import Plutarch.Api.V1.Address (PCredential) import Plutarch.Api.V2 (PMaybeData) +import Plutarch.Extra.Bool (passert) import Plutarch.Extra.Field (pletAll, pletAllC) import "liqwid-plutarch-extra" Plutarch.Extra.List (pisSingleton, ptryDeleteFirstBy, ptryFromSingleton) import Plutarch.Extra.Maybe (pdjust, pdnothing, pmaybeData) @@ -159,17 +160,13 @@ pvoteHelper :: :--> PStakeRedeemerHandler ) pvoteHelper = phoistAcyclic $ - plam $ \valProposalCtx ctx -> unTermCont $ do - pguardC "Owner or delegate signs this transaction" $ - pisSignedBy # pconstant True # ctx - + plam $ \valProposalCtx ctx -> -- This puts trust into the Proposal. The Proposal must necessarily check -- that this is not abused. - - pguardC "Correct outputs" $ - ponlyLocksUpdated # (valProposalCtx # ctx) # ctx - - pure $ pconstant () + passert + "Correct outputs" + (ponlyLocksUpdated # (valProposalCtx # ctx) # ctx) + (pconstant ()) -- | Add new lock the the existing list of locked. paddNewLock :: @@ -199,19 +196,25 @@ ppermitVote = pvoteHelper #$ phoistAcyclic $ pguardC "Only one stake input allowed" $ pisSingleton # ctxF.stakeInputDatums + pguardC "Owner signs this transaction" $ + pisSignedBy # pconstant False # ctx + pure lock pure $ paddNewLock #$ pmatch ctxF.proposalContext $ \case PSpendProposal pid _ r -> pmatch r $ \case PVote ((pfromData . (pfield @"resultTag" #)) -> voteFor) -> - mkRecordConstr - PVoted - ( #votedOn - .= pdata pid - .& #votedFor - .= pdata voteFor - ) + passert + "Owner or delegatee signs the transaction" + (pisSignedBy # pconstant True # ctx) + $ mkRecordConstr + PVoted + ( #votedOn + .= pdata pid + .& #votedFor + .= pdata voteFor + ) PCosign _ -> withOnlyOneStakeInput #$ mkRecordConstr @@ -269,8 +272,8 @@ premoveLocks = phoistAcyclic $ -} pretractVote :: forall (s :: S). Term s PStakeRedeemerHandler pretractVote = pvoteHelper #$ phoistAcyclic $ - plam $ - flip pmatch $ \ctxF -> + plam $ \ctx -> + pmatch ctx $ \ctxF -> pmatch ctxF.proposalContext $ \case PSpendProposal pid s r -> pmatch r $ \case PUnlockStake _ -> @@ -279,7 +282,11 @@ pretractVote = pvoteHelper #$ phoistAcyclic $ (s #== pconstant Finished) (pcon PRemoveAllLocks) (pcon PRemoveVoterLockOnly) - in premoveLocks # pid # mode + authorized = pisSignedBy # pconstant True # ctx + in passert + "Authorized by owner or delegatee" + authorized + $ premoveLocks # pid # mode _ -> ptraceError "Expected unlock" _ -> ptraceError "Expected spending proposal" diff --git a/agora/Agora/Stake/Scripts.hs b/agora/Agora/Stake/Scripts.hs index bb25b29..24d407d 100644 --- a/agora/Agora/Stake/Scripts.hs +++ b/agora/Agora/Stake/Scripts.hs @@ -13,6 +13,7 @@ module Agora.Stake.Scripts ( import Agora.Credential (authorizationContext, pauthorizedBy) import Agora.Proposal (PProposalDatum, PProposalRedeemer) +import Agora.SafeMoney (GTTag, ProposalSTTag, StakeSTTag) import Agora.Stake ( PProposalContext ( PNewProposal, @@ -52,7 +53,7 @@ import Agora.Stake.Redeemers ( ppermitVote, pretractVote, ) -import Agora.Utils (pisDNothing) +import Agora.Utils (pisDNothing, ptoScottEncodingT, puntag) import Plutarch.Api.V1 ( PCredential (PPubKeyCredential, PScriptCredential), PCurrencySymbol, @@ -71,7 +72,6 @@ import Plutarch.Extra.AssetClass ( PAssetClass, PAssetClassData, passetClass, - ptoScottEncoding, ) import Plutarch.Extra.Bool (passert) import Plutarch.Extra.Field (pletAll, pletAllC) @@ -79,6 +79,7 @@ import Plutarch.Extra.Functor (PFunctor (pfmap)) import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust, pmapMaybe) import Plutarch.Extra.Maybe ( passertPJust, + pdjust, pfromJust, pfromMaybe, pjust, @@ -89,9 +90,11 @@ import Plutarch.Extra.Ord (POrdering (PEQ, PGT, PLT), pcompareBy, pfromOrd) import Plutarch.Extra.ScriptContext ( pfindTxInByTxOutRef, ptryFromOutputDatum, + pvalidatorHashFromAddress, pvalidatorHashToTokenName, pvalueSpent, ) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( pguardC, pletC, @@ -101,6 +104,7 @@ import "liqwid-plutarch-extra" Plutarch.Extra.TermCont ( ) import Plutarch.Extra.Value ( passetClassValueOf, + passetClassValueOfT, psymbolValueOf, psymbolValueOf', ) @@ -128,15 +132,14 @@ import Prelude hiding (Num ((+))) == Arguments Following arguments should be provided(in this order): - 1. governor ST assetclass + 1. governance token assetclass @since 1.0.0 -} stakePolicy :: - -- | The (governance) token that a Stake can store. - ClosedTerm (PAssetClassData :--> PMintingPolicy) + ClosedTerm (PTagged GTTag PAssetClassData :--> PMintingPolicy) stakePolicy = - plam $ \gstClass _redeemer ctx' -> unTermCont $ do + plam $ \gtClass _redeemer ctx' -> unTermCont $ do ctx <- pletFieldsC @'["txInfo", "purpose"] ctx' txInfo <- pletC $ ctx.txInfo let _a :: Term _ PTxInfo @@ -202,10 +205,10 @@ stakePolicy = foldl1 (#&&) [ ptraceIfFalse "Stake ouput has expected amount of stake token" $ - passetClassValueOf - # (ptoScottEncoding # gstClass) + passetClassValueOfT + # (ptoScottEncodingT # gtClass) # outputF.value - #== pto (pfromData datumF.stakedAmount) + #== pfromData datumF.stakedAmount , ptraceIfFalse "Stake Owner should sign the transaction" $ pauthorizedBy # authorizationContext txInfoF @@ -229,17 +232,17 @@ stakePolicy = Following arguments should be provided(in this order): 1. stake ST symbol 2. proposal ST assetclass - 3. governor ST assetclass + 3. governance token assetclass @since 1.0.0 -} mkStakeValidator :: StakeRedeemerImpl s -> - Term s PCurrencySymbol -> - Term s PAssetClass -> - Term s PAssetClass -> + Term s (PTagged StakeSTTag PCurrencySymbol) -> + Term s (PTagged ProposalSTTag PAssetClass) -> + Term s (PTagged GTTag PAssetClass) -> Term s PValidator -mkStakeValidator impl sstSymbol pstClass gstClass = +mkStakeValidator impl sstSymbol pstClass gtClass = plam $ \_datum redeemer ctx -> unTermCont $ do ctxF <- pletFieldsC @'["txInfo", "purpose"] ctx txInfo <- pletC $ pfromData ctxF.txInfo @@ -268,19 +271,16 @@ mkStakeValidator impl sstSymbol pstClass gstClass = # (pfield @"_0" # stakeInputRef) # txInfoF.inputs - stakeValidatorCredential <- + stakeValidatorHash <- pletC $ - pfield @"credential" + pfromJust + #$ pvalidatorHashFromAddress #$ pfield @"address" # validatedInput - let sstName = pvalidatorHashToTokenName $ - pmatch stakeValidatorCredential $ - \case - PScriptCredential r -> pfield @"_0" # r - _ -> perror + let sstName = pvalidatorHashToTokenName stakeValidatorHash - sstClass <- pletC $ passetClass # sstSymbol # sstName + sstClass <- pletC $ passetClass # puntag sstSymbol # sstName -------------------------------------------------------------------------- @@ -300,10 +300,13 @@ mkStakeValidator impl sstSymbol pstClass gstClass = PGT -> ptraceError "More than one SST in one UTxO" -- 1 PEQ -> - let ownerCredential = pfield @"credential" # txOutF.address + let ownerValidatoHash = + pfromJust + #$ pvalidatorHashFromAddress + # txOutF.address isOwnedByStakeValidator = - ownerCredential #== stakeValidatorCredential + ownerValidatoHash #== stakeValidatorHash datum = ptrace "Resolve stake datum" $ @@ -340,7 +343,7 @@ mkStakeValidator impl sstSymbol pstClass gstClass = authorizedBy <- pletC $ pauthorizedBy # authorizationContext txInfoF - PPair allHaveSameOwner allHaveSameDelegatee <- + PPair allHaveSameOwner allHaveSameOrOwnedByDelegatee <- pmatchC $ pfoldr # plam @@ -353,11 +356,15 @@ mkStakeValidator impl sstSymbol pstClass gstClass = allHaveSameOwner #&& dF.owner #== firstStakeInputDatumF.owner - allHaveSameDelegatee' = - allHaveSameDelegatee - #&& dF.delegatedTo - #== firstStakeInputDatumF.delegatedTo - in pcon $ PPair allHaveSameOwner' allHaveSameDelegatee' + allHaveSameOrOwnedByDelegatee' = + let delegated = + dF.delegatedTo #== firstStakeInputDatumF.delegatedTo + ownedByDelegatee = + pdata (pdjust # dF.owner) + #== firstStakeInputDatumF.delegatedTo + in allHaveSameDelegatee + #&& (delegated #|| ownedByDelegatee) + in pcon $ PPair allHaveSameOwner' allHaveSameOrOwnedByDelegatee' ) # pcon (PPair (pconstant True) (pconstant True)) # restOfStakeInputDatums @@ -368,7 +375,7 @@ mkStakeValidator impl sstSymbol pstClass gstClass = # firstStakeInputDatumF.owner delegateSignsTransaction = - allHaveSameDelegatee + allHaveSameOrOwnedByDelegatee #&& pmaybeData # pconstant False # plam ((authorizedBy #) . pfromData) @@ -405,13 +412,12 @@ mkStakeValidator impl sstSymbol pstClass gstClass = ( \output -> let validateGT = plam $ \stakeDatum -> let expected = - pto $ - pfromData $ - pfield @"stakedAmount" # stakeDatum + pfromData $ + pfield @"stakedAmount" # stakeDatum actual = - passetClassValueOf - # gstClass + passetClassValueOfT + # gtClass # (pfield @"value" # output) in pif (expected #== actual) @@ -431,10 +437,11 @@ mkStakeValidator impl sstSymbol pstClass gstClass = plam $ flip pletAll $ \txOutF -> let isProposalUTxO = - passetClassValueOf + passetClassValueOfT # pstClass # txOutF.value #== 1 + proposalDatum = pfromData $ ptryFromOutputDatum @(PAsData PProposalDatum) @@ -443,7 +450,7 @@ mkStakeValidator impl sstSymbol pstClass gstClass = in pif isProposalUTxO (pjust # proposalDatum) pnothing let pstMinted = - passetClassValueOf # pstClass # txInfoF.mint #== 1 + passetClassValueOfT # pstClass # txInfoF.mint #== 1 newProposalContext = pcon $ @@ -596,15 +603,15 @@ mkStakeValidator impl sstSymbol pstClass gstClass = Following arguments should be provided(in this order): 1. stake ST symbol 2. proposal ST assetclass - 3. governor ST assetclass + 3. governance token assetclass @since 1.0.0 -} stakeValidator :: ClosedTerm - ( PCurrencySymbol - :--> PAssetClassData - :--> PAssetClassData + ( PTagged StakeSTTag PCurrencySymbol + :--> PTagged ProposalSTTag PAssetClassData + :--> PTagged GTTag PAssetClassData :--> PValidator ) stakeValidator = @@ -620,5 +627,5 @@ stakeValidator = } ) sstSymbol - (ptoScottEncoding # pstClass) - (ptoScottEncoding # gstClass) + (ptoScottEncodingT # pstClass) + (ptoScottEncodingT # gstClass) diff --git a/agora/Agora/Treasury.hs b/agora/Agora/Treasury.hs index 77ac360..a48793e 100644 --- a/agora/Agora/Treasury.hs +++ b/agora/Agora/Treasury.hs @@ -13,8 +13,10 @@ module Agora.Treasury ( ) where import Agora.AuthorityToken (singleAuthorityTokenBurned) +import Agora.SafeMoney (AuthorityTokenTag) import Plutarch.Api.V1.Value (PCurrencySymbol, PValue) import Plutarch.Api.V2 (PScriptPurpose (PSpending), PValidator) +import Plutarch.Extra.Tagged (PTagged) import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletFieldsC, pmatchC) {- | Validator ensuring that transactions consuming the treasury @@ -25,10 +27,10 @@ import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletFieldsC, pm Following arguments should be provided(in this order): 1. authority token symbol - @since 0.1.0 + @since 1.0.0 -} treasuryValidator :: - ClosedTerm (PCurrencySymbol :--> PValidator) + ClosedTerm (PTagged AuthorityTokenTag PCurrencySymbol :--> PValidator) treasuryValidator = plam $ \atSymbol _ _ ctx' -> unTermCont $ do -- plet required fields from script context. ctx <- pletFieldsC @["txInfo", "purpose"] ctx' diff --git a/agora/Agora/Utils.hs b/agora/Agora/Utils.hs index c7504e4..c589ed5 100644 --- a/agora/Agora/Utils.hs +++ b/agora/Agora/Utils.hs @@ -13,11 +13,23 @@ module Agora.Utils ( punwords, pisNothing, pisDNothing, + ptoScottEncodingT, + ptaggedSymbolValueOf, + ptag, + puntag, ) where import Plutarch.Api.V2 ( + AmountGuarantees, + KeyGuarantees, + PCurrencySymbol, PMaybeData (PDNothing), + PValue, ) +import Plutarch.Extra.AssetClass (PAssetClass, PAssetClassData, ptoScottEncoding) +import Plutarch.Extra.Tagged (PTagged) +import Plutarch.Extra.Value (psymbolValueOf) +import Plutarch.Unsafe (punsafeDowncast) import PlutusLedgerApi.V2 ( Address (Address), Credential (ScriptCredential), @@ -67,3 +79,39 @@ pisDNothing = phoistAcyclic $ flip pmatch $ \case PDNothing _ -> pconstant True _ -> pconstant False + +-- | @since 1.0.0 +ptoScottEncodingT :: + forall {k :: Type} (unit :: k) (s :: S). + Term s (PTagged unit PAssetClassData :--> PTagged unit PAssetClass) +ptoScottEncodingT = phoistAcyclic $ + plam $ \d -> + punsafeDowncast $ ptoScottEncoding #$ pto d + +{- | Get the sum of all values belonging to a particular tagged 'CurrencySymbol'. + + @since 1.0.0 +-} +ptaggedSymbolValueOf :: + forall + {k :: Type} + (unit :: k) + (keys :: KeyGuarantees) + (amounts :: AmountGuarantees) + (s :: S). + Term s (PTagged unit PCurrencySymbol :--> (PValue keys amounts :--> PInteger)) +ptaggedSymbolValueOf = phoistAcyclic $ plam $ \tcs -> psymbolValueOf # pto tcs + +-- | @since 1.0.0 +ptag :: + forall {k :: Type} (tag :: k) (a :: PType) (s :: S). + Term s a -> + Term s (PTagged tag a) +ptag = punsafeDowncast + +-- | @since 1.0.0 +puntag :: + forall {k :: Type} (tag :: k) (a :: PType) (s :: S). + Term s (PTagged tag a) -> + Term s a +puntag = pto diff --git a/bench.csv b/bench.csv index d5a67cb..c584075 100644 --- a/bench.csv +++ b/bench.csv @@ -1,485 +1,497 @@ name,cpu,mem,size -Agora/Effects/Treasury Withdrawal Effect/effect/Simple,216997233,586606,3883 -Agora/Effects/Treasury Withdrawal Effect/effect/Simple with multiple treasuries ,308856363,791874,4315 -Agora/Effects/Treasury Withdrawal Effect/effect/Mixed Assets,301297604,790206,4253 -Agora/Effects/Governor Mutation Effect/validator/valid new governor datum/governor validator should pass,124118615,348863,11344 -Agora/Effects/Governor Mutation Effect/validator/valid new governor datum/effect validator should pass,145816056,387807,4684 +Agora/Effects/Treasury Withdrawal Effect/effect/Simple,217066233,586906,3885 +Agora/Effects/Treasury Withdrawal Effect/effect/Simple with multiple treasuries ,308925363,792174,4317 +Agora/Effects/Treasury Withdrawal Effect/effect/Mixed Assets,301366604,790506,4255 +Agora/Effects/Governor Mutation Effect/validator/valid new governor datum/governor validator should pass,127718343,363543,11453 +Agora/Effects/Governor Mutation Effect/validator/valid new governor datum/effect validator should pass,144891797,388749,4705 Agora/Stake/policy/create/valid/stake owner: pub key,77468330,198844,3556 Agora/Stake/policy/create/valid/stake owner: script,90607586,237423,3591 -Agora/Stake/validator/destroy/legal/One stake/stake validator,100078548,269227,7234 +Agora/Stake/validator/destroy/legal/One stake/stake validator,100261620,272735,7340 Agora/Stake/validator/destroy/legal/One stake/stake policy,29665872,85956,3543 -Agora/Stake/validator/destroy/legal/Multiple stake/stake validator,653190180,1566811,10487 +Agora/Stake/validator/destroy/legal/Multiple stake/stake validator,639028701,1563146,10593 Agora/Stake/validator/destroy/legal/Multiple stake/stake policy,292337523,820464,6795 Agora/Stake/validator/destroy/illegal/Destroy locked stakes/stake policy,292337523,820464,6856 Agora/Stake/validator/destroy/illegal/not authorized by owner/stake policy,292337523,820464,6764 Agora/Stake/validator/destroy/illegal/not authorized by owner/stake policy,292337523,820464,6795 -Agora/Stake/validator/stakeDepositWithdraw deposit,142600267,368376,7349 -Agora/Stake/validator/stakeDepositWithdraw withdraw,142600267,368376,7341 -Agora/Stake/validator/set delegate/override existing delegate,174128015,438205,7480 -Agora/Stake/validator/set delegate/remove existing delegate,164793019,414817,7410 -Agora/Stake/validator/set delegate/set delegate to something,171699027,431105,7410 -Agora/Proposal/policy (proposal creation)/legal/proposal,30050955,75784,2649 -Agora/Proposal/policy (proposal creation)/legal/governor,276205614,721548,11842 -Agora/Proposal/policy (proposal creation)/legal/stake,298855773,742208,8177 -Agora/Proposal/policy (proposal creation)/illegal/invalid next proposal id/proposal,30050955,75784,2649 -Agora/Proposal/policy (proposal creation)/illegal/invalid next proposal id/stake,298855773,742208,8177 -Agora/Proposal/policy (proposal creation)/illegal/use other's stake/proposal,30050955,75784,2617 -Agora/Proposal/policy (proposal creation)/illegal/use other's stake/governor,276205614,721548,11811 -Agora/Proposal/policy (proposal creation)/illegal/altered stake/proposal,30050955,75784,2649 -Agora/Proposal/policy (proposal creation)/illegal/invalid stake locks/proposal,30050955,75784,2657 -Agora/Proposal/policy (proposal creation)/illegal/invalid stake locks/governor,276205614,721548,11850 -Agora/Proposal/policy (proposal creation)/illegal/has reached maximum proposals limit/proposal,30050955,75784,2669 -Agora/Proposal/policy (proposal creation)/illegal/has reached maximum proposals limit/stake,311554209,778424,8207 -Agora/Proposal/policy (proposal creation)/illegal/loose time range/proposal,30050955,75784,2649 -Agora/Proposal/policy (proposal creation)/illegal/loose time range/stake,298855773,742208,8177 -Agora/Proposal/policy (proposal creation)/illegal/open time range/proposal,30050955,75784,2645 -Agora/Proposal/policy (proposal creation)/illegal/open time range/stake,298855773,742208,8173 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/VotingReady/proposal,30050955,75784,2649 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/VotingReady/stake,298855773,742208,8177 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/proposal,30050955,75784,2649 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/stake,298855773,742208,8177 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/proposal,30050955,75784,2649 -Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/stake,298855773,742208,8177 -Agora/Proposal/policy (proposal creation)/illegal/fake SST/proposal,30050955,75784,2557 -Agora/Proposal/policy (proposal creation)/illegal/wrong governor redeemer/stake,298855773,742208,8177 -Agora/Proposal/validator/cosignature/legal/proposal,201639831,555552,11850 -Agora/Proposal/validator/cosignature/legal/stake,256076245,660928,7976 -Agora/Proposal/validator/cosignature/illegal/insufficient staked amount/stake,256076245,660928,7976 -Agora/Proposal/validator/cosignature/illegal/proposal locks not updated/proposal,201639831,555552,11844 -Agora/Proposal/validator/cosignature/illegal/duplicate cosigners/stake,262425463,679036,7993 -Agora/Proposal/validator/cosignature/illegal/cosigners not updated/stake,256076245,660928,7942 -Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,256076245,660928,7976 -Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,256076245,660928,7976 -Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,256076245,660928,7976 -Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by owner/proposal,216994178,602728,11687 -Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by owner/stake,270844879,700689,7821 -Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by delegatee/proposal,216994178,602728,11687 -Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by delegatee/stake,277671774,717845,7821 -Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by owner/proposal,323569032,881282,12879 -Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by owner/stake,561081905,1375723,9013 -Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by delegatee/proposal,323569032,881282,12879 -Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by delegatee/stake,567908800,1392879,9013 -Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by owner/proposal,430143886,1159836,14069 -Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by owner/stake,851318931,2050757,10203 -Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by delegatee/proposal,430143886,1159836,14069 -Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by delegatee/stake,858145826,2067913,10203 -Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by owner/proposal,536718740,1438390,15260 -Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by owner/stake,1141555957,2725791,11394 -Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by delegatee/proposal,536718740,1438390,15260 -Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by delegatee/stake,1148382852,2742947,11394 -Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by owner/proposal,643293594,1716944,16451 -Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by owner/stake,1431792983,3400825,12585 -Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by delegatee/proposal,643293594,1716944,16451 -Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by delegatee/stake,1438619878,3417981,12585 -Agora/Proposal/validator/voting/legal/transparent non-GT tokens/proposal,216994178,602728,11687 -Agora/Proposal/validator/voting/legal/transparent non-GT tokens/stake,270844879,700689,7821 -Agora/Proposal/validator/voting/illegal/vote for nonexistent outcome/stake,270844879,700689,7829 -Agora/Proposal/validator/voting/illegal/unauthorized tx/proposal,216994178,602728,11687 -Agora/Proposal/validator/voting/illegal/more than one proposals/stake,270844879,700689,7829 -Agora/Proposal/validator/voting/illegal/locks not added/proposal,430143886,1159836,14039 -Agora/Proposal/validator/voting/illegal/attempt to burn stakes/proposal,407077031,1108216,13041 -Agora/Proposal/validator/voting/illegal/insufficient staked amount/stake,270844879,700689,7816 -Agora/Proposal/validator/voting/illegal/insufficient staked amount/stake,851318931,2050757,10181 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,241700498,672625,12320 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,221087600,615610,12082 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,234495233,642758,13353 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,400581660,1062545,12814 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,3654 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,237889208,660397,12041 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,217276310,603382,11803 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,230683943,630530,12895 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,398214366,1055039,12449 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,3289 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,212146847,594271,12075 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,210418464,583981,12076 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,222605368,614793,12076 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,208335557,582043,11796 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,206607174,571753,11797 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,218794078,602565,11797 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,3654 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,3289 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,400581660,1062545,12814 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,87514895,216737,3654 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,398214366,1055039,12449 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,82449293,203081,3289 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/forget to mint GATs/proposal,230683943,630530,12249 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,230683943,630530,12895 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,3289 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,230683943,630530,12927 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,82449293,203081,3321 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/proposal,230683943,630530,12889 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/authority,82449293,203081,3283 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/proposal,230683943,630530,12895 -Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/authority,82449293,203081,3289 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,315925218,876927,13236 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,299007206,829900,12998 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,308719953,847060,14269 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,442316888,1179777,13425 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,4265 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,308302638,852471,12675 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,291384626,805444,12437 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,301097373,822604,13530 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,438194981,1166157,12873 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,3713 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,286371567,798573,12991 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,284643184,788283,12992 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,296830088,819095,12992 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,278748987,774117,12430 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,277020604,763827,12431 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,289207508,794639,12431 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,4265 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,3713 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,442316888,1179777,13425 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,87514895,216737,4265 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,438194981,1166157,12873 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,82449293,203081,3713 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/forget to mint GATs/proposal,301097373,822604,12884 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,301097373,822604,13530 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,3713 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,301097373,822604,13562 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,82449293,203081,3745 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/proposal,301097373,822604,13524 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/authority,82449293,203081,3707 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/proposal,301097373,822604,13530 -Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/authority,82449293,203081,3713 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,538599378,1489833,15983 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,532766024,1472770,15745 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,531394113,1459966,17016 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,567522572,1531473,15256 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,6096 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,519542928,1428693,14582 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,513709574,1411630,14344 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,512337663,1398826,15437 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,558136826,1499511,14144 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,4984 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,509045727,1411479,15738 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,507317344,1401189,15739 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,519504248,1432001,15739 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,489989277,1350339,14337 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,488260894,1340049,14338 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,500447798,1370861,14338 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,6096 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,4984 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,567522572,1531473,15256 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,87514895,216737,6096 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,558136826,1499511,14144 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,82449293,203081,4984 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/forget to mint GATs/proposal,512337663,1398826,14791 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,512337663,1398826,15437 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,4984 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,512337663,1398826,15469 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,82449293,203081,5016 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/proposal,512337663,1398826,15431 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/authority,82449293,203081,4978 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/proposal,512337663,1398826,15437 -Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/authority,82449293,203081,4984 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,421827692,1151721,13821 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,251438320,699338,12493 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,264845953,726486,13763 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,415454956,1104409,13088 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,3927 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,418016402,1139493,13540 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,247627030,687110,12212 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,261034663,714258,13304 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,413087662,1096903,12722 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,3562 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,242497567,677999,12486 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,240769184,667709,12487 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,252956088,698521,12487 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,238686277,665771,12205 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,236957894,655481,12206 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,249144798,686293,12206 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,3927 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,3562 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,415454956,1104409,13088 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,87514895,216737,3927 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,413087662,1096903,12722 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,82449293,203081,3562 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/forget to mint GATs/proposal,261034663,714258,12659 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,261034663,714258,13304 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,3562 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,261034663,714258,13336 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,82449293,203081,3594 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/proposal,261034663,714258,13298 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/authority,82449293,203081,3556 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/proposal,261034663,714258,13304 -Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/authority,82449293,203081,3562 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,496052412,1356023,14736 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,329357926,913628,13408 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,339070673,930788,14679 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,457190184,1221641,13698 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,4538 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,488429832,1331567,14176 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,321735346,889172,12847 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,331448093,906332,13940 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,453068277,1208021,13146 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,3986 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,316722287,882301,13401 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,314993904,872011,13402 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,327180808,902823,13402 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,309099707,857845,12840 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,307371324,847555,12841 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,319558228,878367,12841 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,4538 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,3986 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,457190184,1221641,13698 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,87514895,216737,4538 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,453068277,1208021,13146 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,82449293,203081,3986 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/forget to mint GATs/proposal,331448093,906332,13294 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,331448093,906332,13940 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,3986 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,331448093,906332,13972 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,82449293,203081,4018 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/proposal,331448093,906332,13934 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/authority,82449293,203081,3980 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/proposal,331448093,906332,13940 -Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/authority,82449293,203081,3986 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,718726572,1968929,17482 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,563116744,1556498,16154 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,561744833,1543694,17425 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,582395868,1573337,15529 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,6369 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,699670122,1907789,16082 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,544060294,1495358,14753 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,542688383,1482554,15846 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,573010122,1541375,14417 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,5257 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,539396447,1495207,16147 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,537668064,1484917,16148 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,549854968,1515729,16148 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,520339997,1434067,14746 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,518611614,1423777,14747 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,530798518,1454589,14747 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,6369 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,5257 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,582395868,1573337,15529 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,87514895,216737,6369 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,573010122,1541375,14417 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,82449293,203081,5257 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/forget to mint GATs/proposal,542688383,1482554,15200 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,542688383,1482554,15846 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,5257 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,542688383,1482554,15878 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,82449293,203081,5289 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/proposal,542688383,1482554,15840 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/authority,82449293,203081,5251 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/proposal,542688383,1482554,15846 -Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/authority,82449293,203081,5257 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,662150128,1796282,15697 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,289376720,803998,13004 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,302784353,831146,14275 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,434046576,1156739,13429 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,4269 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,658338838,1784054,15418 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,285565430,791770,12724 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,298973063,818918,13816 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,431679282,1149233,13063 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,3903 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,280435967,782659,12997 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,278707584,772369,12998 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,290894488,803181,12998 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,276624677,770431,12717 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,274896294,760141,12718 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,287083198,790953,12718 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,4269 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,3903 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,434046576,1156739,13429 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,87514895,216737,4269 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,431679282,1149233,13063 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,82449293,203081,3903 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/forget to mint GATs/proposal,298973063,818918,13171 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,298973063,818918,13816 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,3903 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,298973063,818918,13849 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,82449293,203081,3935 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/proposal,298973063,818918,13810 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/authority,82449293,203081,3897 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/proposal,298973063,818918,13816 -Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/authority,82449293,203081,3903 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,736374848,2000584,16613 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,367296326,1018288,13919 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,377009073,1035448,15190 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,475781804,1273971,14039 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,4879 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,728752268,1976128,16053 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,359673746,993832,13360 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,369386493,1010992,14452 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,471659897,1260351,13487 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,4327 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,354660687,986961,13912 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,352932304,976671,13913 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,365119208,1007483,13913 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,347038107,962505,13353 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,345309724,952215,13354 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,357496628,983027,13354 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,4879 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,4327 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,475781804,1273971,14039 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,87514895,216737,4879 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,471659897,1260351,13487 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,82449293,203081,4327 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/forget to mint GATs/proposal,369386493,1010992,13807 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,369386493,1010992,14452 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,4327 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,369386493,1010992,14484 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,82449293,203081,4359 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/proposal,369386493,1010992,14446 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/authority,82449293,203081,4321 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/proposal,369386493,1010992,14452 -Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/authority,82449293,203081,4327 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,959049008,2613490,19360 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,601055144,1661158,16666 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,599683233,1648354,17937 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,600987488,1625667,15870 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,87514895,216737,6710 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,939992558,2552350,17959 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,581998694,1600018,15266 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,580626783,1587214,16358 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,591601742,1593705,14758 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,82449293,203081,5598 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,577334847,1599867,16659 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,575606464,1589577,16660 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,587793368,1620389,16660 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,558278397,1538727,15259 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,556550014,1528437,15260 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,568736918,1559249,15260 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,87514895,216737,6710 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,82449293,203081,5598 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,600987488,1625667,15870 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,87514895,216737,6710 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,591601742,1593705,14758 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,82449293,203081,5598 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/forget to mint GATs/proposal,580626783,1587214,15712 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,580626783,1587214,16358 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,82449293,203081,5598 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,580626783,1587214,16390 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,82449293,203081,5630 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/proposal,580626783,1587214,16352 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/authority,82449293,203081,5592 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/proposal,580626783,1587214,16358 -Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/authority,82449293,203081,5598 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting/stake,279486314,706477,8061 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting/proposal,216327247,595640,11929 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting by delegatee/stake,286313209,723633,8061 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting by delegatee/proposal,216327247,595640,11929 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter/creator: retract votes while voting/stake,289992569,737079,8077 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter/creator: retract votes while voting/proposal,222731651,614354,11940 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/creator: remove creator lock after voting/stake,280487571,709684,8064 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/creator: remove creator lock after voting/proposal,184158955,507672,11933 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/Voter: remove lock after voting/stake,280617292,708881,8066 -Agora/Proposal/validator/unlocking/legal/with 1 stakes/Voter: remove lock after voting/proposal,185197232,510470,11934 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting/stake,578170494,1369221,9406 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting/proposal,327836147,887354,13274 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting by delegatee/stake,584997389,1386377,9406 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting by delegatee/proposal,327836147,887354,13274 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter/creator: retract votes while voting/stake,609689259,1461027,9444 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter/creator: retract votes while voting/proposal,347049359,943496,13307 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/creator: remove creator lock after voting/stake,578912309,1374034,9407 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/creator: remove creator lock after voting/proposal,252004769,673522,13276 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/Voter: remove lock after voting/stake,579301472,1371625,9411 -Agora/Proposal/validator/unlocking/legal/with 3 stakes/Voter: remove lock after voting/proposal,255119600,681916,13279 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting/stake,896501330,2063405,10752 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting/proposal,439345047,1179068,14620 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting by delegatee/stake,903328225,2080561,10752 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting by delegatee/proposal,439345047,1179068,14620 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter/creator: retract votes while voting/stake,949032605,2216415,10812 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter/creator: retract votes while voting/proposal,471367067,1272638,14675 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/creator: remove creator lock after voting/stake,896983703,2069824,10751 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/creator: remove creator lock after voting/proposal,319850583,839372,14620 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/Voter: remove lock after voting/stake,897632308,2065809,10757 -Agora/Proposal/validator/unlocking/legal/with 5 stakes/Voter: remove lock after voting/proposal,325041968,853362,14625 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting/stake,1234478822,2789029,12097 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting/proposal,550853947,1470782,15965 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting by delegatee/stake,1241305717,2806185,12097 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting by delegatee/proposal,550853947,1470782,15965 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter/creator: retract votes while voting/stake,1308022607,3003243,12179 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter/creator: retract votes while voting/proposal,595684775,1601780,16042 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/creator: remove creator lock after voting/stake,1234701753,2797054,12094 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/creator: remove creator lock after voting/proposal,387696397,1005222,15963 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/Voter: remove lock after voting/stake,1235609800,2791433,12102 -Agora/Proposal/validator/unlocking/legal/with 7 stakes/Voter: remove lock after voting/proposal,394964336,1024808,15970 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting/stake,1592102970,3546093,13442 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting/proposal,662362847,1762496,17310 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting by delegatee/stake,1598929865,3563249,13442 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting by delegatee/proposal,662362847,1762496,17310 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter/creator: retract votes while voting/stake,1686659265,3821511,13546 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter/creator: retract votes while voting/proposal,720002483,1930922,17409 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/creator: remove creator lock after voting/stake,1592066459,3555724,13437 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/creator: remove creator lock after voting/proposal,455542211,1171072,17306 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/Voter: remove lock after voting/stake,1593233948,3548497,13447 -Agora/Proposal/validator/unlocking/legal/with 9 stakes/Voter: remove lock after voting/proposal,464886704,1196254,17315 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting/stake,1969373774,4334597,14788 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting/proposal,773871747,2054210,18656 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting by delegatee/stake,1976200669,4351753,14788 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting by delegatee/proposal,773871747,2054210,18656 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter/creator: retract votes while voting/stake,2084942579,4671219,14915 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter/creator: retract votes while voting/proposal,844320191,2260064,18778 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/creator: remove creator lock after voting/stake,1969077821,4345834,14781 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/creator: remove creator lock after voting/proposal,523388025,1336922,18650 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/Voter: remove lock after voting/stake,1970504752,4337001,14793 -Agora/Proposal/validator/unlocking/legal/with 11 stakes/Voter: remove lock after voting/proposal,534809072,1367700,18661 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,278920825,705275,8061 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,280051803,707679,8061 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,280617292,708881,8061 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,182462488,504066,11933 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,190395307,522806,11933 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,183593466,506470,11933 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/unlock an irrelevant stake/stake,289133851,739603,8083 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/creator: retract votes/stake,277833668,708906,8065 -Agora/Proposal/validator/unlocking/illegal/with 1 stakes/change output stake value/proposal,216327247,595640,11926 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,577605005,1368019,9406 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,578735983,1370423,9406 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,579301472,1371625,9406 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,250308302,669916,13276 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,258241121,688656,13276 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,251439280,672320,13276 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/unlock an irrelevant stake/stake,592378113,1445019,9462 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/creator: retract votes/stake,558477564,1352928,9420 -Agora/Proposal/validator/unlocking/illegal/with 3 stakes/change output stake value/proposal,327836147,887354,13265 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,895935841,2062203,10752 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,897066819,2064607,10752 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,897632308,2065809,10752 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,318154116,835766,14620 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,326086935,854506,14620 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,319285094,838170,14620 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/unlock an irrelevant stake/stake,895622375,2150435,10842 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/creator: retract votes/stake,839121460,1996950,10776 -Agora/Proposal/validator/unlocking/illegal/with 5 stakes/change output stake value/proposal,439345047,1179068,14605 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1233913333,2787827,12097 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1235044311,2790231,12097 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1235609800,2791433,12097 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,385999930,1001616,15963 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,393932749,1020356,15963 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,387130908,1004020,15963 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/unlock an irrelevant stake/stake,1198866637,2855851,12221 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/creator: retract votes/stake,1119765356,2640972,12131 -Agora/Proposal/validator/unlocking/illegal/with 7 stakes/change output stake value/proposal,550853947,1470782,15944 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1591537481,3544891,13442 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1592668459,3547295,13442 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1593233948,3548497,13442 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,453845744,1167466,17306 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,461778563,1186206,17306 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,454976722,1169870,17306 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/unlock an irrelevant stake/stake,1502110899,3561267,13601 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/creator: retract votes/stake,1400409252,3284994,13486 -Agora/Proposal/validator/unlocking/illegal/with 9 stakes/change output stake value/proposal,662362847,1762496,17283 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,1968808285,4333395,14788 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,1969939263,4335799,14788 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,1970504752,4337001,14788 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,521691558,1333316,18650 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,529624377,1352056,18650 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,522822536,1335720,18650 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/unlock an irrelevant stake/stake,1805355161,4266683,14981 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/creator: retract votes/stake,1681053148,3929016,14843 -Agora/Proposal/validator/unlocking/illegal/with 11 stakes/change output stake value/proposal,773871747,2054210,18623 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct simple,26456223,75851,755 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct many inputs,51581175,146321,855 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct even though scripts don't match,26456223,75851,754 -Agora/Treasury/Validator/Positive/Allows for effect changes,42170246,119764,1444 -Agora/Treasury/Validator/Positive/Fails when GAT token name is not script address,42170246,119764,1480 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct simple,26456223,75851,755 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct many inputs,51581175,146321,855 -Agora/AuthorityToken/singleAuthorityTokenBurned/Correct even though scripts don't match,26456223,75851,754 +Agora/Stake/validator/stakeDepositWithdraw deposit,139159477,366380,7455 +Agora/Stake/validator/stakeDepositWithdraw withdraw,139159477,366380,7447 +Agora/Stake/validator/set delegate/override existing delegate,170687225,436209,7586 +Agora/Stake/validator/set delegate/remove existing delegate,161352229,412821,7516 +Agora/Stake/validator/set delegate/set delegate to something,168258237,429109,7516 +Agora/Proposal/policy (proposal creation)/legal/proposal,33965500,89285,2770 +Agora/Proposal/policy (proposal creation)/legal/governor,278780450,736308,11951 +Agora/Proposal/policy (proposal creation)/legal/stake,294849494,739010,8283 +Agora/Proposal/policy (proposal creation)/illegal/invalid next proposal id/proposal,33965500,89285,2770 +Agora/Proposal/policy (proposal creation)/illegal/invalid next proposal id/stake,294849494,739010,8283 +Agora/Proposal/policy (proposal creation)/illegal/use other's stake/proposal,33965500,89285,2738 +Agora/Proposal/policy (proposal creation)/illegal/use other's stake/governor,278780450,736308,11920 +Agora/Proposal/policy (proposal creation)/illegal/altered stake/proposal,33965500,89285,2770 +Agora/Proposal/policy (proposal creation)/illegal/invalid stake locks/proposal,33965500,89285,2778 +Agora/Proposal/policy (proposal creation)/illegal/invalid stake locks/governor,278780450,736308,11959 +Agora/Proposal/policy (proposal creation)/illegal/has reached maximum proposals limit/proposal,33965500,89285,2790 +Agora/Proposal/policy (proposal creation)/illegal/has reached maximum proposals limit/stake,307547930,775226,8313 +Agora/Proposal/policy (proposal creation)/illegal/loose time range/proposal,33965500,89285,2770 +Agora/Proposal/policy (proposal creation)/illegal/loose time range/stake,294849494,739010,8283 +Agora/Proposal/policy (proposal creation)/illegal/open time range/proposal,33965500,89285,2766 +Agora/Proposal/policy (proposal creation)/illegal/open time range/stake,294849494,739010,8279 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/VotingReady/proposal,33965500,89285,2770 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/VotingReady/stake,294849494,739010,8283 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/proposal,33965500,89285,2770 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/stake,294849494,739010,8283 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/proposal,33965500,89285,2770 +Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/stake,294849494,739010,8283 +Agora/Proposal/policy (proposal creation)/illegal/fake SST/proposal,33965500,89285,2678 +Agora/Proposal/policy (proposal creation)/illegal/wrong governor redeemer/stake,294849494,739010,8283 +Agora/Proposal/policy (proposal creation)/illegal/wrong governor redeemer/stake,294849494,739010,8283 +Agora/Proposal/validator/cosignature/legal/proposal,206387671,574470,12163 +Agora/Proposal/validator/cosignature/legal/stake,252069966,657730,8082 +Agora/Proposal/validator/cosignature/illegal/insufficient staked amount/stake,252069966,657730,8082 +Agora/Proposal/validator/cosignature/illegal/proposal locks not updated/proposal,206387671,574470,12157 +Agora/Proposal/validator/cosignature/illegal/duplicate cosigners/stake,258419184,675838,8099 +Agora/Proposal/validator/cosignature/illegal/cosigners not updated/stake,252069966,657730,8048 +Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,252069966,657730,8082 +Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,252069966,657730,8082 +Agora/Proposal/validator/cosignature/illegal/cosign after draft/(negative test)/stake,252069966,657730,8082 +Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by owner/proposal,224764746,633762,12000 +Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by owner/stake,266838600,697491,7927 +Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by delegatee/proposal,224764746,633762,12000 +Agora/Proposal/validator/voting/legal/different number of stakes/1 stakes/by delegatee/stake,273665495,714647,7927 +Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by owner/proposal,337385056,936548,13192 +Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by owner/stake,550033158,1367135,9119 +Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by delegatee/proposal,337385056,936548,13192 +Agora/Proposal/validator/voting/legal/different number of stakes/3 stakes/by delegatee/stake,556860053,1384291,9119 +Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by owner/proposal,450005366,1239334,14382 +Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by owner/stake,833227716,2036779,10309 +Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by delegatee/proposal,450005366,1239334,14382 +Agora/Proposal/validator/voting/legal/different number of stakes/5 stakes/by delegatee/stake,840054611,2053935,10309 +Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by owner/proposal,562625676,1542120,15573 +Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by owner/stake,1116422274,2706423,11500 +Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by delegatee/proposal,562625676,1542120,15573 +Agora/Proposal/validator/voting/legal/different number of stakes/7 stakes/by delegatee/stake,1123249169,2723579,11500 +Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by owner/proposal,675245986,1844906,16764 +Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by owner/stake,1399616832,3376067,12691 +Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by delegatee/proposal,675245986,1844906,16764 +Agora/Proposal/validator/voting/legal/different number of stakes/9 stakes/by delegatee/stake,1406443727,3393223,12691 +Agora/Proposal/validator/voting/legal/transparent non-GT tokens/proposal,224764746,633762,12000 +Agora/Proposal/validator/voting/legal/transparent non-GT tokens/stake,266838600,697491,7927 +Agora/Proposal/validator/voting/legal/Delegatee vote with own and delegated stakes in one tx/proposal,447576378,1232234,14312 +Agora/Proposal/validator/voting/legal/Delegatee vote with own and delegated stakes in one tx/stake,842482196,2051932,10239 +Agora/Proposal/validator/voting/illegal/vote for nonexistent outcome/stake,266838600,697491,7935 +Agora/Proposal/validator/voting/illegal/unauthorized tx/proposal,224764746,633762,12000 +Agora/Proposal/validator/voting/illegal/more than one proposals/stake,266838600,697491,7935 +Agora/Proposal/validator/voting/illegal/locks not added/proposal,450005366,1239334,14352 +Agora/Proposal/validator/voting/illegal/attempt to burn stakes/proposal,411824871,1127134,13354 +Agora/Proposal/validator/voting/illegal/insufficient staked amount/stake,266838600,697491,7922 +Agora/Proposal/validator/voting/illegal/insufficient staked amount/stake,833227716,2036779,10287 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,245482226,688041,12633 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,224869328,631026,12395 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,238276961,658174,13715 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,445781894,1186704,12972 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,3998 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,241670936,675813,12354 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,221058038,618798,12116 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,234465671,645946,13256 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,443414600,1179198,12606 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,3632 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,215928575,609687,12388 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,214200192,599397,12389 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,226387096,630209,12389 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,212117285,597459,12109 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,210388902,587169,12110 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,222575806,617981,12110 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,3998 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,3632 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,445781894,1186704,12972 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,96756794,242826,3998 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,443414600,1179198,12606 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,91691192,229170,3632 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/forget to mint GATs/proposal,234465671,645946,12611 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,234465671,645946,13256 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,3632 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,234465671,645946,13288 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,91691192,229170,3664 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/proposal,234465671,645946,13250 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong GAT datum/authority,91691192,229170,3626 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/proposal,234465671,645946,13256 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/invalid governor output datum/authority,91691192,229170,3632 +Agora/Proposal/validator/advancing/with 1 cosigners and 1 effects/illegal/wrong governor redeemer/proposal,234465671,645946,13256 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,319706946,892343,13549 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,302788934,845316,13311 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,312501681,862476,14630 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,487517122,1303936,13582 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,4608 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,312084366,867887,12988 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,295166354,820860,12750 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,304879101,838020,13891 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,483395215,1290316,13030 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,4056 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,290153295,813989,13304 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,288424912,803699,13305 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,300611816,834511,13305 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,282530715,789533,12743 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,280802332,779243,12744 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,292989236,810055,12744 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,4608 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,4056 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,487517122,1303936,13582 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,96756794,242826,4608 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,483395215,1290316,13030 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,91691192,229170,4056 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/forget to mint GATs/proposal,304879101,838020,13245 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,304879101,838020,13891 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,4056 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,304879101,838020,13923 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,91691192,229170,4088 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/proposal,304879101,838020,13885 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong GAT datum/authority,91691192,229170,4050 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/proposal,304879101,838020,13891 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/invalid governor output datum/authority,91691192,229170,4056 +Agora/Proposal/validator/advancing/with 1 cosigners and 2 effects/illegal/wrong governor redeemer/proposal,304879101,838020,13891 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,542381106,1505249,16296 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,536547752,1488186,16058 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,535175841,1475382,17377 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,612722806,1655632,15413 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,6439 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,523324656,1444109,14895 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,517491302,1427046,14657 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,516119391,1414242,15798 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,603337060,1623670,14301 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,5327 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,512827455,1426895,16051 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,511099072,1416605,16052 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,523285976,1447417,16052 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,493771005,1365755,14650 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,492042622,1355465,14651 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,504229526,1386277,14651 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,6439 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,5327 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,612722806,1655632,15413 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,96756794,242826,6439 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,603337060,1623670,14301 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,91691192,229170,5327 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/forget to mint GATs/proposal,516119391,1414242,15152 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,516119391,1414242,15798 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,5327 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,516119391,1414242,15830 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,91691192,229170,5359 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/proposal,516119391,1414242,15792 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong GAT datum/authority,91691192,229170,5321 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/proposal,516119391,1414242,15798 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/invalid governor output datum/authority,91691192,229170,5327 +Agora/Proposal/validator/advancing/with 1 cosigners and 5 effects/illegal/wrong governor redeemer/proposal,516119391,1414242,15798 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,425609420,1167137,14134 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,255220048,714754,12806 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,268627681,741902,14125 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,460655190,1228568,13245 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,4271 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,421798130,1154909,13853 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,251408758,702526,12525 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,264816391,729674,13665 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,458287896,1221062,12879 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,3905 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,246279295,693415,12799 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,244550912,683125,12800 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,256737816,713937,12800 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,242468005,681187,12518 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,240739622,670897,12519 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,252926526,701709,12519 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,4271 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,3905 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,460655190,1228568,13245 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,96756794,242826,4271 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,458287896,1221062,12879 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,91691192,229170,3905 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/forget to mint GATs/proposal,264816391,729674,13020 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,264816391,729674,13665 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,3905 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,264816391,729674,13697 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,91691192,229170,3937 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/proposal,264816391,729674,13659 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong GAT datum/authority,91691192,229170,3899 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/proposal,264816391,729674,13665 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/invalid governor output datum/authority,91691192,229170,3905 +Agora/Proposal/validator/advancing/with 5 cosigners and 1 effects/illegal/wrong governor redeemer/proposal,264816391,729674,13665 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,499834140,1371439,15049 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,333139654,929044,13721 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,342852401,946204,15040 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,502390418,1345800,13855 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,4881 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,492211560,1346983,14489 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,325517074,904588,13160 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,335229821,921748,14301 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,498268511,1332180,13303 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,4329 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,320504015,897717,13714 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,318775632,887427,13715 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,330962536,918239,13715 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,312881435,873261,13153 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,311153052,862971,13154 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,323339956,893783,13154 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,4881 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,4329 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,502390418,1345800,13855 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,96756794,242826,4881 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,498268511,1332180,13303 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,91691192,229170,4329 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/forget to mint GATs/proposal,335229821,921748,13655 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,335229821,921748,14301 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,4329 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,335229821,921748,14333 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,91691192,229170,4361 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/proposal,335229821,921748,14295 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong GAT datum/authority,91691192,229170,4323 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/proposal,335229821,921748,14301 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/invalid governor output datum/authority,91691192,229170,4329 +Agora/Proposal/validator/advancing/with 5 cosigners and 2 effects/illegal/wrong governor redeemer/proposal,335229821,921748,14301 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,722508300,1984345,17795 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,566898472,1571914,16467 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,565526561,1559110,17786 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,627596102,1697496,15686 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,6712 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,703451850,1923205,16395 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,547842022,1510774,15066 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,546470111,1497970,16207 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,618210356,1665534,14574 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,5600 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,543178175,1510623,16460 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,541449792,1500333,16461 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,553636696,1531145,16461 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,524121725,1449483,15059 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,522393342,1439193,15060 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,534580246,1470005,15060 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,6712 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,5600 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,627596102,1697496,15686 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,96756794,242826,6712 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,618210356,1665534,14574 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,91691192,229170,5600 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/forget to mint GATs/proposal,546470111,1497970,15561 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,546470111,1497970,16207 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,5600 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,546470111,1497970,16239 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,91691192,229170,5632 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/proposal,546470111,1497970,16201 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong GAT datum/authority,91691192,229170,5594 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/proposal,546470111,1497970,16207 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/invalid governor output datum/authority,91691192,229170,5600 +Agora/Proposal/validator/advancing/with 5 cosigners and 5 effects/illegal/wrong governor redeemer/proposal,546470111,1497970,16207 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,665931856,1811698,16010 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,293158448,819414,13317 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,306566081,846562,14636 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,479246810,1280898,13586 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,4612 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Draft to VotingReady/proposal,662120566,1799470,15731 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from VotingReady to Locked/proposal,289347158,807186,13037 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/proposal,302754791,834334,14178 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/governor,476879516,1273392,13221 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,4247 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,284217695,798075,13310 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,282489312,787785,13311 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,294676216,818597,13311 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Draft to Finished/proposal,280406405,785847,13030 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from VotingReady to Finished/proposal,278678022,775557,13031 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/legal/to failed state/from Locked to Finished/proposal,290864926,806369,13031 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,4612 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,4247 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,479246810,1280898,13586 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,96756794,242826,4612 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/governor,476879516,1273392,13221 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/to next state too late/from Locked/authority,91691192,229170,4247 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/forget to mint GATs/proposal,302754791,834334,13532 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/proposal,302754791,834334,14178 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,4247 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs with bad token name/proposal,302754791,834334,14210 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/mint GATs with bad token name/authority,91691192,229170,4279 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/proposal,302754791,834334,14172 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong GAT datum/authority,91691192,229170,4241 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/proposal,302754791,834334,14178 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/invalid governor output datum/authority,91691192,229170,4247 +Agora/Proposal/validator/advancing/with 10 cosigners and 1 effects/illegal/wrong governor redeemer/proposal,302754791,834334,14178 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,740156576,2016000,16926 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,371078054,1033704,14232 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,380790801,1050864,15551 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,520982038,1398130,14196 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,5222 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Draft to VotingReady/proposal,732533996,1991544,16366 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from VotingReady to Locked/proposal,363455474,1009248,13673 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/proposal,373168221,1026408,14813 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/governor,516860131,1384510,13644 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,4670 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,358442415,1002377,14225 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,356714032,992087,14226 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,368900936,1022899,14226 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Draft to Finished/proposal,350819835,977921,13666 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from VotingReady to Finished/proposal,349091452,967631,13667 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/legal/to failed state/from Locked to Finished/proposal,361278356,998443,13667 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,5222 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,4670 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,520982038,1398130,14196 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,96756794,242826,5222 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/governor,516860131,1384510,13644 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/to next state too late/from Locked/authority,91691192,229170,4670 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/forget to mint GATs/proposal,373168221,1026408,14168 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/proposal,373168221,1026408,14813 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,4670 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs with bad token name/proposal,373168221,1026408,14845 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/mint GATs with bad token name/authority,91691192,229170,4702 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/proposal,373168221,1026408,14807 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong GAT datum/authority,91691192,229170,4664 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/proposal,373168221,1026408,14813 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/invalid governor output datum/authority,91691192,229170,4670 +Agora/Proposal/validator/advancing/with 10 cosigners and 2 effects/illegal/wrong governor redeemer/proposal,373168221,1026408,14813 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,962830736,2628906,19673 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,604836872,1676574,16979 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,603464961,1663770,18299 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,646187722,1749826,16028 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,96756794,242826,7054 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Draft to VotingReady/proposal,943774286,2567766,18272 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from VotingReady to Locked/proposal,585780422,1615434,15579 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/proposal,584408511,1602630,16719 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/governor,636801976,1717864,14915 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to next state/from Locked to Finished/authority,91691192,229170,5941 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,581116575,1615283,16972 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,579388192,1604993,16973 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,591575096,1635805,16973 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Draft to Finished/proposal,562060125,1554143,15572 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from VotingReady to Finished/proposal,560331742,1543853,15573 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/legal/to failed state/from Locked to Finished/proposal,572518646,1574665,15573 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,96756794,242826,7054 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/advance finished proposals/(negative test)/authority,91691192,229170,5941 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,646187722,1749826,16028 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,96756794,242826,7054 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/governor,636801976,1717864,14915 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/to next state too late/from Locked/authority,91691192,229170,5941 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/forget to mint GATs/proposal,584408511,1602630,16074 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/proposal,584408511,1602630,16719 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs for wrong validators/authority,91691192,229170,5941 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs with bad token name/proposal,584408511,1602630,16751 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/mint GATs with bad token name/authority,91691192,229170,5973 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/proposal,584408511,1602630,16713 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong GAT datum/authority,91691192,229170,5935 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/proposal,584408511,1602630,16719 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/invalid governor output datum/authority,91691192,229170,5941 +Agora/Proposal/validator/advancing/with 10 cosigners and 5 effects/illegal/wrong governor redeemer/proposal,584408511,1602630,16719 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting/stake,274914546,702077,8167 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting/proposal,243276264,679894,12242 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting by delegatee/stake,281741441,719233,8167 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter: retract votes while voting by delegatee/proposal,243276264,679894,12242 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter/creator: retract votes while voting/stake,285420801,732679,8183 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/voter/creator: retract votes while voting/proposal,252967100,708268,12253 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/creator: remove creator lock after voting/stake,275915803,705284,8170 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/creator: remove creator lock after voting/proposal,188906795,526590,12246 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/Voter: remove lock after voting/stake,276045524,704481,8172 +Agora/Proposal/validator/unlocking/legal/with 1 stakes/Voter: remove lock after voting/proposal,189945072,529388,12247 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting/stake,566556258,1359431,9512 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting/proposal,392288032,1087616,13587 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting by delegatee/stake,573383153,1376587,9512 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter: retract votes while voting by delegatee/proposal,392288032,1087616,13587 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter/creator: retract votes while voting/stake,598075023,1451237,9550 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/voter/creator: retract votes while voting/proposal,421360540,1172738,13620 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/creator: remove creator lock after voting/stake,567298073,1364244,9513 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/creator: remove creator lock after voting/proposal,256752609,692440,13589 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/Voter: remove lock after voting/stake,567687236,1361835,9517 +Agora/Proposal/validator/unlocking/legal/with 3 stakes/Voter: remove lock after voting/proposal,259867440,700834,13592 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting/stake,877844626,2048225,10858 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting/proposal,541299800,1495338,14933 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting by delegatee/stake,884671521,2065381,10858 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter: retract votes while voting by delegatee/proposal,541299800,1495338,14933 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter/creator: retract votes while voting/stake,930375901,2201235,10918 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/voter/creator: retract votes while voting/proposal,589753980,1637208,14988 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/creator: remove creator lock after voting/stake,878326999,2054644,10857 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/creator: remove creator lock after voting/proposal,324598423,858290,14933 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/Voter: remove lock after voting/stake,878975604,2050629,10863 +Agora/Proposal/validator/unlocking/legal/with 5 stakes/Voter: remove lock after voting/proposal,329789808,872280,14938 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting/stake,1208779650,2768459,12203 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting/proposal,690311568,1903060,16278 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting by delegatee/stake,1215606545,2785615,12203 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter: retract votes while voting by delegatee/proposal,690311568,1903060,16278 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter/creator: retract votes while voting/stake,1282323435,2982673,12285 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/voter/creator: retract votes while voting/proposal,758147420,2101678,16355 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/creator: remove creator lock after voting/stake,1209002581,2776484,12200 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/creator: remove creator lock after voting/proposal,392444237,1024140,16276 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/Voter: remove lock after voting/stake,1209910628,2770863,12208 +Agora/Proposal/validator/unlocking/legal/with 7 stakes/Voter: remove lock after voting/proposal,399712176,1043726,16283 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting/stake,1559361330,3520133,13548 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting/proposal,839323336,2310782,17623 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting by delegatee/stake,1566188225,3537289,13548 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter: retract votes while voting by delegatee/proposal,839323336,2310782,17623 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter/creator: retract votes while voting/stake,1653917625,3795551,13652 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/voter/creator: retract votes while voting/proposal,926540860,2566148,17722 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/creator: remove creator lock after voting/stake,1559324819,3529764,13543 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/creator: remove creator lock after voting/proposal,460290051,1189990,17619 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/Voter: remove lock after voting/stake,1560492308,3522537,13553 +Agora/Proposal/validator/unlocking/legal/with 9 stakes/Voter: remove lock after voting/proposal,469634544,1215172,17628 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting/stake,1929589666,4303247,14894 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting/proposal,988335104,2718504,18969 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting by delegatee/stake,1936416561,4320403,14894 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter: retract votes while voting by delegatee/proposal,988335104,2718504,18969 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter/creator: retract votes while voting/stake,2045158471,4639869,15021 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/voter/creator: retract votes while voting/proposal,1094934300,3030618,19091 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/creator: remove creator lock after voting/stake,1929293713,4314484,14887 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/creator: remove creator lock after voting/proposal,528135865,1355840,18963 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/Voter: remove lock after voting/stake,1930720644,4305651,14899 +Agora/Proposal/validator/unlocking/legal/with 11 stakes/Voter: remove lock after voting/proposal,539556912,1386618,18974 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,274349057,700875,8167 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,275480035,703279,8167 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/retract votes while not voting/(negative test)/stake,276045524,704481,8167 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,187210328,522984,12246 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,195143147,541724,12246 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/remove creator too early/(negative test)/proposal,188341306,525388,12246 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/unlock an irrelevant stake/stake,284562083,735203,8189 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/creator: retract votes/stake,273261900,704506,8171 +Agora/Proposal/validator/unlocking/illegal/with 1 stakes/change output stake value/proposal,243276264,679894,12239 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,565990769,1358229,9512 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,567121747,1360633,9512 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/retract votes while not voting/(negative test)/stake,567687236,1361835,9512 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,255056142,688834,13589 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,262988961,707574,13589 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/remove creator too early/(negative test)/proposal,256187120,691238,13589 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/unlock an irrelevant stake/stake,580763877,1435229,9568 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/creator: retract votes/stake,546863328,1343138,9526 +Agora/Proposal/validator/unlocking/illegal/with 3 stakes/change output stake value/proposal,392288032,1087616,13578 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,877279137,2047023,10858 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,878410115,2049427,10858 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/retract votes while not voting/(negative test)/stake,878975604,2050629,10858 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,322901956,854684,14933 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,330834775,873424,14933 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/remove creator too early/(negative test)/proposal,324032934,857088,14933 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/unlock an irrelevant stake/stake,876965671,2135255,10948 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/creator: retract votes/stake,820464756,1981770,10882 +Agora/Proposal/validator/unlocking/illegal/with 5 stakes/change output stake value/proposal,541299800,1495338,14918 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1208214161,2767257,12203 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1209345139,2769661,12203 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/retract votes while not voting/(negative test)/stake,1209910628,2770863,12203 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,390747770,1020534,16276 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,398680589,1039274,16276 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/remove creator too early/(negative test)/proposal,391878748,1022938,16276 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/unlock an irrelevant stake/stake,1173167465,2835281,12327 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/creator: retract votes/stake,1094066184,2620402,12237 +Agora/Proposal/validator/unlocking/illegal/with 7 stakes/change output stake value/proposal,690311568,1903060,16257 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1558795841,3518931,13548 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1559926819,3521335,13548 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/retract votes while not voting/(negative test)/stake,1560492308,3522537,13548 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,458593584,1186384,17619 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,466526403,1205124,17619 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/remove creator too early/(negative test)/proposal,459724562,1188788,17619 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/unlock an irrelevant stake/stake,1469369259,3535307,13707 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/creator: retract votes/stake,1367667612,3259034,13592 +Agora/Proposal/validator/unlocking/illegal/with 9 stakes/change output stake value/proposal,839323336,2310782,17596 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,1929024177,4302045,14894 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,1930155155,4304449,14894 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/retract votes while not voting/(negative test)/stake,1930720644,4305651,14894 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,526439398,1352234,18963 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,534372217,1370974,18963 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/remove creator too early/(negative test)/proposal,527570376,1354638,18963 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/unlock an irrelevant stake/stake,1765571053,4235333,15087 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/creator: retract votes/stake,1641269040,3897666,14949 +Agora/Proposal/validator/unlocking/illegal/with 11 stakes/change output stake value/proposal,988335104,2718504,18936 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct simple,26525223,76151,758 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct many inputs,51650175,146621,858 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct even though scripts don't match,26525223,76151,757 +Agora/Treasury/Validator/Positive/Allows for effect changes,42239246,120064,1447 +Agora/Treasury/Validator/Positive/Fails when GAT token name is not script address,42239246,120064,1483 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct simple,26525223,76151,758 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct many inputs,51650175,146621,858 +Agora/AuthorityToken/singleAuthorityTokenBurned/Correct even though scripts don't match,26525223,76151,757 Agora/Governor/policy/totally legal,63319800,170930,2766 -Agora/Governor/validator/mutate/legal,129016947,358159,11157 +Agora/Governor/validator/mutate/legal,132616675,372839,11266