From 92c64f8d7a2f6946bf3b02cf166dc48ce5f22ee5 Mon Sep 17 00:00:00 2001 From: fanghr Date: Wed, 18 May 2022 20:34:56 +0800 Subject: [PATCH] store timing config in the proposal datum .... and mock the value upon creation for now --- agora-sample/Sample/Governor.hs | 3 +++ agora-sample/Sample/Proposal.hs | 2 ++ agora-sample/Sample/Shared.hs | 13 +++++++++++++ agora-test/Spec/Proposal.hs | 3 ++- agora/Agora/Governor/Scripts.hs | 13 +++++++++++++ agora/Agora/Proposal.hs | 5 +++++ agora/Agora/Proposal/Scripts.hs | 3 +++ agora/Agora/Proposal/Time.hs | 28 +++++++++++++++++++++++++++- 8 files changed, 68 insertions(+), 2 deletions(-) diff --git a/agora-sample/Sample/Governor.hs b/agora-sample/Sample/Governor.hs index ff5f0bf..f1c8f38 100644 --- a/agora-sample/Sample/Governor.hs +++ b/agora-sample/Sample/Governor.hs @@ -73,6 +73,7 @@ import Sample.Shared ( gstUTXORef, minAda, proposalPolicySymbol, + proposalTimingConfig, proposalValidatorAddress, signer, signer2, @@ -234,6 +235,7 @@ createProposal = , cosigners = [signer] , thresholds = defaultProposalThresholds , votes = emptyVotesFor effects + , timingConfig = proposalTimingConfig } ) proposalOutput :: TxOut @@ -408,6 +410,7 @@ mintGATs = , cosigners = [signer, signer2] , thresholds = defaultProposalThresholds , votes = proposalVotes + , timingConfig = proposalTimingConfig } proposalInputDatum :: Datum proposalInputDatum = Datum $ toBuiltinData proposalInputDatum' diff --git a/agora-sample/Sample/Proposal.hs b/agora-sample/Sample/Proposal.hs index e778fca..7853606 100644 --- a/agora-sample/Sample/Proposal.hs +++ b/agora-sample/Sample/Proposal.hs @@ -74,6 +74,7 @@ proposalCreation = , cosigners = [signer] , thresholds = defaultProposalThresholds , votes = emptyVotesFor effects + , timingConfig = proposalTimingConfig } ) @@ -167,6 +168,7 @@ cosignProposal newSigners = , cosigners = [signer] , thresholds = defaultProposalThresholds , votes = emptyVotesFor effects + , timingConfig = proposalTimingConfig } stakeDatum :: StakeDatum stakeDatum = StakeDatum (Tagged 50_000_000) signer2 [] diff --git a/agora-sample/Sample/Shared.hs b/agora-sample/Sample/Shared.hs index c6f40a7..71f2192 100644 --- a/agora-sample/Sample/Shared.hs +++ b/agora-sample/Sample/Shared.hs @@ -36,6 +36,7 @@ module Sample.Shared ( proposalPolicySymbol, proposalValidatorHash, proposalValidatorAddress, + proposalTimingConfig, -- ** Authority authorityToken, @@ -74,6 +75,9 @@ import Agora.Proposal ( Proposal (..), ProposalThresholds (..), ) +import Agora.Proposal.Time ( + ProposalTimingConfig (..), + ) import Agora.Stake (Stake (..)) import Agora.Treasury (treasuryValidator) import Agora.Utils (validatorHashToTokenName) @@ -184,6 +188,15 @@ authorityToken = authorityTokenFromGovernor governor authorityTokenSymbol :: CurrencySymbol authorityTokenSymbol = authorityTokenSymbolFromGovernor governor +proposalTimingConfig :: ProposalTimingConfig +proposalTimingConfig = + ProposalTimingConfig + { draftTime = 0 + , votingTime = 1000 + , lockingTime = 2000 + , executingTime = 3000 + } + ------------------------------------------------------------------ treasuryOut :: TxOut diff --git a/agora-test/Spec/Proposal.hs b/agora-test/Spec/Proposal.hs index cb049ed..a9caafb 100644 --- a/agora-test/Spec/Proposal.hs +++ b/agora-test/Spec/Proposal.hs @@ -13,7 +13,7 @@ module Spec.Proposal (tests) where import Agora.Proposal ( Proposal (..), - ProposalDatum (ProposalDatum), + ProposalDatum (..), ProposalId (ProposalId), ProposalRedeemer (Cosign), ProposalStatus (Draft), @@ -77,6 +77,7 @@ tests = [ (ResultTag 0, AssocMap.empty) , (ResultTag 1, AssocMap.empty) ] + , timingConfig = Shared.proposalTimingConfig } ) (Cosign [signer2]) diff --git a/agora/Agora/Governor/Scripts.hs b/agora/Agora/Governor/Scripts.hs index 8389f1d..d424db5 100644 --- a/agora/Agora/Governor/Scripts.hs +++ b/agora/Agora/Governor/Scripts.hs @@ -126,6 +126,7 @@ import Plutarch.TryFrom (ptryFrom) -------------------------------------------------------------------------------- +import Agora.Proposal.Time (ProposalTimingConfig (..)) import Plutus.V1.Ledger.Api ( CurrencySymbol (..), MintingPolicy, @@ -576,6 +577,8 @@ governorValidator gov = .& #cosigners .= proposalInputDatumF.cosigners .& #thresholds .= proposalInputDatumF.thresholds .& #votes .= proposalInputDatumF.votes + -- FIXME: copy from the governor datum + .& #timingConfig .= pdata (pconstant tmpTimingConfig) ) tcassert "Unexpected output proposal datum" $ @@ -727,6 +730,16 @@ governorValidator gov = let sym = governorSTSymbolFromGovernor gov in phoistAcyclic $ pconstant sym + -- TODO: remove this. This is temperary. + tmpTimingConfig :: ProposalTimingConfig + tmpTimingConfig = + ProposalTimingConfig + { draftTime = 0 + , votingTime = 1000 + , lockingTime = 2000 + , executingTime = 3000 + } + -------------------------------------------------------------------------------- -- | Get the 'CurrencySymbol' of GST. diff --git a/agora/Agora/Proposal.hs b/agora/Agora/Proposal.hs index 3c82fe3..21407d3 100644 --- a/agora/Agora/Proposal.hs +++ b/agora/Agora/Proposal.hs @@ -44,6 +44,8 @@ import PlutusTx qualified import PlutusTx.AssocMap qualified as AssocMap -------------------------------------------------------------------------------- + +import Agora.Proposal.Time (PProposalTimingConfig, ProposalTimingConfig) import Agora.SafeMoney (GTTag) import Agora.Utils (pkeysEqual, pnotNull) import Control.Applicative (Const) @@ -186,6 +188,8 @@ data ProposalDatum = ProposalDatum -- ^ Thresholds copied over on initialization. , votes :: ProposalVotes -- ^ Vote tally on the proposal + , timingConfig :: ProposalTimingConfig + -- ^ Timing configuration copied over on initialization. } deriving stock (Eq, Show, GHC.Generic) @@ -354,6 +358,7 @@ newtype PProposalDatum (s :: S) = PProposalDatum , "cosigners" ':= PBuiltinList (PAsData PPubKeyHash) , "thresholds" ':= PProposalThresholds , "votes" ':= PProposalVotes + , "timingConfig" ':= PProposalTimingConfig ] ) } diff --git a/agora/Agora/Proposal/Scripts.hs b/agora/Agora/Proposal/Scripts.hs index f09e90b..d56e146 100644 --- a/agora/Agora/Proposal/Scripts.hs +++ b/agora/Agora/Proposal/Scripts.hs @@ -151,6 +151,7 @@ proposalValidator proposal = , "cosigners" , "thresholds" , "votes" + , "timingConfig" ] proposalDatum @@ -253,6 +254,7 @@ proposalValidator proposal = .& #cosigners .= proposalF.cosigners .& #thresholds .= proposalF.thresholds .& #votes .= pdata expectedNewVotes + .& #timingConfig .= proposalF.timingConfig ) tcassert "Invalid output proposal" $ proposalOut #== expectedProposalOut @@ -342,6 +344,7 @@ proposalValidator proposal = .& #cosigners .= pdata updatedSigs .& #thresholds .= proposalF.thresholds .& #votes .= proposalF.votes + .& #timingConfig .= proposalF.timingConfig ) ) in foldr1 diff --git a/agora/Agora/Proposal/Time.hs b/agora/Agora/Proposal/Time.hs index afc4339..54fed1a 100644 --- a/agora/Agora/Proposal/Time.hs +++ b/agora/Agora/Proposal/Time.hs @@ -39,7 +39,12 @@ import Plutarch.Api.V1 ( PPOSIXTimeRange, PUpperBound (PUpperBound), ) -import Plutarch.DataRepr (PDataFields, PIsDataReprInstances (..)) +import Plutarch.DataRepr (DerivePConstantViaData (..), PDataFields, PIsDataReprInstances (..)) +import Plutarch.Lift ( + DerivePConstantViaNewtype (..), + PConstantDecl, + PUnsafeLiftDecl (..), + ) import Plutarch.Numeric (AdditiveSemigroup ((+))) import Plutarch.Unsafe (punsafeCoerce) import Plutus.V1.Ledger.Time (POSIXTime) @@ -122,10 +127,24 @@ newtype PProposalTime (s :: S) (PlutusType, PIsData, PDataFields) via (PIsDataReprInstances PProposalTime) +instance PUnsafeLiftDecl PProposalTime where + type PLifted PProposalTime = ProposalTime +deriving via + (DerivePConstantViaData ProposalTime PProposalTime) + instance + (PConstantDecl ProposalTime) + -- | Plutarch-level version of 'ProposalStartingTime'. newtype PProposalStartingTime (s :: S) = PProposalStartingTime (Term s PPOSIXTime) deriving (PlutusType, PIsData, PEq, POrd) via (DerivePNewtype PProposalStartingTime PPOSIXTime) +instance PUnsafeLiftDecl PProposalStartingTime where + type PLifted PProposalStartingTime = ProposalStartingTime +deriving via + (DerivePConstantViaNewtype ProposalStartingTime PProposalStartingTime PPOSIXTime) + instance + (PConstantDecl ProposalStartingTime) + -- | Plutarch-level version of 'ProposalTimingConfig'. newtype PProposalTimingConfig (s :: S) = PProposalTimingConfig { getProposalTimingConfig :: @@ -146,6 +165,13 @@ newtype PProposalTimingConfig (s :: S) = PProposalTimingConfig (PlutusType, PIsData, PDataFields) via (PIsDataReprInstances PProposalTimingConfig) +instance PUnsafeLiftDecl PProposalTimingConfig where + type PLifted PProposalTimingConfig = ProposalTimingConfig +deriving via + (DerivePConstantViaData ProposalTimingConfig PProposalTimingConfig) + instance + (PConstantDecl ProposalTimingConfig) + -------------------------------------------------------------------------------- -- FIXME: Orphan instance, move this to plutarch-extra.