use lpe's AssetClass; fix errors

This commit is contained in:
Hongrui Fang 2022-10-19 22:46:57 +08:00
parent 6ae1dcdb40
commit cac856f4eb
24 changed files with 195 additions and 196 deletions

View file

@ -28,7 +28,7 @@ import Plutarch.Api.V2 (
PTxInfo (PTxInfo),
PTxOut (PTxOut),
)
import Plutarch.Extra.AssetClass (PAssetClass, passetClass, passetClassValueOf)
import Plutarch.Extra.AssetClass (PAssetClassData, ptoScottEncoding)
import "liqwid-plutarch-extra" Plutarch.Extra.List (plookupAssoc)
import Plutarch.Extra.ScriptContext (pisTokenSpent)
import Plutarch.Extra.Sum (PSum (PSum))
@ -132,7 +132,7 @@ singleAuthorityTokenBurned gatCs inputs mint = unTermCont $ do
@since 0.1.0
-}
authorityTokenPolicy :: ClosedTerm (PAssetClass :--> PMintingPolicy)
authorityTokenPolicy :: ClosedTerm (PAssetClassData :--> PMintingPolicy)
authorityTokenPolicy =
plam $ \atAssetClass _redeemer ctx' ->
pmatch ctx' $ \(PScriptContext ctx') -> unTermCont $ do
@ -141,12 +141,16 @@ authorityTokenPolicy =
txInfo <- pletFieldsC @'["inputs", "mint", "outputs"] txInfo'
let inputs = txInfo.inputs
mintedValue = pfromData txInfo.mint
govTokenSpent = pisTokenSpent # atAssetClass # inputs
govTokenSpent = pisTokenSpent # (ptoScottEncoding # atAssetClass) # inputs
PMinting ownSymbol' <- pmatchC $ pfromData ctx.purpose
let ownSymbol = pfromData $ pfield @"_0" # ownSymbol'
mintedATs = passetClassValueOf # mintedValue # (passetClass # ownSymbol # pconstant "")
mintedATs =
psymbolValueOf
# ownSymbol
# mintedValue
pure $
pif
(0 #< mintedATs)

View file

@ -17,15 +17,10 @@ import Agora.Treasury (treasuryValidator)
import Data.Map (fromList)
import Data.Text (Text, unpack)
import Plutarch (Config)
import Plutarch.Extra.AssetClass (PAssetClass)
import PlutusLedgerApi.V1.Value (AssetClass)
import Ply (TypedScriptEnvelope)
import Ply.Plutarch.Class (PlyArgOf)
import Ply.Plutarch.TypedWriter (TypedWriter, mkEnvelope)
import ScriptExport.ScriptInfo (RawScriptExport (..))
type instance PlyArgOf PAssetClass = AssetClass
{- | Parameterize core scripts, given the 'Agora.Governor.Governor'
parameters and plutarch configurations.

View file

@ -155,7 +155,7 @@ mutateGovernorValidator =
effectDatumF <- pletAllC effectDatum
txInfoF <- pletFieldsC @'["inputs", "outputs", "datums", "redeemers"] txInfo
----------------------------------------------------------------------------
--------------------------------------------------------------------------
scriptInputs <-
pletC $
@ -184,13 +184,13 @@ mutateGovernorValidator =
isGovernorInput =
foldl1
(#&&)
[ ptraceIfFalse "Can only modify the pinned governor" $
inputF.outRef #== effectDatumF.governorRef
, ptraceIfFalse "Governor UTxO should carry GST" $
[ ptraceIfFalse "Governor UTxO should carry GST" $
psymbolValueOf
# 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

View file

@ -46,6 +46,7 @@ import Plutarch.DataRepr (
DerivePConstantViaData (DerivePConstantViaData),
PDataFields,
)
import Plutarch.Extra.AssetClass (AssetClass)
import Plutarch.Extra.IsData (
DerivePConstantViaEnum (DerivePConstantEnum),
EnumIsData (EnumIsData),
@ -54,7 +55,6 @@ import Plutarch.Extra.IsData (
import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pletFieldsC)
import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted))
import PlutusLedgerApi.V1 (TxOutRef)
import PlutusLedgerApi.V1.Value (AssetClass)
import PlutusTx qualified
--------------------------------------------------------------------------------

View file

@ -55,10 +55,10 @@ import Plutarch.Api.V2 (
PTxOutRef,
PValidator,
)
import Plutarch.Extra.AssetClass (passetClass, passetClassValueOf)
import Plutarch.Extra.AssetClass (passetClass)
import Plutarch.Extra.Field (pletAll, pletAllC)
import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust, pmapMaybe)
import Plutarch.Extra.Map (pkeys, ptryLookup)
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.Record (mkRecordConstr, (.&), (.=))
@ -77,7 +77,7 @@ import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (
pmatchC,
ptryFromC,
)
import Plutarch.Extra.Value (psymbolValueOf)
import Plutarch.Extra.Value (passetClassValueOf, psymbolValueOf)
--------------------------------------------------------------------------------
@ -490,7 +490,7 @@ governorValidator =
proposalInputDatumF.status #== pconstantData Locked
-- Find the highest votes and the corresponding tag.
let quorum = pto $ pto $ pfromData $ pfield @"execute" # proposalInputDatumF.thresholds
let quorum = pto $ pfromData $ pfield @"execute" # proposalInputDatumF.thresholds
neutralOption = pneutralOption # proposalInputDatumF.effects
finalResultTag = pwinner # proposalInputDatumF.votes # quorum # neutralOption
@ -528,8 +528,8 @@ governorValidator =
gatAssetClass = passetClass # atSymbol # tagToken
valueGATCorrect =
passetClassValueOf
# outputF.value
# gatAssetClass #== 1
# gatAssetClass
# outputF.value #== 1
let hasCorrectDatum =
effect.datumHash #== pfromDatumHash # outputF.datum

View file

@ -8,8 +8,8 @@ import Data.Aeson qualified as Aeson
import Data.Map (fromList)
import Data.Tagged (untag)
import Plutarch.Api.V2 (mintingPolicySymbol, validatorHash)
import Plutarch.Extra.AssetClass (AssetClass (AssetClass))
import PlutusLedgerApi.V1 (Address, CurrencySymbol, TxOutRef, ValidatorHash)
import PlutusLedgerApi.V1.Value (AssetClass (AssetClass))
import Ply (
ScriptRole (MintingPolicyRole, ValidatorRole),
toMintingPolicy,
@ -72,7 +72,7 @@ linker = do
toMintingPolicy
govPol'
gstAssetClass =
AssetClass (gstSymbol, "")
AssetClass gstSymbol ""
govValHash = validatorHash $ toValidator govVal'
at = gstAssetClass
@ -89,14 +89,14 @@ linker = do
propValAddress =
validatorHashToAddress $ validatorHash $ toValidator propVal'
pstSymbol = mintingPolicySymbol $ toMintingPolicy propPol'
pstAssetClass = AssetClass (pstSymbol, "")
pstAssetClass = AssetClass pstSymbol ""
stakPol' = stkPol # untag governor.gtClassRef
stakVal' = stkVal # sstSymbol # pstAssetClass # untag governor.gtClassRef
sstSymbol = mintingPolicySymbol $ toMintingPolicy stakPol'
stakValTokenName =
validatorHashToTokenName $ validatorHash $ toValidator stakVal'
sstAssetClass = AssetClass (sstSymbol, stakValTokenName)
sstAssetClass = AssetClass sstSymbol stakValTokenName
treaVal' = treVal # atSymbol

View file

@ -8,8 +8,6 @@ import Data.Bifunctor (Bifunctor (bimap))
import Data.Map.Strict qualified as StrictMap
import Data.Traversable (for)
import Plutarch.Api.V1 (KeyGuarantees (Sorted), PMap)
import Plutarch.Num (PNum)
import Plutarch.SafeMoney (PDiscrete)
import PlutusTx qualified
import PlutusTx.AssocMap qualified as AssocMap
@ -76,6 +74,3 @@ instance
isSorted [] = True
isSorted [_] = True
isSorted (x : y : xs) = x < y && isSorted (y : xs)
-- | @since 1.0.0
deriving anyclass instance PNum (PDiscrete tag)

View file

@ -78,8 +78,9 @@ import Plutarch.Extra.IsData (
ProductIsData (ProductIsData),
)
import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust)
import Plutarch.Extra.Map qualified as PM
import "liqwid-plutarch-extra" Plutarch.Extra.Map qualified as PM
import Plutarch.Extra.Maybe (pfromJust)
import Plutarch.Extra.Tagged (PTagged)
import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC)
import Plutarch.Lift (
DerivePConstantViaNewtype (DerivePConstantViaNewtype),
@ -87,7 +88,6 @@ import Plutarch.Lift (
PUnsafeLiftDecl (type PLifted),
)
import Plutarch.Orphans ()
import Plutarch.SafeMoney (PDiscrete)
import PlutusLedgerApi.V2 (Credential, DatumHash, ScriptHash, ValidatorHash)
import PlutusTx qualified
@ -560,11 +560,11 @@ newtype PProposalThresholds (s :: S) = PProposalThresholds
Term
s
( PDataRecord
'[ "execute" ':= PDiscrete GTTag
, "create" ':= PDiscrete GTTag
, "toVoting" ':= PDiscrete GTTag
, "vote" ':= PDiscrete GTTag
, "cosign" ':= PDiscrete GTTag
'[ "execute" ':= PTagged GTTag PInteger
, "create" ':= PTagged GTTag PInteger
, "toVoting" ':= PTagged GTTag PInteger
, "vote" ':= PTagged GTTag PInteger
, "cosign" ':= PTagged GTTag PInteger
]
)
}

View file

@ -50,12 +50,11 @@ import Plutarch.Api.V2 (
PTxOut,
PValidator,
)
import Plutarch.Extra.AssetClass (PAssetClass, passetClass, passetClassValueOf)
import Plutarch.Extra.AssetClass (PAssetClassData, passetClass, ptoScottEncoding)
import Plutarch.Extra.Category (PCategory (pidentity))
import Plutarch.Extra.Comonad (pextract)
import Plutarch.Extra.Field (pletAll, pletAllC)
import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust)
import Plutarch.Extra.Map (pupdate)
import "plutarch-extra" Plutarch.Extra.Map (pupdate)
import Plutarch.Extra.Maybe (
passertPJust,
pisJust,
@ -80,8 +79,7 @@ import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (
ptryFromC,
)
import Plutarch.Extra.Traversable (pfoldMap)
import Plutarch.Extra.Value (psymbolValueOf)
import Plutarch.SafeMoney (PDiscrete (PDiscrete))
import Plutarch.Extra.Value (passetClassValueOf, psymbolValueOf)
import Plutarch.Unsafe (punsafeCoerce)
{- | Policy for Proposals.
@ -109,7 +107,7 @@ import Plutarch.Unsafe (punsafeCoerce)
@since 1.0.0
-}
proposalPolicy :: ClosedTerm (PAssetClass :--> PMintingPolicy)
proposalPolicy :: ClosedTerm (PAssetClassData :--> PMintingPolicy)
proposalPolicy =
plam $ \gtAssetClass _redeemer ctx' -> unTermCont $ do
PScriptContext ctx' <- pmatchC ctx'
@ -120,12 +118,12 @@ proposalPolicy =
PMinting ownSymbol' <- pmatchC $ pfromData ctx.purpose
let mintedProposalST =
passetClassValueOf
# pfromData txInfo.mint
# (passetClass # (pfield @"_0" # ownSymbol') # pconstant "")
# txInfo.mint
pguardC "Governance state-thread token must move" $
pisTokenSpent
# gtAssetClass
# (ptoScottEncoding # gtAssetClass)
# txInfo.inputs
pguardC "Minted exactly one proposal ST" $
@ -211,7 +209,7 @@ instance DerivePlutusType PStakeInputsContext where
-}
proposalValidator ::
ClosedTerm
( PAssetClass
( PAssetClassData
:--> PCurrencySymbol
:--> PCurrencySymbol
:--> PInteger
@ -304,8 +302,8 @@ proposalValidator =
let isStakeUTxO =
-- A stake UTxO is a UTxO that carries SST.
passetClassValueOf
# (ptoScottEncoding # sstClass)
# txOutF.value
# sstClass
#== 1
stake =
@ -495,9 +493,8 @@ proposalValidator =
PProposalVotes $
pupdate
# plam
( \votes -> unTermCont $ do
PDiscrete v <- pmatchC totalStakeAmount
pure $ pcon $ PJust $ votes + (pextract # v)
( \votes ->
pcon $ PJust $ votes + pto totalStakeAmount
)
# voteFor
# pto (pfromData proposalInputDatumF.votes)
@ -546,9 +543,8 @@ proposalValidator =
pisVoter # stakeRoles
voteCount =
pextract
#$ pto
$ pfromData stakeF.stakedAmount
pto $
pfromData stakeF.stakedAmount
newVotes =
pretractVotes

View file

@ -11,6 +11,7 @@ module Agora.SafeMoney (
GovernorSTTag,
StakeSTTag,
ProposalSTTag,
AuthorityTokenTag,
adaRef,
) where
@ -47,6 +48,12 @@ data StakeSTTag
-}
data ProposalSTTag
{- | Authority token.
@since 1.0.0
-}
data AuthorityTokenTag
{- | Resolves ada tags.
@since 0.1.0

View file

@ -64,16 +64,15 @@ import Plutarch.DataRepr (
import Plutarch.Extra.Field (pletAll)
import Plutarch.Extra.IsData (
DerivePConstantViaDataList (DerivePConstantViaDataList),
PlutusTypeDataList,
ProductIsData (ProductIsData),
)
import "liqwid-plutarch-extra" Plutarch.Extra.List (pfindJust)
import Plutarch.Extra.Maybe (passertPJust, pjust, pnothing)
import Plutarch.Extra.Sum (PSum (PSum))
import Plutarch.Extra.Tagged (PTagged)
import Plutarch.Extra.Traversable (pfoldMap)
import Plutarch.Lift (PConstantDecl, PUnsafeLiftDecl (PLifted))
import Plutarch.Orphans ()
import Plutarch.SafeMoney (Discrete, PDiscrete)
import PlutusLedgerApi.V2 (Credential)
import PlutusTx qualified
@ -193,7 +192,7 @@ PlutusTx.makeIsDataIndexed
@since 0.1.0
-}
data StakeDatum = StakeDatum
{ stakedAmount :: Discrete GTTag
{ stakedAmount :: Tagged GTTag Integer
-- ^ Tracks the amount of governance token staked in the datum.
-- This also acts as the voting weight for 'Agora.Proposal.Proposal's.
, owner :: Credential
@ -236,7 +235,7 @@ newtype PStakeDatum (s :: S) = PStakeDatum
Term
s
( PDataRecord
'[ "stakedAmount" ':= PDiscrete GTTag
'[ "stakedAmount" ':= PTagged GTTag PInteger
, "owner" ':= PCredential
, "delegatedTo" ':= PMaybeData (PAsData PCredential)
, "lockedBy" ':= PBuiltinList (PAsData PProposalLock)
@ -261,7 +260,7 @@ newtype PStakeDatum (s :: S) = PStakeDatum
)
instance DerivePlutusType PStakeDatum where
type DPTStrat _ = PlutusTypeDataList
type DPTStrat _ = PlutusTypeNewtype
-- | @since 1.0.0
instance PUnsafeLiftDecl PStakeDatum where
@ -282,7 +281,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" ':= PDiscrete GTTag]))
PDepositWithdraw (Term s (PDataRecord '["delta" ':= PTagged GTTag PInteger]))
| -- | Destroy a stake, retrieving its LQ, the minimum ADA and any other assets.
PDestroy (Term s (PDataRecord '[]))
| PPermitVote (Term s (PDataRecord '[]))
@ -493,7 +492,7 @@ instance DerivePlutusType PSigContext where
-}
data PStakeRedeemerContext (s :: S)
= -- | See also 'DepositWithdraw'.
PDepositWithdrawDelta (Term s (PDiscrete GTTag))
PDepositWithdrawDelta (Term s (PTagged GTTag PInteger))
| -- | See also 'DelegateTo'.
PSetDelegateTo (Term s PCredential)
| PNoMetadata

View file

@ -55,8 +55,6 @@ import Plutarch.Extra.Field (pletAll, pletAllC)
import Plutarch.Extra.Maybe (pdjust, pdnothing, pmaybeData)
import Plutarch.Extra.Record (mkRecordConstr, (.&), (.=))
import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (pguardC, pletC, pmatchC)
import Plutarch.Numeric.Additive (AdditiveMonoid (zero), AdditiveSemigroup ((+)))
import Prelude hiding (Num ((+)))
-- | A wrapper which ensures that no proposal is presented in the transaction.
pwithoutProposal ::
@ -393,7 +391,7 @@ pdepositWithdraw = phoistAcyclic $
newStakedAmount <- pletC $ stakeInputDatumF.stakedAmount + delta
pguardC "Non-negative staked amount" $ zero #<= newStakedAmount
pguardC "Non-negative staked amount" $ 0 #<= newStakedAmount
let expectedDatum =
mkRecordConstr

View file

@ -60,6 +60,7 @@ import Plutarch.Api.V1 (
PTokenName,
)
import Plutarch.Api.V1.AssocMap (plookup)
import Plutarch.Api.V1.Value (pvalueOf)
import Plutarch.Api.V2 (
PMintingPolicy,
PScriptPurpose (PMinting, PSpending),
@ -69,8 +70,8 @@ import Plutarch.Api.V2 (
)
import Plutarch.Extra.AssetClass (
PAssetClass,
passetClassValueOf,
pvalueOf,
PAssetClassData,
ptoScottEncoding,
)
import Plutarch.Extra.Field (pletAll)
import Plutarch.Extra.Functor (PFunctor (pfmap))
@ -98,12 +99,10 @@ import "liqwid-plutarch-extra" Plutarch.Extra.TermCont (
)
import Plutarch.Extra.Traversable (pfoldMap)
import Plutarch.Extra.Value (
passetClassValueOf,
psymbolValueOf,
)
import Plutarch.Num (PNum (pnegate))
import Plutarch.SafeMoney (
pvalueDiscrete,
)
import Plutarch.Unsafe (punsafeCoerce)
import Prelude hiding (Num ((+)))
@ -133,7 +132,7 @@ import Prelude hiding (Num ((+)))
-}
stakePolicy ::
-- | The (governance) token that a Stake can store.
ClosedTerm (PAssetClass :--> PMintingPolicy)
ClosedTerm (PAssetClassData :--> PMintingPolicy)
stakePolicy =
plam $ \gstClass _redeemer ctx' -> unTermCont $ do
ctx <- pletFieldsC @'["txInfo", "purpose"] ctx'
@ -217,7 +216,8 @@ stakePolicy =
let hasExpectedStake =
ptraceIfFalse "Stake ouput has expected amount of stake token" $
pvalueDiscrete # gstClass # outputF.value #== datumF.stakedAmount
passetClassValueOf # (ptoScottEncoding # gstClass) # outputF.value
#== pto (pfromData datumF.stakedAmount)
let ownerSignsTransaction =
ptraceIfFalse "Stake Owner should sign the transaction" $
pauthorizedBy
@ -400,10 +400,13 @@ mkStakeValidator impl sstSymbol pstClass gstClass =
# plam
( \output ->
let validateGT = plam $ \stakeDatum ->
let expected = pfield @"stakedAmount" # stakeDatum
let expected =
pto $
pfromData $
pfield @"stakedAmount" # stakeDatum
actual =
pvalueDiscrete
passetClassValueOf
# gstClass
# (pfield @"value" # output)
in pif
@ -438,8 +441,8 @@ mkStakeValidator impl sstSymbol pstClass gstClass =
flip pletAll $ \txOutF ->
let isProposalUTxO =
passetClassValueOf
# txOutF.value
# pstClass #== 1
# pstClass
# txOutF.value #== 1
proposalDatum =
pfromData $
pfromOutputDatum @(PAsData PProposalDatum)
@ -448,7 +451,7 @@ mkStakeValidator impl sstSymbol pstClass gstClass =
in pif isProposalUTxO (pjust # proposalDatum) pnothing
let pstMinted =
passetClassValueOf # txInfoF.mint # pstClass #== 1
passetClassValueOf # pstClass # txInfoF.mint #== 1
newProposalContext =
pcon $
@ -601,15 +604,25 @@ mkStakeValidator impl sstSymbol pstClass gstClass =
@since 1.0.0
-}
stakeValidator :: ClosedTerm (PCurrencySymbol :--> PAssetClass :--> PAssetClass :--> PValidator)
stakeValidator ::
ClosedTerm
( PCurrencySymbol
:--> PAssetClassData
:--> PAssetClassData
:--> PValidator
)
stakeValidator =
plam $
mkStakeValidator $
StakeRedeemerImpl
{ onDepositWithdraw = pdepositWithdraw
, onDestroy = pdestroy
, onPermitVote = ppermitVote
, onRetractVote = pretractVote
, onDelegateTo = pdelegateTo
, onClearDelegate = pclearDelegate
}
plam $ \cs pstClass gstClass ->
mkStakeValidator
( StakeRedeemerImpl
{ onDepositWithdraw = pdepositWithdraw
, onDestroy = pdestroy
, onPermitVote = ppermitVote
, onRetractVote = pretractVote
, onDelegateTo = pdelegateTo
, onClearDelegate = pclearDelegate
}
)
cs
(ptoScottEncoding # pstClass)
(ptoScottEncoding # gstClass)