diff --git a/agora/Agora/Governor/Scripts.hs b/agora/Agora/Governor/Scripts.hs index b0b6ea1..9ffcca3 100644 --- a/agora/Agora/Governor/Scripts.hs +++ b/agora/Agora/Governor/Scripts.hs @@ -87,7 +87,6 @@ import Plutarch.Extra.ScriptContext ( pvalueSpent, ) import Plutarch.Extra.TermCont (pguardC, pletC, pletFieldsC, pmatchC, ptryFromC) -import Plutarch.Extra.Tuple (pfstTuple, psndTuple) import Plutarch.Extra.Value (phasOnlyOneTokenOfCurrencySymbol, psymbolValueOf) import PlutusLedgerApi.V1 (TxOutRef) @@ -519,7 +518,7 @@ governorValidator as = let tagToken :: Term _ PTokenName tagToken = pmaybeData # pconstant "" # plam (pscriptHashToTokenName . pfromData) - #$ psndTuple # effect + #$ pfield @"scriptHash" # effect receiverScriptHash = passertPJust # "GAT receiver should be a script" #$ pscriptHashFromAddress # outputF.address @@ -530,7 +529,7 @@ governorValidator as = authorityTokens #== psingleton # (ppairDataBuiltin # pdata tagToken # pdata 1) hasCorrectDatum = - pfstTuple # effect #== pfromDatumHash # outputF.datum + pfield @"datumHash" # effect #== pfromDatumHash # outputF.datum pure $ foldr1 diff --git a/agora/Agora/Proposal.hs b/agora/Agora/Proposal.hs index 7674f7c..d3463d4 100644 --- a/agora/Agora/Proposal.hs +++ b/agora/Agora/Proposal.hs @@ -60,7 +60,6 @@ import Plutarch.Api.V2 ( PDatumHash, PMaybeData, PScriptHash, - PTuple, ) import Plutarch.DataRepr ( DerivePConstantViaData ( @@ -75,6 +74,7 @@ import Plutarch.Extra.IsData ( DerivePConstantViaDataList (DerivePConstantViaDataList), DerivePConstantViaEnum (DerivePConstantEnum), EnumIsData (EnumIsData), + PlutusTypeDataList, PlutusTypeEnumData, ProductIsData (ProductIsData), ) @@ -285,8 +285,35 @@ newtype ProposalVotes = ProposalVotes emptyVotesFor :: forall a. StrictMap.Map ResultTag a -> ProposalVotes emptyVotesFor = ProposalVotes . StrictMap.mapWithKey (const . const 0) +-- | @since 1.0.0 +data ProposalEffectMetadata = ProposalEffectMetadata + { datumHash :: DatumHash + -- ^ Hash of datum sent to effect validator with GAT + , scriptHash :: Maybe ScriptHash + -- ^ A 'ScriptHash' that encodes the authority script. + } + deriving stock + ( -- | @since 1.0.0 + Generic + , -- | @since 1.0.0 + Show + , -- | @since 1.0.0 + Eq + ) + deriving anyclass + ( -- | @since 1.0.0 + SOP.Generic + ) + deriving + ( -- | @since 1.0.0 + PlutusTx.ToData + , -- | @since 1.0.0 + PlutusTx.FromData + ) + via (ProductIsData ProposalEffectMetadata) + -- | @since 0.3.0 -type ProposalEffectGroup = StrictMap.Map ValidatorHash (DatumHash, Maybe ScriptHash) +type ProposalEffectGroup = StrictMap.Map ValidatorHash ProposalEffectMetadata {- | Haskell-level datum for Proposal scripts. @@ -608,6 +635,52 @@ deriving via instance (PConstantDecl ProposalVotes) +{- | Plutarch-level version of 'ProposalEffectMetadata'. + + @since 1.0.0 +-} +newtype PProposalEffectMetadata (s :: S) + = PProposalEffectMetadata + ( Term + s + ( PDataRecord + '[ "datumHash" ':= PDatumHash + , "scriptHash" ':= PMaybeData (PAsData PScriptHash) + ] + ) + ) + deriving stock + ( -- | @since 1.0.0 + Generic + ) + deriving anyclass + ( -- | @since 1.0.0 + PlutusType + , -- | @since 1.0.0 + PIsData + , -- | @since 1.0.0 + PEq + , -- | @since 1.0.0 + PDataFields + ) + +-- | @since 1.0.0 +instance DerivePlutusType PProposalEffectMetadata where + type DPTStrat _ = PlutusTypeDataList + +-- | @since 1.0.0 +instance PUnsafeLiftDecl PProposalEffectMetadata where + type PLifted _ = ProposalEffectMetadata + +-- | @since 1.0.0 +deriving via + (DerivePConstantViaDataList ProposalEffectMetadata PProposalEffectMetadata) + instance + (PConstantDecl ProposalEffectMetadata) + +-- | @since 1.0.0 +instance PTryFrom PData (PAsData PProposalEffectMetadata) + {- | The effect script hashes and their associated datum hash and authority check script hash belonging to a particular effect group or result. @@ -617,10 +690,7 @@ type PProposalEffectGroup = PMap 'Sorted PValidatorHash - ( PTuple - PDatumHash - (PMaybeData (PAsData PScriptHash)) - ) + PProposalEffectMetadata {- | Plutarch-level version of 'ProposalDatum'. @@ -657,12 +727,12 @@ newtype PProposalDatum (s :: S) = PProposalDatum -- | @since 0.2.0 instance DerivePlutusType PProposalDatum where - type DPTStrat _ = PlutusTypeNewtype + type DPTStrat _ = PlutusTypeDataList instance PTryFrom PData (PAsData PProposalDatum) -- | @since 0.1.0 -instance PUnsafeLiftDecl PProposalDatum where type PLifted PProposalDatum = ProposalDatum +instance PUnsafeLiftDecl PProposalDatum where type PLifted _ = ProposalDatum -- | @since 0.1.0 deriving via (DerivePConstantViaDataList ProposalDatum PProposalDatum) instance (PConstantDecl ProposalDatum) diff --git a/agora/Agora/Stake.hs b/agora/Agora/Stake.hs index efd6f37..27bb0b7 100644 --- a/agora/Agora/Stake.hs +++ b/agora/Agora/Stake.hs @@ -44,6 +44,7 @@ import Plutarch.DataRepr ( import Plutarch.Extra.Field (pletAll) import Plutarch.Extra.IsData ( DerivePConstantViaDataList (DerivePConstantViaDataList), + PlutusTypeDataList, ProductIsData (ProductIsData), ) import Plutarch.Extra.List (pnotNull) @@ -51,7 +52,7 @@ import Plutarch.Extra.Sum (PSum (PSum)) import Plutarch.Extra.Traversable (pfoldMap) import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted)) import Plutarch.Orphans () -import Plutarch.SafeMoney (PDiscrete) +import Plutarch.SafeMoney (Discrete, PDiscrete) import PlutusLedgerApi.V2 (Credential) import PlutusTx qualified import Prelude hiding (Num (..)) @@ -170,7 +171,7 @@ PlutusTx.makeIsDataIndexed @since 0.1.0 -} data StakeDatum = StakeDatum - { stakedAmount :: Tagged GTTag Integer + { stakedAmount :: Discrete GTTag -- ^ Tracks the amount of governance token staked in the datum. -- This also acts as the voting weight for 'Agora.Proposal.Proposal's. , owner :: Credential @@ -234,7 +235,7 @@ newtype PStakeDatum (s :: S) = PStakeDatum ) instance DerivePlutusType PStakeDatum where - type DPTStrat _ = PlutusTypeNewtype + type DPTStrat _ = PlutusTypeDataList -- | @since 0.1.0 instance Plutarch.Lift.PUnsafeLiftDecl PStakeDatum where