From 4317987964c142267b608c92b00bba95240215ce Mon Sep 17 00:00:00 2001 From: Hongrui Fang Date: Sat, 16 Jul 2022 18:26:35 +0800 Subject: [PATCH] check GST while moving from `Locked` --- agora-specs/Sample/Proposal/Advance.hs | 115 +++++++++++++++++++++++-- agora-specs/Sample/Proposal/Shared.hs | 5 +- agora-specs/Spec/Proposal.hs | 12 ++- agora/Agora/Proposal/Scripts.hs | 25 +++++- bench.csv | 89 ++++++++++--------- 5 files changed, 187 insertions(+), 59 deletions(-) diff --git a/agora-specs/Sample/Proposal/Advance.hs b/agora-specs/Sample/Proposal/Advance.hs index 73c2ab6..8af1f9d 100644 --- a/agora-specs/Sample/Proposal/Advance.hs +++ b/agora-specs/Sample/Proposal/Advance.hs @@ -16,6 +16,8 @@ module Sample.Proposal.Advance ( Parameters (..), ) where +import Agora.Governor +import Agora.Governor.Scripts (governorValidator) import Agora.Proposal ( ProposalDatum (..), ProposalId (ProposalId), @@ -46,7 +48,8 @@ import Agora.Stake ( import Agora.Stake.Scripts (stakeValidator) import Data.Coerce (coerce) import Data.Default (def) -import Data.List (sort) +import Data.List (singleton, sort) +import Data.Maybe (fromJust) import Data.Tagged (Tagged (..), untag) import Plutarch.Context ( BaseBuilder, @@ -76,8 +79,10 @@ import PlutusLedgerApi.V1 ( ) import PlutusLedgerApi.V1.Value qualified as Value import PlutusTx.AssocMap qualified as AssocMap -import Sample.Proposal.Shared (proposalTxRef, stakeTxRef) +import Sample.Proposal.Shared (governorTxRef, proposalTxRef, stakeTxRef) import Sample.Shared ( + govAssetClass, + govValidatorHash, minAda, proposalPolicySymbol, proposalValidatorHash, @@ -109,6 +114,12 @@ data Parameters = Parameters -- ^ Whether the transaction is signed by all the cosigners. , perStakeGTs :: Tagged GTTag Integer -- ^ The staked amount of each stake. + , moveGovernorST :: Bool + -- ^ Whether the GST should be moved or not. + -- If this is set to true, the governor validator will be run in + -- the 'mkTestTree'. + , modifyGovernor :: Bool + -- ^ Whether to modify the governor output datum or not. } --- @@ -117,9 +128,13 @@ data Parameters = Parameters proposalRef :: TxOutRef proposalRef = TxOutRef proposalTxRef 1 +-- | Reference to the governor UTXO. +governorRef :: TxOutRef +governorRef = TxOutRef governorTxRef 2 + -- | Create the reference to a particular stake UTXO. mkStakeRef :: Int -> TxOutRef -mkStakeRef = TxOutRef stakeTxRef . (+ 2) . fromIntegral +mkStakeRef = TxOutRef stakeTxRef . (+ 3) . fromIntegral --- @@ -176,12 +191,25 @@ mkStakeInputDatums ps = , Voted (ProposalId 1) (ResultTag 2) ] +governorInputDatum :: GovernorDatum +governorInputDatum = + GovernorDatum + { proposalThresholds = def + , nextProposalId = ProposalId 42 + , proposalTimings = def + , createProposalTimeRangeMaxWidth = def + , maximumProposalsPerStake = 3 + } + --- -- | Script purpose of the proposal validator. proposalScriptPurpose :: ScriptPurpose proposalScriptPurpose = Spending proposalRef +governorScriptPurpose :: ScriptPurpose +governorScriptPurpose = Spending governorRef + -- | Script purpose of the stake validator, given which stake we want to spend. mkStakeScriptPurpose :: Int -> ScriptPurpose mkStakeScriptPurpose = Spending . mkStakeRef @@ -194,6 +222,12 @@ mkStakeScriptPurpose = Spending . mkStakeRef proposalRedeemer :: ProposalRedeemer proposalRedeemer = AdvanceProposal +{- | The propsoal redeemer used to spend the governor UTXO, which is always + 'MintGATs' in this case. +-} +governorRedeemer :: GovernorRedeemer +governorRedeemer = MintGATs + {- | The propsoal redeemer used to spend the stake UTXO, which is always 'WitnessStake' in this case. -} @@ -219,6 +253,9 @@ advance :: advance ps = let pst = Value.singleton proposalPolicySymbol "" 1 sst = Value.assetClassValue stakeAssetClass 1 + gst = Value.assetClassValue govAssetClass 1 + + --- proposalInputDatum :: ProposalDatum proposalInputDatum = @@ -230,6 +267,8 @@ advance ps = { status = ps.toStatus } + --- + stakeInputDatums :: [StakeDatum] stakeInputDatums = mkStakeInputDatums ps @@ -275,19 +314,50 @@ advance ps = in if ps.includeAllStakes then withIds else [head withIds] + --- - signBuilder :: BaseBuilder - signBuilder = + governorOutputDatum :: GovernorDatum + governorOutputDatum = + if ps.modifyGovernor + then + governorInputDatum + { nextProposalId = ProposalId 41 + } + else governorInputDatum + + governorBuilder :: BaseBuilder + governorBuilder = + if ps.moveGovernorST + then + mconcat + [ input $ + script govValidatorHash + . withValue (sortValue $ gst <> minAda) + . withDatum governorInputDatum + . withOutRef governorRef + , output $ + script govValidatorHash + . withValue (sortValue $ gst <> minAda) + . withDatum governorOutputDatum + ] + else mempty + + --- + + sigBuilder :: BaseBuilder + sigBuilder = let sos = mkStakeOwners ps in if ps.signByAllCosigners then foldMap signedWith sos else signedWith $ head sos + --- + builder :: BaseBuilder builder = mconcat [ txId "95ba4015e30aef16a3461ea97a779f814aeea6b8009d99a94add4b8293be737a" - , signBuilder + , sigBuilder , timeRange ps.validTimeRange , input $ script proposalValidatorHash @@ -299,7 +369,7 @@ advance ps = . withValue (pst <> minAda) . withDatum proposalOutputDatum ] - in buildTxInfoUnsafe $ builder <> stakeBuilder + in buildTxInfoUnsafe $ builder <> stakeBuilder <> governorBuilder --- @@ -431,6 +501,8 @@ advanceToNextStateInTimeParameters nCosigners = signByAllCosigners = case from of Draft -> True _ -> False + + shouldIncludeGovernor = from == Locked in Parameters { fromStatus = from , toStatus = getNextState from @@ -443,6 +515,8 @@ advanceToNextStateInTimeParameters nCosigners = , perStakeGTs = (def :: ProposalThresholds).vote `div` fromIntegral nCosigners + 1 + , moveGovernorST = shouldIncludeGovernor + , modifyGovernor = False } ) [Draft, VotingReady, Locked] @@ -461,6 +535,8 @@ advanceToFailedStateDueToTimeoutParameters nCosigners = , stakeCount = fromIntegral nCosigners , signByAllCosigners = False , perStakeGTs = 1 + , moveGovernorST = False + , modifyGovernor = False } ) [Draft, VotingReady, Locked] @@ -480,6 +556,8 @@ insufficientVotesParameters = , stakeCount = 1 , signByAllCosigners = True , perStakeGTs = 20 + , moveGovernorST = False + , modifyGovernor = False } insufficientCosignsParameters :: Int -> Parameters @@ -500,6 +578,8 @@ advanceFromFinishedParameters = , stakeCount = 1 , signByAllCosigners = True , perStakeGTs = 20 + , moveGovernorST = False + , modifyGovernor = False } invalidOutputStakeParameters :: Int -> [Parameters] @@ -512,8 +592,8 @@ invalidOutputStakeParameters nCosigners = {- | Create a test tree that runs the stake validator and proposal validator to test the advancing functionalities. -} -mkTestTree :: String -> Parameters -> Bool -> SpecificationTree -mkTestTree name ps isValidForProposalValidator = group name [proposal, stake] +mkTestTree :: String -> Parameters -> Bool -> Maybe Bool -> SpecificationTree +mkTestTree name ps isValidForProposalValidator isValidForGovernorValidator = group name final where txInfo = advance ps @@ -544,3 +624,20 @@ mkTestTree name ps isValidForProposalValidator = group name [proposal, stake] txInfo (mkStakeScriptPurpose idx) ) + + proposalAndStake = [proposal, stake] + + governor = + if ps.moveGovernorST + then + singleton $ + testValidator + (fromJust isValidForGovernorValidator) + "governor" + (governorValidator Shared.governor) + governorInputDatum + governorRedeemer + (ScriptContext txInfo governorScriptPurpose) + else mempty + + final = proposalAndStake <> governor diff --git a/agora-specs/Sample/Proposal/Shared.hs b/agora-specs/Sample/Proposal/Shared.hs index 0082f68..d2def9f 100644 --- a/agora-specs/Sample/Proposal/Shared.hs +++ b/agora-specs/Sample/Proposal/Shared.hs @@ -5,7 +5,7 @@ Description: Shared constants for propsoal samples Shared constants for propsoal samples. -} -module Sample.Proposal.Shared (proposalTxRef, stakeTxRef) where +module Sample.Proposal.Shared (proposalTxRef, stakeTxRef, governorTxRef) where import PlutusLedgerApi.V1 (TxId) @@ -16,3 +16,6 @@ proposalTxRef = "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be" -- | 'TxId' of all the stake inputs in the samples. stakeTxRef :: TxId stakeTxRef = "0ca36f3a357bc69579ab2531aecd1e7d3714d993c7820f40b864be15" + +governorTxRef :: TxId +governorTxRef = "cb076140e80d240f9c89e478aedbddbe6f4734fecbd0ae3e37404c12e7798c0f" diff --git a/agora-specs/Spec/Proposal.hs b/agora-specs/Spec/Proposal.hs index a05d147..d7a712a 100644 --- a/agora-specs/Spec/Proposal.hs +++ b/agora-specs/Spec/Proposal.hs @@ -147,6 +147,7 @@ specs = nCosigners ) True + Nothing , Advance.mkTestTree "to failed state" ( head $ @@ -154,6 +155,7 @@ specs = nCosigners ) True + Nothing ] illegalGroup = @@ -163,10 +165,12 @@ specs = "insufficient cosigns" (Advance.insufficientCosignsParameters nCosigners) False + Nothing , Advance.mkTestTree "invalid stake output" (head $ Advance.invalidOutputStakeParameters nCosigners) False + Nothing ] in group name [legalGroup, illegalGroup] @@ -179,14 +183,14 @@ specs = map ( \ps -> let name = "from: " <> show ps.fromStatus - in Advance.mkTestTree name ps True + in Advance.mkTestTree name ps True (Just True) ) (tail $ Advance.advanceToNextStateInTimeParameters 1) , group "advance to failed state" $ map ( \ps -> let name = "from: " <> show ps.fromStatus - in Advance.mkTestTree name ps True + in Advance.mkTestTree name ps True (Just True) ) (tail $ Advance.advanceToFailedStateDueToTimeoutParameters 1) ] @@ -198,10 +202,12 @@ specs = "insufficient votes" Advance.insufficientVotesParameters False + Nothing , Advance.mkTestTree "initial state is Finished" Advance.advanceFromFinishedParameters False + Nothing , group "invalid stake output" $ do @@ -213,7 +219,7 @@ specs = <> show nStake <> " stakes" - pure $ Advance.mkTestTree name ps False + pure $ Advance.mkTestTree name ps False (Just True) ] in [draftGroup, legalGroup, illegalGroup] , group "unlocking" $ diff --git a/agora/Agora/Proposal/Scripts.hs b/agora/Agora/Proposal/Scripts.hs index ad64b58..247b56e 100644 --- a/agora/Agora/Proposal/Scripts.hs +++ b/agora/Agora/Proposal/Scripts.hs @@ -76,7 +76,7 @@ import Plutarch.Extra.TermCont ( ) import Plutarch.SafeMoney (PDiscrete (..)) import Plutarch.Unsafe (punsafeCoerce) -import PlutusLedgerApi.V1.Value (AssetClass (AssetClass)) +import PlutusLedgerApi.V1.Value (AssetClass (AssetClass, unAssetClass)) {- | Policy for Proposals. @@ -651,12 +651,29 @@ proposalValidator proposal = pguardC "Cannot advance ahead of time" notTooEarly pguardC "Finished proposals cannot be advanced" $ pnot # isFinished + let gstSymbol = + pconstant $ + fst $ + unAssetClass proposal.governorSTAssetClass + + gstMoved <- + pletC $ + pany + # plam + ( \( (pfield @"value" #) + . (pfield @"resolved" #) + . pfromData -> + value + ) -> + psymbolValueOf # gstSymbol # value #== 1 + ) + # txInfoF.inputs + let toFailedState = unTermCont $ do pguardC "Proposal should fail: not on time" $ proposalOutStatus #== pconstant Finished - -- TODO: Should check that the GST is not moved - -- if the proposal is in 'Locked' state. + pguardC "GST not moved" $ pnot # gstMoved pure $ pconstant () @@ -677,6 +694,8 @@ proposalValidator proposal = pguardC "Proposal status set to Finished" $ proposalOutStatus #== pconstant Finished + pguardC "GST moved" gstMoved + -- TODO: Perform other necessary checks. pure $ pconstant () _ -> pconstant () diff --git a/bench.csv b/bench.csv index e9ef945..4ea97f2 100644 --- a/bench.csv +++ b/bench.csv @@ -29,11 +29,11 @@ Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Locked/stake,153960499,403133,5404 Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/proposal,33689644,100286,2002 Agora/Proposal/policy (proposal creation)/illegal/invalid proposal status/Finished/stake,153960499,403133,5404 -Agora/Proposal/validator/cosignature/legal/with 1 cosigners/propsoal,235405219,657707,8151 +Agora/Proposal/validator/cosignature/legal/with 1 cosigners/propsoal,235543219,658307,8360 Agora/Proposal/validator/cosignature/legal/with 1 cosigners/stake,118915099,307672,5213 -Agora/Proposal/validator/cosignature/legal/with 5 cosigners/propsoal,670429262,1868318,10781 +Agora/Proposal/validator/cosignature/legal/with 5 cosigners/propsoal,670567262,1868918,10990 Agora/Proposal/validator/cosignature/legal/with 5 cosigners/stake,549710287,1450080,7723 -Agora/Proposal/validator/cosignature/legal/with 10 cosigners/propsoal,1328551536,3641835,14069 +Agora/Proposal/validator/cosignature/legal/with 10 cosigners/propsoal,1328689536,3642435,14278 Agora/Proposal/validator/cosignature/legal/with 10 cosigners/stake,1097682628,2902865,10860 Agora/Proposal/validator/cosignature/illegal/duplicate cosigners/stake,118915099,307672,5213 Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 1 cosigners/status: VotingReady/stake,118915099,307672,5213 @@ -45,89 +45,92 @@ Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 5 co Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 10 cosigners/status: VotingReady/stake,1097682628,2902865,10860 Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 10 cosigners/status: Locked/stake,1097682628,2902865,10860 Agora/Proposal/validator/cosignature/illegal/proposal status not Draft/with 10 cosigners/status: Finished/stake,1097682628,2902865,10860 -Agora/Proposal/validator/voting/legal/propsoal,253541830,711367,8133 +Agora/Proposal/validator/voting/legal/propsoal,253679830,711967,8342 Agora/Proposal/validator/voting/legal/stake,136152299,356425,5239 -Agora/Proposal/validator/advancing/from draft/with 1 cosigner(s)/legal/to next state/propsoal,222392288,630302,8114 +Agora/Proposal/validator/advancing/from draft/with 1 cosigner(s)/legal/to next state/propsoal,222530288,630902,8323 Agora/Proposal/validator/advancing/from draft/with 1 cosigner(s)/legal/to next state/stake,118915099,307672,5222 -Agora/Proposal/validator/advancing/from draft/with 1 cosigner(s)/legal/to failed state/propsoal,217337596,619581,8116 +Agora/Proposal/validator/advancing/from draft/with 1 cosigner(s)/legal/to failed state/propsoal,217475596,620181,8325 Agora/Proposal/validator/advancing/from draft/with 1 cosigner(s)/legal/to failed state/stake,118915099,307672,5224 Agora/Proposal/validator/advancing/from draft/with 1 cosigner(s)/illegal/insufficient cosigns/stake,118638207,307672,5152 -Agora/Proposal/validator/advancing/from draft/with 5 cosigner(s)/legal/to next state/propsoal,602596705,1722841,10969 +Agora/Proposal/validator/advancing/from draft/with 5 cosigner(s)/legal/to next state/propsoal,602734705,1723441,11178 Agora/Proposal/validator/advancing/from draft/with 5 cosigner(s)/legal/to next state/stake,496218319,1294304,7957 -Agora/Proposal/validator/advancing/from draft/with 5 cosigner(s)/legal/to failed state/propsoal,239706944,681645,8477 +Agora/Proposal/validator/advancing/from draft/with 5 cosigner(s)/legal/to failed state/propsoal,239844944,682245,8686 Agora/Proposal/validator/advancing/from draft/with 5 cosigner(s)/legal/to failed state/stake,118915099,307672,5465 Agora/Proposal/validator/advancing/from draft/with 5 cosigner(s)/illegal/insufficient cosigns/stake,447610813,1171578,7606 -Agora/Proposal/validator/advancing/from draft/with 10 cosigner(s)/legal/to next state/propsoal,1183788938,3402248,14538 +Agora/Proposal/validator/advancing/from draft/with 10 cosigner(s)/legal/to next state/propsoal,1183926938,3402848,14747 Agora/Proposal/validator/advancing/from draft/with 10 cosigner(s)/legal/to next state/stake,1125911200,2984885,11375 -Agora/Proposal/validator/advancing/from draft/with 10 cosigner(s)/legal/to failed state/propsoal,267668629,759225,8930 +Agora/Proposal/validator/advancing/from draft/with 10 cosigner(s)/legal/to failed state/propsoal,267806629,759825,9139 Agora/Proposal/validator/advancing/from draft/with 10 cosigner(s)/legal/to failed state/stake,118915099,307672,5767 Agora/Proposal/validator/advancing/from draft/with 10 cosigner(s)/illegal/insufficient cosigns/stake,1013739927,2699971,10673 -Agora/Proposal/validator/advancing/legal/advance to next state/from: VotingReady/propsoal,253438293,715975,8123 +Agora/Proposal/validator/advancing/legal/advance to next state/from: VotingReady/propsoal,272116829,760091,8332 Agora/Proposal/validator/advancing/legal/advance to next state/from: VotingReady/stake,118915099,307672,5229 -Agora/Proposal/validator/advancing/legal/advance to next state/from: Locked/propsoal,242199184,683144,8123 -Agora/Proposal/validator/advancing/legal/advance to next state/from: Locked/stake,118915099,307672,5229 -Agora/Proposal/validator/advancing/legal/advance to failed state/from: VotingReady/propsoal,239371739,677134,8117 +Agora/Proposal/validator/advancing/legal/advance to next state/from: Locked/propsoal,295366820,822071,8771 +Agora/Proposal/validator/advancing/legal/advance to next state/from: Locked/stake,156324691,401372,5668 +Agora/Proposal/validator/advancing/legal/advance to next state/from: Locked/governor,258411069,667386,8946 +Agora/Proposal/validator/advancing/legal/advance to failed state/from: VotingReady/propsoal,258602387,722952,8326 Agora/Proposal/validator/advancing/legal/advance to failed state/from: VotingReady/stake,118915099,307672,5225 -Agora/Proposal/validator/advancing/legal/advance to failed state/from: Locked/propsoal,240502717,679538,8117 +Agora/Proposal/validator/advancing/legal/advance to failed state/from: Locked/propsoal,259733365,725356,8326 Agora/Proposal/validator/advancing/legal/advance to failed state/from: Locked/stake,118915099,307672,5225 Agora/Proposal/validator/advancing/illegal/insufficient votes/stake,118915099,307672,5225 Agora/Proposal/validator/advancing/illegal/initial state is Finished/stake,118915099,307672,5217 +Agora/Proposal/validator/advancing/illegal/invalid stake output/from Lockedwith 1 stakes/governor,258411069,667386,8946 +Agora/Proposal/validator/advancing/illegal/invalid stake output/from Lockedwith 5 stakes/governor,265599017,688074,9187 Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: retract votes while voting/stake,125083340,324576,5219 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: retract votes while voting/propsoal,236436652,664524,8114 +Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: retract votes while voting/propsoal,236574652,665124,8323 Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: retract votes while voting/stake,128314586,333630,5235 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: retract votes while voting/propsoal,249908859,704466,8125 +Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: retract votes while voting/propsoal,250046859,705066,8334 Agora/Proposal/validator/unlocking/legal/with 1 proposals/creator: remove creator locks when finished/stake,125083340,324576,5217 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/creator: remove creator locks when finished/propsoal,204228787,584379,8111 +Agora/Proposal/validator/unlocking/legal/with 1 proposals/creator: remove creator locks when finished/propsoal,204366787,584979,8320 Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove all locks when finished/stake,125083340,324576,5233 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove all locks when finished/propsoal,212663044,609283,8123 +Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove all locks when finished/propsoal,212801044,609883,8332 Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Locked/stake,125083340,324576,5223 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Locked/propsoal,205544939,588263,8118 +Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Locked/propsoal,205682939,588863,8327 Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Finished/stake,125083340,324576,5223 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Finished/propsoal,205544939,588263,8118 +Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter: unlock after voting/Finished/propsoal,205682939,588863,8327 Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove vote locks when locked/stake,128314586,333630,5239 -Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove vote locks when locked/propsoal,219548722,629597,8129 +Agora/Proposal/validator/unlocking/legal/with 1 proposals/voter/creator: remove vote locks when locked/propsoal,219686722,630197,8338 Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: retract votes while voting/stake,259870480,666572,7303 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: retract votes while voting/propsoal,379077900,1077188,10174 +Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: retract votes while voting/propsoal,379215900,1077788,10383 Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: retract votes while voting/stake,276026710,711842,7380 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: retract votes while voting/propsoal,444606435,1268442,10226 +Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: retract votes while voting/propsoal,444744435,1269042,10435 Agora/Proposal/validator/unlocking/legal/with 5 proposals/creator: remove creator locks when finished/stake,259870480,666572,7293 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/creator: remove creator locks when finished/propsoal,312309599,902235,10167 +Agora/Proposal/validator/unlocking/legal/with 5 proposals/creator: remove creator locks when finished/propsoal,312447599,902835,10376 Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove all locks when finished/stake,259870480,666572,7374 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove all locks when finished/propsoal,350698580,1013987,10220 +Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove all locks when finished/propsoal,350836580,1014587,10429 Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Locked/stake,259870480,666572,7324 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Locked/propsoal,317778859,917311,10195 +Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Locked/propsoal,317916859,917911,10404 Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Finished/stake,259870480,666572,7324 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Finished/propsoal,317778859,917311,10195 +Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter: unlock after voting/Finished/propsoal,317916859,917911,10404 Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove vote locks when locked/stake,276026710,711842,7400 -Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove vote locks when locked/propsoal,383838970,1109957,10246 +Agora/Proposal/validator/unlocking/legal/with 5 proposals/voter/creator: remove vote locks when locked/propsoal,383976970,1110557,10455 Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: retract votes while voting/stake,428354405,1094067,9909 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: retract votes while voting/propsoal,557379460,1593018,12750 +Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: retract votes while voting/propsoal,557517460,1593618,12959 Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: retract votes while voting/stake,460666865,1184607,10060 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: retract votes while voting/propsoal,687978405,1973412,12851 +Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: retract votes while voting/propsoal,688116405,1974012,13060 Agora/Proposal/validator/unlocking/legal/with 10 proposals/creator: remove creator locks when finished/stake,428354405,1094067,9888 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/creator: remove creator locks when finished/propsoal,447410614,1299555,12737 +Agora/Proposal/validator/unlocking/legal/with 10 proposals/creator: remove creator locks when finished/propsoal,447548614,1300155,12946 Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove all locks when finished/stake,428354405,1094067,10049 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove all locks when finished/propsoal,523243000,1519867,12840 +Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove all locks when finished/propsoal,523381000,1520467,13049 Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Locked/stake,428354405,1094067,9949 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Locked/propsoal,458071259,1328621,12790 +Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Locked/propsoal,458209259,1329221,12999 Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Finished/stake,428354405,1094067,9949 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Finished/propsoal,458071259,1328621,12790 +Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter: unlock after voting/Finished/propsoal,458209259,1329221,12999 Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove vote locks when locked/stake,460666865,1184607,10100 -Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove vote locks when locked/propsoal,589201780,1710407,12891 +Agora/Proposal/validator/unlocking/legal/with 10 proposals/voter/creator: remove vote locks when locked/propsoal,589339780,1711007,13100 Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: retract votes while voting/stake,1506651525,3830035,26674 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: retract votes while voting/propsoal,1698509444,4894330,29304 +Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: retract votes while voting/propsoal,1698647444,4894930,29513 Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: retract votes while voting/stake,1642363857,4210303,27362 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: retract votes while voting/propsoal,2245559013,6485220,29763 +Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: retract votes while voting/propsoal,2245697013,6485820,29972 Agora/Proposal/validator/unlocking/legal/with 42 proposals/creator: remove creator locks when finished/stake,1506651525,3830035,26590 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/creator: remove creator locks when finished/propsoal,1312057110,3842403,29260 +Agora/Proposal/validator/unlocking/legal/with 42 proposals/creator: remove creator locks when finished/propsoal,1312195110,3843003,29469 Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove all locks when finished/stake,1506651525,3830035,27301 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove all locks when finished/propsoal,1627527288,4757499,29702 +Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove all locks when finished/propsoal,1627665288,4758099,29911 Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Locked/stake,1506651525,3830035,26843 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Locked/propsoal,1355942619,3961005,29473 +Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Locked/propsoal,1356080619,3961605,29682 Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Finished/stake,1506651525,3830035,26843 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Finished/propsoal,1355942619,3961005,29473 +Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter: unlock after voting/Finished/propsoal,1356080619,3961605,29682 Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove vote locks when locked/stake,1642363857,4210303,27531 -Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove vote locks when locked/propsoal,1903523764,5553287,29932 +Agora/Proposal/validator/unlocking/legal/with 42 proposals/voter/creator: remove vote locks when locked/propsoal,1903661764,5553887,30141 "Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Voter, status: Draft/stake",125083340,324576,5219 "Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Voter, status: Locked/stake",125083340,324576,5219 "Agora/Proposal/validator/unlocking/illegal/with 1 proposals/retract votes while not voting/role: Voter, status: Finished/stake",125083340,324576,5219