commit ec70bfd539fe2e27fd48f5f76395400287ac72d7
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Tue Oct 18 18:58:59 2022 -0500
use LSE
commit 25fff9b3ad1f2dde4cd7cf36977530b06a87d23c
Merge: 01cd3aa 1821dd6
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Tue Oct 18 18:17:45 2022 -0500
Merge branch 'staging' into seungheonoh/ply
commit 01cd3aa7a235e6fe6658246ca1026fa26dc71a83
Author: Hongrui Fang <chfanghr@gmail.com>
Date: Tue Oct 11 12:02:03 2022 +0800
update benchmark
commit a8513244892ce33cfdc9edf8cd501c4985ae8008
Author: Hongrui Fang <chfanghr@gmail.com>
Date: Tue Oct 11 11:59:22 2022 +0800
fix tests
commit 20ca40823485c2e2f78253643cf4453ac7b7ddd5
Author: Hongrui Fang <chfanghr@gmail.com>
Date: Tue Oct 11 11:57:37 2022 +0800
better import
commit a19fe49424210891bd03db71e4083fc1e0edfd98
Author: Hongrui Fang <chfanghr@gmail.com>
Date: Tue Oct 11 11:08:20 2022 +0800
update flake inputs
commit c93b21f1f9441e5c6f54525bf7c6a54757ec36cc
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Mon Oct 10 12:54:12 2022 -0500
tried to make tests pass
commit 1046ae1237299a33c58b48661bdb6d325a22147e
Merge: 2bf4e36 363bd83
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Mon Oct 10 12:18:48 2022 -0500
Merge branch 'staging' into seungheonoh/ply
commit 2bf4e3627c1b229f58078695082da85c80efd560
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Mon Oct 10 10:48:36 2022 -0500
remove junkpile
commit a1dbc9ad9e531fe0d0a0480c4aef9cf9ffa90f1d
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Mon Oct 10 10:47:25 2022 -0500
versions
commit 4542a06ac733858297d3a48c53368fad19dedc43
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Thu Oct 6 22:57:48 2022 -0500
script exporting interface
commit 6bd8c1a1d57e4bf9dc25c3068a9c8eae6bf6a19d
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Thu Oct 6 22:58:41 2022 -0500
fixed tests
commit d3ce2cf95633d336f3e621833677bd5bf10ee2c8
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Sun Oct 2 00:55:18 2022 -0500
fixed tests
commit 1ae64c9f692652b77b0506013853b2ba44267c65
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Sat Oct 1 13:28:20 2022 -0500
linker
commit db88cb75c7b74843141ad8ab4e6522b66d0dcfbc
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Sat Oct 1 01:03:50 2022 -0500
exporting scripts
commit 6389fce28e885a8a7f8669629c266f59c0edb51f
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Sat Oct 1 00:51:49 2022 -0500
made scripts parameterized on the script level
commit aea1e518a8890550bdebd0e5251da11d915c53a9
Author: Seungheon Oh <seungheon.ooh@gmail.com>
Date: Wed Sep 28 19:53:29 2022 -0500
Use `TypedScriptEnvelope` for `Agora.Bootstrap`
300 lines
8 KiB
Haskell
300 lines
8 KiB
Haskell
{- |
|
|
Module : Sample.Governor.Initialize
|
|
Maintainer : connor@mlabs.city
|
|
Description: Generate sample data for testing the functionalities of minting GST.
|
|
|
|
Sample and utilities for testing the functionalities of minting GST.
|
|
-}
|
|
module Sample.Governor.Initialize (
|
|
mintGST,
|
|
Parameters (..),
|
|
totallyValidParameters,
|
|
invalidDatumTimingConfigParameters,
|
|
invalidDatumMaxTimeRangeWidthParameters,
|
|
invalidDatumThresholdsParameters,
|
|
withoutGovernorDatumParameters,
|
|
witnessNotPresentedParameters,
|
|
mintMoreThanOneGSTParameters,
|
|
mintGSTWithNoneEmptyNameParameters,
|
|
mkTestCase,
|
|
) where
|
|
|
|
import Agora.Bootstrap (agoraScripts)
|
|
import Agora.Governor (Governor (..), GovernorDatum (..))
|
|
import Agora.Linker (linker)
|
|
import Agora.Proposal (ProposalId (..), ProposalThresholds (..))
|
|
import Agora.Proposal.Time (
|
|
MaxTimeRangeWidth (MaxTimeRangeWidth),
|
|
ProposalTimingConfig (ProposalTimingConfig),
|
|
)
|
|
import Data.Default (Default (..))
|
|
import Data.Map (Map, (!))
|
|
import Data.Text (Text)
|
|
import Optics (view)
|
|
import Plutarch.Api.V2 (
|
|
mintingPolicySymbol,
|
|
validatorHash,
|
|
)
|
|
import Plutarch.Context (
|
|
input,
|
|
mint,
|
|
output,
|
|
pubKey,
|
|
script,
|
|
signedWith,
|
|
txId,
|
|
withDatum,
|
|
withRef,
|
|
withValue,
|
|
)
|
|
import PlutusLedgerApi.V1.Value (AssetClass (..))
|
|
import PlutusLedgerApi.V1.Value qualified as Value
|
|
import PlutusLedgerApi.V2 (
|
|
CurrencySymbol,
|
|
MintingPolicy (MintingPolicy),
|
|
Script,
|
|
TxOutRef (TxOutRef),
|
|
Validator (Validator),
|
|
ValidatorHash,
|
|
)
|
|
import Sample.Shared (
|
|
deterministicTracingConfing,
|
|
minAda,
|
|
)
|
|
import Sample.Shared qualified as Shared
|
|
import ScriptExport.ScriptInfo (runLinker)
|
|
import Test.Specification (SpecificationTree, testPolicy)
|
|
import Test.Util (CombinableBuilder, mkMinting, pubKeyHashes, sortValue)
|
|
|
|
-- | The parameters that control the generation of the transaction.
|
|
data Parameters = Parameters
|
|
{ datumThresholdsValid :: Bool
|
|
-- ^ Whether the 'GovernorDatum.proposalThresholds' field of the output
|
|
-- governor datum is valid or not.
|
|
, datumMaxTimeRangeWidthValid :: Bool
|
|
-- ^ Whether the 'GovernorDatum.maximumProposalsPerStake'field of the
|
|
-- output governor datum is valid or not.
|
|
, datumTimingConfigValid :: Bool
|
|
-- ^ Whether the 'GovernorDatum.proposalTimings'field of the output
|
|
-- governor datum is valid or not.
|
|
, withGovernorDatum :: Bool
|
|
-- ^ Whether the output GST UTxO will carry the governor datum.
|
|
, presentWitness :: Bool
|
|
-- ^ Whether to spend the UTxO referenced by 'Governor.gstOutRef'.
|
|
, mintMoreThanOneStateToken :: Bool
|
|
-- ^ More than one GST will be minted if this is set to true.
|
|
, mintStateTokenWithName :: Bool
|
|
-- ^ The token name of the GST won't be empty if this is set to true.
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
validGovernorOutputDatum :: GovernorDatum
|
|
validGovernorOutputDatum =
|
|
GovernorDatum
|
|
{ proposalThresholds = def
|
|
, nextProposalId = ProposalId 0
|
|
, proposalTimings = def
|
|
, createProposalTimeRangeMaxWidth = def
|
|
, maximumProposalsPerStake = 3
|
|
}
|
|
|
|
invalidProposalThresholds :: ProposalThresholds
|
|
invalidProposalThresholds = ProposalThresholds (-1) (-1) (-1) (-1) (-1)
|
|
|
|
invalidMaxTimeRangeWidth :: MaxTimeRangeWidth
|
|
invalidMaxTimeRangeWidth = MaxTimeRangeWidth 0
|
|
|
|
invalidProposalTimings :: ProposalTimingConfig
|
|
invalidProposalTimings = ProposalTimingConfig (-1) (-1) (-1) (-1)
|
|
|
|
witnessRef :: TxOutRef
|
|
witnessRef = TxOutRef "b0353c22b0bd6c5296a8eef160ba25d90b5dc82a9bb8bdaa6823ffc19515d6ad" 0
|
|
|
|
governor :: Governor
|
|
governor =
|
|
Shared.governor
|
|
{ gstOutRef = witnessRef
|
|
}
|
|
|
|
scripts :: Map Text Script
|
|
scripts =
|
|
either
|
|
(error . show)
|
|
(view #scripts)
|
|
( runLinker
|
|
linker
|
|
(agoraScripts deterministicTracingConfing)
|
|
governor
|
|
)
|
|
|
|
govPolicy :: MintingPolicy
|
|
govPolicy = MintingPolicy $ scripts ! "agora:governorPolicy"
|
|
|
|
govValidator :: Validator
|
|
govValidator = Validator $ scripts ! "agora:governorValidator"
|
|
|
|
govSymbol :: CurrencySymbol
|
|
govSymbol = mintingPolicySymbol govPolicy
|
|
|
|
govAssetClass :: AssetClass
|
|
govAssetClass = AssetClass (govSymbol, "")
|
|
|
|
govValidatorHash :: ValidatorHash
|
|
govValidatorHash = validatorHash govValidator
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
mintGST :: forall b. CombinableBuilder b => Parameters -> b
|
|
mintGST ps = builder
|
|
where
|
|
gstAC =
|
|
if ps.mintStateTokenWithName
|
|
then AssetClass (govSymbol, "12345")
|
|
else govAssetClass
|
|
gstCount =
|
|
if ps.mintMoreThanOneStateToken
|
|
then 10
|
|
else 1
|
|
gst = Value.assetClassValue gstAC gstCount
|
|
|
|
---
|
|
|
|
governorOutputDatum =
|
|
let th =
|
|
if ps.datumThresholdsValid
|
|
then def
|
|
else invalidProposalThresholds
|
|
trw =
|
|
if ps.datumMaxTimeRangeWidthValid
|
|
then def
|
|
else invalidMaxTimeRangeWidth
|
|
ptc =
|
|
if ps.datumTimingConfigValid
|
|
then def
|
|
else invalidProposalTimings
|
|
in validGovernorOutputDatum
|
|
{ proposalThresholds = th
|
|
, proposalTimings = ptc
|
|
, createProposalTimeRangeMaxWidth = trw
|
|
}
|
|
|
|
governorValue = sortValue $ gst <> minAda
|
|
|
|
---
|
|
|
|
witnessValue = minAda
|
|
witnessPubKey = head pubKeyHashes
|
|
|
|
---
|
|
|
|
witnessBuilder =
|
|
if ps.presentWitness
|
|
then
|
|
mconcat
|
|
[ input $
|
|
mconcat
|
|
[ pubKey witnessPubKey
|
|
, withValue witnessValue
|
|
, withRef witnessRef
|
|
]
|
|
, output $
|
|
mconcat
|
|
[ pubKey witnessPubKey
|
|
, withValue witnessValue
|
|
]
|
|
]
|
|
else mempty
|
|
|
|
---
|
|
|
|
govBuilder =
|
|
let datum =
|
|
if ps.withGovernorDatum
|
|
then withDatum governorOutputDatum
|
|
else mempty
|
|
in output $
|
|
mconcat
|
|
[ script govValidatorHash
|
|
, withValue governorValue
|
|
, datum
|
|
]
|
|
--
|
|
builder =
|
|
mconcat
|
|
[ txId "986b756ffb1c9839fc8d0b22a308ac91d5b5d0ebbfa683a47588c8a5cf70b5af"
|
|
, signedWith (pubKeyHashes !! 1)
|
|
, mint gst
|
|
, govBuilder
|
|
, witnessBuilder
|
|
]
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
totallyValidParameters :: Parameters
|
|
totallyValidParameters =
|
|
Parameters
|
|
{ datumThresholdsValid = True
|
|
, datumMaxTimeRangeWidthValid = True
|
|
, datumTimingConfigValid = True
|
|
, withGovernorDatum = True
|
|
, presentWitness = True
|
|
, mintMoreThanOneStateToken = False
|
|
, mintStateTokenWithName = False
|
|
}
|
|
|
|
invalidDatumThresholdsParameters :: Parameters
|
|
invalidDatumThresholdsParameters =
|
|
totallyValidParameters
|
|
{ datumThresholdsValid = False
|
|
}
|
|
|
|
invalidDatumMaxTimeRangeWidthParameters :: Parameters
|
|
invalidDatumMaxTimeRangeWidthParameters =
|
|
totallyValidParameters
|
|
{ datumMaxTimeRangeWidthValid = False
|
|
}
|
|
|
|
invalidDatumTimingConfigParameters :: Parameters
|
|
invalidDatumTimingConfigParameters =
|
|
totallyValidParameters
|
|
{ datumTimingConfigValid = False
|
|
}
|
|
|
|
withoutGovernorDatumParameters :: Parameters
|
|
withoutGovernorDatumParameters =
|
|
totallyValidParameters
|
|
{ withGovernorDatum = False
|
|
}
|
|
|
|
witnessNotPresentedParameters :: Parameters
|
|
witnessNotPresentedParameters =
|
|
totallyValidParameters
|
|
{ presentWitness = False
|
|
}
|
|
|
|
mintMoreThanOneGSTParameters :: Parameters
|
|
mintMoreThanOneGSTParameters =
|
|
totallyValidParameters
|
|
{ mintMoreThanOneStateToken = True
|
|
}
|
|
|
|
mintGSTWithNoneEmptyNameParameters :: Parameters
|
|
mintGSTWithNoneEmptyNameParameters =
|
|
totallyValidParameters
|
|
{ mintStateTokenWithName = True
|
|
}
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
{- | Create a test tree that runs the governor policy to test the initialization
|
|
of the governor.
|
|
-}
|
|
mkTestCase :: String -> Parameters -> Bool -> SpecificationTree
|
|
mkTestCase name ps valid =
|
|
testPolicy
|
|
valid
|
|
name
|
|
govPolicy
|
|
()
|
|
(mkMinting mintGST ps govSymbol)
|